From 34637d40cea81f0ecc94b43538357bd5ff59f8d1 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 1 May 2015 12:23:03 +0200 Subject: [PATCH] * Added CentrED+ code (thanks to StaticZ for his awesome work!) --- Client/CentrED.ico | Bin 5494 -> 5430 bytes Client/CentrED.lpi | 317 +- Client/CentrED.lpr | 95 +- Client/CentrED.manifest | 37 +- Client/Crc32Hash.pas | 194 + Client/GUI/AeroGlass.pas | 222 + Client/GUI/GlowLabel.pas | 368 ++ Client/GUI/VirtualList.pas | 703 +++ Client/ResourceList.txt | 39 +- Client/Sounds/MusicInf.wav | Bin 0 -> 616186 bytes Client/Tools/UfrmBoundaries.lfm | 399 +- Client/Tools/UfrmBoundaries.pas | 102 +- Client/Tools/UfrmConfirmation.lfm | 19 +- Client/Tools/UfrmConfirmation.pas | 10 + Client/Tools/UfrmDrawSettings.lfm | 142 +- Client/Tools/UfrmDrawSettings.pas | 66 +- Client/Tools/UfrmElevateSettings.lfm | 37 +- Client/Tools/UfrmElevateSettings.pas | 8 + Client/Tools/UfrmFillSettings.lfm | 206 + Client/Tools/UfrmFillSettings.pas | 187 + Client/Tools/UfrmFilter.lfm | 348 +- Client/Tools/UfrmFilter.pas | 181 +- Client/Tools/UfrmHueSettings.lfm | 603 +- Client/Tools/UfrmHueSettings.pas | 647 +- Client/Tools/UfrmLightlevel.lfm | 15 +- Client/Tools/UfrmLightlevel.pas | 9 +- Client/Tools/UfrmMoveSettings.lfm | 118 +- Client/Tools/UfrmMoveSettings.pas | 28 +- Client/Tools/UfrmSelectionSettings.lfm | 12 + Client/Tools/UfrmSelectionSettings.pas | 82 + Client/Tools/UfrmSurfElevateSettings.lfm | 12 + Client/Tools/UfrmSurfElevateSettings.pas | 82 + Client/Tools/UfrmSurfSmoothSettings.lfm | 12 + Client/Tools/UfrmSurfSmoothSettings.pas | 82 + Client/Tools/UfrmSurfStretchSettings.lfm | 12 + Client/Tools/UfrmSurfStretchSettings.pas | 82 + Client/Tools/UfrmToolWindow.lfm | 2 +- Client/Tools/UfrmVirtualLayer.lfm | 170 +- Client/Tools/UfrmVirtualLayer.pas | 34 +- Client/UGameResources.pas | 72 +- Client/ULandscape.pas | 217 +- Client/ULightManager.pas | 215 +- Client/UOverlayUI.pas | 4 +- Client/UPackets.pas | 7 +- Client/UPlatformTypes.pas | 5 +- Client/UResourceManager.pas | 24 +- Client/UdmNetwork.lfm | 4 +- Client/UdmNetwork.pas | 147 +- Client/UfrmAbout.lfm | 338 +- Client/UfrmAbout.pas | 104 +- Client/UfrmAccountControl.lfm | 906 ++- Client/UfrmAccountControl.pas | 137 +- Client/UfrmEditAccount.lfm | 61 +- Client/UfrmEditAccount.pas | 54 +- Client/UfrmInitialize.lfm | 72 +- Client/UfrmInitialize.pas | 23 +- Client/UfrmLargeScaleCommand.lfm | 893 +-- Client/UfrmLargeScaleCommand.pas | 109 +- Client/UfrmLogin.lfm | 1416 +++-- Client/UfrmLogin.pas | 246 +- Client/UfrmMain.lfm | 6917 ++++++++++++++++++---- Client/UfrmMain.pas | 5209 ++++++++++++++-- Client/UfrmRadar.lfm | 53 +- Client/UfrmRadar.pas | 97 +- Client/UfrmRegionControl.lfm | 443 +- Client/UfrmRegionControl.pas | 54 +- Client/UndoRedoCmd.pas | 281 + Client/language.pas | 980 +++ Imaging/ImagingClasses.pas | 2 +- Imaging/ImagingComponents.pas | 2 +- MulProvider/UArtProvider.pas | 61 +- MulProvider/UTexmapProvider.pas | 35 +- MulProvider/UTileDataProvider.pas | 120 +- ResourceBuilder.pas | 12 +- Server/UAccount.pas | 8 + Server/UAdminHandling.pas | 8 +- Server/UCEDServer.pas | 59 +- Server/UClientHandling.pas | 14 +- Server/UConfig.pas | 108 +- Server/UConnectionHandling.pas | 22 +- Server/ULandscape.pas | 51 +- Server/UPacketHandlers.pas | 4 +- Server/URadarMap.pas | 46 +- Server/cedserver.lpi | 60 +- Server/cedserver.lpr | 31 +- Server/language.pas | 120 + UEnums.pas | 1 + UOLib/UArt.pas | 73 +- UOLib/ULight.pas | 4 +- UOLib/UMap.pas | 8 +- UOLib/UStatics.pas | 28 +- UOLib/UTexture.pas | 38 +- UOLib/UTiledata.pas | 293 +- UOLib/UUopFile.pas | 103 + UOLib/UWorldItem.pas | 14 +- version.inc | 648 +- vinfo.pas | 128 + 97 files changed, 22628 insertions(+), 4243 deletions(-) create mode 100644 Client/Crc32Hash.pas create mode 100644 Client/GUI/AeroGlass.pas create mode 100644 Client/GUI/GlowLabel.pas create mode 100644 Client/GUI/VirtualList.pas create mode 100644 Client/Sounds/MusicInf.wav create mode 100644 Client/Tools/UfrmFillSettings.lfm create mode 100644 Client/Tools/UfrmFillSettings.pas create mode 100644 Client/Tools/UfrmSelectionSettings.lfm create mode 100644 Client/Tools/UfrmSelectionSettings.pas create mode 100644 Client/Tools/UfrmSurfElevateSettings.lfm create mode 100644 Client/Tools/UfrmSurfElevateSettings.pas create mode 100644 Client/Tools/UfrmSurfSmoothSettings.lfm create mode 100644 Client/Tools/UfrmSurfSmoothSettings.pas create mode 100644 Client/Tools/UfrmSurfStretchSettings.lfm create mode 100644 Client/Tools/UfrmSurfStretchSettings.pas create mode 100644 Client/UndoRedoCmd.pas create mode 100644 Client/language.pas create mode 100644 Server/language.pas create mode 100644 UOLib/UUopFile.pas create mode 100644 vinfo.pas diff --git a/Client/CentrED.ico b/Client/CentrED.ico index 1bd926290a77127067348afe5a4977c4733e37cb..fa6402bff8bb4894a104f88bef9f2798a3b2b51a 100644 GIT binary patch literal 5430 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 diff --git a/Client/CentrED.lpi b/Client/CentrED.lpi index 6128ec5..2b1d1b1 100644 --- a/Client/CentrED.lpi +++ b/Client/CentrED.lpi @@ -1,33 +1,181 @@ - + - - - - <LFMResourceType Value="res"/> + <Title Value="CentrED+"/> + <ResourceType Value="res"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> <Icon Value="0"/> </General> <LazDoc Paths="../doc"/> <VersionInfo> <UseVersionInfo Value="True"/> - <CurrentMajorRevNr Value="6"/> - <CurrentMinorRevNr Value="1"/> - <CurrentBuildNr Value="209"/> - <ProjectVersion Value="0.6.1.209"/> - <CompanyName Value="AKS DataBasis"/> - <FileDescription Value="UO CentrED"/> - <InternalName Value="CentrED"/> - <LegalCopyright Value="Andreas Schneider"/> - <OriginalFilename Value="CentrED.exe"/> - <ProductName Value="CentrED"/> + <AutoIncrementBuild Value="True"/> + <MinorVersionNr Value="7"/> + <RevisionNr Value="8"/> + <BuildNr Value="1759"/> + <Language Value="0419"/> + <StringTable CompanyName="www.uoquint.ru" FileDescription="UO CentrED+" InternalName="CentrED+" LegalCopyright="StaticZ" OriginalFilename="CentrED-plus.exe" ProductName="CentrED+" ProductVersion="0.7.8"/> </VersionInfo> + <BuildModes Count="4"> + <Item1 Name="default" Default="True"/> + <Item2 Name="Release Win32"> + <CompilerOptions> + <Version Value="9"/> + <Target> + <Filename Value="../bin/PEBinaries/CentrED-plus (x32).exe"/> + </Target> + <SearchPaths> + <IncludeFiles Value="..;../obj;../Imaging;$(ProjOutDir)"/> + <OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + <UnitOutputDirectory Value="../obj/win32"/> + <SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + <LCLWidgetType Value="win32"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <CStyleOperator Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <TargetProcessor Value="pentium4"/> + <TargetCPU Value="i386"/> + <TargetOS Value="win32"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <UseLineInfoUnit Value="False"/> + <StripSymbols Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerMessages> + <IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CustomOptions Value="-FE../bin/PEBinaries/ +-dNoLogging"/> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + </Item2> + <Item3 Name="Release Win64"> + <CompilerOptions> + <Version Value="9"/> + <Target> + <Filename Value="../bin/PEBinaries/CentrED-plus (x64).exe"/> + </Target> + <SearchPaths> + <IncludeFiles Value="..;../obj;../Imaging;$(ProjOutDir)"/> + <OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + <UnitOutputDirectory Value="../obj/win64"/> + <SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + <LCLWidgetType Value="win32"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <CStyleOperator Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <TargetProcessor Value="pentium4"/> + <TargetCPU Value="x86_64"/> + <TargetOS Value="win64"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <UseLineInfoUnit Value="False"/> + <StripSymbols Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerMessages> + <IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CustomOptions Value="-FE../bin/PEBinaries/ +-dNoLogging"/> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + </Item3> + <Item4 Name="Release Linux GTK2 x86"> + <CompilerOptions> + <Version Value="9"/> + <Target> + <Filename Value="../bin/PEBinaries/CentrED-plus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir);../Imaging;.."/> + <OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + <UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/> + <SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <CStyleOperator Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <TargetCPU Value="i386"/> + <TargetOS Value="linux"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <UseLineInfoUnit Value="False"/> + <StripSymbols Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerMessages> + <IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CustomOptions Value="-FE../bin/PEBinaries/ +-dNoLogging"/> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + </Item4> + </BuildModes> <PublishOptions> <Version Value="2"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> @@ -39,27 +187,31 @@ <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> - <RequiredPackages Count="5"> + <RequiredPackages Count="6"> <Item1> - <PackageName Value="multiloglaz"/> + <PackageName Value="lclextensions_package"/> + <MinVersion Minor="3" Valid="True"/> </Item1> <Item2> - <PackageName Value="LazOpenGLContext"/> - <MinVersion Valid="True"/> + <PackageName Value="multiloglaz"/> </Item2> <Item3> - <PackageName Value="LCL"/> + <PackageName Value="LazOpenGLContext"/> + <MinVersion Valid="True"/> </Item3> <Item4> - <PackageName Value="lnetvisual"/> - <MinVersion Minor="5" Release="3" Valid="True"/> + <PackageName Value="LCL"/> </Item4> <Item5> + <PackageName Value="lnetvisual"/> + <MinVersion Minor="5" Release="3" Valid="True"/> + </Item5> + <Item6> <PackageName Value="virtualtreeview_package"/> <MinVersion Major="4" Minor="5" Release="1" Valid="True"/> - </Item5> + </Item6> </RequiredPackages> - <Units Count="46"> + <Units Count="60"> <Unit0> <Filename Value="CentrED.lpr"/> <IsPartOfProject Value="True"/> @@ -330,37 +482,125 @@ <ResourceBaseClass Value="Form"/> <UnitName Value="UfrmLightlevel"/> </Unit45> + <Unit46> + <Filename Value="../UEnhancedMemoryStream.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UEnhancedMemoryStream"/> + </Unit46> + <Unit47> + <Filename Value="UndoRedoCmd.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UndoRedoCmd"/> + </Unit47> + <Unit48> + <Filename Value="../UOLib/UArt.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UArt"/> + </Unit48> + <Unit49> + <Filename Value="../vinfo.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="vinfo"/> + </Unit49> + <Unit50> + <Filename Value="language.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="Language"/> + </Unit50> + <Unit51> + <Filename Value="Tools/UfrmFillSettings.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmFillSettings"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UfrmFillSettings"/> + </Unit51> + <Unit52> + <Filename Value="Tools/UfrmSelectionSettings.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmSelectionSettings"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UfrmSelectionSettings"/> + </Unit52> + <Unit53> + <Filename Value="Tools/UfrmSurfStretchSettings.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmSurfStretchSettings"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UfrmSurfStretchSettings"/> + </Unit53> + <Unit54> + <Filename Value="Tools/UfrmSurfElevateSettings.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmSurfElevateSettings"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UfrmSurfElevateSettings"/> + </Unit54> + <Unit55> + <Filename Value="Tools/UfrmSurfSmoothSettings.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmSurfSmoothSettings"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UfrmSurfSmoothSettings"/> + </Unit55> + <Unit56> + <Filename Value="Crc32Hash.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="Crc32Hash"/> + </Unit56> + <Unit57> + <Filename Value="../UOLib/UUopFile.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UUopFile"/> + </Unit57> + <Unit58> + <Filename Value="GUI/AeroGlass.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="AeroGlass"/> + </Unit58> + <Unit59> + <Filename Value="GUI/VirtualList.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="VirtualList"/> + </Unit59> </Units> </ProjectOptions> <CompilerOptions> - <Version Value="8"/> + <Version Value="9"/> <Target> - <Filename Value="../bin/CentrED"/> + <Filename Value="../bin/PEBinaries/CentrED-plus.exe"/> </Target> <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)/;../Imaging/;../"/> - <OtherUnitFiles Value="../;../UOLib/;../MulProvider/;../Imaging/;../Imaging/JpegLib/;../Imaging/ZLib/;Tools/"/> - <UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/> - <SrcPath Value="$(LazarusDir)/lcl/;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType)/;../;../UOLib/;../MulProvider/;../Imaging/;../Imaging/JpegLib/;../Imaging/ZLib/;Tools/"/> + <IncludeFiles Value="..;../obj;../Imaging;$(ProjOutDir)"/> + <OtherUnitFiles Value="Tools;..;../UOLib;../Server;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;GUI"/> + <UnitOutputDirectory Value="../obj"/> + <LCLWidgetType Value="win32"/> </SearchPaths> <Parsing> <SyntaxOptions> - <CStyleOperator Value="False"/> - <UseAnsiStrings Value="True"/> + <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <CodeGeneration> - <SmartLinkUnit Value="True"/> + <Checks> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + </Checks> + <TargetProcessor Value="pentium4"/> + <TargetCPU Value="i386"/> + <TargetOS Value="win32"/> <Optimizations> <OptimizationLevel Value="3"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> - <UseLineInfoUnit Value="False"/> - <StripSymbols Value="True"/> + <GenerateDebugInfo Value="True"/> </Debugging> - <LinkSmart Value="True"/> <Options> <Win32> <GraphicApplication Value="True"/> @@ -370,9 +610,10 @@ <Other> <CompilerMessages> <IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/> + <UseMsgFile Value="True"/> </CompilerMessages> - <CustomOptions Value="-FE../bin/ --dNoLogging"/> + <CustomOptions Value="-FE../bin/PEBinaries/ ++-dNoLogging"/> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> diff --git a/Client/CentrED.lpr b/Client/CentrED.lpr index cf1596a..b39a3fe 100644 --- a/Client/CentrED.lpr +++ b/Client/CentrED.lpr @@ -21,7 +21,7 @@ * CDDL HEADER END * * - * Portions Copyright 2009 Andreas Schneider + * Portions Copyright 2010 Andreas Schneider *) program CentrED; @@ -31,21 +31,104 @@ uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} - SysUtils, + Classes, SysUtils, Interfaces, // this includes the LCL widgetset - Forms, LResources, UdmNetwork; + Forms, Dialogs, Windows, UdmNetwork, UResourceManager; -{$IFDEF WINDOWS}{$R CentrED.rc}{$ENDIF} +{$R CentrED.res} +{$R CentrED.manifest.rc} function GetApplicationName: String; begin - Result := 'CentrED'; + Result := 'CentrED-plus'; end; +function LoadCursorFromRes(AFileName: string; CurFormat: Boolean = True): HCURSOR; +type + TIconHeader = packed record + hReserved: WORD; // = 0 + hType: WORD; // ICO = 1, CUR = 2 + hCount: WORD; + end; + TIconInfo = packed record + iWidth: BYTE; + iHeight: BYTE; + iColors: BYTE; + iReserved: BYTE; // = 0 + iHotspotX: WORD; // CUR file (/iPlanes for ICO) + iHotspotY: WORD; // CUR file (/iBpp for ICO) + iSize: Cardinal; + iOffset: Cardinal; + end; +var + stream: TStream; + dwSize: Integer; + buffer: array of Byte; + header: TIconHeader; + icoinf: TIconInfo; begin - {$I CentrED.lrs} + stream := ResourceManager.GetResource(AFileName); + dwSize := stream.Size; + SetLength(buffer, dwSize + 8); + stream.Read(buffer[0], dwSize); + if not CurFormat then + Result := HCURSOR(CreateIconFromResource(@buffer[0], dwSize, False, $00030000)) + else begin + CopyMemory(@header, @buffer[0], SizeOf(TIconHeader)); + // Грузим последнее изображение, которое обычно должно являться первым и единственным в иконках + CopyMemory(@icoinf, @buffer[SizeOf(TIconHeader) + (header.hCount - 1) * SizeOf(TIconInfo)], SizeOf(TIconInfo)); + CopyMemory(@buffer[icoinf.iOffset-4], @icoinf.iHotspotX, 2); + CopyMemory(@buffer[icoinf.iOffset-2], @icoinf.iHotspotY, 2); + Result := HCURSOR(CreateIconFromResource(@buffer[icoinf.iOffset-4], icoinf.iSize+4, False, $00030000)) + end; +end; + + +begin + Application.Title:='CentrED+'; OnGetApplicationName := @GetApplicationName; Application.Initialize; + if LowerCase(ChangeFileExt(ExtractFileName(ParamStr(0)), '')) <> LowerCase(GetApplicationName) then + begin + MessageDlg('Ошибка', 'Исполняемый файл был переименован. Переименуйте ' + + 'файл следующим образом: "' + + GetApplicationName + '.exe"', mtError, [mbOK], 0); + Application.Terminate; + end; + + if Paramcount = 1 then begin + MessageDlg('Параметры запуска', ParamStr(1), mtError, [mbOK], 0); + end; + + + // Загрузка курсоров ... + Screen.Cursors[-02] := LoadCursorFromRes('Cursors/BC_NormalSelect.cur'); //crArrow + Screen.Cursors[-19] := LoadCursorFromRes('Cursors/BC_WorkingInBackground.cur'); //crAppStart + Screen.Cursors[-20] := LoadCursorFromRes('Cursors/BC_HelpSelect.cur'); //crHelp + //Screen.Cursors[-12] := LoadCursorFromRes('Cursors/.cur'); //crDrag + //Screen.Cursors[-16] := LoadCursorFromRes('Cursors/.cur'); //crMultiDrag + //Screen.Cursors[-13] := LoadCursorFromRes('Cursors/.cur'); //crNoDrop + + Screen.Cursors[-03] := LoadCursorFromRes('Cursors/BC_PrecisionSelect.cur'); //crCross + Screen.Cursors[-04] := LoadCursorFromRes('Cursors/BC_TextSelect.cur'); //crIBeam + Screen.Cursors[-11] := LoadCursorFromRes('Cursors/BI_Busy.ani', False); //crHourGlass + Screen.Cursors[-18] := LoadCursorFromRes('Cursors/TN_Unavailable.cur'); //crNo + + Screen.Cursors[-22] := LoadCursorFromRes('Cursors/BC_Move.cur'); //crSize + Screen.Cursors[-06] := LoadCursorFromRes('Cursors/BC_DiagonalResize2.cur'); //crSizeNESW + Screen.Cursors[-07] := LoadCursorFromRes('Cursors/BC_VerticalResize.cur'); //crSizeNS + Screen.Cursors[-08] := LoadCursorFromRes('Cursors/BC_DiagonalResize1.cur'); //crSizeNWSE + Screen.Cursors[-09] := LoadCursorFromRes('Cursors/BC_HorizontalResize.cur'); //crSizeWE + Screen.Cursors[-10] := LoadCursorFromRes('Cursors/BC_AlternateSelect.cur'); //crUpArrow + //Screen.Cursors[-14] := LoadCursorFromRes('Cursors/.cur'); //crHSplit + //Screen.Cursors[-15] := LoadCursorFromRes('Cursors/.cur'); //crVSplit + + Screen.Cursors[-21] := LoadCursorFromRes('Cursors/TN_LinkSelect.cur'); //crHandPoint + Screen.Cursors[+01] := LoadCursorFromRes('Cursors/UO_Precision.cur'); + Screen.Cursors[+02] := LoadCursorFromRes('Cursors/UO_AttackMode.cur'); + Screen.Cursors[+03] := LoadCursorFromRes('Cursors/UO_Gauntlet.cur'); + + // Запуск программы... Application.CreateForm(TdmNetwork, dmNetwork); Application.Run; end. diff --git a/Client/CentrED.manifest b/Client/CentrED.manifest index 515fede..174f14b 100644 --- a/Client/CentrED.manifest +++ b/Client/CentrED.manifest @@ -1,17 +1,22 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="CompanyName.ProductName.YourApp" type="win32"/> - <description>Your application description here.</description> - <dependency> - <dependentAssembly> - <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> - </dependentAssembly> - </dependency> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> \ No newline at end of file + <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="CompanyName.ProductName.YourApp" type="win32"/> + <description>Your application description here.</description> + <dependency> + <dependentAssembly> + <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> + </dependentAssembly> + </dependency> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="requestedexecutionlevel" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> + <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> + <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> + <dpiAware>true</dpiAware> + </asmv3:windowsSettings> + </asmv3:application> +</assembly> diff --git a/Client/Crc32Hash.pas b/Client/Crc32Hash.pas new file mode 100644 index 0000000..1c01e92 --- /dev/null +++ b/Client/Crc32Hash.pas @@ -0,0 +1,194 @@ +unit Crc32Hash; +{$mode objfpc}{$H+} + +interface +uses + Classes, SysUtils, Dialogs; + +procedure CalcCRC32(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD); +function CalcStringCRC32(s: string; out CRC32: DWORD): Boolean; +procedure CalcFileCRC32(FromName: string; var CRCvalue: DWORD; var TotalBytes: Int64; var error: Word); + +implementation + +// The constants here are for the CRC-32 generator +// polynomial, as defined in the Microsoft +// Systems Journal, March 1995, pp. 107 - 108 +const + Table: array[0..255] of DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + +type +TInteger8 = Int64; + { + //----------------------------------crc32---------------------------------- +{$IFDEF VER130} // This is a bit awkward + // 8-byte integer + TInteger8 = Int64; // Delphi 5 +{$ELSE} +{$IFDEF VER120} + TInteger8 = Int64; // Delphi 4 +{$ELSE} + TInteger8 = COMP; // Delphi 2 or 3 +{$ENDIF} +{$ENDIF} +} + //----------------------------------crc32---------------------------------- + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + +procedure CalcCRC32(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD); +// The following is a little cryptic (but executes very quickly). +// The algorithm is as follows: +// 1. exclusive-or the input byte with the low-order byte of +// the CRC register to get an INDEX +// 2. shift the CRC register eight bits to the right +// 3. exclusive-or the CRC register with the contents of Table[INDEX] +// 4. repeat steps 1 through 3 for all bytes +var + i: DWORD; + q: ^BYTE; +begin + q := p; + for i := 0 to ByteCount - 1 do + begin + CRCvalue := (CRCvalue shr 8) xor + Table[q^ xor (CRCvalue and $000000FF)]; + Inc(q) + end +end {CalcCRC32}; + +function CalcStringCRC32(s: string; out CRC32: DWORD): Boolean; +var + CRC32Table: DWORD; +begin + // Verify the table used to compute the CRCs has not been modified. + // Thanks to Gary Williams for this suggestion, Jan. 2003. + CRC32Table := $FFFFFFFF; + CalcCRC32(Addr(Table[0]), SizeOf(Table), CRC32Table); + CRC32Table := not CRC32Table; + + if CRC32Table <> $6FCF9E13 then + {$IFDEF ResBuilder} + writeln('!!! CRC32 Table CRC32 is ' + IntToHex(Crc32Table, 8) + ', expecting $6FCF9E13') + {$ELSE} + ShowMessage('CRC32 Table CRC32 is ' + IntToHex(Crc32Table, 8) + ', expecting $6FCF9E13') + {$ENDIF} + else + begin + CRC32 := $FFFFFFFF; // To match PKZIP + if Length(s) > 0 {// Avoid access violation in D4 } then + CalcCRC32(Addr(s[1]), Length(s), CRC32); + CRC32 := not CRC32; // To match PKZIP + Result := True; + end; + + + //ShowMessage('Get CRC is = ' + IntToStr(CRC32)); +end; + +procedure CalcFileCRC32(FromName: string; var CRCvalue: DWORD; + var TotalBytes: TInteger8; + var error: Word); +var + Stream: TMemoryStream; +begin + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + try + try + Stream.LoadFromFile(FromName); + if Stream.Size > 0 then + CalcCRC32(Stream.Memory, Stream.Size, CRCvalue) + except + on E: EReadError do + error := 1 + end; + CRCvalue := not CRCvalue + finally + Stream.Free + end; +end; + +{ +procedure TForm1.Button1Click(Sender: TObject); +var + s: string; + CRC32: DWORD; +begin + s := 'Test String'; + if CalcStringCRC32(s, CRC32) then + ShowMessage(IntToStr(crc32)); +end; +} + +end. diff --git a/Client/GUI/AeroGlass.pas b/Client/GUI/AeroGlass.pas new file mode 100644 index 0000000..f7a413a --- /dev/null +++ b/Client/GUI/AeroGlass.pas @@ -0,0 +1,222 @@ +unit AeroGlass; + +{$mode delphi} +//{$mode objfpc}{$H+} + +interface + +uses + //Windows, Forms, Graphics; + // os + Windows, UxTheme, ShellAPI, Win32Proc, Win32Extra, + // rtl + Classes, SysUtils, + // lcl + Forms, Controls, Graphics, Themes;//, LCLProc, LCLType; + +type + _MARGINS = packed record + cxLeftWidth : Integer; + cxRightWidth : Integer; + cyTopHeight : Integer; + cyBottomHeight : Integer; + end; + + PMargins = ^_MARGINS; + TMargins = _MARGINS; + + DwmIsCompositionEnabledFunc = function(pfEnabled: PBoolean): HRESULT; stdcall; + DwmExtendFrameIntoClientAreaFunc = function(destWnd: HWND; const pMarInset: PMargins): HRESULT; stdcall; + SetLayeredWindowAttributesFunc = function(destWnd: HWND; cKey: TColor; bAlpha: Byte; dwFlags: DWord): BOOL; stdcall; + +const + WS_EX_LAYERED = $80000; + LWA_COLORKEY = 1; + +procedure GlassFormEx(frm: TForm; tmpMargins: TMargins; cBlurColorKey: TColor = clFuchsia); +procedure GlassForm(frm: TForm; cBlurColorKey: TColor = clFuchsia); +function WindowsAeroGlassCompatible: Boolean; + +function CreateBitmap32(DC: HDC; W, H: Integer; var BitmapBits: Pointer): HBITMAP; +procedure DrawAlphaText(wnd: hwnd; DC: HDC; x,y: integer; txt: WideString); + + +implementation + +// ============================================================================= +// == Преобразование формы в AeroGlass +// ============================================================================= + +function WindowsAeroGlassCompatible: Boolean; +var + osVinfo: TOSVERSIONINFO; +begin + ZeroMemory(@osVinfo, SizeOf(osVinfo)); + OsVinfo.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO); + if ( + (GetVersionEx(osVInfo) = True) and + (osVinfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and + (osVinfo.dwMajorVersion >= 6) + ) + then Result:=True + else Result:=False; +end; + +procedure GlassFormEx(frm: TForm; tmpMargins: TMargins; cBlurColorKey: TColor = clFuchsia); +var + hDwmDLL: Cardinal; + fDwmIsCompositionEnabled: DwmIsCompositionEnabledFunc; + fDwmExtendFrameIntoClientArea: DwmExtendFrameIntoClientAreaFunc; + fSetLayeredWindowAttributesFunc: SetLayeredWindowAttributesFunc; + bCmpEnable: Boolean; + mgn: TMargins; +begin + { Continue if Windows version is compatible } + if WindowsAeroGlassCompatible then begin + { Continue if 'dwmapi' library is loaded } + hDwmDLL := LoadLibrary('dwmapi.dll'); + if hDwmDLL <> 0 then begin + { Get values } + @fDwmIsCompositionEnabled := GetProcAddress(hDwmDLL, 'DwmIsCompositionEnabled'); + @fDwmExtendFrameIntoClientArea := GetProcAddress(hDwmDLL, 'DwmExtendFrameIntoClientArea'); + @fSetLayeredWindowAttributesFunc := GetProcAddress(GetModulehandle(user32), 'SetLayeredWindowAttributes'); + { Continue if values are <> nil } + if ( + (@fDwmIsCompositionEnabled <> nil) and + (@fDwmExtendFrameIntoClientArea <> nil) and + (@fSetLayeredWindowAttributesFunc <> nil) + ) + then begin + { Continue if composition is enabled } + fDwmIsCompositionEnabled(@bCmpEnable); + if bCmpEnable = True then begin + { Set Form Color same as cBlurColorKey } + frm.Color := cBlurColorKey; + { ... } + SetWindowLong(frm.Handle, GWL_EXSTYLE, GetWindowLong(frm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED); + { ... } + fSetLayeredWindowAttributesFunc(frm.Handle, cBlurColorKey, 0, LWA_COLORKEY); + { Set margins } + ZeroMemory(@mgn, SizeOf(mgn)); + mgn.cxLeftWidth := tmpMargins.cxLeftWidth; + mgn.cxRightWidth := tmpMargins.cxRightWidth; + mgn.cyTopHeight := tmpMargins.cyTopHeight; + mgn.cyBottomHeight := tmpMargins.cyBottomHeight; + { Extend Form } + fDwmExtendFrameIntoClientArea(frm.Handle,@mgn); + end; + end; + { Free loaded 'dwmapi' library } + FreeLibrary(hDWMDLL); + end; + end; +end; + +procedure GlassForm(frm: TForm; cBlurColorKey: TColor = clFuchsia); +var + tmpMargins: TMargins; +begin + { If all margins are -1 the whole form will be aero glass} + tmpMargins.cxLeftWidth := 8; + tmpMargins.cxRightWidth := 8; + tmpMargins.cyBottomHeight := 25; + tmpMargins.cyTopHeight := 4; + { FormName ; Margins ; TransparentColor } + GlassFormEx(frm, tmpMargins, cBlurColorKey); +end; + +// ============================================================================= +// == Вывод текста и изображений на форме AeroGlass +// ============================================================================= + +function CreateBitmap32(DC: HDC; W, H: Integer; var BitmapBits: Pointer): HBITMAP; +var + bi: BITMAPINFO; +begin + ZeroMemory(@bi, sizeof(BITMAPINFO)); + with bi.bmiHeader do + begin + biSize := sizeof(BITMAPINFOHEADER); + biWidth := W; + biHeight := -H; + biCompression := BI_RGB; + biBitCount := 32; + biPlanes := 1; + biXPelsPerMeter := 0; + biYPelsPerMeter := 0; + biClrUsed := 0; + biClrImportant := 0; + end; + Result := CreateDIBSection(DC, bi, DIB_RGB_COLORS, BitmapBits, 0, 0); +end; + +type + TDTTOpts = record + dwSize: Longword; + dwFlags: Longword; + crText: Longword; + crBorder: Longword; + crShadow: Longword; + eTextShadowType: Integer; + ptShadowOffset: TPoint; + iBorderSize: Integer; + iFontPropId: Integer; + iColorPropId: Integer; + iStateId: Integer; + fApplyOverlay: Integer; + iGlowSize: Integer; + pfnDrawTextCallback: Pointer; + lParam: Integer; + end; + +var + hTheme: THandle; + +procedure DrawAlphaText(wnd: hwnd; DC: HDC; x,y: integer; txt: WideString); +var + tr: trect; + txtOptions: TDTTOPTS; + hBmp: HBITMAP; + hBmpDC: HDC; + hFnt: HFont; + p: pointer; + ts: SIZE; +begin + hTheme := OpenThemeData(wnd, 'window'); + + hBmpDC := CreateCompatibleDC(0); + + hFnt := CreateFont(-MulDiv(10, GetDeviceCaps(hBmpDC, LOGPIXELSY), 72), 0, 0, 0, FW_BOLD {FW_NORMAL}, 0, 0, 0, + DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'arial'); + + SelectObject(hBmpDC, hFnt); + + GetTextExtentPointW(hBmpDC, PWideChar(txt), length(txt), ts); + + SetRect(tr, 0, 0, ts.cx + 5, ts.cy + 5); + + hBmp := CreateBitmap32(hBmpDC, tr.Right, tr.Bottom, p); + SelectObject(hBmpDC, hBmp); + + ZeroMemory(@txtOptions, sizeof(TDTTOPTS)); + txtOptions.dwSize := sizeof(TDTTOPTS); + txtOptions.dwFlags := DTT_COMPOSITED or DTT_GLOWSIZE or DTT_TEXTCOLOR; + txtOptions.iGlowSize := 5; + txtOptions.crText := $00FF0000; + + DrawThemeTextEx(hTheme, hBmpDC, 0, 0, PWideChar(txt), length(txt), DT_SINGLELINE or DT_vCENTER, @tr, @txtOptions); + + BitBlt(dc, x, y, tr.Right, tr.Bottom, hBmpDC, 0, 0, SRCCOPY); + + DeleteObject(hBmpDC); + DeleteObject(hBmp); + DeleteObject(hFnt); + + CloseThemeData(hTheme); +end; + + + + + +end. diff --git a/Client/GUI/GlowLabel.pas b/Client/GUI/GlowLabel.pas new file mode 100644 index 0000000..cd76a2e --- /dev/null +++ b/Client/GUI/GlowLabel.pas @@ -0,0 +1,368 @@ +unit GlowLabel; + {******************************************************************} + { GlowLabel } + { } + { home page : http://www.winningcubed.de } + { email : martin.walter@winningcubed.de } + { } + { date : 15-04-2007 } + { } + { version : 1.0 } + { } + { Use of this file is permitted for commercial and non-commercial } + { use, as long as the author is credited. } + { This file (c) 2007 Martin Walter } + { } + { This Software is distributed on an "AS IS" basis, WITHOUT } + { WARRANTY OF ANY KIND, either express or implied. } + { } + { *****************************************************************} + + +interface + +uses + Windows, Classes, StdCtrls {$IFDEF USETNT}, TntStdCtrls{$ENDIF}; + +type + TCustomGlowLabel = class({$IFDEF USETNT}TTntCustomLabel{$ELSE}TCustomLabel{$ENDIF}) + private + FGlow: Boolean; + FGlowSize: Integer; + FOldGlowSize: Integer; + FBoundsWithGlow: Boolean; + procedure SetGlow(const Value: Boolean); + procedure SetGlowSize(const Value: Integer); + + function IsGlow: Boolean; + function GetExpansion(GlowSize: Integer): Integer; + protected + procedure DoDrawText(var Rect: TRect; Flags: Longint); override; + procedure AdjustBounds; override; + property Glow: Boolean read FGlow write SetGlow; + property GlowSize: Integer read FGlowSize write SetGlowSize; + public + constructor Create(AOwner: TComponent); override; + end; + + TGlowLabel = class(TCustomGlowLabel) + published + property Align; + property Alignment; + property Anchors; + property AutoSize; + property BiDiMode; + property Caption; + property Color nodefault; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property EllipsisPosition; + property Enabled; + property FocusControl; + property Font; + property Glow; + property GlowSize; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property Transparent; + property Layout; + property Visible; + property WordWrap; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseActivate; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseEnter; + property OnMouseLeave; + property OnStartDock; + property OnStartDrag; + end; + +procedure Register; + +implementation + +uses + Controls, Forms, Graphics, SysUtils, Math, DwmApi, Themes, UxTheme; + +function StrScanW(const Str: PWideChar; Chr: WideChar): PWideChar; +begin + Result := Str; + while Result^ <> Chr do + begin + if Result^ = #0 then + begin + Result := nil; + Exit; + end; + Inc(Result); + end; +end; + +function LastDelimiterW(const Delimiters, S: WideString): Integer; +var + P: PWideChar; +begin + Result := Length(S); + P := PWideChar(Delimiters); + while Result > 0 do + begin + if (S[Result] <> #0) and (StrScanW(P, S[Result]) <> nil) then + Exit; + + Dec(Result); + end; +end; + + + +{ TGlowCustomLabel } + +procedure TCustomGlowLabel.AdjustBounds; +const + WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK); +var + DC: HDC; + Rect, Bounds, CalcRect: TRect; + AAlignment: TAlignment; + Expand: Integer; + DoSetBounds: Boolean; +begin + DoSetBounds := False; + Bounds := BoundsRect; + Rect := Bounds; + + if (IsGlow and (csReading in ComponentState)) then + begin + FBoundsWithGlow := True; + FOldGlowSize := FGlowSize; + end; + + if FBoundsWithGlow then + begin + Expand := GetExpansion(FOldGlowSize); + Inc(Rect.Left, Expand); + Inc(Rect.Top, Expand); + Dec(Rect.Right, Expand); + Dec(Rect.Bottom, Expand); + FBoundsWithGlow := False; + DoSetBounds := True; + end; + + if not ((csReading in ComponentState) or + (csLoading in ComponentState)) and + AutoSize then + begin + DC := GetDC(0); + Canvas.Handle := DC; + CalcRect.Left := 0; + CalcRect.Top := 0; + DoDrawText(CalcRect, (DT_EXPANDTABS or DT_CALCRECT) or WordWraps[WordWrap]); + Canvas.Handle := 0; + ReleaseDC(0, DC); + AAlignment := Alignment; + if UseRightToLeftAlignment then + ChangeBiDiModeAlignment(AAlignment); + + if AAlignment = taRightJustify then + Rect.Left := Rect.Right - CalcRect.Right; + + Rect.Right := Rect.Left + CalcRect.Right; + Rect.Bottom := Rect.Top + CalcRect.Bottom; + DoSetBounds := True; + end; + + if IsGlow then + begin + FBoundsWithGlow := True; + Expand := GetExpansion(FGlowSize); + Dec(Rect.Left, Expand); + Dec(Rect.Top, Expand); + Inc(Rect.Right, Expand); + Inc(Rect.Bottom, Expand); + FOldGlowSize := FGlowSize; + DoSetBounds := True; + end; + + if DoSetBounds then + SetBounds(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); +end; + +constructor TCustomGlowLabel.Create(AOwner: TComponent); +begin + inherited; + FGlow := False; + FGlowSize := 10; + FOldGlowSize := 0; + FBoundsWithGlow := False; +end; + +procedure TCustomGlowLabel.DoDrawText(var Rect: TRect; Flags: Integer); + + procedure DoDrawThemeTextEx(DC: HDC; const Text: WideString; TextLen: Integer; + var TextRect: TRect; TextFlags: Cardinal); + var + Options: TDTTOpts; + begin + FillChar(Options, SizeOf(Options), 0); + Options.dwSize := SizeOf(Options); + Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED; + if IsGlow then + begin + Options.dwFlags := Options.dwFlags or DTT_GLOWSIZE; + Options.iGlowSize := FGlowSize; + end; + Options.crText := ColorToRGB(Canvas.Font.Color); + + with ThemeServices.GetElementDetails(teEditTextNormal) do + DrawThemeTextEx(ThemeServices.Theme[teEdit], DC, Part, State, + PWideChar(Text), TextLen, TextFlags, @TextRect, Options); + end; + + procedure DrawText(DC: HDC; const Text: WideString; TextLen: Integer; + var TextRect: TRect; TextFlags: Cardinal); + var + LForm: TCustomForm; + PaintOnGlass: Boolean; + Expand: Integer; + begin + PaintOnGlass := ThemeServices.ThemesEnabled and DwmCompositionEnabled and + not (csDesigning in ComponentState); + if PaintOnGlass then + begin + LForm := GetParentForm(Self); + PaintOnGlass := (LForm <> nil) and LForm.GlassFrame.FrameExtended and + LForm.GlassFrame.IntersectsControl(Self); + end; + + if IsGlow and (Flags and DT_CALCRECT = 0) then + begin + Expand := GetExpansion(FGlowSize); + case Alignment of + taLeftJustify: OffsetRect(TextRect, Expand, 0); + taRightJustify: OffsetRect(TextRect, -Expand, 0); + end; + + case Layout of + tlTop: OffsetRect(TextRect, 0, Expand); + tlBottom: OffsetRect(TextRect, 0, -Expand); + end; + end; + + if PaintOnGlass and (Flags and DT_CALCRECT = 0) then + DoDrawThemeTextEx(DC, Text, TextLen, TextRect, TextFlags) + else + Windows.DrawTextW(DC, PWideChar(Text), TextLen, TextRect, TextFlags); + end; + +const + EllipsisStr = '...'; + Ellipsis: array[TEllipsisPosition] of Longint = (0, DT_PATH_ELLIPSIS, + DT_END_ELLIPSIS, DT_WORD_ELLIPSIS); +var + Text, DText: WideString; + NewRect: TRect; + Height, Delim: Integer; +begin + Text := Caption; + if (Flags and DT_CALCRECT <> 0) and ((Text = '') or ShowAccelChar and + (Text[1] = '&') and (Text[2] = #0)) then + Text := Text + ' '; + if not ShowAccelChar then + Flags := Flags or DT_NOPREFIX; + Flags := DrawTextBiDiModeFlags(Flags); + Canvas.Font := Font; + if (EllipsisPosition <> epNone) and not AutoSize then + begin + DText := Text; + Flags := Flags and not DT_EXPANDTABS; + Flags := Flags or Ellipsis[EllipsisPosition]; + if WordWrap and (EllipsisPosition in [epEndEllipsis, epWordEllipsis]) then + begin + repeat + NewRect := Rect; + Dec(NewRect.Right, Canvas.TextWidth(EllipsisStr)); + Windows.DrawTextW(Canvas.Handle, PWideChar(DText), Length(DText), NewRect, Flags or DT_CALCRECT); + Height := NewRect.Bottom - NewRect.Top; + if (Height > ClientHeight) and (Height > Canvas.Font.Height) then + begin + Delim := LastDelimiterW(' '#9, Text); + if Delim = 0 then + Delim := Length(Text); + Dec(Delim); + + Text := Copy(Text, 1, Delim); + DText := Text + EllipsisStr; + if Text = '' then + Break; + end else + Break; + until False; + end; + if Text <> '' then + Text := DText; + end; + if not Enabled then + begin + OffsetRect(Rect, 1, 1); + Canvas.Font.Color := clBtnHighlight; + DrawText(Canvas.Handle, Text, Length(Text), Rect, Flags); + OffsetRect(Rect, -1, -1); + Canvas.Font.Color := clBtnShadow; + DrawText(Canvas.Handle, Text, Length(Text), Rect, Flags); + end + else + DrawText(Canvas.Handle, Text, Length(Text), Rect, Flags); +end; + +function TCustomGlowLabel.GetExpansion(GlowSize: Integer): Integer; +begin + Result := Ceil(GlowSize / 2) + 1; +end; + +function TCustomGlowLabel.IsGlow: Boolean; +begin + Result := FGlow and (FGlowSize > 0); +end; + +procedure TCustomGlowLabel.SetGlow(const Value: Boolean); +begin + if FGlow <> Value then + begin + FGlow := Value; + AdjustBounds; + Invalidate; + end; +end; + +procedure TCustomGlowLabel.SetGlowSize(const Value: Integer); +begin + if FGlowSize <> Value then + begin + FGlowSize := Value; + AdjustBounds; + Invalidate; + end; +end; + + +procedure Register; +begin + RegisterComponents('MWK', [TGlowLabel]); +end; + +end. diff --git a/Client/GUI/VirtualList.pas b/Client/GUI/VirtualList.pas new file mode 100644 index 0000000..511c89d --- /dev/null +++ b/Client/GUI/VirtualList.pas @@ -0,0 +1,703 @@ +unit VirtualList; + +{$mode delphi}{$H+} +interface + +uses + Windows, Forms, Controls, StdCtrls, Graphics, Classes, SysUtils, VirtualTrees, + Logging, LMessages, ShellAPI, LCLIntf, Math; + +type + {$Z4} INPUTTYPE = (INPUT_MOUSE = $00, INPUT_KEYBOARD = $01, INPUT_HARDWARE = $02); + {$Z4} KEYEVENTF = (KEYEVENTF_EXTENDEDKEY = $01, KEYEVENTF_KEYUP = $02, KEYEVENTF_SCANCODE = $04, KEYEVENTF_UNICODE = $08); + TKEYINPUT = record + itype: INPUTTYPE; + // tagKEYBDINPUT + wVk: WORD; + wScan: WORD; + dwFlags: KEYEVENTF; + time: DWORD; + dwExtraInfo: ULONG_PTR; + end; + + PVirtualItem = ^TVirtualItem; + TVirtualItem = record + NextItem: PVirtualItem; + Node: PVirtualNode; + Column: Word; + Selected: Boolean; + end; + + TVirtualList = class(TVirtualDrawTree) + + private + HintCanvas: TCanvas; + TileColumn: Word; + FirstItem: PVirtualItem; + LastItem: PVirtualItem; + LastSelected: PVirtualItem; + ClearAll: Boolean; + FSelectionCount: DWord; + FTilesCount: DWord; + + function GetSelected(Item: PVirtualItem): Boolean; + procedure SetSelected(Item: PVirtualItem; Value: Boolean); + function GetFocusedNode(): PVirtualItem; + procedure SetFocusedNode(Item: PVirtualItem); + + public + constructor Create(AOwner: TComponent); override; + procedure UpdateHintCanvas(newCanvas: TCanvas); + procedure DoGetHintSize(Node: PVirtualNode; Column: TColumnIndex; var R: TRect); override; + + procedure UpdateTileColumn(count: Word; Forse: Boolean = False); + //function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode; override; + function AddChild(ParentItem: PVirtualNode; UserData: Pointer = nil): PVirtualNode; override; + function AddItem(ParentItem: PVirtualItem; UserData: Pointer = nil): PVirtualItem; + function GetFirst(ConsiderChildrenAbove: Boolean = False): PVirtualItem; + function GetNext(Item: PVirtualItem; ConsiderChildrenAbove: Boolean = False): PVirtualItem; + function GetLast(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualItem; + function GetItemAt(Node: PVirtualNode; Column: TColumnIndex): PVirtualItem; + function GetNodeData(Item: PVirtualItem): Pointer; + procedure Clear; override; + + function GetFirstSelected(ConsiderChildrenAbove: Boolean = False): PVirtualItem; + function GetNextSelected(Item: PVirtualItem; ConsiderChildrenAbove: Boolean = False): PVirtualItem; + property Selected[Item: PVirtualItem]: Boolean read GetSelected write SetSelected; + procedure ClearSelection; + procedure DeleteSelectedNodes; override; + + property FocusedNode: PVirtualItem read GetFocusedNode write SetFocusedNode; + + procedure DoPaintNode(var PaintInfo: TVTPaintInfo); override; + procedure PrepareCell(var PaintInfo: TVTPaintInfo; WindowOrgX, MaxWidth: Integer); override; + procedure DoPaintDropMark(Canvas: TCanvas; Node: PVirtualNode; const R: TRect); override; + + procedure HandleMouseDblClick(var Message: TLMMouse; const HitInfo: THitInfo); override; + procedure HandleMouseDown(var Message: TLMMouse; var HitInfo: THitInfo); override; + procedure HandleMouseUp(var Message: TLMMouse; const HitInfo: THitInfo); override; + + property SelectedCount: Dword read FSelectionCount; + property TilesCount: Dword read FTilesCount; + end; + +function SendInput(nInputs:UINT; pInputs:POINTER; cbSize:INTEGER):UINT; stdcall; external 'User32.dll' name 'SendInput'; + +Implementation + +//---------------------------------------------------------------------------------------------------------------------- + +constructor TVirtualList.Create(AOwner: TComponent); +var + Pvdt: TVirtualDrawTree; + column: TVirtualTreeColumn; + c: Integer; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create START'); + if not (AOwner is TVirtualDrawTree) then begin + Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create(AOwner: TVirtualDrawTree) must get argument TVirtualDrawTree'); + Assert(not (AOwner is TVirtualDrawTree), 'TVirtualTree.Create(AOwner: TVirtualDrawTree) must get argument TVirtualDrawTree'); + Abort; + Halt; + end; + inherited Create(AOwner.Owner); + Pvdt := TVirtualDrawTree(AOwner); + Self.Parent := Pvdt.Parent; + + FSelectionCount := 0; + FTilesCount:= 0; + TileColumn := 1; + ClearAll := True; + + // Копирование свойств + Self.AnchorSideTop.Control := Pvdt.AnchorSideTop.Control; + Self.AnchorSideTop.Side := Pvdt.AnchorSideTop.Side; + Self.AnchorSideLeft.Control := Pvdt.AnchorSideLeft.Control; + Self.AnchorSideLeft.Side := Pvdt.AnchorSideLeft.Side; + Self.AnchorSideRight.Control := Pvdt.AnchorSideRight.Control; + Self.AnchorSideRight.Side := Pvdt.AnchorSideRight.Side; + Self.AnchorSideBottom.Control := Pvdt.AnchorSideBottom.Control; + Self.AnchorSideBottom.Side := Pvdt.AnchorSideBottom.Side; + + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create 0'); + + Self.Left := Pvdt.Left; + Self.Height := Pvdt.Height; + Self.Hint := Pvdt.Hint; + Self.Top := Pvdt.Top; + Self.Width := Pvdt.Width; + Self.Anchors := Pvdt.Anchors; + Self.BorderSpacing.Top := Pvdt.BorderSpacing.Top; + Self.BorderSpacing.Left := Pvdt.BorderSpacing.Left; + Self.BorderSpacing.Right := Pvdt.BorderSpacing.Right; + Self.BorderSpacing.Bottom := Pvdt.BorderSpacing.Bottom; + Self.BiDiMode := Pvdt.BiDiMode; + Self.Tag := Pvdt.Tag; + Self.Color := Pvdt.Color; + Self.Colors.DropMarkColor := Pvdt.Colors.DropMarkColor; + Self.Colors.DropTargetColor := Pvdt.Colors.DropTargetColor; + Self.Colors.DropTargetBorderColor := Pvdt.Colors.DropTargetBorderColor; + Self.Colors.BorderColor := Pvdt.Colors.BorderColor; + Self.Colors.GridLineColor := Pvdt.Colors.GridLineColor; + Self.Colors.TreeLineColor := Pvdt.Colors.TreeLineColor; + Self.Colors.FocusedSelectionColor := Pvdt.Colors.FocusedSelectionColor; + Self.Colors.FocusedSelectionBorderColor := Pvdt.Colors.FocusedSelectionBorderColor; + Self.Colors.SelectionRectangleBlendColor := Pvdt.Colors.SelectionRectangleBlendColor; + Self.Colors.UnfocusedSelectionColor := Pvdt.Colors.UnfocusedSelectionColor; + Self.Colors.UnfocusedSelectionBorderColor := Pvdt.Colors.UnfocusedSelectionBorderColor; + Self.Constraints.MinHeight := Pvdt.Constraints.MinHeight; + Self.Constraints.MinWidth := Pvdt.Constraints.MinWidth; + Self.Constraints.MaxHeight := Pvdt.Constraints.MaxHeight; + Self.Constraints.MaxWidth := Pvdt.Constraints.MaxWidth; + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create 0___'); +// Self.DefaultNodeHeight := Pvdt.DefaultNodeHeight; + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create 0&&&'); + Self.DragKind := PVdt.DragKind; + Self.DragMode := Pvdt.DragMode; + Self.DragOperations := Pvdt.DragOperations; + Self.DragType := Pvdt.DragType; + Self.DrawSelectionMode := Pvdt.DrawSelectionMode; + Self.Font.Height := Pvdt.Font.Height; + Self.Font.Name := Pvdt.Font.Name; + Self.Font.Color := Pvdt.Font.Color; + Self.Font.Style := Pvdt.Font.Style; + Self.Font.Underline := Pvdt.Font.Underline; + Self.Font.Orientation := Pvdt.Font.Orientation; + Self.Font.Size := Pvdt.Font.Size; + Self.Font.Pitch := Pvdt.Font.Pitch; + Self.Font.Quality := Pvdt.Font.Quality; + + Self.Header.AutoSizeIndex := Pvdt.Header.AutoSizeIndex; + Self.Header.DefaultHeight := Pvdt.Header.DefaultHeight; + Self.Header.MainColumn := Pvdt.Header.MainColumn; + Self.Header.Options := Pvdt.Header.Options; + Self.Header.ParentFont := Pvdt.Header.ParentFont; + Self.Header.Style := Pvdt.Header.Style; + Self.HintMode := Pvdt.HintMode; + Self.ParentFont := Pvdt.ParentFont; + Self.ParentShowHint := Pvdt.ParentShowHint; + Self.PopupMenu := Pvdt.PopupMenu; + Self.ScrollBarOptions.AlwaysVisible := Pvdt.ScrollBarOptions.AlwaysVisible; + Self.ScrollBarOptions.ScrollBars := Pvdt.ScrollBarOptions.ScrollBars; + Self.ShowHint := Pvdt.ShowHint; + Self.TabOrder := Pvdt.TabOrder; + Self.TreeOptions.AutoOptions := Pvdt.TreeOptions.AutoOptions; + Self.TreeOptions.MiscOptions := Pvdt.TreeOptions.MiscOptions; + Self.TreeOptions.PaintOptions := Pvdt.TreeOptions.PaintOptions; + Self.TreeOptions.SelectionOptions := Pvdt.TreeOptions.SelectionOptions; + + // Копирование событий + Self.OnChange := Pvdt.OnChange; + Self.OnClick := Pvdt.OnClick; + Self.OnDrawHint := Pvdt.OnDrawHint; + Self.OnDrawNode := Pvdt.OnDrawNode; + Self.OnEnter := Pvdt.OnEnter; + Self.OnGetHintSize := Pvdt.OnGetHintSize; + Self.OnKeyDown := Pvdt.OnKeyDown; + Self.OnKeyPress := Pvdt.OnKeyPress; + Self.OnMouseDown := Pvdt.OnMouseDown; + Self.OnMouseMove := Pvdt.OnMouseMove; + Self.OnScroll := Pvdt.OnScroll; + Self.OnDragAllowed := Pvdt.OnDragAllowed; + Self.OnDragDrop := Pvdt.OnDragDrop; + Self.OnDragOver := Pvdt.OnDragOver; + + + // Копирование колонок + for c := 0 to Pvdt.Header.Columns.Count-1 do begin + column := Self.Header.Columns.Add; + column.Options := Pvdt.Header.Columns[c].Options; + column.Position := Pvdt.Header.Columns[c].Position; + column.MaxWidth := Pvdt.Header.Columns[c].MaxWidth; + column.MinWidth := Pvdt.Header.Columns[c].MinWidth; + column.Width := Pvdt.Header.Columns[c].Width; + column.Spacing := Pvdt.Header.Columns[c].Spacing; + column.Margin := Pvdt.Header.Columns[c].Margin; + column.Style := Pvdt.Header.Columns[c].Style; + column.Text := Pvdt.Header.Columns[c].Text; + end; + + Pvdt.Destroy; + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Create DONE'); +end; + +//---------------------------------------------------------------------------------------------------------------------- + +procedure TVirtualList.UpdateHintCanvas(newCanvas: TCanvas); +begin + // Для перерисовки тултипа нужна его канва, достать ее можно только при получении + // сообщения CM_HINTSHOW (см CMHintShow), но так как все нужные свойства закрыты + // единственным способом ее получения является обработчик события OnDrawHint + Self.HintCanvas := newCanvas; +end; + +procedure TVirtualList.DoGetHintSize(Node: PVirtualNode; Column: TColumnIndex; var R: TRect); +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.DoGetHintSize %d', [Column]); + inherited DoGetHintSize(Node, Column, R); + if (Self.HintCanvas <> nil) then begin + //Self.HintCanvas.Brush.Color := clRed; + Self.HintCanvas.Brush.Style := bsSolid; + Self.HintCanvas.FillRect(0,0,Self.HintCanvas.Width, Self.HintCanvas.Height); + inherited DoDrawHint(Self.HintCanvas, Node, R, Column); + end; +end; + +//---------------------------------------------------------------------------------------------------------------------- + +procedure TVirtualList.UpdateTileColumn(count: Word; Forse: Boolean = False); +var + data, RawData, NodeDat: PByte; + n, c: DWord; + node: PVirtualNode; + item: PVirtualItem; +begin + if (not Forse and ((Self.TileColumn = count) or (Self.Header.Columns.Count <= count))) + then Exit; + + getmem(RawData, NodeDataSize * RootNodeCount + NodeDataSize div Self.TileColumn * count); + data := RawData; + node := inherited GetFirst(False); + while node <> nil do begin + Move(inherited GetNodeData(node)^, data^, NodeDataSize); + inc(data, NodeDataSize); + node := inherited GetNext(node, False); + end; + + SetRoundMode(rmUp); + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.UpdateTileColumn %d %d %d', [Self.RootNodeCount, Self.TileColumn, count]); + //nodes := Round(Self.RootNodeCount * Self.TileColumn / count); + SetRoundMode(rmNearest); + Self.ClearAll := False; + inherited Clear; + Self.NodeDataSize := Self.NodeDataSize div Self.TileColumn * count; + Self.ClearAll := True; + Self.TileColumn := count; + + item := Self.FirstItem; + data := RawData; + //if (item <> nil) then + n:=0; + while item <> nil do begin + if (item^.NextItem = nil) + then Break; + node := inherited AddChild(nil); + NodeDat := inherited GetNodeData(node); + Move(data^, NodeDat^, Self.NodeDataSize); + inc(data, Self.NodeDataSize); + for c:=0 to Self.TileColumn - 1 do begin + if (item^.NextItem = nil) + then Break; + item^.Node := node; + item^.Column := c; + item := item^.NextItem; + end; + inc(n, +1); + end; + freemem(RawData); + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.UpdateTileColumn %s', ['Done']); +end; + +function TVirtualList.AddChild(ParentItem: PVirtualNode; UserData: Pointer = nil): PVirtualNode; +begin + Result := PVirtualNode(Self.AddItem(PVirtualItem(Parent), UserData)); +end; + +function TVirtualList.AddItem(ParentItem: PVirtualItem; UserData: Pointer = nil): PVirtualItem; +var + item: PVirtualItem; +begin +// Logger.Send([lcClient, lcDebug], 'TVirtualTree.AddChild %s', ['Start']); + getmem(item, SizeOf(TVirtualItem)); + item^.NextItem:=nil; + item^.Selected:=False; + if ((Self.LastItem = nil) or (Self.LastItem^.Column = Self.TileColumn - 1)) + then begin + item^.Node := inherited AddChild(nil); + item^.Column := 0; + if (Self.FirstItem = nil) + then Self.FirstItem := item; + end else begin + item^.Node := Self.LastItem^.Node; + item^.Column := Self.LastItem^.Column + 1; + end; + if (Self.LastItem <> nil) + then Self.LastItem^.NextItem := item; + Self.LastItem := item; + Result := item; + inc(FTilesCount, +1); +// Logger.Send([lcClient, lcDebug], 'TVirtualTree.AddChild %s', ['Done']); +end; + +function TVirtualList.GetFirst(ConsiderChildrenAbove: Boolean = False): PVirtualItem; +begin + Result := Self.FirstItem; +end; + +function TVirtualList.GetNext(Item: PVirtualItem; ConsiderChildrenAbove: Boolean = False): PVirtualItem; +begin + Result := Item^.NextItem; +end; + +function TVirtualList.GetLast(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualItem; +begin + Result := Self.LastItem; +end; + +function TVirtualList.GetItemAt(Node: PVirtualNode; Column: TColumnIndex): PVirtualItem; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetItemAt %s', ['Start']); + if (Column < 0) or (Column >= Self.Header.Columns.Count) then begin + Result := nil; + Exit; + end; + + Result := Self.FirstItem; + while (Result <> nil) and ((Result^.Node <> Node) or (Result^.Column <> Word(Self.Header.Columns[Column].Tag))) + do Result := Result^.NextItem; +end; + +function TVirtualList.GetNodeData(Item: PVirtualItem): Pointer; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetNodeData %s', ['Start']); + Result := inherited GetNodeData(Item^.Node) + (Item^.Column * NodeDataSize div Self.TileColumn); +end; + +procedure TVirtualList.Clear; +var + item: PVirtualItem; + next: PVirtualItem; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.Clear %s', ['Called']); + // Злоябучий паскаль автоматически вызывает чистку при изменении NodeDataSize, что не всегда нужно... + if (Self.ClearAll) and (Self.FirstItem <> nil) then begin + next := Self.FirstItem; + while (next <> nil) do begin + item := next; + next := next^.NextItem; + freemem(item); + end; + Self.FirstItem:=nil; + Self.LastItem:=nil; + end; + inherited; + FTilesCount := 0; + FSelectionCount := 0; +end; + +//---------------------------------------------------------------------------------------------------------------------- + +function TVirtualList.GetFirstSelected(ConsiderChildrenAbove: Boolean = False): PVirtualItem; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetFirstSelected %s', ['']); + Result := Self.FirstItem; + while ((Result <> nil) and (not Result^.Selected)) do begin + Result := Result^.NextItem; + end; +end; + +function TVirtualList.GetNextSelected(Item: PVirtualItem; ConsiderChildrenAbove: Boolean = False): PVirtualItem; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetNextSelected %s', ['']); + Result := Item^.NextItem; + while ((Result <> nil) and (not Result^.Selected)) do begin + Result := Result^.NextItem; + end; +end; + +function TVirtualList.GetSelected(Item: PVirtualItem): Boolean; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetSelected %s', ['']); + Result := Item^.Selected; +end; + +procedure TVirtualList.SetSelected(Item: PVirtualItem; Value: Boolean); +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.SetSelected %s', ['']); + if (Item^.Selected = Value) + then Exit; + Item^.Selected := Value; + if not Value + then Dec(FSelectionCount) + else begin + Inc(FSelectionCount); + Self.LastSelected := Item; + end; + // TODO: Обновить отображение выделения +end; + +procedure TVirtualList.ClearSelection; +var + item: PVirtualItem; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.ClearSelection %s', ['']); + item := Self.FirstItem; + while (item <> nil) do begin + Self.SetSelected(item, False); + item := item^.NextItem; + end; + FSelectionCount := 0; + inherited ClearSelection; +end; + +procedure TVirtualList.DeleteSelectedNodes; +var + item, next, prev: PVirtualItem; + node: PVirtualNode; + data, RawData: PByte; + size: Word; + c: Word; +begin + if (Self.GetFirstSelected() = nil) + then Exit; + + size := NodeDataSize div Self.TileColumn; + getmem(RawData, NodeDataSize * RootNodeCount); + data := RawData; + + prev := nil; + item := Self.FirstItem; + while (item <> nil) do begin + if (item^.Selected) then begin + next := item^.NextItem; + Dec(FTilesCount); + freemem(item); + if (prev <> nil) then begin + prev^.NextItem := next; + end else begin + Self.FirstItem := next; + end; + if (next = nil) then begin + Self.LastItem := prev; + end; + item := next; + end else begin + Move((inherited GetNodeData(item^.Node) + (size * item^.Column))^, data^, size); + inc(data, size); + prev := item; + item := item^.NextItem; + end; + end; + + data := RawData; + item := Self.FirstItem; + node := inherited GetFirst(); + while (node <> nil) do begin + Move(data^, inherited GetNodeData(node)^, NodeDataSize); + Inc(data, NodeDataSize); + for c := 0 to Self.TileColumn - 1 do + if item <> nil then begin + item^.Node := node; + item^.Column := c; + item := item^.NextItem; + end else Break; + if (item = nil) + then Break; + node := inherited GetNext(node); + end; + + if (Self.LastItem = nil) + then inherited Clear + else begin + item := Self.LastItem^.NextItem; + while (item <> nil) do begin + if (item^.Node <> Self.LastItem^.Node) then begin + node := item^.Node; + while (node <> nil) do begin + inherited DeleteNode(node, False); + node := inherited GetNext(node); + end; + Break; + end; + item := item^.NextItem; + end; + end; + + freemem(RawData); + Self.LastSelected := nil; + FSelectionCount := 0; +end; + +//---------------------------------------------------------------------------------------------------------------------- + +function TVirtualList.GetFocusedNode(): PVirtualItem; +var + node: PVirtualNode; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.GetFocusedNode %s', ['']); + node := inherited FocusedNode; + Result := Self.FirstItem; + while ((Result <> nil) and (Result^.Node <> node)) + do Result := Result^.NextItem; +end; + +procedure TVirtualList.SetFocusedNode(Item: PVirtualItem); +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.SetFocusedNode %s', ['']); + inherited FocusedNode := Item^.Node; +end; + +//---------------------------------------------------------------------------------------------------------------------- + +procedure TVirtualList.DoPaintNode(var PaintInfo: TVTPaintInfo); +var + item: PVirtualItem; + node: PVirtualNode; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.DoPaintNode %s', ['Start']); + item := Self.FirstItem;//^.NextItem; + while ((item <> nil) and ((item^.Node^.Index <> PaintInfo.Node^.Index) or (item^.Column <> Word(Self.Header.Columns[PaintInfo.Column].Tag)))) + do item := item^.NextItem; + if (item <> nil) then begin + node := PaintInfo.Node; + PaintInfo.Node := PVirtualNode(item); + inherited DoPaintNode(PaintInfo); + PaintInfo.Node := node; + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.DoPaintNode %s', ['Done']); + + if (item^.Selected and (item = Self.LastSelected)) + then PaintInfo.Canvas.Pen.Color := Colors.FocusedSelectionBorderColor + else if item^.Selected + then PaintInfo.Canvas.Pen.Color := Colors.UnfocusedSelectionBorderColor + else PaintInfo.Canvas.Pen.Color := Colors.BorderColor; + //PaintInfo.Canvas.Pen.Color := clRed; + PaintInfo.Canvas.Pen.Style := psDot;//psSolid; + PaintInfo.Canvas.Pen.Width := 1; + + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.DoPaintNode [%d,%d,%d,%d] [%d,%d]', [PaintInfo.CellRect.Left, PaintInfo.CellRect.Top, + //PaintInfo.CellRect.Right - PaintInfo.CellRect.Left, PaintInfo.CellRect.Bottom - PaintInfo.CellRect.Top, PaintInfo.Canvas.Width, PaintInfo.Canvas.Height]); + PaintInfo.Canvas.Line(PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Bottom-1,PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Bottom-1); + PaintInfo.Canvas.Line(PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Top+1,PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Top+1); + if Self.TileColumn > 1 then begin + PaintInfo.Canvas.Line(PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Top+1,PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Bottom-1); + PaintInfo.Canvas.Line(PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Bottom-1,PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Top+1); + end; + + PaintInfo.Canvas.Pen.Color := Color; + PaintInfo.Canvas.Pen.Style := psSolid; + PaintInfo.Canvas.Line(PaintInfo.CellRect.Left,PaintInfo.CellRect.Bottom,PaintInfo.CellRect.Right,PaintInfo.CellRect.Bottom); + PaintInfo.Canvas.Line(PaintInfo.CellRect.Right,PaintInfo.CellRect.Top,PaintInfo.CellRect.Left,PaintInfo.CellRect.Top); + if Self.TileColumn > 1 then begin + PaintInfo.Canvas.Line(PaintInfo.CellRect.Left,PaintInfo.CellRect.Top,PaintInfo.CellRect.Left,PaintInfo.CellRect.Bottom); + PaintInfo.Canvas.Line(PaintInfo.CellRect.Right,PaintInfo.CellRect.Bottom,PaintInfo.CellRect.Right,PaintInfo.CellRect.Top); + PaintInfo.Canvas.Pixels[PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Top+1] := Color; + PaintInfo.Canvas.Pixels[PaintInfo.CellRect.Left+1,PaintInfo.CellRect.Bottom-1] := Color; + PaintInfo.Canvas.Pixels[PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Bottom-1] := Color; + PaintInfo.Canvas.Pixels[PaintInfo.CellRect.Right-1,PaintInfo.CellRect.Top+1] := Color; + end; + + + //PaintInfo.Canvas.Rectangle(PaintInfo.CellRect); + //PaintInfo.Canvas.Line(Rect(1,1,PaintInfo.Canvas.Width-2, PaintInfo.Canvas.Height-2)); + //PaintInfo.Canvas.Rectangle(Rect(1,1,PaintInfo.Canvas.Width-2, PaintInfo.Canvas.Height-2)); + //PaintInfo.Canvas.Line(1,1,PaintInfo.Canvas.Width-2,PaintInfo.Canvas.Height-2); + //PaintInfo.Canvas.Line(1,1,1,PaintInfo.Canvas.Height-2); + //PaintInfo.Canvas.Line(1,PaintInfo.Canvas.Height-2,PaintInfo.Canvas.Width-2,PaintInfo.Canvas.Height-2); + //PaintInfo.Canvas.Line(PaintInfo.Canvas.Width-4,PaintInfo.Canvas.Height-2,PaintInfo.Canvas.Width-4,1); + //PaintInfo.Canvas.Line(0,PaintInfo.Canvas.Width,0,0); + end; +end; + +procedure TVirtualList.PrepareCell(var PaintInfo: TVTPaintInfo; WindowOrgX, MaxWidth: Integer); +var + item: PVirtualItem; +begin + inherited PrepareCell(PaintInfo, WindowOrgX, MaxWidth); + + item := Self.GetItemAt(PaintInfo.Node, PaintInfo.Column); + if (item = nil) + then Exit; + if (item^.Selected and (item = Self.LastSelected)) + then PaintInfo.Canvas.Brush.Color := Colors.FocusedSelectionColor + else if item^.Selected + then PaintInfo.Canvas.Brush.Color := Colors.UnfocusedSelectionColor + else PaintInfo.Canvas.Brush.Color := Colors.GridLineColor; + PaintInfo.Canvas.Brush.Style := bsSolid; + PaintInfo.Canvas.FillRect(0,0,PaintInfo.Canvas.Width, PaintInfo.Canvas.Height); +end; + +procedure TVirtualList.DoPaintDropMark(Canvas: TCanvas; Node: PVirtualNode; const R: TRect); +begin + +end; + +//---------------------------------------------------------------------------------------------------------------------- + +procedure TVirtualList.HandleMouseDblClick(var Message: TLMMouse; const HitInfo: THitInfo); +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.HandleMouseDblClick %s', ['Start']); + inherited HandleMouseDblClick(Message, HitInfo); +end; + +procedure TVirtualList.HandleMouseDown(var Message: TLMMouse; var HitInfo: THitInfo); +var + ShiftState: TShiftState; + HitItem: PVirtualItem; + item: PVirtualItem; + kinput: TKEYINPUT; +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.HandleMouseDown %s', ['Start']); + HitItem := Self.GetItemAt(HitInfo.HitNode, HitInfo.HitColumn); + if (HitItem = nil) then begin + inherited HandleMouseDown(Message, HitInfo); + Exit; + end; + + ShiftState := KeysToShiftState(Message.Keys) * [ssShift, ssCtrl, ssAlt]; + if not (ssAlt in ShiftState) then begin + if (not (ssCtrl in ShiftState)) and (not (ssShift in ShiftState)) then begin + if (not HitItem^.Selected) + then Self.ClearSelection; + Self.SetSelected(HitItem, True); + end else if not (ssShift in ShiftState) then begin + Self.SetSelected(HitItem, not HitItem^.Selected); + end else begin + if not (ssCtrl in ShiftState) + then Self.ClearSelection; + if Self.LastSelected = nil + then Self.LastSelected := Self.FirstItem; + + if Self.LastSelected^.Node^.Index < HitItem^.Node^.Index then begin + item := Self.LastSelected; + HitItem := HitItem; + end else begin + item := HitItem; + HitItem := Self.LastSelected; + end; + while item <> HitItem^.NextItem do begin + Self.SetSelected(item, True); + item := item^.NextItem; + end; + end; + end; + + // Вызываем перерисовку контрола (тутбы потом понормальному сделать...) + if (Self.Focused) then begin + Self.Parent.SetFocus; + Self.SetFocus; + end; + inherited HandleMouseDown(Message, HitInfo); + + // Чтоже я творю-то... + if (ShiftState = []) then begin + kinput.itype := INPUT_KEYBOARD; + kinput.wVk := $11; // VK_CONTROL + SendInput(1, @kinput, sizeof(TKEYINPUT)); + BeginDrag(TRUE); + kinput.dwFlags := KEYEVENTF_KEYUP; + SendInput(1, @kinput, sizeof(TKEYINPUT)); + end; + +end; + +procedure TVirtualList.HandleMouseUp(var Message: TLMMouse; const HitInfo: THitInfo); +begin + //Logger.Send([lcClient, lcDebug], 'TVirtualTree.HandleMouseUp %s', ['Start']); + inherited HandleMouseUp(Message, HitInfo); +end; + +//---------------------------------------------------------------------------------------------------------------------- + + + +end. diff --git a/Client/ResourceList.txt b/Client/ResourceList.txt index 42f9920..943c827 100644 --- a/Client/ResourceList.txt +++ b/Client/ResourceList.txt @@ -1,5 +1,40 @@ +Sounds/MusicInf.wav +GLFont/DejaVu.png +GLFont/DejaVu.fnt Overlay/LeftTopArrow.tga Overlay/TopArrow.tga Overlay/VirtualLayer.tga -GLFont/DejaVu.png -GLFont/DejaVu.fnt +Overlay/LightBulb_24nn.tga +Overlay/LightBulb_24bw.tga +Overlay/LightBulb_24tw.tga +Overlay/LightBulb_24bo.tga +Overlay/LightBulb_24to.tga +Overlay/LightBulb_24by.tga +Overlay/LightBulb_24ty.tga +Overlay/LightBulb_24ny.tga +Overlay/LightBulb_24bl.tga +Overlay/LightBulb_24bb.tga +Overlay/LightBulb_24tb.tga +Overlay/LightBulb_24bg.tga +Overlay/LightBulb_24tg.tga +Overlay/LightBulb_24br.tga +Overlay/LightBulb_24bp.tga +Overlay/Splash.bmp +Overlay/About.bmp +Cursors/BC_NormalSelect.cur +Cursors/BC_WorkingInBackground.cur +Cursors/BC_HelpSelect.cur +Cursors/BC_PrecisionSelect.cur +Cursors/BC_TextSelect.cur +Cursors/BI_Busy.ani +Cursors/TN_Unavailable.cur +Cursors/BC_Move.cur +Cursors/BC_DiagonalResize2.cur +Cursors/BC_VerticalResize.cur +Cursors/BC_DiagonalResize1.cur +Cursors/BC_HorizontalResize.cur +Cursors/BC_AlternateSelect.cur +Cursors/TN_LinkSelect.cur +Cursors/UO_Precision.cur +Cursors/UO_AttackMode.cur +Cursors/UO_Gauntlet.cur \ No newline at end of file diff --git a/Client/Sounds/MusicInf.wav b/Client/Sounds/MusicInf.wav new file mode 100644 index 0000000000000000000000000000000000000000..1904268310235b33efd692aaef2055e9bddd1d13 GIT binary patch literal 616186 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�G+!eGtp1 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%0D$$%`U8|=m|A9yeE(f%!v0K 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 literal 0 HcmV?d00001 diff --git a/Client/Tools/UfrmBoundaries.lfm b/Client/Tools/UfrmBoundaries.lfm index 1db4b5e..15e8418 100644 --- a/Client/Tools/UfrmBoundaries.lfm +++ b/Client/Tools/UfrmBoundaries.lfm @@ -1,47 +1,313 @@ inherited frmBoundaries: TfrmBoundaries - Left = 290 - Height = 164 - Top = 171 - Width = 205 - Caption = 'Boundaries' - ClientHeight = 164 - ClientWidth = 205 - object lblMaxZ: TLabel[0] + Left = 1259 + Height = 141 + Top = 502 + Width = 403 + Anchors = [akTop, akLeft, akBottom] + Caption = 'Границы видимости' + ClientHeight = 141 + ClientWidth = 403 + OnCreate = FormCreate + object tbMaxZ: TTrackBar[0] AnchorSideLeft.Control = Owner - AnchorSideTop.Control = seMaxZ - AnchorSideTop.Side = asrCenter - Left = 8 - Height = 16 - Top = 89 - Width = 68 - BorderSpacing.Left = 8 - Caption = 'Maximum Z:' - Layout = tlCenter - ParentColor = False - end - object lblMinZ: TLabel[1] - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = seMinZ - AnchorSideTop.Side = asrCenter - Left = 8 - Height = 16 - Top = 12 - Width = 67 - BorderSpacing.Left = 8 - Caption = 'Minimum Z:' - Layout = tlCenter - ParentColor = False - end - object tbMinZ: TTrackBar[2] - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = seMinZ - AnchorSideTop.Side = asrBottom + AnchorSideTop.Control = tbMinZ AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 - Height = 36 - Top = 41 - Width = 189 + Height = 30 + Top = 28 + Width = 387 + Frequency = 10 + Max = 127 + Min = -128 + OnChange = tbMaxZChange + PageSize = 1 + Position = 127 + TickMarks = tmTopLeft + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 8 + BorderSpacing.Top = 20 + BorderSpacing.Right = 8 + TabOrder = 1 + end + object GroupBox1: TGroupBox[1] + AnchorSideLeft.Control = tbMaxZ + AnchorSideTop.Control = tbMaxZ + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = tbMaxZ + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 216 + Height = 72 + Top = 60 + Width = 179 + Anchors = [akTop, akRight] + BorderSpacing.Top = 2 + BorderSpacing.Bottom = 4 + Caption = 'Границы высоты' + ClientHeight = 54 + ClientWidth = 175 + TabOrder = 2 + object seMinZ: TSpinEdit + AnchorSideTop.Control = GroupBox1 + AnchorSideRight.Control = GroupBox1 + AnchorSideRight.Side = asrBottom + Left = 119 + Height = 23 + Top = 0 + Width = 48 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + MaxValue = 127 + MinValue = -128 + OnChange = seMinZChange + TabOrder = 0 + Value = -128 + end + object seMaxZ: TSpinEdit + AnchorSideTop.Control = seMinZ + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox1 + AnchorSideRight.Side = asrBottom + Left = 119 + Height = 23 + Top = 28 + Width = 48 + Anchors = [akTop, akRight] + BorderSpacing.Top = 5 + BorderSpacing.Right = 8 + MaxValue = 127 + MinValue = -128 + OnChange = seMaxZChange + TabOrder = 1 + Value = 127 + end + object lblMinZ: TLabel + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = seMinZ + AnchorSideTop.Side = asrCenter + Left = 8 + Height = 16 + Top = 3 + Width = 93 + BorderSpacing.Left = 8 + BorderSpacing.Top = 6 + Caption = 'Z Минимальная:' + Layout = tlCenter + ParentColor = False + end + object lblMaxZ: TLabel + AnchorSideLeft.Control = lblMinZ + AnchorSideTop.Control = seMaxZ + AnchorSideTop.Side = asrCenter + Left = 8 + Height = 16 + Top = 31 + Width = 97 + Caption = 'Z Максимальная:' + Layout = tlCenter + ParentColor = False + end + end + object GroupBox2: TGroupBox[2] + AnchorSideLeft.Control = tbMaxZ + AnchorSideTop.Control = GroupBox1 + AnchorSideRight.Control = GroupBox1 + AnchorSideBottom.Control = GroupBox1 + AnchorSideBottom.Side = asrBottom + Left = 8 + Height = 72 + Top = 60 + Width = 201 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Right = 7 + Caption = 'Границы дальности обзора' + ClientHeight = 54 + ClientWidth = 197 + TabOrder = 3 + object seMaxX: TSpinEdit + AnchorSideTop.Control = GroupBox2 + AnchorSideRight.Control = GroupBox2 + AnchorSideRight.Side = asrBottom + Left = 137 + Height = 23 + Top = 0 + Width = 54 + Anchors = [akTop, akRight] + BorderSpacing.Right = 6 + MaxValue = 12288 + OnChange = seMaxXChange + TabOrder = 0 + Value = 12288 + end + object seMaxY: TSpinEdit + AnchorSideTop.Control = seMaxX + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox2 + AnchorSideRight.Side = asrBottom + Left = 137 + Height = 23 + Top = 28 + Width = 54 + Anchors = [akTop, akRight] + BorderSpacing.Top = 5 + BorderSpacing.Right = 6 + MaxValue = 8192 + OnChange = seMaxYChange + TabOrder = 1 + Value = 8192 + end + object seMinY: TSpinEdit + AnchorSideTop.Control = seMaxY + AnchorSideRight.Control = seMaxY + Left = 64 + Height = 23 + Top = 28 + Width = 54 + Anchors = [akTop, akRight] + BorderSpacing.Right = 19 + MaxValue = 8192 + OnChange = seMinYChange + TabOrder = 2 + end + object seMinX: TSpinEdit + AnchorSideTop.Control = seMaxX + AnchorSideRight.Control = seMaxX + Left = 64 + Height = 23 + Top = 0 + Width = 54 + Anchors = [akTop, akRight] + BorderSpacing.Right = 19 + MaxValue = 12288 + OnChange = seMinXChange + TabOrder = 3 + end + object lblAxeX: TLabel + AnchorSideLeft.Control = sbClearXbnd + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = seMinZ + AnchorSideTop.Side = asrCenter + Left = 23 + Height = 16 + Top = 3 + Width = 35 + BorderSpacing.Left = 3 + BorderSpacing.Top = 6 + Caption = 'Ось X:' + Layout = tlCenter + ParentColor = False + end + object lblAxeY: TLabel + AnchorSideLeft.Control = sbClearYbnd + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = seMinZ + AnchorSideTop.Side = asrCenter + Left = 23 + Height = 16 + Top = 31 + Width = 35 + BorderSpacing.Left = 3 + BorderSpacing.Top = 6 + Caption = 'Ось Y:' + Layout = tlCenter + ParentColor = False + end + object lblAxeX1: TLabel + AnchorSideLeft.Control = seMinX + AnchorSideTop.Control = seMaxX + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = seMaxX + AnchorSideRight.Side = asrBottom + Left = 112 + Height = 16 + Top = 3 + Width = 31 + Alignment = taCenter + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 48 + BorderSpacing.Top = 6 + BorderSpacing.Right = 48 + Caption = '—' + Layout = tlCenter + ParentColor = False + end + object lblAxeY1: TLabel + AnchorSideLeft.Control = seMinY + AnchorSideTop.Control = seMaxY + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = seMaxY + AnchorSideRight.Side = asrBottom + Left = 112 + Height = 16 + Top = 31 + Width = 31 + Alignment = taCenter + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 48 + BorderSpacing.Top = 6 + BorderSpacing.Right = 48 + Caption = '—' + Layout = tlCenter + ParentColor = False + end + object sbClearXbnd: TSpeedButton + AnchorSideLeft.Control = GroupBox2 + AnchorSideTop.Control = seMaxX + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblAxeX + Left = 4 + Height = 16 + Top = 3 + Width = 16 + BorderSpacing.Left = 4 + BorderSpacing.Right = 2 + Caption = '✇' + Font.CharSet = RUSSIAN_CHARSET + Font.Height = -8 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Quality = fqDraft + NumGlyphs = 0 + OnClick = sbClearXbndClick + ShowHint = True + ParentFont = False + ParentShowHint = False + end + object sbClearYbnd: TSpeedButton + AnchorSideLeft.Control = GroupBox2 + AnchorSideTop.Control = seMaxY + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblAxeX + Left = 4 + Height = 16 + Top = 31 + Width = 16 + BorderSpacing.Left = 4 + BorderSpacing.Right = 2 + Caption = '✇' + Font.CharSet = RUSSIAN_CHARSET + Font.Height = -8 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Quality = fqDraft + NumGlyphs = 0 + OnClick = sbClearYbndClick + ShowHint = True + ParentFont = False + ParentShowHint = False + end + end + object tbMinZ: TTrackBar[3] + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 8 + Height = 30 + Top = 8 + Width = 387 Frequency = 10 Max = 127 Min = -128 @@ -52,58 +318,7 @@ inherited frmBoundaries: TfrmBoundaries BorderSpacing.Around = 8 TabOrder = 0 end - object tbMaxZ: TTrackBar[3] - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = seMaxZ - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 36 - Top = 118 - Width = 189 - Frequency = 10 - Max = 127 - Min = -128 - OnChange = tbMaxZChange - PageSize = 1 - Position = 127 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Around = 8 - TabOrder = 1 - end - object seMaxZ: TSpinEdit[4] - AnchorSideTop.Control = tbMinZ - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 149 - Height = 25 - Top = 85 - Width = 48 - Anchors = [akTop, akRight] - BorderSpacing.Right = 8 - MaxValue = 127 - MinValue = -128 - OnChange = seMaxZChange - TabOrder = 2 - Value = 127 - end - object seMinZ: TSpinEdit[5] - AnchorSideTop.Control = Owner - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 149 - Height = 25 - Top = 8 - Width = 48 - Anchors = [akTop, akRight] - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - MaxValue = 127 - MinValue = -128 - OnChange = seMinZChange - TabOrder = 3 - Value = -128 + inherited tmClose: TTimer[4] + left = 312 end end diff --git a/Client/Tools/UfrmBoundaries.pas b/Client/Tools/UfrmBoundaries.pas index 3dfbefc..a1a9c88 100644 --- a/Client/Tools/UfrmBoundaries.pas +++ b/Client/Tools/UfrmBoundaries.pas @@ -31,20 +31,39 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - ComCtrls, Spin, ExtCtrls, UfrmToolWindow; + ComCtrls, Spin, ExtCtrls, Buttons, UfrmToolWindow; type { TfrmBoundaries } TfrmBoundaries = class(TfrmToolWindow) + GroupBox1: TGroupBox; + GroupBox2: TGroupBox; + lblAxeX1: TLabel; + lblAxeY1: TLabel; lblMaxZ: TLabel; lblMinZ: TLabel; + lblAxeX: TLabel; + lblAxeY: TLabel; seMaxZ: TSpinEdit; seMinZ: TSpinEdit; + seMaxX: TSpinEdit; + seMaxY: TSpinEdit; + seMinY: TSpinEdit; + seMinX: TSpinEdit; + sbClearXbnd: TSpeedButton; + sbClearYbnd: TSpeedButton; tbMinZ: TTrackBar; tbMaxZ: TTrackBar; + procedure FormCreate(Sender: TObject); + procedure sbClearXbndClick(Sender: TObject); + procedure sbClearYbndClick(Sender: TObject); + procedure seMaxXChange(Sender: TObject); + procedure seMaxYChange(Sender: TObject); procedure seMaxZChange(Sender: TObject); + procedure seMinXChange(Sender: TObject); + procedure seMinYChange(Sender: TObject); procedure seMinZChange(Sender: TObject); procedure tbMaxZChange(Sender: TObject); procedure tbMinZChange(Sender: TObject); @@ -58,30 +77,101 @@ var implementation uses - UfrmMain; + UfrmMain, Language; { TfrmBoundaries } -procedure TfrmBoundaries.seMaxZChange(Sender: TObject); +procedure TfrmBoundaries.FormCreate(Sender: TObject); begin - tbMaxZ.Position := seMaxZ.Value; + LanguageTranslate(Self); + seMaxX.MaxValue := 8*frmMain.Landscape.Width-1; + seMinX.MaxValue := seMaxX.MaxValue; seMaxX.Value := seMaxX.MaxValue; + seMaxY.MaxValue := 8*frmMain.Landscape.Height-1; + seMinY.MaxValue := seMaxY.MaxValue; seMaxY.Value := seMaxY.MaxValue; +end; + +procedure TfrmBoundaries.sbClearXbndClick(Sender: TObject); +begin + seMinX.Value := seMinX.MinValue; + seMaxX.Value := seMaxX.MaxValue; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.sbClearYbndClick(Sender: TObject); +begin + seMinY.Value := seMinY.MinValue; + seMaxY.Value := seMaxY.MaxValue; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.seMinXChange(Sender: TObject); +begin + if (seMaxX.Value <= seMinX.Value) then if (seMinX.Value < seMaxX.MaxValue) + then seMaxX.Value := seMinX.Value+1 + else seMaxX.Value := seMaxX.MaxValue; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.seMaxXChange(Sender: TObject); +begin + if (seMinX.Value >= seMaxX.Value) then if (seMaxX.Value > seMinX.MinValue) + then seMinX.Value := seMaxX.Value-1 + else seMinX.Value := seMinX.MinValue; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.seMinYChange(Sender: TObject); +begin + if (seMaxY.Value <= seMinY.Value) then if (seMinY.Value < seMaxY.MaxValue) + then seMaxY.Value := seMinY.Value+1 + else seMaxY.Value := seMaxY.MaxValue; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.seMaxYChange(Sender: TObject); +begin + if (seMinY.Value >= seMaxY.Value) then if (seMaxY.Value > seMinY.MinValue) + then seMinY.Value := seMaxY.Value-1 + else seMinY.Value := seMinY.MinValue; frmMain.InvalidateFilter; end; procedure TfrmBoundaries.seMinZChange(Sender: TObject); begin + if (seMaxZ.Value <= seMinZ.Value) then if (seMinZ.Value < seMaxZ.MaxValue) + then seMaxZ.Value := seMinZ.Value+1 + else seMaxZ.Value := seMaxZ.MaxValue; tbMinZ.Position := seMinZ.Value; + tbMaxZ.Position := seMaxZ.Value; frmMain.InvalidateFilter; end; -procedure TfrmBoundaries.tbMaxZChange(Sender: TObject); +procedure TfrmBoundaries.seMaxZChange(Sender: TObject); begin - seMaxZ.Value := tbMaxZ.Position; + if (seMinZ.Value >= seMaxZ.Value) then if (seMaxZ.Value > seMinZ.MinValue) + then seMinZ.Value := seMaxZ.Value-1 + else seMinZ.Value := seMinZ.MinValue; + tbMaxZ.Position := seMaxZ.Value; + tbMinZ.Position := seMinZ.Value; frmMain.InvalidateFilter; end; procedure TfrmBoundaries.tbMinZChange(Sender: TObject); begin + if (tbMaxZ.Position <= tbMinZ.Position) then if (tbMinZ.Position < tbMaxZ.Max) + then tbMaxZ.Position := tbMinZ.Position+1 + else tbMaxZ.Position := tbMaxZ.Max; + seMinZ.Value := tbMinZ.Position; + seMaxZ.Value := tbMaxZ.Position; + frmMain.InvalidateFilter; +end; + +procedure TfrmBoundaries.tbMaxZChange(Sender: TObject); +begin + if (tbMinZ.Position >= tbMaxZ.Position) then if (tbMaxZ.Position > tbMinZ.Min) + then tbMinZ.Position := tbMaxZ.Position-1 + else tbMinZ.Position := tbMinZ.Min; + seMaxZ.Value := tbMaxZ.Position; seMinZ.Value := tbMinZ.Position; frmMain.InvalidateFilter; end; diff --git a/Client/Tools/UfrmConfirmation.lfm b/Client/Tools/UfrmConfirmation.lfm index ab5dab7..ca89192 100644 --- a/Client/Tools/UfrmConfirmation.lfm +++ b/Client/Tools/UfrmConfirmation.lfm @@ -1,25 +1,25 @@ object frmConfirmation: TfrmConfirmation - Left = 290 + Left = 1559 Height = 43 - Top = 171 - Width = 108 + Top = 261 + Width = 116 BorderIcons = [] BorderStyle = bsToolWindow - Caption = 'Apply?' + Caption = 'Подтвердить?' ClientHeight = 43 - ClientWidth = 108 + ClientWidth = 116 Font.Height = -11 - LCLVersion = '0.9.25' + OnCreate = FormCreate + LCLVersion = '0.9.30.2' object btnYes: TButton Left = 8 Height = 25 Top = 8 Width = 40 BorderSpacing.InnerBorder = 4 - Caption = 'Yes' + Caption = 'Да' Default = True ModalResult = 6 - ParentFont = True TabOrder = 0 end object btnNo: TButton @@ -29,9 +29,8 @@ object frmConfirmation: TfrmConfirmation Width = 40 BorderSpacing.InnerBorder = 4 Cancel = True - Caption = 'No' + Caption = 'Нет' ModalResult = 7 - ParentFont = True TabOrder = 1 end end diff --git a/Client/Tools/UfrmConfirmation.pas b/Client/Tools/UfrmConfirmation.pas index abd00cd..c41210b 100644 --- a/Client/Tools/UfrmConfirmation.pas +++ b/Client/Tools/UfrmConfirmation.pas @@ -39,6 +39,7 @@ type TfrmConfirmation = class(TForm) btnYes: TButton; btnNo: TButton; + procedure FormCreate(Sender: TObject); private { private declarations } public @@ -50,6 +51,15 @@ var implementation +uses Language; + +{ TfrmConfirmation } + +procedure TfrmConfirmation.FormCreate(Sender: TObject); +begin + LanguageTranslate(Self); +end; + initialization {$I UfrmConfirmation.lrs} diff --git a/Client/Tools/UfrmDrawSettings.lfm b/Client/Tools/UfrmDrawSettings.lfm index 591409a..007b8eb 100644 --- a/Client/Tools/UfrmDrawSettings.lfm +++ b/Client/Tools/UfrmDrawSettings.lfm @@ -1,42 +1,54 @@ inherited frmDrawSettings: TfrmDrawSettings - Left = 268 - Height = 180 - Top = 165 + Left = 1224 + Height = 240 + Top = 636 Width = 242 - ActiveControl = rbTileList - Caption = 'Draw settings' - ClientHeight = 180 + Caption = 'Опции рисования' + ClientHeight = 240 ClientWidth = 242 OnCreate = FormCreate - object rbTileList: TRadioButton[0] + OnShow = FormShow + object cbProbability: TCheckBox[0] + AnchorSideLeft.Control = rbRandom + AnchorSideTop.Control = rbRandom + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 19 + Top = 56 + Width = 170 + BorderSpacing.Top = 6 + Caption = 'Размещать тайл с шансом:' + TabOrder = 9 + end + object rbTileList: TRadioButton[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 8 - Height = 22 + Height = 19 Top = 8 - Width = 146 + Width = 170 BorderSpacing.Left = 8 BorderSpacing.Top = 8 BorderSpacing.Bottom = 4 - Caption = 'Use tile from the list' + Caption = 'Выбранный тайл из списка' Checked = True - State = cbChecked TabOrder = 0 + TabStop = True end - object rbRandom: TRadioButton[1] + object rbRandom: TRadioButton[2] AnchorSideLeft.Control = rbTileList AnchorSideTop.Control = rbTileList AnchorSideTop.Side = asrBottom Left = 8 - Height = 22 - Top = 34 - Width = 213 + Height = 19 + Top = 31 + Width = 170 BorderSpacing.Top = 4 - Caption = 'Use tiles from the random pool' + Caption = 'Случайный тайл из набора' + OnChange = rbRandomChange TabOrder = 1 - TabStop = False end - object gbHue: TGroupBox[2] + object gbHue: TGroupBox[3] AnchorSideLeft.Control = Owner AnchorSideTop.Control = seRandomHeight AnchorSideTop.Side = asrBottom @@ -44,18 +56,18 @@ inherited frmDrawSettings: TfrmDrawSettings AnchorSideRight.Side = asrBottom Left = 8 Height = 49 - Top = 132 + Top = 185 Width = 226 Anchors = [akTop, akLeft, akRight] BorderSpacing.Around = 8 - Caption = 'Hue (Statics only)' - ClientHeight = 45 + Caption = 'Цвет (Только для Статики)' + ClientHeight = 31 ClientWidth = 222 TabOrder = 2 object pbHue: TPaintBox Cursor = crHandPoint Left = 4 - Height = 41 + Height = 27 Top = 0 Width = 214 Align = alClient @@ -66,58 +78,104 @@ inherited frmDrawSettings: TfrmDrawSettings OnPaint = pbHuePaint end end - object cbRandomHeight: TCheckBox[3] + object cbRandomHeight: TCheckBox[4] AnchorSideLeft.Control = cbForceAltitude AnchorSideTop.Control = cbForceAltitude AnchorSideTop.Side = asrBottom Left = 8 - Height = 22 - Top = 102 - Width = 149 - BorderSpacing.Top = 12 - Caption = 'Add Random Altitude' + Height = 19 + Top = 156 + Width = 163 + BorderSpacing.Top = 8 + Caption = 'Добавить к высоте (случ):' TabOrder = 3 end - object seRandomHeight: TSpinEdit[4] + object seRandomHeight: TSpinEdit[5] AnchorSideTop.Control = cbRandomHeight AnchorSideTop.Side = asrCenter AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 184 - Height = 21 - Top = 103 + Height = 23 + Top = 154 Width = 50 Anchors = [akTop, akRight] BorderSpacing.Right = 8 + OnChange = seRandomHeightChange TabOrder = 4 end - object cbForceAltitude: TCheckBox[5] + object cbForceAltitude: TCheckBox[6] AnchorSideLeft.Control = rbRandom - AnchorSideTop.Control = rbRandom + AnchorSideTop.Control = cbUseSurfaceAltitude AnchorSideTop.Side = asrBottom Left = 8 - Height = 22 - Top = 68 - Width = 111 - BorderSpacing.Top = 12 - Caption = 'Force altitude:' + Height = 19 + Top = 129 + Width = 135 + BorderSpacing.Top = 2 + Caption = 'Задать фикс. высоту:' TabOrder = 5 end - object seForceAltitude: TSpinEdit[6] + object seForceAltitude: TSpinEdit[7] AnchorSideTop.Control = cbForceAltitude AnchorSideTop.Side = asrCenter AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 184 - Height = 21 - Top = 69 + Height = 23 + Top = 127 Width = 50 Anchors = [akTop, akRight] BorderSpacing.Right = 8 MaxValue = 127 MinValue = -128 + OnChange = seForceAltitudeChange TabOrder = 6 end - inherited tmClose: TTimer[7] + object cbUseSurfaceAltitude: TCheckBox[8] + AnchorSideLeft.Control = rbRandom + AnchorSideTop.Control = cbUseFreeTilesOnly + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 19 + Top = 108 + Width = 213 + BorderSpacing.Top = 12 + Caption = 'Брать высоту верхней поверхности' + OnChange = cbUseSurfaceAltitudeChange + TabOrder = 7 + end + object seProbability: TFloatSpinEdit[9] + AnchorSideTop.Control = cbProbability + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 176 + Height = 23 + Top = 54 + Width = 58 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Right = 8 + Increment = 0.01 + MaxValue = 100 + MinValue = 0.01 + OnChange = seProbabilityChange + TabOrder = 8 + Value = 100 + end + object cbUseFreeTilesOnly: TCheckBox[10] + AnchorSideLeft.Control = rbRandom + AnchorSideTop.Control = cbProbability + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 19 + Top = 77 + Width = 218 + BorderSpacing.Top = 2 + Caption = 'Размещать только на пустых тайлах' + TabOrder = 10 + end + inherited tmClose: TTimer[11] + left = 200 end end diff --git a/Client/Tools/UfrmDrawSettings.pas b/Client/Tools/UfrmDrawSettings.pas index 05183ac..0439c27 100644 --- a/Client/Tools/UfrmDrawSettings.pas +++ b/Client/Tools/UfrmDrawSettings.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - Spin, ExtCtrls, LMessages, UfrmToolWindow; + Spin, ExtCtrls, LMessages, VirtualTrees, VirtualList, UfrmToolWindow, UfrmMain; type @@ -39,17 +39,25 @@ type TfrmDrawSettings = class(TfrmToolWindow) cbForceAltitude: TCheckBox; + cbProbability: TCheckBox; + cbUseSurfaceAltitude: TCheckBox; cbRandomHeight: TCheckBox; + cbUseFreeTilesOnly: TCheckBox; + seProbability: TFloatSpinEdit; gbHue: TGroupBox; pbHue: TPaintBox; rbRandom: TRadioButton; rbTileList: TRadioButton; seForceAltitude: TSpinEdit; seRandomHeight: TSpinEdit; + procedure cbUseSurfaceAltitudeChange(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); procedure pbHueClick(Sender: TObject); procedure pbHuePaint(Sender: TObject); + procedure rbRandomChange(Sender: TObject); procedure seForceAltitudeChange(Sender: TObject); + procedure seProbabilityChange(Sender: TObject); procedure seRandomHeightChange(Sender: TObject); private FCanClose: Boolean; @@ -63,7 +71,14 @@ var implementation uses - UGameResources, UHue, UfrmHueSettings; + UGameResources, UHue, UfrmHueSettings, Language; + +type + PTileInfo = ^TTileInfo; + TTileInfo = record + ID: LongWord; + ptr: Pointer; + end; { TfrmDrawSettings } @@ -79,6 +94,34 @@ end; procedure TfrmDrawSettings.FormCreate(Sender: TObject); begin FCanClose := True; + cbUseSurfaceAltitudeChange(Sender); +end; + +procedure TfrmDrawSettings.FormShow(Sender: TObject); +var + item: PVirtualItem; + tileInfo: PTileInfo; + selectedID: LongWord; +begin + LanguageTranslate(Self); + item := frmMain.vdtTiles.GetFirstSelected; + if item <> nil then + begin + tileInfo := frmMain.vdtTiles.GetNodeData(item); + selectedID := tileInfo^.ID; + end; + if (selectedID < $4000) or (selectedID >= $2F000000) + then begin + cbUseFreeTilesOnly.Checked:= False; + cbUseFreeTilesOnly.Enabled:= False; + if (selectedID >= $2F000000) then + cbProbability.Enabled:= False; + end else begin + cbUseFreeTilesOnly.Enabled:= True; + cbProbability.Enabled:= True; + end; + + (frmDrawSettings as TfrmToolWindow).FormShow(Sender); end; procedure TfrmDrawSettings.pbHuePaint(Sender: TObject); @@ -96,6 +139,23 @@ begin end; end; +procedure TfrmDrawSettings.rbRandomChange(Sender: TObject); +begin + if frmMain.mnuAutoHideRandomList.Checked then + frmMain.mnuAutoHideRandomListClick(Sender); +end; + +procedure TfrmDrawSettings.seProbabilityChange(Sender: TObject); +begin + cbProbability.Checked := (seProbability.Value < seProbability.MaxValue); +end; + +procedure TfrmDrawSettings.cbUseSurfaceAltitudeChange(Sender: TObject); +begin + cbForceAltitude.Enabled := not cbUseSurfaceAltitude.Checked; + seForceAltitude.Enabled := not cbUseSurfaceAltitude.Checked; +end; + procedure TfrmDrawSettings.seForceAltitudeChange(Sender: TObject); begin cbForceAltitude.Checked := True; @@ -103,7 +163,7 @@ end; procedure TfrmDrawSettings.seRandomHeightChange(Sender: TObject); begin - cbRandomHeight.Checked := True; + cbRandomHeight.Checked := (seRandomHeight.Value <> 0); end; function TfrmDrawSettings.CanClose: Boolean; diff --git a/Client/Tools/UfrmElevateSettings.lfm b/Client/Tools/UfrmElevateSettings.lfm index 38f52b9..de7b866 100644 --- a/Client/Tools/UfrmElevateSettings.lfm +++ b/Client/Tools/UfrmElevateSettings.lfm @@ -1,24 +1,25 @@ inherited frmElevateSettings: TfrmElevateSettings - Left = 290 + Left = 1502 Height = 114 - Top = 171 + Top = 189 Width = 250 - Caption = 'Elevate' + Caption = 'Изменение высоты' ClientHeight = 114 ClientWidth = 250 + OnCreate = FormCreate object rbRaise: TRadioButton[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 8 Height = 19 Top = 8 - Width = 47 + Width = 66 BorderSpacing.Left = 8 BorderSpacing.Top = 8 - Caption = 'Raise' + Caption = 'Поднять' Checked = True - State = cbChecked TabOrder = 2 + TabStop = True end object rbLower: TRadioButton[1] AnchorSideLeft.Control = rbRaise @@ -27,10 +28,9 @@ inherited frmElevateSettings: TfrmElevateSettings Left = 8 Height = 19 Top = 27 - Width = 52 - Caption = 'Lower' + Width = 71 + Caption = 'Опустить' TabOrder = 0 - TabStop = False end object rbSet: TRadioButton[2] AnchorSideLeft.Control = rbLower @@ -39,10 +39,9 @@ inherited frmElevateSettings: TfrmElevateSettings Left = 8 Height = 19 Top = 46 - Width = 36 - Caption = 'Set' + Width = 56 + Caption = 'Задать' TabOrder = 1 - TabStop = False end object cbRandomHeight: TCheckBox[3] AnchorSideLeft.Control = rbSet @@ -51,9 +50,9 @@ inherited frmElevateSettings: TfrmElevateSettings Left = 8 Height = 19 Top = 81 - Width = 135 + Width = 163 BorderSpacing.Top = 16 - Caption = 'Add Random Altitude' + Caption = 'Добавить к высоте (случ.)' TabOrder = 3 end object seRandomHeight: TSpinEdit[4] @@ -63,8 +62,8 @@ inherited frmElevateSettings: TfrmElevateSettings AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 197 - Height = 25 - Top = 78 + Height = 23 + Top = 79 Width = 45 Anchors = [akTop, akLeft, akRight] BorderSpacing.Right = 8 @@ -79,8 +78,8 @@ inherited frmElevateSettings: TfrmElevateSettings AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 197 - Height = 25 - Top = 24 + Height = 23 + Top = 25 Width = 45 Anchors = [akTop, akRight] BorderSpacing.Right = 8 @@ -89,4 +88,6 @@ inherited frmElevateSettings: TfrmElevateSettings TabOrder = 5 Value = 1 end + inherited tmClose: TTimer[6] + end end diff --git a/Client/Tools/UfrmElevateSettings.pas b/Client/Tools/UfrmElevateSettings.pas index 8fccdfb..3369f6d 100644 --- a/Client/Tools/UfrmElevateSettings.pas +++ b/Client/Tools/UfrmElevateSettings.pas @@ -44,6 +44,7 @@ type rbSet: TRadioButton; seRandomHeight: TSpinEdit; seZ: TSpinEdit; + procedure FormCreate(Sender: TObject); procedure seRandomHeightChange(Sender: TObject); public { public declarations } @@ -54,6 +55,8 @@ var implementation +uses Language; + { TfrmElevateSettings } procedure TfrmElevateSettings.seRandomHeightChange(Sender: TObject); @@ -61,6 +64,11 @@ begin cbRandomHeight.Checked := True; end; +procedure TfrmElevateSettings.FormCreate(Sender: TObject); +begin + LanguageTranslate(Self); +end; + initialization {$I UfrmElevateSettings.lrs} diff --git a/Client/Tools/UfrmFillSettings.lfm b/Client/Tools/UfrmFillSettings.lfm new file mode 100644 index 0000000..9758a55 --- /dev/null +++ b/Client/Tools/UfrmFillSettings.lfm @@ -0,0 +1,206 @@ +inherited frmFillSettings: TfrmFillSettings + Left = 1248 + Height = 377 + Top = 177 + Width = 469 + Caption = 'Опции заливки' + ClientHeight = 377 + ClientWidth = 469 + OnCreate = FormCreate + OnShow = FormShow + object vdtLastPreview: TVirtualDrawTree[0] + Tag = -1 + AnchorSideLeft.Control = cbCategory + AnchorSideTop.Control = gbHue + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbHue + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Cursor = crHandPoint + Left = 4 + Height = 320 + Hint = '-' + Top = 53 + Width = 64 + Anchors = [akTop, akLeft, akBottom] + BorderSpacing.Top = 2 + BorderSpacing.Bottom = 4 + BorderStyle = bsNone + Color = clBlack + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.HotColor = clYellow + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 + Constraints.MinHeight = 64 + DefaultNodeHeight = 44 + DragMode = dmAutomatic + DragOperations = [] + DragType = dtVCL + Header.AutoSizeIndex = -1 + Header.Columns = <> + Header.DefaultHeight = 17 + Header.MainColumn = -1 + Header.Options = [hoShowHint] + Header.ParentFont = True + Header.Style = hsFlatButtons + HintMode = hmHint + ParentShowHint = False + ScrollBarOptions.ScrollBars = ssNone + ShowHint = True + TabOrder = 1 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toMultiSelect] + Visible = False + OnDrawNode = vdtPreviewDrawNode + end + object vdtEntryPreview: TVirtualDrawTree[1] + Tag = -1 + AnchorSideLeft.Control = vdtLastPreview + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = vdtLastPreview + AnchorSideRight.Control = gbHue + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = vdtLastPreview + AnchorSideBottom.Side = asrBottom + Cursor = crHandPoint + Left = 72 + Height = 320 + Hint = '-' + Top = 53 + Width = 393 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 4 + BorderStyle = bsNone + Color = clBlack + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.HotColor = clYellow + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 + Constraints.MinHeight = 64 + DefaultNodeHeight = 44 + DragMode = dmAutomatic + DragOperations = [] + DragType = dtVCL + Header.AutoSizeIndex = -1 + Header.Columns = <> + Header.DefaultHeight = 17 + Header.MainColumn = -1 + Header.Options = [hoShowHint] + Header.ParentFont = True + Header.Style = hsFlatButtons + HintMode = hmHint + ParentShowHint = False + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical + ShowHint = True + TabOrder = 5 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toMultiSelect] + Visible = False + OnDrawNode = vdtPreviewDrawNode + end + object gbHue: TGroupBox[2] + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 239 + Height = 49 + Top = 2 + Width = 226 + Anchors = [akTop, akRight] + BorderSpacing.Top = 2 + BorderSpacing.Right = 4 + Caption = 'Цвет (Только для Статики)' + ClientHeight = 31 + ClientWidth = 222 + TabOrder = 0 + object pbHue: TPaintBox + Cursor = crHandPoint + Left = 4 + Height = 27 + Top = 0 + Width = 214 + Align = alClient + BorderSpacing.Left = 4 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + OnClick = pbHueClick + OnPaint = pbHuePaint + end + end + object cbCategory: TComboBox[3] + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = lblFillType + AnchorSideTop.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 4 + Height = 23 + Top = 20 + Width = 120 + BorderSpacing.Left = 4 + BorderSpacing.Top = 1 + ItemHeight = 15 + Sorted = True + Style = csDropDownList + TabOrder = 2 + end + object cbFillReview: TCheckBox[4] + AnchorSideLeft.Control = cbFillConfirm + AnchorSideBottom.Control = cbFillConfirm + Left = 132 + Height = 19 + Top = 7 + Width = 103 + Anchors = [akLeft, akBottom] + Caption = 'Предпросмотр' + TabOrder = 3 + end + object cbFillConfirm: TCheckBox[5] + AnchorSideLeft.Control = cbCategory + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Side = asrBottom + AnchorSideBottom.Control = gbHue + AnchorSideBottom.Side = asrBottom + Left = 132 + Height = 19 + Top = 26 + Width = 107 + Anchors = [akLeft, akBottom] + BorderSpacing.Left = 8 + BorderSpacing.Bottom = 6 + Caption = 'Подтверждение' + TabOrder = 4 + end + object lblFillType: TLabel[6] + AnchorSideLeft.Control = cbCategory + AnchorSideTop.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 4 + Height = 16 + Top = 3 + Width = 72 + BorderSpacing.Top = 3 + Caption = 'Тип заливки:' + ParentColor = False + end + inherited tmClose: TTimer[7] + left = 80 + end +end diff --git a/Client/Tools/UfrmFillSettings.pas b/Client/Tools/UfrmFillSettings.pas new file mode 100644 index 0000000..79cb200 --- /dev/null +++ b/Client/Tools/UfrmFillSettings.pas @@ -0,0 +1,187 @@ +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UfrmFillSettings; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, + Spin, ExtCtrls, LMessages, VirtualTrees, VirtualList, UfrmToolWindow, UfrmMain; + +type + + { TfrmFillSettings } + + TfrmFillSettings = class(TfrmToolWindow) + cbFillReview: TCheckBox; + cbFillConfirm: TCheckBox; + cbCategory: TComboBox; + gbHue: TGroupBox; + lblFillType: TLabel; + pbHue: TPaintBox; + vdtLastPreview: TVirtualDrawTree; + vdtEntryPreview: TVirtualDrawTree; + procedure cbUseSurfaceAltitudeChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure pbHueClick(Sender: TObject); + procedure pbHuePaint(Sender: TObject); + procedure rbRandomChange(Sender: TObject); + procedure seForceAltitudeChange(Sender: TObject); + procedure seProbabilityChange(Sender: TObject); + procedure seRandomHeightChange(Sender: TObject); + procedure vdtPreviewDrawNode(Sender: TBaseVirtualTree; + const PaintInfo: TVTPaintInfo); + private + FCanClose: Boolean; + function CanClose: Boolean; override; + procedure OnHueClose(Sender: TObject; var ACloseAction: TCloseAction); + end; + +const + vdtPreviewNodeWidth = 44; + vdtPreviewColumnsMax = 1920 div vdtPreviewNodeWidth; + +var + frmFillSettings: TfrmFillSettings; + +implementation + +uses + UGameResources, UHue, UfrmHueSettings, Language; + +type + PTileInfo = ^TTileInfo; + TTileInfo = record + ID: LongWord; + ptr: Pointer; + end; + +{ TfrmFillSettings } + +procedure TfrmFillSettings.pbHueClick(Sender: TObject); +begin + frmHueSettings.Left := Mouse.CursorPos.x - 8; + frmHueSettings.Top := Mouse.CursorPos.y - 8; + frmHueSettings.OnClose := @OnHueClose; + frmHueSettings.Show; + FCanClose := False; +end; + +procedure TfrmFillSettings.FormCreate(Sender: TObject); +begin + FCanClose := True; + cbUseSurfaceAltitudeChange(Sender); +end; + +procedure TfrmFillSettings.FormShow(Sender: TObject); +var + item: PVirtualItem; + tileInfo: PTileInfo; + selectedID: LongWord; +begin + LanguageTranslate(Self); + item := frmMain.vdtTiles.GetFirstSelected; + if item <> nil then + begin + tileInfo := frmMain.vdtTiles.GetNodeData(item); + selectedID := tileInfo^.ID; + end; + + (frmFillSettings as TfrmToolWindow).FormShow(Sender); +end; + +procedure TfrmFillSettings.pbHuePaint(Sender: TObject); +var + hue: THue; +begin + if frmHueSettings <> nil then + begin + if frmHueSettings.lbHue.ItemIndex > 0 then + hue := ResMan.Hue.Hues[frmHueSettings.lbHue.ItemIndex - 1] + else + hue := nil; + TfrmHueSettings.DrawHue(hue, pbHue.Canvas, pbHue.Canvas.ClipRect, + frmHueSettings.lbHue.Items.Strings[frmHueSettings.lbHue.ItemIndex]); + end; +end; + +procedure TfrmFillSettings.rbRandomChange(Sender: TObject); +begin + if frmMain.mnuAutoHideRandomList.Checked then + frmMain.mnuAutoHideRandomListClick(Sender); +end; + +procedure TfrmFillSettings.seProbabilityChange(Sender: TObject); +begin + // cbProbability.Checked := (seProbability.Value < seProbability.MaxValue); +end; + +procedure TfrmFillSettings.cbUseSurfaceAltitudeChange(Sender: TObject); +begin +// cbForceAltitude.Enabled := not cbUseSurfaceAltitude.Checked; +// seForceAltitude.Enabled := not cbUseSurfaceAltitude.Checked; +end; + +procedure TfrmFillSettings.seForceAltitudeChange(Sender: TObject); +begin +// cbForceAltitude.Checked := True; +end; + +procedure TfrmFillSettings.seRandomHeightChange(Sender: TObject); +begin +// cbRandomHeight.Checked := (seRandomHeight.Value <> 0); +end; + +procedure TfrmFillSettings.vdtPreviewDrawNode(Sender: TBaseVirtualTree; + const PaintInfo: TVTPaintInfo); +begin + +end; + +function TfrmFillSettings.CanClose: Boolean; +begin + Result := FCanClose and inherited CanClose; +end; + +procedure TfrmFillSettings.OnHueClose(Sender: TObject; + var ACloseAction: TCloseAction); +var + msg: TLMessage; +begin + FCanClose := True; + frmHueSettings.OnClose := nil; + pbHue.Repaint; + MouseLeave(msg); +end; + +initialization + {$I UfrmFillSettings.lrs} + +end. + diff --git a/Client/Tools/UfrmFilter.lfm b/Client/Tools/UfrmFilter.lfm index 441af9b..b1d7b90 100644 --- a/Client/Tools/UfrmFilter.lfm +++ b/Client/Tools/UfrmFilter.lfm @@ -1,19 +1,23 @@ object frmFilter: TfrmFilter - Left = 290 + Left = 1498 Height = 492 - Top = 171 + Top = 0 Width = 232 - ActiveControl = rgFilterType.RadioButton0 BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsToolWindow - Caption = 'Filter' + Caption = 'Фильтр' ClientHeight = 492 ClientWidth = 232 Font.Height = -11 + KeyPreview = True OnCreate = FormCreate OnDestroy = FormDestroy + OnKeyDown = FormKeyDown + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp OnShow = FormShow - LCLVersion = '0.9.29' + ShowInTaskBar = stNever + LCLVersion = '0.9.30.2' object rgFilterType: TRadioGroup Left = 4 Height = 40 @@ -22,7 +26,7 @@ object frmFilter: TfrmFilter Align = alTop AutoFill = True BorderSpacing.Around = 4 - Caption = 'Filter rule' + Caption = 'Правило фильтра' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize @@ -31,15 +35,18 @@ object frmFilter: TfrmFilter ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 26 - ClientWidth = 222 + ClientHeight = 22 + ClientWidth = 220 Columns = 2 ItemIndex = 0 Items.Strings = ( - 'Exclusive' - 'Inclusive' + 'Исключающий' + 'Включающий' ) OnClick = rgFilterTypeClick + OnKeyDown = FormKeyDown + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp TabOrder = 0 end object GroupBox1: TGroupBox @@ -49,25 +56,31 @@ object frmFilter: TfrmFilter Width = 224 Align = alClient BorderSpacing.Around = 4 - Caption = 'Tile filter' - ClientHeight = 245 - ClientWidth = 222 + Caption = 'Фильтрация тайлов' + ClientHeight = 241 + ClientWidth = 220 TabOrder = 1 + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp object Label1: TLabel - AnchorSideLeft.Control = GroupBox1 - AnchorSideTop.Control = cbTileFilter - AnchorSideTop.Side = asrBottom + AnchorSideLeft.Control = btnClear + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnClear AnchorSideRight.Control = GroupBox1 AnchorSideRight.Side = asrBottom - Left = 4 - Height = 30 - Top = 30 - Width = 214 + Left = 56 + Height = 25 + Top = 215 + Width = 164 Anchors = [akTop, akLeft, akRight] - BorderSpacing.Around = 4 - Caption = 'Drag and Drop static tiles from the tile list on this list to add them to the filter.' + BorderSpacing.Left = 4 + Caption = 'Чтобы добавить тайлы - перетащите предметы в список из списка тайлов.' + Font.Height = -9 ParentColor = False + ParentFont = False WordWrap = True + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp end object btnClear: TSpeedButton AnchorSideLeft.Control = btnDelete @@ -78,46 +91,45 @@ object frmFilter: TfrmFilter AnchorSideBottom.Side = asrBottom Left = 30 Height = 22 - Hint = 'Clear' - Top = 219 + Hint = 'Очистить список' + Top = 215 Width = 22 Anchors = [akLeft, akBottom] - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 20000000000000040000640000006400000000000000000000003ADCFE004800 - 3A00FEFF4800FCFF1C00FCFF1C0080FF9C00003BD700AF9AFF00002CC600FDEB - 9B000000000000000000000000000000000000000000000000000EECFF00B2FC - FF000046C00078D0FF000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000 - EFFF0000EDFF0000EDFFCBF3FC008905000024AEEF00E4A81C000000DB00B29E - FF0088000D000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443 - F7FF3242F7FF141BF1FF0000EDFFFCFF1C00FCFF1C0080FF9C0004000000FFBC - 00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909 - F5FF161BF5FF3343F7FF141BF1FF0000EDFFE4FF5C000050FF004C0000000000 - F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333 - F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF000008000052FF000000 - FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA - FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF0000CC0088005B000000 - FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1 - FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00B8FF00E3FFA8000000 - FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF08009000FCFF72000000 - FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF02000000E4FF5C000000 - FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2 - FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FFFCFF1C00000000000000 - FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC - FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000CCFF4C000000 - FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B - FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000 - 00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D - FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000 - 0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663 - FEFF5461FEFF2227FCFF0000FBFFFCFF1C00000000000000000008000000EFEF - EF00EFEFEF00EFEFEF000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000 - FDFF0000FDFF0000FDFF000000000000000000000000000000009034DE009034 - DE00D86FDF00D86FDF00E0A223004AC6080000000000580000005870DF000C70 - DF000000000000000000000000002070DF000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnClearClick @@ -130,47 +142,46 @@ object frmFilter: TfrmFilter AnchorSideBottom.Side = asrBottom Left = 4 Height = 22 - Hint = 'Delete' - Top = 219 + Hint = 'Удалить выделенные' + Top = 215 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 20000000000000040000640000006400000000000000000000004F91AB005588 - 9C0043718A004E6974003E4B4C00457796003E6A950037556C005C7E8800548B - A00031464100FFFFFF002B3238002D3B430074B9C8007FC4D5004788A7004A92 - B500435E6F002E3040002E3538003D5E7B003853BEFF3551BDFF304BBCFF2E4E - B8FF303B3600FFFFFF00313637002C2D2B00588997007BC3D400365F8400396E - 9A003B6282003A5564004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FFFFFFFF0036423900486B710061B4CE00396F9600375C - 83004085B1004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FFFFFFFF00354C4C004D94AF00375D7F003348 - 5C005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FFFFFFFF004A90A6003B5864003D5B - 6A004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF57929C00498BA40047676D005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF54839500FFFFFF005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF6FA2AF00000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF58B2E00000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF000000000800000000E8 - 1D007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF000000000000000001000100DB12 - C0006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF00000000000000002401AD00BA02 - AE002301AE006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFFBB02F00000010000D8000000000000000000 - 000008000000010008006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF5031DE005031DE002501AC00B902AD000D040400F804 - 0500F20005000A0106000C040500F8040600686ADDFF6364DCFF6164DAFF5D63 - D9FFF2000700F804610000000000710900005031DE005031DE004034DE004034 - DE0068B0E00068B0E0000E049300F8049500F2009500070102000F049500F804 - 0200F2000200080104000E040200F8040400F200040009010500 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnDeleteClick @@ -178,20 +189,21 @@ object frmFilter: TfrmFilter ParentShowHint = False end object vdtFilter: TVirtualDrawTree - Tag = 1 + Tag = -1 AnchorSideLeft.Control = GroupBox1 - AnchorSideTop.Control = Label1 + AnchorSideTop.Control = cbTileFilter AnchorSideTop.Side = asrBottom AnchorSideRight.Control = GroupBox1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnDelete Cursor = 63 Left = 4 - Height = 151 - Top = 64 - Width = 214 + Height = 184 + Top = 27 + Width = 212 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Around = 4 + Color = 16052980 DefaultNodeHeight = 44 DragType = dtVCL Header.AutoSizeIndex = 0 @@ -199,38 +211,115 @@ object frmFilter: TfrmFilter item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 8 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 0 - TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.AutoOptions = [toAutoDropExpand, toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.MiscOptions = [toAcceptOLEDrop, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] OnDragOver = vdtFilterDragOver OnDragDrop = vdtFilterDragDrop OnDrawNode = vdtFilterDrawNode + OnKeyDown = FormKeyDown end object cbTileFilter: TCheckBox AnchorSideLeft.Control = GroupBox1 AnchorSideTop.Control = GroupBox1 Left = 4 - Height = 22 + Height = 19 Top = 4 - Width = 85 + Width = 166 BorderSpacing.Around = 4 - Caption = 'Filter active' + Caption = 'Использовать фильтрацию' OnChange = cbTileFilterChange + OnKeyDown = FormKeyDown + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp TabOrder = 1 end end @@ -241,29 +330,35 @@ object frmFilter: TfrmFilter Width = 224 Align = alBottom BorderSpacing.Around = 4 - Caption = 'Hue filter' - ClientHeight = 154 - ClientWidth = 222 + Caption = 'Фильтрация цветов' + ClientHeight = 150 + ClientWidth = 220 TabOrder = 2 + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp object cbHueFilter: TCheckBox Left = 4 - Height = 22 + Height = 19 Top = 4 - Width = 214 + Width = 212 Align = alTop BorderSpacing.Around = 4 - Caption = 'Filter active' + Caption = 'Использовать фильтрацию' OnChange = cbHueFilterChange + OnKeyDown = FormKeyDown + OnMouseDown = FormMouseDown + OnMouseUp = FormMouseUp TabOrder = 0 end object vdtHues: TVirtualDrawTree Cursor = 63 Left = 4 - Height = 120 - Top = 30 - Width = 214 + Height = 119 + Top = 27 + Width = 212 Align = alClient BorderSpacing.Around = 4 + Color = 16052980 Header.AutoSizeIndex = 2 Header.Columns = < item @@ -272,25 +367,28 @@ object frmFilter: TfrmFilter end item Position = 1 - Text = 'Hue' + Text = 'Цвет' Width = 38 end item Position = 2 - Text = 'Name' - Width = 154 + Text = 'Название' + Width = 133 end> Header.DefaultHeight = 17 Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons PopupMenu = pmHues + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 1 TreeOptions.MiscOptions = [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning] TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] TreeOptions.SelectionOptions = [toFullRowSelect] OnChecked = vdtHuesChecked OnDrawNode = vdtHuesDrawNode + OnKeyDown = FormKeyDown end end object Splitter1: TSplitter @@ -306,12 +404,18 @@ object frmFilter: TfrmFilter left = 148 top = 404 object mnuCheckHues: TMenuItem - Caption = 'Check all hues' + Caption = 'Отметить все цвета' OnClick = mnuCheckHuesClick end object mnuUncheckHues: TMenuItem - Caption = 'Uncheck all hues' + Caption = 'Удалить все цвета' OnClick = mnuUncheckHuesClick end end + object tFormClose: TTimer + Interval = 10 + OnTimer = tFormCloseTimer + left = 192 + top = 56 + end end diff --git a/Client/Tools/UfrmFilter.pas b/Client/Tools/UfrmFilter.pas index 8dd65d3..4bf2039 100644 --- a/Client/Tools/UfrmFilter.pas +++ b/Client/Tools/UfrmFilter.pas @@ -31,8 +31,8 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - ExtCtrls, VirtualTrees, LCLIntf, LMessages, Buttons, UPlatformTypes, UStatics, - Menus; + ExtCtrls, VirtualTrees, VirtualList, LCLIntf, LMessages, Buttons, UPlatformTypes, + UStatics, Menus, Windows, Logging; type @@ -55,7 +55,8 @@ type pmHues: TPopupMenu; rgFilterType: TRadioGroup; Splitter1: TSplitter; - vdtFilter: TVirtualDrawTree; + tFormClose: TTimer; + vdtFilter: TVirtualList; vdtHues: TVirtualDrawTree; procedure btnClearClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); @@ -63,10 +64,18 @@ type procedure cbTileFilterChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure FormMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); + procedure GroupBox1MouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); procedure mnuUncheckHuesClick(Sender: TObject); procedure mnuCheckHuesClick(Sender: TObject); procedure rgFilterTypeClick(Sender: TObject); + procedure tFormCloseTimer(Sender: TObject); procedure vdtFilterDragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); @@ -78,6 +87,8 @@ type procedure vdtHuesChecked(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vdtHuesDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo); + private + FLastRMouseDown: DWORD; protected FLocked: Boolean; FCheckedHues: TBits; @@ -86,6 +97,8 @@ type property Locked: Boolean read FLocked write FLocked; function Filter(AStatic: TStaticItem): Boolean; procedure JumpToHue(AHueID: Word); + procedure AddTile(ATileID: LongWord); + procedure AddHue(AHueID: Word); end; var @@ -94,16 +107,17 @@ var implementation uses - UfrmMain, UGameResources, UHue, UGraphicHelper, UGUIPlatformUtils; + UfrmMain, UGameResources, UHue, UGraphicHelper, UGUIPlatformUtils, Language; type PTileInfo = ^TTileInfo; TTileInfo = record - ID: Word; + ID: LongWord; + ptr: Pointer; end; PHueInfo = ^THueInfo; THueInfo = record - ID: Word; + ID: LongWord; Hue: THue; end; @@ -111,16 +125,21 @@ type procedure TfrmFilter.FormShow(Sender: TObject); var - upperLeft, lowerLeft: TPoint; + wspos : TPoint; + wrect : TRect; begin - upperLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width, 0)); - lowerLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width, - frmMain.pcLeft.Height)); - Left := upperLeft.x - 8; - Top := upperLeft.y - 8; - Height := lowerLeft.y - upperLeft.y; - SetWindowParent(Handle, frmMain.Handle); + GetWindowRect(frmFilter.Handle, wrect); + wspos := frmMain.oglGameWindow.ClientToScreen(Classes.Point(0, 0)); + Left := wspos.X - 1; + Top := wspos.Y - 1; + Height:= frmMain.oglGameWindow.ClientHeight - (wrect.Bottom - wrect.Top - ClientHeight); +end; + +procedure TfrmFilter.GroupBox1MouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + end; procedure TfrmFilter.mnuUncheckHuesClick(Sender: TObject); @@ -149,24 +168,27 @@ procedure TfrmFilter.vdtFilterDragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); var - sourceTree: TVirtualDrawTree; - selected, node: PVirtualNode; + sourceTree: TVirtualList; + selected: PVirtualItem; + node: PVirtualNode; sourceTileInfo, targetTileInfo: PTileInfo; begin - sourceTree := Source as TVirtualDrawTree; - if (sourceTree <> Sender) and (sourceTree <> nil) and - (sourceTree.Tag = 1) then + sourceTree := Source as TVirtualList; + if (sourceTree <> Sender) and (sourceTree <> nil) then begin Sender.BeginUpdate; selected := sourceTree.GetFirstSelected; while selected <> nil do begin sourceTileInfo := sourceTree.GetNodeData(selected); - if sourceTileInfo^.ID > $3FFF then + if (sourceTileInfo^.ID > $3FFF) and (sourceTileInfo^.ID < $0F000000) then begin - node := Sender.AddChild(nil); - targetTileInfo := Sender.GetNodeData(node); - targetTileInfo^.ID := sourceTileInfo^.ID; + //node := Sender.AddChild(nil); + //targetTileInfo := Sender.GetNodeData(node); + //targetTileInfo^.ID := sourceTileInfo^.ID; + Logger.Send([lcClient, lcDebug], 'TfrmFilter.vdtFilterDragDrop TileID', Format('0x%.8x', [sourceTileInfo^.ID])); + AddTile(sourceTileInfo^.ID); + cbTileFilter.Checked := True; frmMain.InvalidateFilter; end; @@ -180,8 +202,7 @@ procedure TfrmFilter.vdtFilterDragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean); begin - if (Source <> Sender) and (Source is TVirtualDrawTree) and - (TVirtualDrawTree(Source).Tag = 1) then + if (Source <> Sender) and (Source is TVirtualDrawTree) then begin Accept := True; end; @@ -244,8 +265,8 @@ function TfrmFilter.Filter(AStatic: TStaticItem): Boolean; var found: Boolean; tileInfo: PTileInfo; - node: PVirtualNode; - id: Word; + node: PVirtualItem; + id: LongWord; begin if cbTileFilter.Checked then begin @@ -296,12 +317,70 @@ begin end; end; +procedure TfrmFilter.AddTile(ATileID: LongWord); +var + selected, node: PVirtualItem; + sourceTileInfo, targetTileInfo: PTileInfo; + exists: Boolean; +begin + if (ATileID > $3FFF) and (ATileID < $0F000000) then + begin + exists := False; + vdtFilter.BeginUpdate; + + selected := vdtFilter.GetFirst(); + while selected <> nil do + begin + sourceTileInfo := vdtFilter.GetNodeData(selected); + if sourceTileInfo^.ID = ATileID then + begin + exists := True; + break; + end; + selected := vdtFilter.GetNext(selected); + end; + if not exists then + begin + node := vdtFilter.AddItem(nil); + targetTileInfo := vdtFilter.GetNodeData(node); + targetTileInfo^.ID := ATileID; + end; + + vdtFilter.EndUpdate; + end; +end; + +procedure TfrmFilter.AddHue(AHueID: Word); +var + hueInfo: PHueInfo; + node: PVirtualNode; +begin + node := vdtHues.GetFirst; + while node <> nil do + begin + hueInfo := vdtHues.GetNodeData(node); + if hueInfo^.ID = AHueID then + begin + //FCheckedHues.Bits[AHueID] := True; + vdtHues.CheckState[node] := csCheckedNormal; + vdtHues.ClearSelection; + vdtHues.Selected[node] := True; + vdtHues.FocusedNode := node; + node := nil; + end else + node := vdtHues.GetNext(node); + end; +end; + procedure TfrmFilter.FormCreate(Sender: TObject); var i: Integer; hueInfo: PHueInfo; node: PVirtualNode; begin + vdtFilter := TVirtualList.Create(vdtFilter); + LanguageTranslate(Self); + FLocked := False; vdtFilter.NodeDataSize := SizeOf(TTileInfo); vdtHues.NodeDataSize := SizeOf(THueInfo); @@ -326,9 +405,56 @@ begin if FCheckedHues <> nil then FreeAndNil(FCheckedHues); end; +procedure TfrmFilter.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if (Key = VK_SPACE) and Visible then begin + frmFilter.Locked := True; + frmFilter.Hide; + frmFilter.Locked := False; + // Говно код для задержки чтобы дать время обработать события что возвращают фокус + tFormClose.Interval := 10; + tFormClose.Tag := PtrInt(False); + tFormClose.Enabled := True; + end; +end; + +procedure TfrmFilter.tFormCloseTimer(Sender: TObject); +begin + if (Boolean(tFormClose.Tag)) then begin + frmFilter.Locked := True; + frmFilter.Hide; + frmFilter.Locked := False; + end; + frmMain.SetFocus; + tFormClose.Enabled := False; +end; + +procedure TfrmFilter.FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + If Button = mbRight then + FLastRMouseDown := GetTickCount; +end; + +procedure TfrmFilter.FormMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if (Visible and not frmMain.mnuAutoShowFilterWindow.Checked and (GetTickCount - FLastRMouseDown < 1000)) then + begin + frmFilter.Locked := True; + frmFilter.Hide; + frmFilter.Locked := False; + frmMain.SetFocus; + end; +end; + procedure TfrmFilter.btnDeleteClick(Sender: TObject); begin + vdtFilter.BeginUpdate; vdtFilter.DeleteSelectedNodes; + vdtFilter.EndUpdate; + frmMain.InvalidateFilter; end; procedure TfrmFilter.cbHueFilterChange(Sender: TObject); @@ -344,6 +470,7 @@ end; procedure TfrmFilter.btnClearClick(Sender: TObject); begin vdtFilter.Clear; + frmMain.InvalidateFilter; end; initialization diff --git a/Client/Tools/UfrmHueSettings.lfm b/Client/Tools/UfrmHueSettings.lfm index cbf4c6b..6f2e3bb 100644 --- a/Client/Tools/UfrmHueSettings.lfm +++ b/Client/Tools/UfrmHueSettings.lfm @@ -1,59 +1,588 @@ inherited frmHueSettings: TfrmHueSettings - Left = 290 - Height = 209 - Top = 171 - Width = 217 - Caption = 'Hue Settings' - ClientHeight = 209 - ClientWidth = 217 + Left = 1300 + Height = 496 + Top = 33 + Width = 516 + Caption = 'Выбор цвета' + ClientHeight = 496 + ClientWidth = 516 + OnClose = FormClose OnCreate = FormCreate + OnHide = FormHide + OnShow = FormShow object lblHue: TLabel[0] - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = cbRandom + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edHue - AnchorSideTop.Side = asrCenter - Left = 8 + AnchorSideRight.Control = edHue + AnchorSideRight.Side = asrBottom + Left = 410 Height = 16 - Top = 12 - Width = 26 - BorderSpacing.Left = 8 - Caption = 'Hue:' + Top = 9 + Width = 30 + Anchors = [akTop, akRight] + BorderSpacing.Left = 2 + BorderSpacing.Top = 3 + BorderSpacing.Right = 65 + Caption = 'Цвет:' ParentColor = False end object edHue: TEdit[1] AnchorSideLeft.Control = lblHue AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Owner - Left = 42 - Height = 25 - Top = 8 - Width = 80 + AnchorSideTop.Control = lbHue + AnchorSideRight.Control = gbPreview + AnchorSideRight.Side = asrBottom + Left = 444 + Height = 23 + Top = 6 + Width = 61 + Anchors = [akTop, akRight] BorderSpacing.Left = 8 - BorderSpacing.Top = 8 + BorderSpacing.Right = 7 OnEditingDone = edHueEditingDone - TabOrder = 0 + TabOrder = 1 end object lbHue: TListBox[2] AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = gbPreview + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 6 + Height = 484 + Top = 6 + Width = 315 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 6 + DragMode = dmAutomatic + ItemHeight = 16 + OnClick = lbHueDblClick + OnDblClick = lbHueDblClick + OnDrawItem = lbHueDrawItem + OnSelectionChange = lbHueSelectionChange + Style = lbOwnerDrawFixed + TabOrder = 2 + end + object gbRandom: TGroupBox[3] + AnchorSideLeft.Control = gbPreview + AnchorSideTop.Control = lbHue + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbPreview + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 325 + Height = 250 + Top = 240 + Width = 187 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Top = 4 + BorderSpacing.Bottom = 6 + Caption = 'Набор случайных цветов' + ClientHeight = 232 + ClientWidth = 183 + TabOrder = 3 + Visible = False + object btnAddRandom: TSpeedButton + AnchorSideLeft.Control = gbRandom + AnchorSideTop.Control = gbRandom + Left = 4 + Height = 22 + Hint = 'Add' + Top = 0 + Width = 23 + BorderSpacing.Left = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnAddRandomClick + ShowHint = True + ParentShowHint = False + end + object btnDeleteRandom: TSpeedButton + AnchorSideLeft.Control = btnAddRandom + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnAddRandom + Left = 31 + Height = 22 + Hint = 'Delete' + Top = 0 + Width = 23 + BorderSpacing.Left = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnDeleteRandomClick + ShowHint = True + ParentShowHint = False + end + object btnClearRandom: TSpeedButton + AnchorSideLeft.Control = btnDeleteRandom + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnDeleteRandom + Left = 58 + Height = 22 + Hint = 'Clear' + Top = 0 + Width = 23 + BorderSpacing.Left = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnClearRandomClick + ShowHint = True + ParentShowHint = False + end + object btnRandomPresetSave: TSpeedButton + AnchorSideTop.Control = cbRandomPreset + AnchorSideRight.Control = btnRandomPresetDelete + Left = 131 + Height = 22 + Hint = 'Save Preset' + Top = 205 + Width = 22 + Anchors = [akTop, akRight] + BorderSpacing.Right = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000000000000000000000000000BA6833FFC38458FFD38B68FFE18F + 70FFDC8D6CFFDA8B6DFFD78A6EFFCD8B6CFFAB6D44FFA65F2EFF00000000BA65 + 30FFBB6631FFBA6630FFBA6630FFBA6530FFC68355FFEFCEBAFFDDFFFFFF87EE + C7FFA2F4D7FFA2F6D7FF8CEEC7FFE0FFFFFFDDA285FFAB6A3EFFBC6933FFF8F1 + EAFFF7ECDFFFF6EADEFFF6EADCFFF6EADCFFC37F51FFEFB69AFFEAF3E8FF51BF + 84FF6FC998FF71C999FF54BF84FFE4F4E9FFDD9C7BFFAA693AFFBF7138FFF5EB + DFFFFDBF68FFFBBE65FFFCBE64FFFCBE64FFC48154FFEAB697FFF3F3EAFFEDF1 + E6FFEFF1E6FFEFF0E6FFEDF1E5FFF3F5EDFFD59C79FFB07044FFC1783CFFF7ED + E3FFFDC26EFFFFD79EFFFFD69BFFFFD798FFC98B61FFE6B592FFE2A781FFE1A7 + 81FFDEA37DFFDCA17BFFDB9F79FFD99E77FFD49A73FFBB7E57FFC47C40FFF7F0 + E6FFF8B455FFF7B554FFF8B453FFF8B253FFCA8D65FFEAB899FFDDA57EFFDDA6 + 80FFDBA37CFFD9A07AFFD9A079FFD89F78FFD89E78FFBF845DFFC58245FFF8F2 + EBFFFEE7D6FFFDE7D6FFFDE7D6FFFDE6D5FFC8885DFFEFBFA1FFFDFCFAFFFEFC + FBFFFEFDFDFFFEFDFCFFFDFBFAFFFDFCFBFFDDA885FFC17F53FFC68447FFF9F3 + ECFFFEE8D6FFFDE7D6FFFDE7D6FFFDE7D5FFC7865BFFEFC09EFFFFFFFFFFCC93 + 6EFFFFFFFFFFFFFFFFFFFFFBF7FFFFF8F1FFE4AF8CFFC78A61FFC68849FFF9F4 + EDFFFEE8D8FFFEE8D7FFFEE7D6FFFDE5D3FFCC8D65FFF3CDB0FFFFFFFFFFE3C7 + B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEABFA1FFC98960FFC6884AFFF9F4 + EFFFFEE7D7FFFDE7D5FFFDE6D4FFFCE6D2FFD4976EFFD49E7BFFD09871FFD6A4 + 82FFCD8E68FFCD9069FFD09A75FFD19973FFC88B62FF00000000C6894BFFF9F4 + F0FFFCE6D3FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4 + B5FFF1D2B3FFF8F4F0FFC48246FF000000000000000000000000C6894BFFF9F5 + F1FFFCE3CFFFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2 + ECFFFBF7F3FFF5EFE9FFC27E45FF000000000000000000000000C6894CFFF9F5 + F1FFFCE3CDFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6 + CDFFFAE5C9FFE2B684FFBF7942FF000000000000000000000000C5884BFFFAF6 + F2FFFAE0C7FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8 + B4FFE1B07DFFDB9264FF00000000000000000000000000000000C48549FFF7F2 + ECFFF8F4EEFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B2 + 7DFFDB9465FF000000000000000000000000000000000000000000000000C88B + 4DFFC88C4FFFC88C4FFFC88C4FFFC88D4FFFC98C4FFFC78B4FFFC5894BFFC476 + 3BFF000000000000000000000000000000000000000000000000 + } + NumGlyphs = 0 + OnClick = btnRandomPresetSaveClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object btnRandomPresetDelete: TSpeedButton + AnchorSideTop.Control = btnRandomPresetSave + AnchorSideRight.Control = gbRandom + AnchorSideRight.Side = asrBottom + Left = 157 + Height = 22 + Hint = 'Delete Preset' + Top = 205 + Width = 22 + Anchors = [akTop, akRight] + BorderSpacing.Right = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000BA6530FFBB6631FFBA6630FFBA6630FFBA6630FFBA6530FFBA652FFFB965 + 2EFF6E5E76FF1949A8FF0542BBFF1348ADFF394E8FFF0000000000000000BC69 + 33FFF8F1EAFFF7ECDFFFF6EBDEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFF8AA5 + D7FF2866CAFF2177E6FF0579EAFF0164DDFF064DBBFF0000000000000000BF71 + 38FFF5EBDFFFFDBF68FFFCBD67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FF1E52 + B0FF639DF4FF187FFFFF0076F8FF0076EEFF0368E1FF0345B9FF00000000C178 + 3CFFF7EDE3FFFDC26EFFFFD8A0FFFFD79EFFFFD69BFFFFD798FFFFD696FF0543 + BCFFAECDFEFFFFFFFFFFFFFFFFFFFFFFFFFF187FEFFF0442BCFF00000000C47C + 40FFF7F0E6FFF8B455FFF7B456FFF7B554FFF8B453FFF8B253FFF7B352FF2453 + ABFF8DB5F6FF4D92FFFF1177FFFF2186FFFF408AEBFF0344B9FF00000000C580 + 42FFF8F1E8FFFEE5D5FFFDE5D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FF94A1 + C9FF3D76D1FF8DB5F7FFB8D6FEFF72A8F5FF2F6BC9FF0000000000000000C582 + 45FFF8F2EBFFFEE7D6FFFDE7D6FFFDE7D6FFFDE7D6FFFDE6D5FFFDE5D3FFFCE4 + D1FF94A1C9FF2A5EC1FF0543BCFF1F59BFFF686279FF0000000000000000C684 + 47FFF9F3ECFFFEE8D6FFFEE8D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4 + D0FFFBE3CCFFFADFC7FFFADFC6FFFAF2EAFFC68042FF0000000000000000C688 + 49FFF9F4EDFFFEE8D8FFFEE8D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1 + CCFFFAE0C7FFF9DDC3FFF8DCC2FFFAF4EDFFC68245FF0000000000000000C688 + 4AFFF9F4EFFFFEE7D7FFFDE7D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADF + C7FFF8DCC2FFF6DABDFFF6D8BBFFFAF4EFFFC68346FF0000000000000000C689 + 4BFFF9F4F0FFFCE6D3FFFCE6D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DC + C2FFF5D6BBFFF3D4B5FFF1D2B3FFF8F4F0FFC48246FF0000000000000000C689 + 4BFFF9F5F1FFFCE3CFFFFBE4D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9 + BCFFF4E9DFFFF7F2ECFFFBF7F3FFF5EFE9FFC27E45FF0000000000000000C689 + 4CFFF9F5F1FFFCE3CDFFFBE3CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6 + BAFFFDFBF8FFFCE6CDFFFAE5C9FFE2B684FFBF7942FF0000000000000000C588 + 4BFFFAF6F2FFFAE0C7FFFBE1C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6 + B8FFFFFBF8FFF6D8B4FFE1B07DFFDB9264FF000000000000000000000000C485 + 49FFF7F2ECFFF8F4EEFFF8F4EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2 + ECFFF2E6D7FFE2B27DFFDB9465FF000000000000000000000000000000000000 + 0000C88B4DFFC88C4FFFC88C4FFFC88C4FFFC88C4FFFC88D4FFFC98C4FFFC78B + 4FFFC5894BFFC4763BFF00000000000000000000000000000000 + } + NumGlyphs = 0 + OnClick = btnRandomPresetDeleteClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object cbRandomPreset: TComboBox + AnchorSideLeft.Control = gbRandom + AnchorSideRight.Control = btnRandomPresetSave + AnchorSideBottom.Control = gbRandom + AnchorSideBottom.Side = asrBottom + Left = 4 + Height = 23 + Top = 205 + Width = 123 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 4 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + ItemHeight = 15 + OnChange = cbRandomPresetChange + Sorted = True + Style = csDropDownList + TabOrder = 0 + end + object lbRandom: TListBox + AnchorSideLeft.Control = gbRandom + AnchorSideTop.Control = btnAddRandom + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbRandom + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = cbRandomPreset + Left = 4 + Height = 177 + Top = 24 + Width = 175 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 4 + BorderSpacing.Top = 2 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + ItemHeight = 0 + MultiSelect = True + OnDragDrop = lbRandomDragDrop + OnDragOver = lbRandomDragOver + OnDrawItem = lbHueDrawItem + Style = lbOwnerDrawVariable + TabOrder = 1 + end + end + object gbPreview: TGroupBox[4] + AnchorSideLeft.Control = lbHue AnchorSideTop.Control = edHue AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Owner - AnchorSideBottom.Side = asrBottom - Left = 8 - Height = 160 - Top = 41 - Width = 201 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Around = 8 - ItemHeight = 16 - OnDrawItem = lbHueDrawItem - OnSelectionChange = lbHueSelectionChange - Style = lbOwnerDrawFixed - TabOrder = 1 + AnchorSideBottom.Control = gbLastUsed + Left = 325 + Height = 93 + Top = 37 + Width = 187 + Anchors = [akTop, akRight, akBottom] + BorderSpacing.Top = 8 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + Caption = 'Предпросмотр цвета на тайле' + ClientHeight = 75 + ClientWidth = 183 + TabOrder = 4 + object ImagePreviewItem: TImage + AnchorSideLeft.Control = gbPreview + AnchorSideTop.Control = edTileId + AnchorSideRight.Control = gbPreview + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbPreview + AnchorSideBottom.Side = asrBottom + Left = 4 + Height = 209 + Top = 6 + Width = 175 + Align = alCustom + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 2 + BorderSpacing.Around = 4 + end + object edTileId: TEdit + AnchorSideLeft.Control = lblTileId + AnchorSideTop.Control = gbPreview + AnchorSideRight.Control = ImagePreviewItem + AnchorSideRight.Side = asrBottom + Left = 118 + Height = 23 + Top = 0 + Width = 61 + Anchors = [akTop, akRight] + BorderSpacing.Left = 36 + OnEditingDone = edTileIdEditingDone + TabOrder = 0 + end + object lblTileId: TLabel + AnchorSideLeft.Control = gbPreview + AnchorSideTop.Control = edTileId + AnchorSideRight.Control = edTileId + AnchorSideRight.Side = asrBottom + Left = 84 + Height = 16 + Top = 4 + Width = 31 + Anchors = [akTop, akRight] + BorderSpacing.Left = 8 + BorderSpacing.Top = 4 + BorderSpacing.Right = 64 + Caption = 'Тайл:' + ParentColor = False + end + object ShowAll: TButton + AnchorSideLeft.Control = ImagePreviewItem + AnchorSideTop.Control = edTileId + AnchorSideRight.Control = edTileId + AnchorSideBottom.Control = edTileId + AnchorSideBottom.Side = asrBottom + Left = 4 + Height = 20 + Top = 2 + Width = 78 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Top = 2 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 1 + Caption = 'Показать все' + OnClick = ShowAllClick + TabOrder = 1 + end end - inherited tmClose: TTimer[3] - left = 152 - top = 112 + object cbRandom: TCheckBox[5] + AnchorSideLeft.Control = gbPreview + AnchorSideTop.Control = edHue + AnchorSideRight.Control = gbRandom + Left = 325 + Height = 19 + Top = 7 + Width = 84 + Align = alCustom + BorderSpacing.Top = 1 + Caption = 'Случайный' + OnChange = cbRandomChange + TabOrder = 5 + end + object vdtHuePreview: TVirtualDrawTree[6] + Tag = -1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Cursor = crHandPoint + Left = 6 + Height = 240 + Hint = '-' + Top = 259 + Width = 314 + Anchors = [] + BorderSpacing.Top = 1 + BorderSpacing.Right = 3 + BorderStyle = bsNone + Color = clBlack + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.HotColor = clYellow + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 + Constraints.MinHeight = 64 + DefaultNodeHeight = 44 + DragMode = dmAutomatic + DragOperations = [] + DragType = dtVCL + Header.AutoSizeIndex = -1 + Header.Columns = <> + Header.DefaultHeight = 17 + Header.MainColumn = -1 + Header.Options = [hoShowHint] + Header.ParentFont = True + Header.Style = hsFlatButtons + HintMode = hmHint + ParentShowHint = False + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical + ShowHint = True + TabOrder = 0 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toMultiSelect] + Visible = False + OnClick = vdtHuePreviewClick + OnDblClick = vdtHuePreviewClick + OnDrawNode = vdtHuePreviewDrawNode + OnMouseMove = vdtHuePreviewMouseMove + end + object gbLastUsed: TGroupBox[7] + AnchorSideLeft.Control = gbPreview + AnchorSideTop.Control = lbHue + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbPreview + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbRandom + Left = 325 + Height = 100 + Top = 134 + Width = 187 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Top = 4 + BorderSpacing.Bottom = 6 + Caption = 'Последние выбранные цвета' + ClientHeight = 82 + ClientWidth = 183 + TabOrder = 6 + Visible = False + object lbLastUsed: TListBox + AnchorSideLeft.Control = gbLastUsed + AnchorSideTop.Control = gbLastUsed + AnchorSideRight.Control = gbLastUsed + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbLastUsed + AnchorSideBottom.Side = asrBottom + Left = 4 + Height = 78 + Top = 0 + Width = 175 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 4 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + ItemHeight = 0 + OnClick = lbLastUsedDblClick + OnDblClick = lbLastUsedDblClick + OnDrawItem = lbHueDrawItem + Style = lbOwnerDrawVariable + TabOrder = 0 + end + end + inherited tmClose: TTimer[8] + left = 24 + top = 16 end end diff --git a/Client/Tools/UfrmHueSettings.pas b/Client/Tools/UfrmHueSettings.pas index ecf2d72..46cf1f1 100644 --- a/Client/Tools/UfrmHueSettings.pas +++ b/Client/Tools/UfrmHueSettings.pas @@ -31,33 +31,118 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - UfrmToolWindow, UHue; + ExtCtrls, Buttons, UfrmToolWindow, XMLRead, XMLWrite, DOM, VirtualTrees, VirtualList, + Math, UHue, UArt, UTiledata, UfrmMain, ImagingComponents, LConvEncoding, ComCtrls, + Windows, ShellAPI, Logging, + ULandscape;//ImagingClasses, UPlatformTypes; type { TfrmHueSettings } TfrmHueSettings = class(TfrmToolWindow) + btnAddRandom: TSpeedButton; + btnClearRandom: TSpeedButton; + btnDeleteRandom: TSpeedButton; + btnRandomPresetDelete: TSpeedButton; + btnRandomPresetSave: TSpeedButton; + gbLastUsed: TGroupBox; + lbLastUsed: TListBox; + ShowAll: TButton; + cbRandom: TCheckBox; + cbRandomPreset: TComboBox; edHue: TEdit; + edTileId: TEdit; + gbRandom: TGroupBox; + gbPreview: TGroupBox; + ImagePreviewItem: TImage; lblHue: TLabel; lbHue: TListBox; + lblTileId: TLabel; + lbRandom: TListBox; + vdtHuePreview: TVirtualDrawTree; + procedure btnAddRandomClick(Sender: TObject); + procedure btnClearRandomClick(Sender: TObject); + procedure btnDeleteRandomClick(Sender: TObject); + procedure btnRandomPresetDeleteClick(Sender: TObject); + procedure btnRandomPresetSaveClick(Sender: TObject); + procedure cbRandomChange(Sender: TObject); + procedure cbRandomPresetChange(Sender: TObject); procedure edHueEditingDone(Sender: TObject); + procedure edTileIdEditingDone(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormHide(Sender: TObject); + procedure FormClose(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure lbHueDblClick(Sender: TObject); procedure lbHueDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure lbHueSelectionChange(Sender: TObject; User: boolean); + procedure lbLastUsedDblClick(Sender: TObject); + procedure lbRandomDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure lbRandomDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure lvHueCustomDrawItem(Sender: TCustomListView; Item: TListItem; + State: TCustomDrawState; var DefaultDraw: Boolean); + procedure ShowAllClick(Sender: TObject); + procedure UpdateItemPreview(ID : Integer; Hue: Integer); + procedure vdtHuePreviewClick(Sender: TObject); + procedure vdtHuePreviewDrawNode(Sender: TBaseVirtualTree; + const PaintInfo: TVTPaintInfo); + procedure vdtHuePreviewMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + private + FConfigDir: String; + FRandomHuePresetsFile: String; + FRandomHuePresetsDoc: TXMLDocument; + LastSelectedNode: PVirtualNode; + LastSelectedColm: Integer; + LastFormPosition: TPoint; + function FindRandomPreset(AName: String): TDOMElement; + procedure LoadRandomPresets; + procedure SaveRandomPresets; + procedure HuePreviewRebuild(ItemID, ItemWidth, ItemHeight: Integer); + procedure HuePreviewFree(); + public + function GetHue: Word; + procedure AddLastUsed(hue: Word); public class procedure DrawHue(AHue: THue; ACanvas: TCanvas; ARect: TRect; - ACaption: string); + ACaption: string; lineWidth: Integer = 2); + public + lbDlgBadColrCaption: string; + lbDlgBadColr: string; + lbDlgBadTileCaption: string; + lbDlgBadTile: string; + lbDlgSavePrsCaption: string; + lbDlgSavePrs: string; + lbNoHuesName: string; end; +const + vdtHuesPreviewColumnsMax = 1920 div 44; + vdtHuesLastUsedLength = 14; + var frmHueSettings: TfrmHueSettings; implementation uses - UGameResources, UGraphicHelper; + UGameResources, UGraphicHelper, UfrmLogin, Language; + +type + PHuesInfo = ^THuesInfo; + THuesInfo = record + ID : array[0..vdtHuesPreviewColumnsMax] of Integer; + Art: array[0..vdtHuesPreviewColumnsMax] of TArt; + end; + + PTileInfo = ^TTileInfo; + TTileInfo = record + ID: LongWord; + ptr: Pointer; + end; { TfrmHueSettings } @@ -68,48 +153,385 @@ begin if (not TryStrToInt(edHue.Text, hueID)) or (hueID >= lbHue.Items.Count) then begin edHue.Text := Format('$%x', [lbHue.ItemIndex]); - MessageDlg('Invalid Hue', 'The hue you''ve entered is invalid.', mtWarning, [mbOK], 0); + MessageDlg(lbDlgBadColrCaption, lbDlgBadColr, mtWarning, [mbOK], 0); end else lbHue.ItemIndex := hueID; end; +procedure TfrmHueSettings.edTileIdEditingDone(Sender: TObject); +var + tileID: Integer; +begin + tileID := 0; + if (not TryStrToInt(edTileId.Text, tileID)) or (tileID >= ResMan.Landscape.MaxStaticID) or (tileID <= 0) then + begin + edTileId.Text := Format('$%x', [edTileId.Tag - $4000]); + MessageDlg(lbDlgBadTileCaption, lbDlgBadTile, mtWarning, [mbOK], 0); + end else + begin + edTileId.Tag := $4000 + tileID; + UpdateItemPreview(edTileId.Tag, lbHue.ItemIndex); + end; +end; + +procedure TfrmHueSettings.AddLastUsed(hue: Word); +var + index: Integer; +begin + lbLastUsed.Items.BeginUpdate; + for index := 0 to lbLastUsed.Items.Count - 1 do + if PtrInt(lbLastUsed.Items.Objects[index]) = hue then begin + lbLastUsed.Items.Delete(index); + break; + end; + lbLastUsed.Items.InsertObject(0, lbHue.Items.Strings[hue], TObject(PtrInt(hue))); + while lbLastUsed.Items.Count > vdtHuesLastUsedLength do begin + lbLastUsed.Items.Delete(lbLastUsed.Items.Count - 1); + end; + lbLastUsed.Items.EndUpdate; +end; + +procedure TfrmHueSettings.lbLastUsedDblClick(Sender: TObject); +var + hue: Integer; +begin + if (lbLastUsed.ItemIndex < 0) or (lbLastUsed.ItemIndex >= lbLastUsed.Items.Count) + then exit; + hue := PtrInt(lbLastUsed.Items.Objects[lbLastUsed.ItemIndex]); + edHue.Text := Format('$%x', [hue]); + edHueEditingDone(Sender); +end; + +procedure TfrmHueSettings.btnDeleteRandomClick(Sender: TObject); +var + i: Integer; +begin + lbRandom.Items.BeginUpdate; + for i := lbRandom.Items.Count - 1 downto 0 do + if lbRandom.Selected[i] then + lbRandom.Items.Delete(i); + lbRandom.Items.EndUpdate; +end; + +procedure TfrmHueSettings.btnRandomPresetDeleteClick(Sender: TObject); +var + preset: TDOMElement; +begin + if cbRandomPreset.ItemIndex > -1 then + begin + preset := TDOMElement(cbRandomPreset.Items.Objects[cbRandomPreset.ItemIndex]); + FRandomHuePresetsDoc.DocumentElement.RemoveChild(preset); + cbRandomPreset.Items.Delete(cbRandomPreset.ItemIndex); + cbRandomPreset.ItemIndex := -1; + end; +end; + +procedure TfrmHueSettings.btnRandomPresetSaveClick(Sender: TObject); +var + presetName: string; + i: Integer; + preset, hue: TDOMElement; + children: TDOMNodeList; +begin + presetName := cbRandomPreset.Text; + if InputQuery(lbDlgSavePrsCaption, lbDlgSavePrs, presetName) then + begin + preset := FindRandomPreset(presetName); + if preset = nil then + begin + preset := FRandomHuePresetsDoc.CreateElement('Preset'); + preset.AttribStrings['Name'] := UTF8ToCP1251(presetName); + FRandomHuePresetsDoc.DocumentElement.AppendChild(preset); + cbRandomPreset.Items.AddObject(presetName, preset); + end else + begin + children := preset.GetChildNodes; + for i := children.Count - 1 downto 0 do + preset.RemoveChild(children[i]); + end; + + for i := 0 to lbRandom.Items.Count - 1 do + begin + hue := FRandomHuePresetsDoc.CreateElement('Hue'); + hue.AttribStrings['ID'] := IntToStr(PtrInt(lbRandom.Items.Objects[i])); + preset.AppendChild(hue); + end; + + cbRandomPreset.ItemIndex := cbRandomPreset.Items.IndexOfObject(preset); + + SaveRandomPresets; + end; +end; + +procedure TfrmHueSettings.cbRandomChange(Sender: TObject); +begin + lbHue.MultiSelect := cbRandom.Checked; + gbRandom.Visible := cbRandom.Checked; + gbLastUsed.Visible := not cbRandom.Checked; +end; + +procedure TfrmHueSettings.cbRandomPresetChange(Sender: TObject); +var + preset, hue: TDOMElement; + id: PtrInt; +begin + lbRandom.Clear; + if cbRandomPreset.ItemIndex > -1 then + begin + preset := TDOMElement(cbRandomPreset.Items.Objects[cbRandomPreset.ItemIndex]); + hue := TDOMElement(preset.FirstChild); + + while hue <> nil do + begin + if hue.NodeName = 'Hue' then + begin + id := StrToInt(hue.AttribStrings['ID']); + lbRandom.Items.AddObject(lbHue.Items.Strings[id], TObject(id)); + end; + hue := TDOMElement(hue.NextSibling); + end; + end; +end; + +procedure TfrmHueSettings.btnClearRandomClick(Sender: TObject); +begin + lbRandom.Items.Clear; +end; + +procedure TfrmHueSettings.btnAddRandomClick(Sender: TObject); +var + i: PtrInt; +begin + lbRandom.Items.BeginUpdate; + for i := 0 to lbHue.Count - 1 do + if lbHue.Selected[i] then + lbRandom.Items.AddObject(lbHue.Items.Strings[i], TObject(i)); + lbRandom.Items.EndUpdate; +end; + procedure TfrmHueSettings.FormCreate(Sender: TObject); var i: Integer; hue: THue; begin + LanguageTranslate(Self); + lbHue.Clear; - lbHue.Items.Add('$0 (no hue)'); + lbHue.Items.Add(lbNoHuesName); for i := 1 to ResMan.Hue.Count do begin hue := ResMan.Hue.Hues[i-1]; lbHue.Items.AddObject(Format('$%x (%s)', [i, hue.Name]), hue); end; lbHue.ItemIndex := 0; + + if (sprofile <> '') then + if (frmMain.ProfileDir <> '') + then FConfigDir := frmMain.ProfileDir + else FConfigDir := frmMain.ConfigDir; + FRandomHuePresetsFile := FConfigDir + 'RandomHuePresets.xml'; + ForceDirectories(FConfigDir); + + Logger.Send([lcClient, lcInfo], ' FConfigDir', FRandomHuePresetsFile); + LoadRandomPresets; + + vdtHuePreview.Align := alClient; + vdtHuePreview.NodeDataSize := SizeOf(THuesInfo); + + gbLastUsed.Height := gbRandom.Height; + cbRandomChange(Sender); + //ImagePreviewItem.Height := gbPreview.Height - ImagePreviewItem.Top - 4; end; +procedure TfrmHueSettings.FormShow(Sender: TObject); +var + item: PVirtualItem; + tileInfo: PTileInfo; + selectedID: LongWord; +begin + item := frmMain.vdtTiles.GetFirstSelected; + if item <> nil then + begin + tileInfo := frmMain.vdtTiles.GetNodeData(item); + selectedID := tileInfo^.ID; + end; + if (selectedID < $4000) or (selectedID >= ResMan.Tiledata.StaticCount + $4000) + then selectedID := $4001; + + edTileId.Tag := selectedID; + edTileId.Text := Format('$%x', [selectedID - $4000]); + UpdateItemPreview(edTileId.Tag, lbHue.ItemIndex); + + vdtHuePreview.Visible := False; + (frmHueSettings as TfrmToolWindow).FormShow(Sender); + gbPreview.Visible := True; + frmHueSettings.Width := 516; + frmHueSettings.Height:= 534; + //lbHue.Visible:= false; +end; + + +procedure TfrmHueSettings.FormHide(Sender: TObject); +begin + HuePreviewFree(); +end; + +procedure TfrmHueSettings.FormClose(Sender: TObject); +begin + HuePreviewFree(); +end; + +procedure TfrmHueSettings.UpdateItemPreview(ID : Integer; Hue: Integer); +var + tileData: TTileData; + artHue: THue; + artEntry: TArt; + artPartial: Boolean; + destRect: TRect; + destColor: Word; +begin + if ResMan.Art.Exists(ID) then + begin + if Hue > 0 then + artHue := ResMan.Hue.Hues[Hue - 1] + else + artHue := nil; + tileData := TTileData(ResMan.Tiledata.Block[ID]); + artPartial := tdfPartialHue in tileData.Flags; + + //destColor := ARGB2RGB(ImagePreviewItem.Canvas.Pixels[destRect.Left, destRect.Top]); + destColor := EncodeUOColor($00F0F0F0); + artEntry := ResMan.Art.GetArt(ID, destColor, artHue, artPartial); + + destRect.Bottom := Min(artEntry.Graphic.Height, ImagePreviewItem.Canvas.Height); + destRect.Right := Min(artEntry.Graphic.Width, ImagePreviewItem.Canvas.Width); + destRect.Top := ((ImagePreviewItem.Canvas.Height - destRect.Bottom) div 2); + destRect.Left := ((ImagePreviewItem.Canvas.Width - destRect.Right) div 2); + + destRect.Bottom := ((ImagePreviewItem.Canvas.Height + destRect.Bottom) div 2); + destRect.Right := ((ImagePreviewItem.Canvas.Width + destRect.Right) div 2); + + ImagePreviewItem.Canvas.Brush.Color := $00F5F5F5;//DecodeUOColor(destColor); + ImagePreviewItem.Canvas.Clear; + DisplayImage(ImagePreviewItem.Canvas, destRect, artEntry.Graphic); + ImagePreviewItem.Update; + + artEntry.Free; + end; +end; + + procedure TfrmHueSettings.lbHueDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var hue: THue; begin - if Index > 0 then - hue := ResMan.Hue.Hues[Index-1] - else - hue := nil; - DrawHue(hue, lbHue.Canvas, ARect, lbHue.Items.Strings[Index]); + if ((Control = lbRandom) or (Control = lbLastUsed)) then begin + Index := PtrInt((Control as TListBox).Items.Objects[Index]); + if Index > 0 + then hue := ResMan.Hue.Hues[Index-1] + else hue := nil; + DrawHue(hue, (Control as TListBox).Canvas, ARect, Format('$%x', [Index]), 3); + end else if Control = lbLastUsed then begin + Index := PtrInt(lbLastUsed.Items.Objects[Index]); + if Index > 0 + then hue := ResMan.Hue.Hues[Index-1] + else hue := nil; + DrawHue(hue, lbLastUsed.Canvas, ARect, Format('$%x', [Index]), 3); + end else begin // Control = lbHue + if Index > 0 + then hue := ResMan.Hue.Hues[Index-1] + else hue := nil; + DrawHue(hue, lbHue.Canvas, ARect, lbHue.Items.Strings[Index], 4); + end +end; + +procedure TfrmHueSettings.lbHueDblClick(Sender: TObject); +begin + lbHueSelectionChange(Sender, True); end; procedure TfrmHueSettings.lbHueSelectionChange(Sender: TObject; User: boolean); begin edHue.Text := Format('$%x', [lbHue.ItemIndex]); + + //if (ImagePreviewItem <> nil) and (ImagePreviewItem.Canvas <> nil) then + UpdateItemPreview(edTileId.Tag, lbHue.ItemIndex); + AddLastUsed(lbHue.ItemIndex); +end; + +procedure TfrmHueSettings.lbRandomDragDrop(Sender, Source: TObject; X, Y: Integer); +begin + if Source = lbHue then + btnAddRandomClick(Sender); +end; + +procedure TfrmHueSettings.lbRandomDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +begin + if Source = lbHue then Accept := True; +end; + +procedure TfrmHueSettings.lvHueCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +begin + +end; + +function TfrmHueSettings.FindRandomPreset(AName: String): TDOMElement; +begin + Result := TDOMElement(FRandomHuePresetsDoc.DocumentElement.FirstChild); + while Result <> nil do + begin + if SameText(Result.AttribStrings['Name'], AName) then + Break; + + Result := TDOMElement(Result.NextSibling); + end; +end; + +procedure TfrmHueSettings.LoadRandomPresets; +var + presetElement, hueElement: TDOMElement; +begin + FreeAndNil(FRandomHuePresetsDoc); + cbRandomPreset.Items.Clear; + if FileExists(FRandomHuePresetsFile) then + begin + ReadXMLFile(FRandomHuePresetsDoc, FRandomHuePresetsFile); + presetElement := TDOMElement(FRandomHuePresetsDoc.DocumentElement.FirstChild); + while presetElement <> nil do + begin + if presetElement.NodeName = 'Preset' then + cbRandomPreset.Items.AddObject( + CP1251ToUTF8(presetElement.AttribStrings['Name']), presetElement); + presetElement := TDOMElement(presetElement.NextSibling); + end; + end else + begin + FRandomHuePresetsDoc := TXMLDocument.Create; + FRandomHuePresetsDoc.AppendChild(FRandomHuePresetsDoc.CreateElement('RandomHuePresets')); + end; +end; + +procedure TfrmHueSettings.SaveRandomPresets; +begin + WriteXMLFile(FRandomHuePresetsDoc, FRandomHuePresetsFile); +end; + +function TfrmHueSettings.GetHue: Word; +begin + if cbRandom.Checked and (lbRandom.Items.Count > 0) then + Result := PtrInt(lbRandom.Items.Objects[Random(lbRandom.Items.Count)]) + else + Result := lbHue.ItemIndex; end; class procedure TfrmHueSettings.DrawHue(AHue: THue; ACanvas: TCanvas; ARect: TRect; - ACaption: string); + ACaption: string; lineWidth: Integer = 2); var hueColor: TColor; - i: Integer; + i, w, leftCPos: Integer; begin ACanvas.Pen.Color := clWhite; ACanvas.Rectangle(ARect); @@ -118,12 +540,207 @@ begin begin hueColor := ARGB2RGB(AHue.ColorTable[i]); ACanvas.Pen.Color := hueColor; - ACanvas.MoveTo(ARect.Left + 2 + i, ARect.Top + 1); - ACanvas.LineTo(ARect.Left + 2 + i, ARect.Bottom - 1); + leftCPos := ARect.Left + 2 + lineWidth*i; + for w := 0 to lineWidth do begin + ACanvas.MoveTo(leftCPos + w, ARect.Top + 1); + ACanvas.LineTo(leftCPos + w, ARect.Bottom - 1); + end; end; - ACanvas.TextOut(ARect.Left + 36, ARect.Top, ACaption); + ACanvas.TextOut(ARect.Left + lineWidth*36, ARect.Top+1, ACaption); end; +// vdtHuePreview + +procedure TfrmHueSettings.ShowAllClick(Sender: TObject); +var + artEntry: TArt; + point: TPoint; +begin + if ResMan.Art.Exists(edTileId.Tag) then begin + LastFormPosition.y := Top; + LastFormPosition.x := Left; + + artEntry := ResMan.Art.GetArt(edTileId.Tag, 0, nil, false); + HuePreviewRebuild(edTileId.Tag, artEntry.Graphic.Width, artEntry.Graphic.Height); + + cbRandom.Checked := False; + vdtHuePreview.Visible := True; + vdtHuePreview.SetFocus; + end; +end; + +procedure TfrmHueSettings.HuePreviewRebuild(ItemID, ItemWidth, ItemHeight: Integer); +var + item: PVirtualNode; + info: PHuesInfo; + cols: Integer; + h,cn: Integer; + ScrollBarWidth: Integer; + wspos: TPoint; + wrect: TRect; +begin + HuePreviewFree; + + GetWindowRect(frmHueSettings.Handle, wrect); + wspos.X := 0; wspos.Y := 0; + wspos := frmMain.oglGameWindow.ClientToScreen(wspos); + Left := wspos.X - 20; + Top := wspos.Y - 1; + Width := frmMain.oglGameWindow.ClientWidth - (wrect.Right - wrect.Left - ClientWidth); + Height:= frmMain.oglGameWindow.ClientHeight - (wrect.Bottom - wrect.Top - ClientHeight); + + + if vdtHuePreview.Tag = edTileId.Tag then exit; + + //определяем число колонок + cols:= ((ClientWidth - GetSystemMetrics(SM_CXVSCROLL))// - 16) + div (ItemWidth + 2)) - 1; + if (cols > vdtHuesPreviewColumnsMax) + then cols:=vdtHuesPreviewColumnsMax; + Logger.Send([lcClient, lcInfo], 'TfrmHueSettings.HuePreviewRebuild(): Число колонок cols', cols+1); + + // Создаем колонки + vdtHuePreview.BeginUpdate; + vdtHuePreview.Header.Columns.Clear; + vdtHuePreview.Header.Columns.DefaultWidth := ItemWidth + 2; + for cn := 0 to cols do + vdtHuePreview.Header.Columns.Add; + + // Создаем ячейки + vdtHuePreview.Clear; + + vdtHuePreview.Tag := ItemID; + vdtHuePreview.DefaultNodeHeight := ItemHeight + 2; + h := 0; + while h < ResMan.Hue.Count do begin + item := vdtHuePreview.AddChild(nil); + info := vdtHuePreview.GetNodeData(item); + for cn := cols to vdtHuesPreviewColumnsMax do + info^.Art[cn] := nil; + for cn := 0 to cols do begin + info^.Art[cn] := nil; + info^.ID[cn] := h; + h := h + 1; + if h >= ResMan.Hue.Count + then break; + end; + end; + vdtHuePreview.EndUpdate; +end; + +procedure TfrmHueSettings.HuePreviewFree(); +var + colm: Integer; + node: PVirtualNode; + info: PHuesInfo; +begin + vdtHuePreview.Tag := -1; + node := vdtHuePreview.GetFirst(); + while node <> nil do begin + info := vdtHuePreview.GetNodeData(node); + for colm := 0 to vdtHuesPreviewColumnsMax do begin + if info^.Art[colm] <> nil + then info^.Art[colm].Free; + info^.Art[colm] := nil; + end; + node := vdtHuePreview.GetNext(node); + end; +end; + +procedure TfrmHueSettings.vdtHuePreviewDrawNode(Sender: TBaseVirtualTree; + const PaintInfo: TVTPaintInfo); +var + //tileInfo : PTileInfo; + destColor : Word; + tileData : TTileData; + artPartial: Boolean; + artEntry : TArt; + + info: PHuesInfo; + id : Integer; + hue : THue; + mpos: TPoint; + rect: TRect; +begin + id := TVirtualDrawTree(Sender).Tag; + info:= Sender.GetNodeData(PaintInfo.Node); + if info^.ID[PaintInfo.Column] <= 0 then begin + hue := nil; + if (PaintInfo.Node <> Sender.GetFirst()) then begin + PaintInfo.Canvas.Brush.Color := vdtHuePreview.Color; + exit; // Не рисуем ячейки без цвета если они не в первом ряду + end; + end else hue := ResMan.Hue.Hues[info^.ID[PaintInfo.Column] - 1]; + + if ResMan.Art.Exists(id) then begin + // Определяем цвет подсветки (т.е. выделен ли тайл) + {mpos := vdtHuePreview.ScreenToClient(Mouse.CursorPos); + if (vdtHuePreview.GetNodeAt(mpos.x, mpos.y) = PaintInfo.Node) + and ((mpos.x div vdtHuePreview.Header.Columns.DefaultWidth) = PaintInfo.Column) + then destColor := EncodeUOColor(vdtHuePreview.Colors.FocusedSelectionColor) + else }destColor := EncodeUOColor(vdtHuePreview.Color); + + if info^.Art[PaintInfo.Column] = nil then begin + tileData := TTileData(ResMan.Tiledata.Block[ID]); + artPartial := tdfPartialHue in tileData.Flags; + artEntry := ResMan.Art.GetArt(ID, destColor, hue, artPartial); + info^.Art[PaintInfo.Column] := artEntry; + end else artEntry := info^.Art[PaintInfo.Column]; + + rect.Left := PaintInfo.CellRect.Left + 1; + rect.Top := PaintInfo.CellRect.Top + 1; + rect.Right := PaintInfo.CellRect.Right - 1; + rect.Bottom:= PaintInfo.CellRect.Bottom - 1; + + DisplayImage(PaintInfo.Canvas, rect, artEntry.Graphic); + //artEntry.Free; + end; + +end; + +procedure TfrmHueSettings.vdtHuePreviewMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +var + mpos: TPoint; + colm: Integer; + node: PVirtualNode; +begin + {mpos := vdtHuePreview.ScreenToClient(Mouse.CursorPos); + colm := mpos.x div vdtHuePreview.Header.Columns.DefaultWidth; + node := vdtHuePreview.GetNodeAt(mpos.x, mpos.y); + if (colm <> LastSelectedColm) and (node <> LastSelectedNode) then begin + vdtHuePreview.RepaintNode(node); + LastSelectedColm := colm; + LastSelectedNode := node; + vdtHuePreview.RepaintNode(node); + end;} +end; + +procedure TfrmHueSettings.vdtHuePreviewClick(Sender: TObject); +var + mpos: TPoint; + info: PHuesInfo; + hues: Integer; +begin + mpos := vdtHuePreview.ScreenToClient(Mouse.CursorPos); + info := vdtHuePreview.GetNodeData( vdtHuePreview.GetNodeAt(mpos.x, mpos.y) ); + hues := info^.ID[ mpos.x div vdtHuePreview.Header.Columns.DefaultWidth ]; + if hues < ResMan.Hue.Count then begin + Logger.Send([lcClient, lcInfo], 'mpos.x="%d"; mpos.y="%d"; hues="%d"', [mpos.x, mpos.y, hues]); + + edHue.Text := Format('$%x', [hues]); + edHueEditingDone(Sender); + + FormShow(Sender); // Закрываем окно и возвращаемся обратно + Top := LastFormPosition.y; + Left := LastFormPosition.x; + mpos.x := ImagePreviewItem.Width div 2; + mpos.y := ImagePreviewItem.Height div 2; + Mouse.CursorPos := ImagePreviewItem.ClientToScreen(mpos); + end; +end; + + initialization {$I UfrmHueSettings.lrs} diff --git a/Client/Tools/UfrmLightlevel.lfm b/Client/Tools/UfrmLightlevel.lfm index 1b5d12f..28bd178 100644 --- a/Client/Tools/UfrmLightlevel.lfm +++ b/Client/Tools/UfrmLightlevel.lfm @@ -1,15 +1,19 @@ inherited frmLightlevel: TfrmLightlevel + Left = 598 Height = 171 - Width = 40 - ActiveControl = tbLightlevel - Caption = 'Lightlevel' + Top = 733 + Width = 53 + Caption = 'Свет' ClientHeight = 171 - ClientWidth = 40 + ClientWidth = 53 + Constraints.MaxWidth = 40 + Constraints.MinWidth = 36 + OnCreate = FormCreate object tbLightlevel: TTrackBar[0] Left = 0 Height = 171 Top = 0 - Width = 40 + Width = 53 Max = 32 OnChange = tbLightlevelChange Orientation = trVertical @@ -18,5 +22,6 @@ inherited frmLightlevel: TfrmLightlevel TabOrder = 0 end inherited tmClose: TTimer[1] + top = 88 end end diff --git a/Client/Tools/UfrmLightlevel.pas b/Client/Tools/UfrmLightlevel.pas index 6bd4e55..a1d3510 100644 --- a/Client/Tools/UfrmLightlevel.pas +++ b/Client/Tools/UfrmLightlevel.pas @@ -14,6 +14,7 @@ type TfrmLightlevel = class(TfrmToolWindow) tbLightlevel: TTrackBar; + procedure FormCreate(Sender: TObject); procedure tbLightlevelChange(Sender: TObject); private { private declarations } @@ -27,7 +28,7 @@ var implementation uses - UfrmMain; + UfrmMain, Language; { TfrmLightlevel } @@ -40,9 +41,15 @@ begin end else frmMain.LightManager.LightLevel := tbLightlevel.Position; + frmMain.acLightlevel.Tag:=frmMain.LightManager.LightLevel; frmMain.oglGameWindow.Repaint; end; +procedure TfrmLightlevel.FormCreate(Sender: TObject); +begin + LanguageTranslate(Self); +end; + initialization {$I UfrmLightlevel.lrs} diff --git a/Client/Tools/UfrmMoveSettings.lfm b/Client/Tools/UfrmMoveSettings.lfm index 48bb12b..bb3111f 100644 --- a/Client/Tools/UfrmMoveSettings.lfm +++ b/Client/Tools/UfrmMoveSettings.lfm @@ -1,25 +1,26 @@ inherited frmMoveSettings: TfrmMoveSettings - Left = 290 - Height = 120 - Top = 171 - Width = 232 - ActiveControl = cbAsk - AutoSize = True - Caption = 'Move settings' - ClientHeight = 120 - ClientWidth = 232 + Left = 1327 + Height = 112 + Top = 452 + Width = 212 + Caption = 'Опции перемещения' + ClientHeight = 112 + ClientWidth = 212 + OnCreate = FormCreate object cbAsk: TCheckBox[0] - AnchorSideLeft.Control = gbDirection - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = gbDirection - Left = 121 + AnchorSideLeft.Control = gbMovment + AnchorSideRight.Control = gbMovment + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 119 Height = 19 - Top = 20 - Width = 94 - BorderSpacing.Left = 8 - BorderSpacing.Top = 16 - BorderSpacing.Right = 8 - Caption = 'Ask each time' + Top = 63 + Width = 87 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 4 + BorderSpacing.Bottom = 30 + Caption = 'Спрашивать' Checked = True State = cbChecked TabOrder = 0 @@ -27,14 +28,13 @@ inherited frmMoveSettings: TfrmMoveSettings object gbDirection: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner - Left = 8 + Left = 4 Height = 108 - Top = 4 + Top = 0 Width = 105 AutoSize = True BorderSpacing.Left = 4 BorderSpacing.Bottom = 4 - BorderSpacing.Around = 4 ClientHeight = 90 ClientWidth = 101 TabOrder = 1 @@ -46,7 +46,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 0 Width = 23 BorderSpacing.Left = 8 - Color = clBtnFace Down = True Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -97,7 +96,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 0 Width = 23 BorderSpacing.Left = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -147,7 +145,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 0 Width = 23 BorderSpacing.Left = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -198,7 +195,6 @@ inherited frmMoveSettings: TfrmMoveSettings Width = 23 BorderSpacing.Top = 8 BorderSpacing.Right = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -248,7 +244,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 60 Width = 23 BorderSpacing.Top = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -299,7 +294,6 @@ inherited frmMoveSettings: TfrmMoveSettings Width = 23 BorderSpacing.Left = 8 BorderSpacing.Bottom = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -349,7 +343,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 60 Width = 23 BorderSpacing.Top = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -399,7 +392,6 @@ inherited frmMoveSettings: TfrmMoveSettings Top = 30 Width = 23 BorderSpacing.Top = 8 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -446,7 +438,7 @@ inherited frmMoveSettings: TfrmMoveSettings AnchorSideTop.Control = btnTop AnchorSideTop.Side = asrBottom Left = 33 - Height = 25 + Height = 23 Hint = 'Offset' Top = 30 Width = 34 @@ -462,20 +454,70 @@ inherited frmMoveSettings: TfrmMoveSettings object btnCancel: TButton[2] AnchorSideLeft.Control = gbDirection AnchorSideLeft.Side = asrBottom + AnchorSideRight.Control = gbMovment + AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = gbDirection AnchorSideBottom.Side = asrBottom - Left = 121 + Left = 117 Height = 25 - Top = 83 - Width = 103 - Anchors = [akLeft, akBottom] + Top = 82 + Width = 89 + Anchors = [akLeft, akRight, akBottom] BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 4 + BorderSpacing.Bottom = 1 BorderSpacing.InnerBorder = 4 Cancel = True - Caption = 'Cancel' + Caption = 'Отмена' ModalResult = 2 TabOrder = 2 end + object gbMovment: TGroupBox[3] + AnchorSideLeft.Control = gbDirection + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = cbAsk + Left = 115 + Height = 59 + Top = 0 + Width = 91 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Right = 6 + BorderSpacing.Bottom = 4 + Caption = 'Перемещать' + ClientHeight = 41 + ClientWidth = 87 + TabOrder = 3 + object cbLand: TCheckBox + AnchorSideLeft.Control = gbMovment + AnchorSideTop.Control = gbMovment + Left = 8 + Height = 19 + Top = 0 + Width = 61 + BorderSpacing.Left = 8 + Caption = 'Рельеф' + OnChange = cbLandChange + TabOrder = 0 + end + object cbItem: TCheckBox + AnchorSideLeft.Control = cbLand + AnchorSideTop.Control = cbLand + AnchorSideTop.Side = asrBottom + Left = 8 + Height = 19 + Top = 19 + Width = 63 + Caption = 'Статику' + Checked = True + OnChange = cbItemChange + State = cbChecked + TabOrder = 1 + end + end + inherited tmClose: TTimer[4] + left = 184 + end end diff --git a/Client/Tools/UfrmMoveSettings.pas b/Client/Tools/UfrmMoveSettings.pas index 0d1f738..e41b8b3 100644 --- a/Client/Tools/UfrmMoveSettings.pas +++ b/Client/Tools/UfrmMoveSettings.pas @@ -40,6 +40,8 @@ type TfrmMoveSettings = class(TfrmToolWindow) btnCancel: TButton; cbAsk: TCheckBox; + cbLand: TCheckBox; + cbItem: TCheckBox; gbDirection: TGroupBox; btnTopLeft: TSpeedButton; btnTop: TSpeedButton; @@ -49,8 +51,12 @@ type btnBottom: TSpeedButton; btnBottomLeft: TSpeedButton; btnLeft: TSpeedButton; + gbMovment: TGroupBox; seOffset: TSpinEdit; procedure btnTopLeftClick(Sender: TObject); + procedure cbItemChange(Sender: TObject); + procedure cbLandChange(Sender: TObject); + procedure FormCreate(Sender: TObject); procedure FormDeactivate(Sender: TObject); override; procedure FormShow(Sender: TObject); override; protected @@ -66,7 +72,7 @@ var implementation uses - UdmNetwork, UfrmMain, UEnums; + UdmNetwork, UfrmMain, UEnums, Language; { TfrmMoveSettings } @@ -79,7 +85,7 @@ end; procedure TfrmMoveSettings.FormShow(Sender: TObject); begin btnCancel.Visible := (fsModal in FormState); - if dmNetwork.AccessLevel = alAdministrator then + if dmNetwork.AccessLevel = alDeveloper then seOffset.MaxValue := Max(frmMain.Landscape.CellWidth, frmMain.Landscape.CellHeight); inherited FormShow(Sender); @@ -140,6 +146,24 @@ begin ModalResult := mrYes; end; +procedure TfrmMoveSettings.cbItemChange(Sender: TObject); +begin + if not cbItem.Checked + then cbLand.Checked := True; +end; + +procedure TfrmMoveSettings.cbLandChange(Sender: TObject); +begin + if not cbLand.Checked + then cbItem.Checked := True; +end; + +procedure TfrmMoveSettings.FormCreate(Sender: TObject); +begin + LanguageTranslate(Self); +end; + + initialization {$I UfrmMoveSettings.lrs} diff --git a/Client/Tools/UfrmSelectionSettings.lfm b/Client/Tools/UfrmSelectionSettings.lfm new file mode 100644 index 0000000..f989f1e --- /dev/null +++ b/Client/Tools/UfrmSelectionSettings.lfm @@ -0,0 +1,12 @@ +inherited frmSelectionSettings: TfrmSelectionSettings + Left = 1122 + Height = 116 + Top = 613 + Width = 188 + Caption = 'Опции выделения' + OnCreate = FormCreate + OnShow = FormShow + inherited tmClose: TTimer + left = 80 + end +end diff --git a/Client/Tools/UfrmSelectionSettings.pas b/Client/Tools/UfrmSelectionSettings.pas new file mode 100644 index 0000000..72e31c4 --- /dev/null +++ b/Client/Tools/UfrmSelectionSettings.pas @@ -0,0 +1,82 @@ +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UfrmSelectionSettings; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, + Spin, ExtCtrls, LMessages, VirtualTrees, UfrmToolWindow, UfrmMain; + +type + + { TfrmSelectionSettings } + + TfrmSelectionSettings = class(TfrmToolWindow) + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FCanClose: Boolean; + function CanClose: Boolean; override; + end; + +var + frmSelectionSettings: TfrmSelectionSettings; + +implementation + +uses + UGameResources, UHue, UfrmHueSettings, Language; + +//type + +{ TfrmSelectionSettings } + +procedure TfrmSelectionSettings.FormCreate(Sender: TObject); +begin + FCanClose := True; +end; + +procedure TfrmSelectionSettings.FormShow(Sender: TObject); +begin + LanguageTranslate(Self); + //do work + (frmSelectionSettings as TfrmToolWindow).FormShow(Sender); +end; + + +function TfrmSelectionSettings.CanClose: Boolean; +begin + Result := FCanClose and inherited CanClose; +end; + +initialization + {$I UfrmSelectionSettings.lrs} + +end. + diff --git a/Client/Tools/UfrmSurfElevateSettings.lfm b/Client/Tools/UfrmSurfElevateSettings.lfm new file mode 100644 index 0000000..d54f3fd --- /dev/null +++ b/Client/Tools/UfrmSurfElevateSettings.lfm @@ -0,0 +1,12 @@ +inherited frmSurfElevateSettings: TfrmSurfElevateSettings + Left = 1122 + Height = 80 + Top = 613 + Width = 244 + Caption = 'Опции редактирования меша' + OnCreate = FormCreate + OnShow = FormShow + inherited tmClose: TTimer + left = 80 + end +end diff --git a/Client/Tools/UfrmSurfElevateSettings.pas b/Client/Tools/UfrmSurfElevateSettings.pas new file mode 100644 index 0000000..583dc8b --- /dev/null +++ b/Client/Tools/UfrmSurfElevateSettings.pas @@ -0,0 +1,82 @@ +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UfrmSurfElevateSettings; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, + Spin, ExtCtrls, LMessages, VirtualTrees, UfrmToolWindow, UfrmMain; + +type + + { TfrmSurfElevateSettings } + + TfrmSurfElevateSettings = class(TfrmToolWindow) + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FCanClose: Boolean; + function CanClose: Boolean; override; + end; + +var + frmSurfElevateSettings: TfrmSurfElevateSettings; + +implementation + +uses + UGameResources, UHue, UfrmHueSettings, Language; + +//type + +{ TfrmSurfElevateSettings } + +procedure TfrmSurfElevateSettings.FormCreate(Sender: TObject); +begin + FCanClose := True; +end; + +procedure TfrmSurfElevateSettings.FormShow(Sender: TObject); +begin + LanguageTranslate(Self); + //do work + (frmSurfElevateSettings as TfrmToolWindow).FormShow(Sender); +end; + + +function TfrmSurfElevateSettings.CanClose: Boolean; +begin + Result := FCanClose and inherited CanClose; +end; + +initialization + {$I UfrmSurfElevateSettings.lrs} + +end. + diff --git a/Client/Tools/UfrmSurfSmoothSettings.lfm b/Client/Tools/UfrmSurfSmoothSettings.lfm new file mode 100644 index 0000000..4afa0bd --- /dev/null +++ b/Client/Tools/UfrmSurfSmoothSettings.lfm @@ -0,0 +1,12 @@ +inherited frmSurfSmoothSettings: TfrmSurfSmoothSettings + Left = 1122 + Height = 87 + Top = 613 + Width = 231 + Caption = 'Опции растягивания меша' + OnCreate = FormCreate + OnShow = FormShow + inherited tmClose: TTimer + left = 80 + end +end diff --git a/Client/Tools/UfrmSurfSmoothSettings.pas b/Client/Tools/UfrmSurfSmoothSettings.pas new file mode 100644 index 0000000..984de45 --- /dev/null +++ b/Client/Tools/UfrmSurfSmoothSettings.pas @@ -0,0 +1,82 @@ +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UfrmSurfSmoothSettings; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, + Spin, ExtCtrls, LMessages, VirtualTrees, UfrmToolWindow, UfrmMain; + +type + + { TfrmSurfSmoothSettings } + + TfrmSurfSmoothSettings = class(TfrmToolWindow) + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FCanClose: Boolean; + function CanClose: Boolean; override; + end; + +var + frmSurfSmoothSettings: TfrmSurfSmoothSettings; + +implementation + +uses + UGameResources, UHue, UfrmHueSettings, Language; + +//type + +{ TfrmSurfSmoothSettings } + +procedure TfrmSurfSmoothSettings.FormCreate(Sender: TObject); +begin + FCanClose := True; +end; + +procedure TfrmSurfSmoothSettings.FormShow(Sender: TObject); +begin + LanguageTranslate(Self); + //do work + (frmSurfSmoothSettings as TfrmToolWindow).FormShow(Sender); +end; + + +function TfrmSurfSmoothSettings.CanClose: Boolean; +begin + Result := FCanClose and inherited CanClose; +end; + +initialization + {$I UfrmSurfSmoothSettings.lrs} + +end. + diff --git a/Client/Tools/UfrmSurfStretchSettings.lfm b/Client/Tools/UfrmSurfStretchSettings.lfm new file mode 100644 index 0000000..10d1ebe --- /dev/null +++ b/Client/Tools/UfrmSurfStretchSettings.lfm @@ -0,0 +1,12 @@ +inherited frmSurfStretchSettings: TfrmSurfStretchSettings + Left = 1122 + Height = 71 + Top = 613 + Width = 249 + Caption = 'Опции сглаживания меша' + OnCreate = FormCreate + OnShow = FormShow + inherited tmClose: TTimer + left = 80 + end +end diff --git a/Client/Tools/UfrmSurfStretchSettings.pas b/Client/Tools/UfrmSurfStretchSettings.pas new file mode 100644 index 0000000..e21d758 --- /dev/null +++ b/Client/Tools/UfrmSurfStretchSettings.pas @@ -0,0 +1,82 @@ +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UfrmSurfStretchSettings; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, + Spin, ExtCtrls, LMessages, VirtualTrees, UfrmToolWindow, UfrmMain; + +type + + { TfrmSurfStretchSettings } + + TfrmSurfStretchSettings = class(TfrmToolWindow) + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FCanClose: Boolean; + function CanClose: Boolean; override; + end; + +var + frmSurfStretchSettings: TfrmSurfStretchSettings; + +implementation + +uses + UGameResources, UHue, UfrmHueSettings, Language; + +//type + +{ TfrmSurfStretchSettings } + +procedure TfrmSurfStretchSettings.FormCreate(Sender: TObject); +begin + FCanClose := True; +end; + +procedure TfrmSurfStretchSettings.FormShow(Sender: TObject); +begin + LanguageTranslate(Self); + //do work + (frmSurfStretchSettings as TfrmToolWindow).FormShow(Sender); +end; + + +function TfrmSurfStretchSettings.CanClose: Boolean; +begin + Result := FCanClose and inherited CanClose; +end; + +initialization + {$I UfrmSurfStretchSettings.lrs} + +end. + diff --git a/Client/Tools/UfrmToolWindow.lfm b/Client/Tools/UfrmToolWindow.lfm index 808aa95..7b35217 100644 --- a/Client/Tools/UfrmToolWindow.lfm +++ b/Client/Tools/UfrmToolWindow.lfm @@ -11,7 +11,7 @@ object frmToolWindow: TfrmToolWindow OnDeactivate = FormDeactivate OnShow = FormShow ShowInTaskBar = stNever - LCLVersion = '0.9.29' + LCLVersion = '0.9.30' object tmClose: TTimer Enabled = False OnTimer = tmCloseTimer diff --git a/Client/Tools/UfrmVirtualLayer.lfm b/Client/Tools/UfrmVirtualLayer.lfm index afb4577..c5f1b91 100644 --- a/Client/Tools/UfrmVirtualLayer.lfm +++ b/Client/Tools/UfrmVirtualLayer.lfm @@ -1,21 +1,20 @@ inherited frmVirtualLayer: TfrmVirtualLayer - Left = 290 - Height = 82 - Top = 171 + Left = 1164 + Height = 88 + Top = 443 Width = 210 - ActiveControl = cbShowLayer - Caption = 'Virtual Layer' - ClientHeight = 82 + Caption = 'Виртуальный слой' + ClientHeight = 88 ClientWidth = 210 + OnCreate = FormCreate object tbZ: TTrackBar[0] AnchorSideLeft.Control = Owner - AnchorSideTop.Control = seZ - AnchorSideTop.Side = asrBottom + AnchorSideTop.Control = cbShowBlocks AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 36 - Top = 37 + Top = 44 Width = 194 Frequency = 10 Max = 127 @@ -24,6 +23,7 @@ inherited frmVirtualLayer: TfrmVirtualLayer PageSize = 1 Position = 0 Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 9 BorderSpacing.Around = 8 TabOrder = 0 end @@ -32,28 +32,164 @@ inherited frmVirtualLayer: TfrmVirtualLayer AnchorSideTop.Control = seZ AnchorSideTop.Side = asrCenter Left = 8 - Height = 22 - Top = 7 - Width = 126 + Height = 19 + Top = 8 + Width = 131 BorderSpacing.Left = 8 - Caption = 'Show Layer at Z:' + Caption = 'Показать на высоте:' OnChange = cbShowLayerChange TabOrder = 1 end - object seZ: TSpinEdit[2] + object cbShowBlocks: TCheckBox[2] + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = cbShowLayer + AnchorSideTop.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 8 + Height = 19 + Top = 27 + Width = 166 + BorderSpacing.Left = 8 + Caption = 'Выделять границы блоков' + OnChange = cbShowLayerChange + TabOrder = 3 + end + object btnZi20: TButton[3] + AnchorSideTop.Control = tbZ + AnchorSideRight.Control = tbZ + AnchorSideRight.Side = asrBottom + Left = 172 + Height = 14 + Top = 72 + Width = 28 + Anchors = [akTop, akRight] + BorderSpacing.Top = 28 + BorderSpacing.Right = 2 + Caption = '+20' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 4 + end + object btnZi05: TButton[4] + AnchorSideTop.Control = btnZi20 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = btnZi20 + Left = 142 + Height = 14 + Top = 72 + Width = 28 + Anchors = [akTop, akRight] + BorderSpacing.Right = 2 + Caption = '+5' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 5 + end + object btnZd20: TButton[5] + AnchorSideLeft.Control = tbZ + AnchorSideTop.Control = btnZi20 + AnchorSideTop.Side = asrCenter + Left = 10 + Height = 14 + Top = 72 + Width = 28 + BorderSpacing.Left = 2 + Caption = '-20' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 6 + end + object btnZd05: TButton[6] + AnchorSideLeft.Control = btnZd20 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnZi20 + AnchorSideTop.Side = asrCenter + Left = 40 + Height = 14 + Top = 72 + Width = 28 + BorderSpacing.Left = 2 + Caption = '-5' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 7 + end + object btnZd03: TButton[7] + AnchorSideLeft.Control = btnZd05 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnZi20 + AnchorSideTop.Side = asrCenter + Left = 70 + Height = 14 + Top = 72 + Width = 28 + BorderSpacing.Left = 2 + Caption = '-3' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 8 + end + object btnZi03: TButton[8] + AnchorSideTop.Control = btnZi20 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = btnZi05 + Left = 112 + Height = 14 + Top = 72 + Width = 28 + Anchors = [akTop, akRight] + BorderSpacing.Right = 2 + Caption = '+3' + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + OnClick = btnZ_Click + ParentFont = False + TabOrder = 9 + end + object seZ: TSpinEdit[9] AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 152 - Height = 21 - Top = 8 + Height = 23 + Top = 6 Width = 50 Anchors = [akTop, akRight] - BorderSpacing.Top = 8 + BorderSpacing.Top = 6 BorderSpacing.Right = 8 MaxValue = 127 MinValue = -128 OnChange = seZChange TabOrder = 2 end + inherited tmClose: TTimer[10] + end end diff --git a/Client/Tools/UfrmVirtualLayer.pas b/Client/Tools/UfrmVirtualLayer.pas index 8ebcbd4..eb23c53 100644 --- a/Client/Tools/UfrmVirtualLayer.pas +++ b/Client/Tools/UfrmVirtualLayer.pas @@ -38,10 +38,19 @@ type { TfrmVirtualLayer } TfrmVirtualLayer = class(TfrmToolWindow) + btnZi20: TButton; + btnZi05: TButton; + btnZd20: TButton; + btnZd05: TButton; + btnZd03: TButton; + btnZi03: TButton; cbShowLayer: TCheckBox; + cbShowBlocks: TCheckBox; seZ: TSpinEdit; tbZ: TTrackBar; + procedure btnZ_Click(Sender: TObject); procedure cbShowLayerChange(Sender: TObject); + procedure FormCreate(Sender: TObject); procedure seZChange(Sender: TObject); procedure tbZChange(Sender: TObject); public @@ -54,7 +63,7 @@ var implementation uses - UfrmMain; + UfrmMain, Language; { TfrmVirtualLayer } @@ -69,6 +78,29 @@ begin frmMain.InvalidateScreenBuffer; end; +procedure TfrmVirtualLayer.btnZ_Click(Sender: TObject); +var + value: integer; +begin + value := seZ.Value; + if (Sender = btnZd20) then dec(value, 20) else + if (Sender = btnZd05) then dec(value, 05) else + if (Sender = btnZd03) then dec(value, 03) else + if (Sender = btnZi03) then inc(value, 03) else + if (Sender = btnZi05) then inc(value, 05) else + if (Sender = btnZi20) then inc(value, 20) else + exit; + if (value < -128) or (value > 127) then + exit; + seZ.Value := value; + seZChange(Sender); +end; + +procedure TfrmVirtualLayer.FormCreate(Sender: TObject); +begin + LanguageTranslate(Self); +end; + procedure TfrmVirtualLayer.tbZChange(Sender: TObject); begin seZ.Value := tbZ.Position; diff --git a/Client/UGameResources.pas b/Client/UGameResources.pas index f99e885..51d138a 100644 --- a/Client/UGameResources.pas +++ b/Client/UGameResources.pas @@ -30,7 +30,7 @@ unit UGameResources; interface uses - Classes, SysUtils, UArtProvider, UTileDataProvider, UTexmapProvider, + Classes, SysUtils, Dialogs, UArtProvider, UTileDataProvider, UTexmapProvider, ULandscape, UHueProvider, UAnimDataProvider, ULightProvider; type @@ -38,7 +38,7 @@ type { TGameResourceManager } TGameResourceManager = class - constructor Create(ADataDir: String); + constructor Create(ADataDir: String; Flags: Cardinal; out Success: Boolean); destructor Destroy; override; protected { Members } @@ -63,37 +63,83 @@ type { Methods } function GetFile(AFileName: String): String; procedure InitLandscape(AWidth, AHeight: Word); + public + lbDlgErrorFilePathCaption: string; + lbDlgErrorFilePathMsg: string; end; var GameResourceManager: TGameResourceManager; ResMan: TGameResourceManager absolute GameResourceManager; -procedure InitGameResourceManager(ADataDir: String); +function InitGameResourceManager(ADataDir: String; Flags: Cardinal): Boolean; implementation -procedure InitGameResourceManager(ADataDir: String); +uses + UStatics, UfrmInitialize, Language; + +//var +// GameResourceInited : Boolean;//:= False; + +function InitGameResourceManager(ADataDir: String; Flags: Cardinal): Boolean; begin FreeAndNil(GameResourceManager); - GameResourceManager := TGameResourceManager.Create(ADataDir); + GameResourceManager := TGameResourceManager.Create(ADataDir, Flags, Result); end; { TGameResourceManager } -constructor TGameResourceManager.Create(ADataDir: String); +constructor TGameResourceManager.Create(ADataDir: String; Flags: Cardinal; out Success: Boolean); begin inherited Create; + LanguageTranslate(nil, nil, self); FDataDir := IncludeTrailingPathDelimiter(ADataDir); - FArtProvider := TArtProvider.Create(GetFile('art.mul'), GetFile('artidx.mul'), True); - FTiledataProvider := TTiledataProvider.Create(GetFile('tiledata.mul'), True); + // 0xF0 - FlagsData Version Type + // 0x0000 - UnUsed + // 0x01 - pre-alpha client () + // 0x02 - Reserved (alpha client?) + // 0x04 - Reserved (use Verdata) + // 0x08 - HS Client Format + + // Проверка путей + if (not FileExists(GetFile('art.mul'))) or + (not FileExists(GetFile('artidx.mul'))) or + (not FileExists(GetFile('hues.mul'))) or + (not FileExists(GetFile('tiledata.mul'))) or + (not FileExists(GetFile('animdata.mul')) and ((Flags and $01) = 0)) or + (not FileExists(GetFile('texmaps.mul')) and ((Flags and $01) = 0)) or + (not FileExists(GetFile('texidx.mul')) and ((Flags and $01) = 0)) or + (not FileExists(GetFile('light.mul')) and ((Flags and $01) = 0)) or + (not FileExists(GetFile('lightidx.mul')) and ((Flags and $01) = 0)) then + begin + MessageDlg(lbDlgErrorFilePathCaption, lbDlgErrorFilePathMsg, mtWarning, [mbOK], 0); + Success := False; + Destroy; exit; + end; + + UseStaticsOldFormat := (Flags and $01) <> 0; + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['art.mul, artidx.mul'])); + FArtProvider := TArtProvider.Create((Flags and $01) <> 0, GetFile('art.mul'), GetFile('artidx.mul'), True); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['tiledata.mul'])); + FTiledataProvider := TTiledataProvider.Create((Flags and $08) = 0, GetFile('tiledata.mul'), True); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['animdata.mul'])); FAnimdataProvider := TAnimDataProvider.Create(GetFile('animdata.mul'), True); - FTexmapProvider := TTexmapProvider.Create(GetFile('texmaps.mul'), - GetFile('texidx.mul'), True); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['texmaps.mul, texidx.mul'])); + FTexmapProvider := TTexmapProvider.Create(Boolean(Flags and $01), GetFile('texmaps.mul'), GetFile('texidx.mul'), True); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['hues.mul'])); FHueProvider := THueProvider.Create(GetFile('hues.mul'), True); - FLightProvider := TLightProvider.Create(GetFile('light.mul'), - GetFile('lightidx.mul'), True); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['light.mul, lightidx.mul'])); + FLightProvider := TLightProvider.Create(GetFile('light.mul'), GetFile('lightidx.mul'), True); + + Success := True; end; destructor TGameResourceManager.Destroy; @@ -115,6 +161,8 @@ end; procedure TGameResourceManager.InitLandscape(AWidth, AHeight: Word); begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['Landscape'])); + FreeAndNil(FLandscape); FLandscape := TLandscape.Create(AWidth, AHeight); end; diff --git a/Client/ULandscape.pas b/Client/ULandscape.pas index 2c01e80..15ba1f8 100644 --- a/Client/ULandscape.pas +++ b/Client/ULandscape.pas @@ -31,9 +31,9 @@ interface uses SysUtils, Classes, math, matrix, LCLIntf, GL, GLu, ImagingOpenGL, Imaging, - ImagingClasses, ImagingTypes, ImagingUtility, + ImagingClasses, ImagingTypes, ImagingUtility, DOM, XMLRead, UGenericIndex, UMap, UStatics, UArt, UTexture, UTiledata, UHue, UWorldItem, - UMulBlock, UAnimData, + UMulBlock, UAnimData, UfrmInitialize, UEnhancedMemoryStream, UGLFont, UCacheManager; @@ -70,6 +70,7 @@ type procedure AddRef; procedure DelRef; function HitTest(AX, AY: Integer): Boolean; + function HitTest(AX, AY: Integer; Zoom: Single): Boolean; {ICacheable} function CanBeRemoved: Boolean; @@ -89,7 +90,7 @@ type { TAnimMaterial } TAnimMaterial = class(TMaterial) - constructor Create(ABaseID: Word; AAnimData: TAnimData; AHue: THue = nil; + constructor Create(ABaseID: LongWord; AAnimData: TAnimData; AHue: THue = nil; APartialHue: Boolean = False); destructor Destroy; override; protected @@ -114,12 +115,12 @@ type FUseAnims: Boolean; public property UseAnims: Boolean read FUseAnims write FUseAnims; - function GetArtMaterial(ATileID: Word): TMaterial; overload; - function GetArtMaterial(ATileID: Word; AHue: THue; + function GetArtMaterial(ATileID: LongWord): TMaterial; overload; + function GetArtMaterial(ATileID: LongWord; AHue: THue; APartialHue: Boolean): TMaterial; overload; function GetStaticMaterial(AStaticItem: TStaticItem; AOverrideHue: Integer = -1): TMaterial; - function GetTexMaterial(ATileID: Word): TMaterial; + function GetTexMaterial(ATileID: LongWord): TMaterial; end; { TSeperatedStaticBlock } @@ -175,6 +176,7 @@ type FCellWidth: Word; FCellHeight: Word; FBlockCache: TBlockCache; + FBlockCacheBak: TBlockCache; FOnChange: TLandscapeChangeEvent; FOnMapChanged: TMapChangedEvent; FOnNewBlock: TNewBlockEvent; @@ -186,10 +188,11 @@ type FWriteMap: TBits; FDrawMap: TBits; FMaxStaticID: Cardinal; + BlockCacheSize: Integer; { Methods } function GetMapBlock(AX, AY: Word): TMapBlock; - function GetMapCell(AX, AY: Word): TMapCell; - function GetNormals(AX, AY: Word): TNormals; + function GetMapCell(AX, AY: Integer): TMapCell; + function GetNormals(AX, AY: Integer): TNormals; function GetStaticBlock(AX, AY: Word): TSeperatedStaticBlock; function GetStaticList(AX, AY: Word): TStaticItemList; { Events } @@ -207,9 +210,9 @@ type property Height: Word read FHeight; property CellWidth: Word read FCellWidth; property CellHeight: Word read FCellHeight; - property MapCell[X, Y: Word]: TMapCell read GetMapCell; + property MapCell[X, Y: Integer]: TMapCell read GetMapCell; property StaticList[X, Y: Word]: TStaticItemList read GetStaticList; - property Normals[X, Y: Word]: TNormals read GetNormals; + property Normals[X, Y: Integer]: TNormals read GetNormals; property MaxStaticID: Cardinal read FMaxStaticID; property OnChange: TLandscapeChangeEvent read FOnChange write FOnChange; property OnMapChanged: TMapChangedEvent read FOnMapChanged write FOnMapChanged; @@ -224,9 +227,9 @@ type write FOnStaticHued; { Methods } function CanWrite(AX, AY: Word): Boolean; - procedure FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, - AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; - AAdditionalTiles: TWorldItemList = nil); + procedure FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, AHeight: Word; + AMap, AStatics, ATDWalls, ATDBridges, ATDRoofs, ATDSurfaces, ATDFoliage, ATDWet: Boolean; + ANoDraw: Boolean; AAdditionalTiles: TWorldItemList = nil); function GetEffectiveAltitude(ATile: TMapCell): ShortInt; function GetLandAlt(AX, AY: Word; ADefault: ShortInt): ShortInt; procedure GetNormals(AX, AY: Word; var ANormals: TNormals); @@ -235,6 +238,7 @@ type procedure PrepareBlocks(AX1, AY1, AX2, AY2: Word); procedure UpdateBlockAccess; procedure UpdateWriteMap(AStream: TEnhancedMemoryStream); + procedure ResizeBlockCache(Count: Integer); end; { TGLText } @@ -258,6 +262,8 @@ type ScreenRect: TRect; DrawQuad: array[0..3,0..1] of TGLint; RealQuad: array[0..3,0..1] of TGLint; + LineWidth: array[0..2] of GLfloat; + LineDraw: array[0..2,0..1,0..1] of TGLint; Item: TWorldItem; HighRes: TMaterial; LowRes: TMaterial; @@ -265,6 +271,7 @@ type State: TScreenState; Highlighted: Boolean; HueOverride: Boolean; + Hue: Word; CheckRealQuad: Boolean; Translucent: Boolean; WalkRestriction: TWalkRestriction; @@ -288,7 +295,8 @@ type function Add(AItem: TWorldItem): PBlockInfo; procedure Clear; procedure Delete(AItem: TWorldItem); - function Find(AScreenPosition: TPoint): PBlockInfo; + function Find(AScreenPosition: TPoint; Zoom: Single): PBlockInfo; + function Find(AX, AY: Word): PBlockInfo; function GetSerial: Cardinal; function Insert(AItem: TWorldItem): PBlockInfo; function Iterate(var ABlockInfo: PBlockInfo): Boolean; @@ -342,7 +350,7 @@ begin inherited Destroy; end; -function TLandTextureManager.GetArtMaterial(ATileID: Word): TMaterial; +function TLandTextureManager.GetArtMaterial(ATileID: LongWord): TMaterial; var artEntry: TArt; animData: TAnimData; @@ -373,7 +381,7 @@ begin Result.AddRef; end; -function TLandTextureManager.GetArtMaterial(ATileID: Word; AHue: THue; +function TLandTextureManager.GetArtMaterial(ATileID: LongWord; AHue: THue; APartialHue: Boolean): TMaterial; var artEntry: TArt; @@ -431,7 +439,7 @@ begin tdfPartialHue in staticTiledata.Flags); end; -function TLandTextureManager.GetTexMaterial(ATileID: Word): TMaterial; +function TLandTextureManager.GetTexMaterial(ATileID: LongWord): TMaterial; var texEntry: TTexture; texID: Integer; @@ -460,7 +468,7 @@ end; constructor TSeperatedStaticBlock.Create(AData: TStream; AIndex: TGenericIndex; AX, AY: Word); var - i: Integer; + i, ts: Integer; item: TStaticItem; block: TMemoryStream; begin @@ -473,13 +481,18 @@ begin for i := 0 to 63 do Cells[i] := TStaticItemList.Create; + if not UseStaticsOldFormat + then ts := 7 + else ts := 11; + if (AData <> nil) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then begin AData.Position := AIndex.Lookup; block := TMemoryStream.Create; block.CopyFrom(AData, AIndex.Size); block.Position := 0; - for i := 1 to (AIndex.Size div 7) do + + for i := 1 to (AIndex.Size div ts) do begin item := TStaticItem.Create(Self, block, AX, AY); Cells[(item.Y mod 8) * 8 + (item.X mod 8)].Add(item); @@ -592,7 +605,8 @@ begin FHeight := AHeight; FCellWidth := FWidth * 8; FCellHeight := FHeight * 8; - FBlockCache := TBlockCache.Create(256); + BlockCacheSize := 256; + FBlockCache := TBlockCache.Create(BlockCacheSize); //856 FBlockCache.OnRemoveObject := @OnRemoveCachedObject; FOnChange := nil; @@ -608,6 +622,7 @@ begin for i := 0 to FWriteMap.Size - 1 do FWriteMap[i] := True; + //FMaxStaticID := $1FFDC; FMaxStaticID := Min(Min(ResMan.Animdata.AnimCount, ResMan.Tiledata.StaticCount), ResMan.Art.EntryCount - $4000); Logger.Send([lcClient, lcInfo], 'Landscape recognizes $%x StaticTile IDs.', @@ -628,6 +643,11 @@ end; destructor TLandscape.Destroy; begin + if (FBlockCacheBak <> nil) then + begin + FBlockCacheBak.OnRemoveObject := nil; + FreeAndNil(FBlockCacheBak); + end; if FBlockCache <> nil then begin FBlockCache.OnRemoveObject := nil; @@ -661,7 +681,7 @@ begin end; end; -function TLandscape.GetMapCell(AX, AY: Word): TMapCell; +function TLandscape.GetMapCell(AX, AY: Integer): TMapCell; var block: TMapBlock; begin @@ -674,7 +694,7 @@ begin end; end; -function TLandscape.GetNormals(AX, AY: Word): TNormals; +function TLandscape.GetNormals(AX, AY: Integer): TNormals; begin GetNormals(AX, AY, Result); end; @@ -732,7 +752,9 @@ begin index.Lookup := ABuffer.Position else index.Lookup := -1; - index.Size := count * 7; + if not UseStaticsOldFormat + then index.Size := count * 7 + else index.Size := count * 11; statics := TSeperatedStaticBlock.Create(ABuffer, index, coords.X, coords.Y); FBlockCache.RemoveID(id); @@ -957,8 +979,8 @@ begin end; procedure TLandscape.FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, - AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; - AAdditionalTiles: TWorldItemList = nil); + AHeight: Word; AMap, AStatics, ATDWalls, ATDBridges, ATDRoofs, ATDSurfaces, ATDFoliage, ATDWet: Boolean; + ANoDraw: Boolean; AAdditionalTiles: TWorldItemList = nil); var drawMapCell: TMapCell; drawStatics: TStaticItemList; @@ -967,7 +989,7 @@ var staticTileData: TStaticTiledata; begin ADrawList.Clear; - tempDrawList := TWorldItemList.Create(False);; + tempDrawList := TWorldItemList.Create(False); for x := AX to AX + AWidth do begin for y := AY to AY + AWidth do @@ -993,8 +1015,13 @@ begin staticTileData := ResMan.Tiledata.StaticTiles[drawStatics[i].TileID]; if ANoDraw or FDrawMap[drawStatics[i].TileID + $4000] then begin - drawStatics[i].UpdatePriorities(staticTileData, - ADrawList.GetSerial); + if not ATDWalls and ((tdfWall in staticTileData.Flags) or (tdfWindow in staticTileData.Flags)) then continue; + if not ATDBridges and ((tdfBridge in staticTileData.Flags) or (tdfStairBack in staticTileData.Flags) or (tdfStairRight in staticTileData.Flags)) then continue; + if not ATDRoofs and (tdfRoof in staticTileData.Flags) then continue; + if not ATDSurfaces and (tdfSurface in staticTileData.Flags) then continue; + if not ATDFoliage and (tdfFoliage in staticTileData.Flags) then continue; + if not ATDWet and (tdfWet in staticTileData.Flags) then continue; + drawStatics[i].UpdatePriorities(staticTileData, ADrawList.GetSerial); tempDrawList.Add(drawStatics[i]); end; end; @@ -1128,48 +1155,42 @@ end; procedure TLandscape.LoadNoDrawMap(AFileName: String); var - noDrawFile: TextFile; - line, ids1, ids2: String; - i, id1, id2, splitPos: Integer; -begin - AssignFile(noDrawFile, AFileName); - Reset(noDrawFile); - while not EOF(noDrawFile) do - begin - ReadLn(noDrawFile, line); - if (Length(line) > 0) and (line[1] in ['S', 'T']) then - begin - splitPos := Pos('-', line); - if splitPos > 1 then - begin - ids1 := Copy(line, 2, splitPos - 2); - ids2 := Copy(line, splitPos + 1, Length(line)); - if TryStrToInt(ids1, id1) and TryStrToInt(ids2, id2) then - begin - if line[1] = 'S' then - begin - Inc(id1, $4000); - Inc(id2, $4000); - end; + XMLDoc: TXMLDocument; + iNode, node: TDOMNode; + s: string; + i, id: Integer; - for i := id1 to id2 do - if i < FDrawMap.Size then - FDrawMap[i] := False; - end; - end else +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['VirtualTiles.xml'])); + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, AFileName); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'virtualtiles' then + begin + iNode := XMLDoc.DocumentElement.FirstChild; + while iNode <> nil do + begin + if LowerCase(iNode.NodeName) = 'nodraw' then begin - ids1 := Copy(line, 2, Length(line)); - if TryStrToInt(ids1, id1) then + node := iNode.FirstChild; + while node <> nil do begin - if line[1] = 'S' then - Inc(id1, $4000); - if id1 < FDrawMap.Size then - FDrawMap[id1] := False; + s := LowerCase(node.NodeName); + if (s = 'tile') or (s = 'land') or (s = 'item') then + for i := node.Attributes.Length - 1 downto 0 do + if LowerCase(node.Attributes[i].NodeName) = 'id' then + if TryStrToInt(node.Attributes[i].NodeValue, id) then + begin + if s = 'item' + then Inc(id, $4000); + if (id >= 0) and (id < FDrawMap.Size) + then FDrawMap[id] := False; + end; + node := node.NextSibling; end; end; + iNode := iNode.NextSibling; end; end; - CloseFile(noDrawFile); end; procedure TLandscape.MoveStatic(AStatic: TStaticItem; AX, AY: Word); @@ -1272,6 +1293,28 @@ begin Logger.ExitMethod([lcLandscape, lcDebug], 'TLandscape.UpdateWriteMap'); end; +procedure TLandscape.ResizeBlockCache(Count: Integer); +begin + if Count < 0 then Count:= 256; + if FBlockCache <> nil then + begin + if BlockCacheSize = Count then exit; + + FBlockCache.OnRemoveObject := nil; + if (FBlockCacheBak <> nil) then begin + FBlockCacheBak.Clear; + FreeAndNil(FBlockCacheBak); + FBlockCacheBak := nil; + end; + if Count = 0 then exit; + FBlockCacheBak := FBlockCache; + + BlockCacheSize:= Count; + FBlockCache := TBlockCache.Create(BlockCacheSize); //256 + FBlockCache.OnRemoveObject := @OnRemoveCachedObject; + end; +end; + { TMaterial } constructor TMaterial.Create; @@ -1328,6 +1371,13 @@ begin Free; end; +function TMaterial.HitTest(AX, AY: Integer; Zoom: Single): Boolean; +begin + AX := Trunc(AX / Zoom); + AY := Trunc(AY / Zoom); + Result := HitTest(AX, AY); +end; + function TMaterial.HitTest(AX, AY: Integer): Boolean; var pixel: TColor32Rec; @@ -1453,7 +1503,7 @@ begin end; end; -function TScreenBuffer.Find(AScreenPosition: TPoint): PBlockInfo; +function TScreenBuffer.Find(AScreenPosition: TPoint; Zoom: Single): PBlockInfo; var current: PBlockInfo; buff: array[0..3] of GLuint; @@ -1498,13 +1548,46 @@ begin Result := current; end else if current^.LowRes.HitTest(AScreenPosition.x - current^.ScreenRect.Left, - AScreenPosition.y - current^.ScreenRect.Top) then + AScreenPosition.y - current^.ScreenRect.Top, Zoom) then Result := current; end; current := current^.Next; end; end; +function TScreenBuffer.Find(AX, AY: Word): PBlockInfo; +var + current: PBlockInfo; + tile: TWorldItem; + staticTileData: TStaticTiledata; + tileZ: Integer; +begin + Result := nil; + current := FShortCuts[0]; + while current <> nil do //search the last matching tile + begin + if current^.State = ssNormal then begin + tile := current^.Item; + if (tile.X = AX) and (tile.Y = AY) then begin + + tileZ := $FFFF; + if tile is TStaticItem then begin + staticTileData := ResMan.Tiledata.StaticTiles[tile.TileID]; + if tdfSurface in staticTileData.Flags then + tileZ := tile.Z + staticTileData.Height; + end else if tile is TMapCell then begin + tileZ := ResMan.Landscape.GetEffectiveAltitude(tile as TMapCell) + end else if tile is TVirtualTile then + tileZ := tile.Z; + + if (tileZ <> $FFFF) and ((Result = nil) or (tile.Z > Result^.Item.Z)) then + Result := current; + end; + end; + current := current^.Next; + end; +end; + function TScreenBuffer.GetSerial: Cardinal; begin Result := FSerial; @@ -1593,7 +1676,7 @@ begin shortcut := 1; blockInfo := FShortCuts[0]; repeat - if step = nextStep then + if (step = nextStep) and (shortcut <= 10) then begin FShortCuts[shortcut] := blockInfo; Inc(shortcut); @@ -1713,7 +1796,7 @@ end; { TAnimMaterial } -constructor TAnimMaterial.Create(ABaseID: Word; AAnimData: TAnimData; +constructor TAnimMaterial.Create(ABaseID: LongWord; AAnimData: TAnimData; AHue: THue = nil; APartialHue: Boolean = False); var i: Integer; diff --git a/Client/ULightManager.pas b/Client/ULightManager.pas index 2a5d953..719d1db 100644 --- a/Client/ULightManager.pas +++ b/Client/ULightManager.pas @@ -31,10 +31,21 @@ interface uses Classes, SysUtils, Imaging, ImagingTypes, ImagingClasses, ImagingCanvases, - ImagingOpenGL, GL, GLu, GLext, fgl, ULandscape, UWorldItem, UCacheManager; + ImagingOpenGL, GL, GLu, GLext, fgl, ULandscape, UWorldItem, UCacheManager, + Math, DOM, XMLRead; + +const + ColorsCount = 15; type + TLightColor = record + r: Float; + g: Float; + b: Float; + end; + PLightColor = ^TLightColor; + TCalculateOffset = procedure(AX, AY: Integer; out DrawX, DrawY: Integer) of object; { TLightMaterial } @@ -55,14 +66,16 @@ type { TLightSource } TLightSource = class - constructor Create(AManager: TLightManager; AWorldItem: TWorldItem); + constructor Create(AManager: TLightManager; AWorldItem: TWorldItem; Zoom: Single); destructor Destroy; override; protected + FColorID: Byte; FX: Integer; FY: Integer; FZ: SmallInt; FMaterial: TLightMaterial; public + property ColorID: Byte read FColorID; property X: Integer read FX; property Y: Integer read FY; property Z: SmallInt read FZ; @@ -88,24 +101,132 @@ type FInitialized: Boolean; function GetLight(AID: Integer): TLightMaterial; procedure SetLightLevel(AValue: Byte); - procedure UpdateOverlay(AScreenRect: TRect); + procedure UpdateOverlay(AScreenRect: TRect; Zoom: Single); public property LightLevel: Byte read FLightLevel write SetLightLevel; procedure InitGL; procedure UpdateLightMap(ALeft, AWidth, ATop, AHeight: Integer; - AScreenBuffer: TScreenBuffer); - procedure Draw(AScreenRect: TRect); + AScreenBuffer: TScreenBuffer; Zoom: Single); + procedure Draw(AScreenRect: TRect; Zoom: Single); + + public + procedure LoadConfig(AFileName: String); + public + LColors: array[1..ColorsCount] of TLightColor; + TileCol: ^Byte; end; + implementation uses - UGameResources, UTiledata, UStatics, UMap, ULight, Logging; + UGameResources, UTiledata, UStatics, UMap, ULight, Logging, UfrmMain, UfrmInitialize; { TLightManager } -constructor TLightManager.Create(ACalculateOffset: TCalculateOffset); +procedure TLightManager.LoadConfig(AFileName: String); +var + XMLDoc: TXMLDocument; + iNode, node: TDOMNode; + s: string; + i, id, col, r, g, b: Integer; begin + for i := 1 to ColorsCount do begin + LColors[i].R := 1.0; + LColors[i].G := 1.0; + LColors[i].B := 1.0; + end; + if (TileCol <> nil) then + Freemem(TileCol); + Getmem(TileCol, (ResMan.Landscape.MaxStaticID + 1) * SizeOf(Byte)); + for i := 0 to ResMan.Landscape.MaxStaticID do + TileCol[i] := 1; + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['ColorLight.xml'])); + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, AFileName); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'colorlight' then + begin + iNode := XMLDoc.DocumentElement.FirstChild; + while iNode <> nil do + begin + if LowerCase(iNode.NodeName) = 'colors' then + begin + node := iNode.FirstChild; + while node <> nil do + begin + if (LowerCase(node.NodeName) = 'color') then begin + id := -1; + r := 255; + g := 255; + b := 255; + for i := node.Attributes.Length - 1 downto 0 do + begin + s := LowerCase(node.Attributes[i].NodeName); + if (s = 'id') then + TryStrToInt(node.Attributes[i].NodeValue, id); + if (s = 'r') then + TryStrToInt(node.Attributes[i].NodeValue, r); + if (s = 'g') then + TryStrToInt(node.Attributes[i].NodeValue, g); + if (s = 'b') then + TryStrToInt(node.Attributes[i].NodeValue, b); + end; + if (id > 0) and (id <= ColorsCount) then begin + if (r < 0) then r := 0; + if (g < 0) then g := 0; + if (b < 0) then b := 0; + if (r > 255) then r := 255; + if (g > 255) then g := 255; + if (b > 255) then b := 255; + LColors[id].R := (Float(r)) / 255.0; + LColors[id].G := (Float(g)) / 255.0; + LColors[id].B := (Float(b)) / 255.0; + end; + end; + node := node.NextSibling; + end; + end; + if LowerCase(iNode.NodeName) = 'sources' then + begin + node := iNode.FirstChild; + while node <> nil do + begin + s := LowerCase(node.NodeName); + if (s = 'tile') or (s = 'item') then begin + col := 1; + id := -1; + for i := node.Attributes.Length - 1 downto 0 do begin + if LowerCase(node.Attributes[i].NodeName) = 'id' then + if TryStrToInt(node.Attributes[i].NodeValue, id) then + begin + if s = 'tile' + then Dec(id, $4000); + end; + if LowerCase(node.Attributes[i].NodeName) = 'color' then + if TryStrToInt(node.Attributes[i].NodeValue, col) then + begin + if (col < 1) or (col > ColorsCount) + then col := 1; + end; + end; + if (id >= 0) and (id <= ResMan.Landscape.MaxStaticID) + then TileCol[id] := col; + end; + node := node.NextSibling; + end; + end; + iNode := iNode.NextSibling; + end; + end; +end; + +constructor TLightManager.Create(ACalculateOffset: TCalculateOffset); +var + i: Integer; +begin + TileCol := nil; + FCalculateOffset := ACalculateOffset; FLightSources := TLightSources.Create(True); FLightLevel := 0; @@ -115,6 +236,10 @@ end; destructor TLightManager.Destroy; begin + if (TileCol <> nil) then begin + Freemem(TileCol); + TileCol := nil; + end; FreeAndNil(FLightSources); FreeAndNil(FOverlay); FreeAndNil(FLightCache); @@ -145,7 +270,7 @@ begin FValid := False; end; -procedure TLightManager.UpdateOverlay(AScreenRect: TRect); +procedure TLightManager.UpdateOverlay(AScreenRect: TRect; Zoom: Single); var canvas: TFastARGB32Canvas; color: TColor32Rec; @@ -153,6 +278,7 @@ var lightMaterial: TLightMaterial; colorGL: GLclampf; fbo: GLuint; + ptilcol: PLightColor; begin glDeleteTextures(1, @FOverlayTexture); if FUseFBO then @@ -182,23 +308,25 @@ begin lightMaterial := FLightSources[i].Material; if lightMaterial <> nil then begin + ptilcol := @LColors[FLightSources[i].ColorID]; glBindTexture(GL_TEXTURE_2D, lightMaterial.Texture); + glColor3f(ptilcol^.R, ptilcol^.G, ptilcol^.B); glBegin(GL_QUADS); glTexCoord2i(0, 0); - glVertex2i(FLightSources[i].FX - lightMaterial.RealWidth div 2, - FLightSources[i].FY - lightMaterial.RealHeight div 2); + glVertex2i(FLightSources[i].FX - Trunc(Zoom*lightMaterial.RealWidth) div 2, + FLightSources[i].FY - Trunc(Zoom*lightMaterial.RealHeight) div 2); glTexCoord2i(0, 1); - glVertex2i(FLightSources[i].FX - lightMaterial.RealWidth div 2, - FLightSources[i].FY - lightMaterial.RealHeight div 2 + - lightMaterial.Height); + glVertex2i(FLightSources[i].FX - Trunc(Zoom*lightMaterial.RealWidth) div 2, + FLightSources[i].FY - Trunc(Zoom*lightMaterial.RealHeight) div 2 + + Trunc(Zoom*lightMaterial.Height)); glTexCoord2i(1, 1); - glVertex2i(FLightSources[i].FX - lightMaterial.RealWidth div 2 + - lightMaterial.Width, FLightSources[i].FY - - lightMaterial.RealHeight div 2 + lightMaterial.Height); + glVertex2i(FLightSources[i].FX - Trunc(Zoom*lightMaterial.RealWidth) div 2 + + Trunc(Zoom*lightMaterial.Width), FLightSources[i].FY - + Trunc(Zoom*lightMaterial.RealHeight) div 2 + Trunc(Zoom*lightMaterial.Height)); glTexCoord2i(1, 0); - glVertex2i(FLightSources[i].FX - lightMaterial.RealWidth div 2 + - lightMaterial.Width, - FLightSources[i].FY - lightMaterial.RealHeight div 2); + glVertex2i(FLightSources[i].FX - Trunc(Zoom*lightMaterial.RealWidth) div 2 + + Trunc(Zoom*lightMaterial.Width), + FLightSources[i].FY - Trunc(Zoom*lightMaterial.RealHeight) div 2); glEnd; end; end; @@ -227,8 +355,8 @@ begin if lightMaterial <> nil then begin lightMaterial.Canvas.DrawAdd(lightMaterial.Canvas.ClipRect, canvas, - FLightSources[i].FX - lightMaterial.RealWidth div 2, - FLightSources[i].FY - lightMaterial.RealHeight div 2); + FLightSources[i].FX - Trunc(Zoom*lightMaterial.RealWidth) div 2, + FLightSources[i].FY - Trunc(Zoom*lightMaterial.RealHeight) div 2); end; end; finally @@ -247,7 +375,7 @@ begin end; procedure TLightManager.UpdateLightMap(ALeft, AWidth, ATop, AHeight: Integer; - AScreenBuffer: TScreenBuffer); + AScreenBuffer: TScreenBuffer; Zoom: Single); var blockInfo: PBlockInfo; lights: TWorldItemList; @@ -279,8 +407,10 @@ begin if tdfLightSource in tileData.Flags then lights.Add(blockInfo^.Item) else - tileMap[blockInfo^.Item.X - ALeft, blockInfo^.Item.Y - ATop] := - blockInfo^.Item; + x := blockInfo^.Item.X - ALeft; + y := blockInfo^.Item.Y - ATop; + if InRange(x, 0, AWidth - 1) and InRange(y, 0, AHeight - 1) then + tileMap[x, y] := blockInfo^.Item; end; end; @@ -288,9 +418,10 @@ begin begin x := lights[i].X + 1 - ALeft; y := lights[i].Y + 1 - ATop; - if (x = AWidth) or (y = AHeight) or (tileMap[x,y] = nil) or - (tileMap[x,y].Z < lights[i].Z + 5) then - FLightSources.Add(TLightSource.Create(Self, lights[i])); + if (x = AWidth) or (y = AHeight) or + (InRange(x, 0, AWidth - 1) and InRange(y, 0, AHeight - 1) and + ((tileMap[x,y] = nil) or (tileMap[x,y].Z < lights[i].Z + 5))) then + FLightSources.Add(TLightSource.Create(Self, lights[i], Zoom)); end; lights.Free; @@ -299,7 +430,7 @@ begin //Logger.ExitMethod([lcClient, lcDebug], 'UpdateLightMap'); end; -procedure TLightManager.Draw(AScreenRect: TRect); +procedure TLightManager.Draw(AScreenRect: TRect; Zoom: Single); begin if not FInitialized then InitGL; @@ -307,38 +438,41 @@ begin glColor4f(1, 1, 1, 1); if not FValid then - UpdateOverlay(AScreenRect); + UpdateOverlay(AScreenRect, Zoom); glBindTexture(GL_TEXTURE_2D, FOverlayTexture); glBlendFunc(GL_ZERO, GL_SRC_COLOR); glBegin(GL_QUADS); + Zoom := 1.0; if FUseFBO then begin + glColor3f(1.0, 1.0, 1.0); glTexCoord2i(0, 1); - glVertex2i(AScreenRect.Left, AScreenRect.Top); + glVertex2i(Trunc(Zoom*AScreenRect.Left), Trunc(Zoom*AScreenRect.Top)); glTexCoord2i(0, 0); - glVertex2i(AScreenRect.Left, AScreenRect.Bottom); + glVertex2i(Trunc(Zoom*AScreenRect.Left), Trunc(Zoom*AScreenRect.Bottom)); glTexCoord2i(1, 0); - glVertex2i(AScreenRect.Right, AScreenRect.Bottom); + glVertex2i(Trunc(Zoom*AScreenRect.Right), Trunc(Zoom*AScreenRect.Bottom)); glTexCoord2i(1, 1); - glVertex2i(AScreenRect.Right, AScreenRect.Top); + glVertex2i(Trunc(Zoom*AScreenRect.Right), Trunc(Zoom*AScreenRect.Top)); end else begin + glColor3f(1.0, 1.0, 1.0); glTexCoord2i(0, 0); - glVertex2i(AScreenRect.Left, AScreenRect.Top); + glVertex2i(Trunc(Zoom*AScreenRect.Left), Trunc(Zoom*AScreenRect.Top)); glTexCoord2i(0, 1); - glVertex2i(AScreenRect.Left, AScreenRect.Bottom); + glVertex2i(Trunc(Zoom*AScreenRect.Left), Trunc(Zoom*AScreenRect.Bottom)); glTexCoord2i(1, 1); - glVertex2i(AScreenRect.Right, AScreenRect.Bottom); + glVertex2i(Trunc(Zoom*AScreenRect.Right), Trunc(Zoom*AScreenRect.Bottom)); glTexCoord2i(1, 0); - glVertex2i(AScreenRect.Right, AScreenRect.Top); + glVertex2i(Trunc(Zoom*AScreenRect.Right), Trunc(Zoom*AScreenRect.Top)); end; glEnd; end; { TLightSource } -constructor TLightSource.Create(AManager: TLightManager; AWorldItem: TWorldItem); +constructor TLightSource.Create(AManager: TLightManager; AWorldItem: TWorldItem; Zoom: Single); var lightID: Byte; begin @@ -346,9 +480,12 @@ begin FMaterial := AManager.GetLight(lightID); if FMaterial <> nil then begin + FColorID := AManager.TileCol[AWorldItem.TileID]; + if (FColorID < 1) or (FColorID > ColorsCount) + then FColorID := 1; AManager.FCalculateOffset(AWorldItem.X, AWorldItem.Y, FX, FY); FZ := AWorldItem.Z * 4; - FY := FY + 22 - FZ; + FY := FY + Trunc(Zoom*(22 - FZ)); FMaterial.AddRef; end; end; diff --git a/Client/UOverlayUI.pas b/Client/UOverlayUI.pas index 5817786..a60aef0 100644 --- a/Client/UOverlayUI.pas +++ b/Client/UOverlayUI.pas @@ -177,7 +177,7 @@ begin FActiveArrow := -1; FVisible := False; - arrow := TSingleImage.CreateFromStream(ResourceManager.GetResource(0)); + arrow := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LeftTopArrow.tga')); for i := 0 to 3 do begin FArrows[2*i] := TGLArrow.Create(arrow); @@ -186,7 +186,7 @@ begin end; arrow.Free; - arrow := TSingleImage.CreateFromStream(ResourceManager.GetResource(1)); + arrow := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/TopArrow.tga')); for i := 0 to 3 do begin FArrows[2*i+1] := TGLArrow.Create(arrow); diff --git a/Client/UPackets.pas b/Client/UPackets.pas index bbd7c12..9567fab 100644 --- a/Client/UPackets.pas +++ b/Client/UPackets.pas @@ -28,7 +28,7 @@ unit UPackets; interface uses - Classes, dzlib, UEnhancedMemoryStream, UPacket, UStatics; + Classes, dzlib, UEnhancedMemoryStream, UPacket, UStatics, Logging; type TBlockCoords = packed record @@ -97,7 +97,7 @@ type TElevateStaticPacket = class(TStaticPacket) constructor Create(AStaticItem: TStaticItem; ANewZ: ShortInt); constructor Create(AX, AY: Word; AZ: ShortInt; ATileID: Word; AHue: Word; - ANewZ: Word); + ANewZ: ShortInt); end; { TMoveStaticPacket } @@ -182,6 +182,7 @@ begin FStream.WriteByte($03); FStream.WriteStringNull(AUsername); FStream.WriteStringNull(APassword); + Logger.Send([lcClient, lcInfo], 'Отправлен пакет TLoginRequestPacket'); end; { TQuitPacket } @@ -262,7 +263,7 @@ begin end; constructor TElevateStaticPacket.Create(AX, AY: Word; AZ: ShortInt; - ATileID: Word; AHue: Word; ANewZ: Word); + ATileID: Word; AHue: Word; ANewZ: ShortInt); begin inherited Create($09, 11); FStream.WriteWord(AX); diff --git a/Client/UPlatformTypes.pas b/Client/UPlatformTypes.pas index 0ee37f2..7c386a4 100644 --- a/Client/UPlatformTypes.pas +++ b/Client/UPlatformTypes.pas @@ -30,10 +30,11 @@ unit UPlatformTypes; interface uses - Classes, SysUtils, ActiveX; + Classes, SysUtils, + {$IFDEF WINDOWS}ActiveX{$ELSE}fakeactivex{$ENDIF}; type - IDataObject = ActiveX.IDataObject; + IDataObject = {$IFDEF WINDOWS}ActiveX{$ELSE}fakeactivex{$ENDIF}.IDataObject; implementation diff --git a/Client/UResourceManager.pas b/Client/UResourceManager.pas index 9857dbd..d42b3f5 100644 --- a/Client/UResourceManager.pas +++ b/Client/UResourceManager.pas @@ -30,7 +30,7 @@ unit UResourceManager; interface uses - Classes, SysUtils; + Classes, SysUtils, Crc32Hash; type @@ -43,10 +43,12 @@ type FFileStream: TFileStream; FCount: Integer; FLookupTable: array of Cardinal; + FfnHashTable: array of Cardinal; FCurrentResource: Integer; FResourceStream: TMemoryStream; public function GetResource(AIndex: Integer): TStream; + function GetResource(AFileName: String): TStream; end; var @@ -63,7 +65,9 @@ begin FFileStream.Position := 0; FFileStream.Read(FCount, SizeOf(Integer)); SetLength(FLookupTable, FCount); + SetLength(FfnHashTable, FCount); FFileStream.Read(FLookupTable[0], FCount * SizeOf(Cardinal)); + FFileStream.Read(FfnHashTable[0], FCount * SizeOf(Cardinal)); FCurrentResource := -1; end; @@ -74,6 +78,22 @@ begin inherited Destroy; end; +function TResourceManager.GetResource(AFileName: String): TStream; +var + i : Integer; + hash : DWORD; +begin + if not CalcStringCRC32(AnsiLowerCase(AFileName), hash) + then Result := nil + else begin + for i := 0 to FCount do + if FfnHashTable[i] = hash then begin + Result := GetResource(i); + break; + end; + end; +end; + function TResourceManager.GetResource(AIndex: Integer): TStream; var size: Cardinal; @@ -93,7 +113,7 @@ end; initialization begin - ResourceManager := TResourceManager.Create(ChangeFileExt(ParamStr(0), '.dat')); + ResourceManager := TResourceManager.Create(ExtractFilePath(ParamStr(0)) + '../Assetspack.dat'); end; finalization diff --git a/Client/UdmNetwork.lfm b/Client/UdmNetwork.lfm index e80b362..bc50407 100644 --- a/Client/UdmNetwork.lfm +++ b/Client/UdmNetwork.lfm @@ -2,10 +2,10 @@ object dmNetwork: TdmNetwork OnCreate = DataModuleCreate OnDestroy = DataModuleDestroy OldCreateOrder = False - Height = 300 + Height = 375 HorizontalOffset = 290 VerticalOffset = 171 - Width = 400 + Width = 631 object TCPClient: TLTCPComponent Port = 0 OnReceive = TCPClientReceive diff --git a/Client/UdmNetwork.pas b/Client/UdmNetwork.pas index 0f5110c..edb5d19 100644 --- a/Client/UdmNetwork.pas +++ b/Client/UdmNetwork.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Dialogs, lNetComponents, lNet, - UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils; + UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils, LConvEncoding; type @@ -51,9 +51,11 @@ type protected FSendQueue: TEnhancedMemoryStream; FReceiveQueue: TEnhancedMemoryStream; + FProfile: string; FUsername: string; FPassword: string; FAccessLevel: TAccessLevel; + FServerStart: TDateTime; FDataDir: string; FLastPacket: TDateTime; procedure OnCanSend(ASocket: TLSocket); @@ -61,11 +63,22 @@ type procedure ProcessQueue; procedure DoLogin; public + property Profile: string read FProfile; property Username: string read FUsername; property AccessLevel: TAccessLevel read FAccessLevel write FAccessLevel; + property ServerStart: TDateTime read FServerStart; procedure Send(APacket: TPacket); procedure Disconnect; procedure CheckClose(ASender: TForm); + public + ErrorCaption: string; + WrongServer: string; + WrongAccount: string; + WrongPassword: string; + NoAccess: string; + AlreadyLogined: string; + TCPErrorCaption: string; + UnsuportedVersion: string; end; var @@ -77,8 +90,10 @@ uses UPacketHandlers, UPackets, UfrmMain, UfrmLogin, UfrmInitialize, UGameResources, UfrmAccountControl, UfrmEditAccount, UfrmDrawSettings, UfrmBoundaries, UfrmElevateSettings, UfrmConfirmation, UfrmMoveSettings, - UfrmAbout, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand, - UfrmVirtualLayer, UfrmFilter, UfrmRegionControl, UfrmLightlevel; + UfrmAbout, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand, UfrmFillSettings, + UfrmVirtualLayer, UfrmFilter, UfrmRegionControl, UfrmLightlevel, UfrmSelectionSettings, + UfrmSurfElevateSettings, UfrmSurfStretchSettings, UfrmSurfSmoothSettings, + Logging, Language; {$I version.inc} @@ -114,8 +129,11 @@ begin end; procedure TdmNetwork.TCPClientError(const msg: string; aSocket: TLSocket); +var + rumsg : string; begin - MessageDlg('Connection error', msg, mtError, [mbOK], 0); + rumsg := CP1251ToUTF8(msg); + MessageDlg(TCPErrorCaption, rumsg, mtError, [mbOK], 0); if not TCPClient.Connected then TCPClientDisconnect(aSocket); end; @@ -164,68 +182,98 @@ var subID: Byte; loginState: TLoginState; width, height: Word; + flags: Cardinal; serverState: TServerState; + date, time: TDateTime; begin subID := ABuffer.ReadByte; case subID of $01: begin - if ABuffer.ReadCardinal = ProtocolVersion then + if (ABuffer.ReadCardinal - $1000) = ProtocolVersion then begin - frmInitialize.lblStatus.Caption := 'Authenticating'; + frmInitialize.lblStatus.Caption := frmInitialize.SplashAuthorization; Send(TLoginRequestPacket.Create(FUsername, FPassword)); end else - begin - MessageDlg('Error', 'Invalid protocol version. Maybe your client is outdated.', mtError, [mbOK], 0); + begin // sLineBreak + MessageDlg(ErrorCaption, UnsuportedVersion, mtError, [mbOK], 0); Disconnect; end; + Logger.Send([lcClient, lcInfo], 'Текущая версия протокола подтверждена'); end; $03: begin loginState := TLoginState(ABuffer.ReadByte); if loginState = lsOK then begin - frmInitialize.lblStatus.Caption := 'Initializing'; - frmInitialize.Repaint; - frmInitialize.lblStatus.Repaint; + frmInitialize.SetStatusLabel(frmInitialize.SplashInicialization); + Application.ProcessMessages; FAccessLevel := TAccessLevel(ABuffer.ReadByte); - InitGameResourceManager(FDataDir); - width := ABuffer.ReadWord; + FServerStart := IncSecond(Now, - ABuffer.ReadDWord); + width := ABuffer.ReadWord; height := ABuffer.ReadWord; - ResMan.InitLandscape(width, height); - ResMan.Landscape.UpdateWriteMap(ABuffer); + flags := ABuffer.ReadCardinal; - frmMain := TfrmMain.Create(dmNetwork); - frmRadarMap := TfrmRadarMap.Create(frmMain); - frmLargeScaleCommand := TfrmLargeScaleCommand.Create(frmMain); - frmRegionControl := TfrmRegionControl.Create(frmMain); - frmAccountControl := TfrmAccountControl.Create(frmMain); - frmEditAccount := TfrmEditAccount.Create(frmAccountControl); - frmConfirmation := TfrmConfirmation.Create(frmMain); - frmDrawSettings := TfrmDrawSettings.Create(frmMain); - frmMoveSettings := TfrmMoveSettings.Create(frmMain); - frmElevateSettings := TfrmElevateSettings.Create(frmMain); - frmHueSettings := TfrmHueSettings.Create(frmMain); - frmBoundaries := TfrmBoundaries.Create(frmMain); - frmFilter := TfrmFilter.Create(frmMain); - frmVirtualLayer := TfrmVirtualLayer.Create(frmMain); - frmLightlevel := TfrmLightlevel.Create(frmMain); - frmAbout := TfrmAbout.Create(frmMain); - frmMain.Show; - frmInitialize.Hide; - tmNoOp.Enabled := True; + // Для совместимости с сервером 0.7.0 (ранее тут слалось число преметов) + if (flags and $FF000000) = 0 then // GameResourceManager.Tiledata.StaticCount + if flags < $C000 then flags := $F0000000 else flags := $F0000008; + + if not InitGameResourceManager(FDataDir, Flags) then begin + Logger.Send([lcClient, lcInfo], 'CentrED+ загрузка отменена, не та версия *.mul файлов.'); + Disconnect; exit; + end; + + ResMan.InitLandscape(width, height); + + // Проверка обновлений + frmInitialize.SetStatusLabel(frmInitialize.SplashUpdates); + + + Logger.Send([lcClient, lcInfo], 'Начало загрузки CentrED+'); + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['OpenGL Device'])); + ResMan.Landscape.UpdateWriteMap(ABuffer); Logger.Send([lcClient, lcInfo], 'ResMan.Landscape.UpdateWriteMap(ABuffer);'); + + frmMain := TfrmMain.Create(dmNetwork); Logger.Send([lcClient, lcInfo], 'frmMain := TfrmMain.Create(dmNetwork);'); + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['Windows Forms'])); + frmRadarMap := TfrmRadarMap.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmRadarMap := TfrmRadarMap.Create(frmMain);'); + frmLargeScaleCommand := TfrmLargeScaleCommand.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmLargeScaleCommand := TfrmLargeScaleCommand.Create(frmMain);'); + frmRegionControl := TfrmRegionControl.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmRegionControl := TfrmRegionControl.Create(frmMain);'); + frmAccountControl := TfrmAccountControl.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmAccountControl := TfrmAccountControl.Create(frmMain);'); + frmEditAccount := TfrmEditAccount.Create(frmAccountControl); Logger.Send([lcClient, lcInfo], 'frmEditAccount := TfrmEditAccount.Create(frmAccountControl);'); + frmConfirmation := TfrmConfirmation.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmConfirmation := TfrmConfirmation.Create(frmMain);'); + frmSelectionSettings := TfrmSelectionSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmSelectionSettings := TfrmSelectionSettings.Create(frmMain);'); + frmMoveSettings := TfrmMoveSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmMoveSettings := TfrmMoveSettings.Create(frmMain);'); + frmElevateSettings := TfrmElevateSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmElevateSettings := TfrmElevateSettings.Create(frmMain);'); + frmSurfElevateSettings := TfrmSurfElevateSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmSurfElevateSettings := TfrmSurfElevateSettings.Create(frmMain);'); + frmSurfStretchSettings := TfrmSurfStretchSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmSurfStretchSettings := TfrmSurfStretchSettings.Create(frmMain);'); + frmSurfSmoothSettings := TfrmSurfSmoothSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmSurfSmoothSettings := TfrmSurfSmoothSettings.Create(frmMain);'); + frmDrawSettings := TfrmDrawSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmDrawSettings := TfrmDrawSettings.Create(frmMain);'); + frmHueSettings := TfrmHueSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmHueSettings := TfrmHueSettings.Create(frmMain);'); + frmFillSettings := TfrmFillSettings.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmFillSettings := TfrmFillSettings.Create(frmMain);'); + frmVirtualLayer := TfrmVirtualLayer.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmVirtualLayer := TfrmVirtualLayer.Create(frmMain)'); + frmBoundaries := TfrmBoundaries.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmBoundaries := TfrmBoundaries.Create(frmMain);'); + frmFilter := TfrmFilter.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmFilter := TfrmFilter.Create(frmMain);'); + frmLightlevel := TfrmLightlevel.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmLightlevel := TfrmLightlevel.Create(frmMain);'); + frmAbout := TfrmAbout.Create(frmMain); Logger.Send([lcClient, lcInfo], 'frmAbout := TfrmAbout.Create(frmMain);'); + frmMain.mnuTileListViewClick(nil); + frmMain.Show; Logger.Send([lcClient, lcInfo], 'frmMain.Show;'); + frmInitialize.Hide; Logger.Send([lcClient, lcInfo], 'frmInitialize.Hide;'); + tmNoOp.Enabled := True; Logger.Send([lcClient, lcInfo], 'tmNoOp.Enabled := True;'); + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['Done'])); end else begin if loginState = lsInvalidUser then - MessageDlg('Error', 'The username you specified is incorrect.', mtWarning, [mbOK], 0) + MessageDlg(ErrorCaption, WrongAccount, mtWarning, [mbOK], 0) else if loginState = lsInvalidPassword then - MessageDlg('Error', 'The password you specified is incorrect.', mtWarning, [mbOK], 0) + MessageDlg(ErrorCaption, WrongPassword, mtWarning, [mbOK], 0) else if loginState = lsAlreadyLoggedIn then - MessageDlg('Error', 'There is already a client logged in using that account.', mtWarning, [mbOK], 0) + MessageDlg(ErrorCaption, AlreadyLogined, mtWarning, [mbOK], 0) else if loginState = lsNoAccess then - MessageDlg('Error', 'This account has no access.', mtWarning, [mbOK], 0); + MessageDlg(ErrorCaption, NoAccess, mtWarning, [mbOK], 0); end; + Logger.Send([lcClient, lcInfo], 'CentrED+ запущен.'); end; $04: //Server state begin @@ -238,7 +286,7 @@ begin end else begin case serverState of - ssFrozen: frmInitialize.lblStatus.Caption := 'The server is currently paused.'; + ssFrozen: frmInitialize.lblStatus.Caption := frmInitialize.SplashSuspend; ssOther: frmInitialize.lblStatus.Caption := ABuffer.ReadStringNull end; tmNoOp.Enabled := False; @@ -296,18 +344,23 @@ begin FreeAndNil(frmEditAccount); FreeAndNil(frmAccountControl); FreeAndNil(frmConfirmation); - FreeAndNil(frmDrawSettings); + FreeAndNil(frmSelectionSettings); FreeAndNil(frmMoveSettings); FreeAndNil(frmElevateSettings); + FreeAndNil(frmSurfElevateSettings); + FreeAndNil(frmSurfStretchSettings); + FreeAndNil(frmSurfSmoothSettings); + FreeAndNil(frmDrawSettings); FreeAndNil(frmHueSettings); + FreeAndNil(frmFillSettings); + FreeAndNil(frmVirtualLayer); FreeAndNil(frmBoundaries); FreeAndNil(frmFilter); - FreeAndNil(frmVirtualLayer); + FreeAndNil(frmLightlevel); FreeAndNil(frmAbout); FreeAndNil(frmRegionControl); FreeAndNil(frmLargeScaleCommand); FreeAndNil(frmRadarMap); - FreeAndNil(frmLightlevel); if frmMain <> nil then begin @@ -320,16 +373,20 @@ begin frmInitialize.Hide; while frmLogin.ShowModal = mrOK do begin + LanguageTranslate(frmInitialize, self, nil); if TCPClient.Connect(frmLogin.edHost.Text, frmLogin.edPort.Value) then begin + if frmLogin.cbProfile.ItemIndex > -1 + then FProfile := frmLogin.cbProfile.Text + else FProfile := '---'; FUsername := frmLogin.edUsername.Text; FPassword := frmLogin.edPassword.Text; - FDataDir := frmLogin.edData.Text; - frmInitialize.lblStatus.Caption := 'Connecting'; + FDataDir := UTF8ToCP1251(frmLogin.edData.Text); + frmInitialize.lblStatus.Caption := frmInitialize.SplashConnection; frmInitialize.Show; Break; end else - MessageDlg('Error', 'Cannot connect to the specified server.', mtError, [mbOK], 0); + MessageDlg(ErrorCaption, WrongServer, mtError, [mbOK], 0); end; frmLogin.Close; FreeAndNil(frmLogin); diff --git a/Client/UfrmAbout.lfm b/Client/UfrmAbout.lfm index 55fbf27..5874e43 100644 --- a/Client/UfrmAbout.lfm +++ b/Client/UfrmAbout.lfm @@ -1,146 +1,232 @@ object frmAbout: TfrmAbout - Left = 290 - Height = 308 - Top = 171 - Width = 354 + Left = 1412 + Height = 255 + Top = 424 + Width = 324 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog - Caption = 'About CentrED' - ClientHeight = 308 - ClientWidth = 354 + Caption = 'О программе CentrED+' + ClientHeight = 255 + ClientWidth = 324 + Color = clBlack Font.Height = -11 OnCreate = FormCreate + OnHide = FormHide + OnShow = FormShow Position = poScreenCenter - LCLVersion = '0.9.29' - object Label3: TLabel - Left = 8 - Height = 53 - Top = 189 - Width = 338 - Align = alTop - BorderSpacing.Top = 16 - BorderSpacing.Around = 8 - Caption = 'Ultima(tm) Online (c) 1997 Electronic Arts Inc. Ultima, the UO logo, Are You With Us?, ORIGIN, the ORIGIN logo and We create worlds are trademarks or registered trademarks of Electronic Arts Inc. in the U.S. and/or other countries. All rights reserved.' - ParentColor = False - WordWrap = True - end - object Label5: TLabel - Left = 8 - Height = 14 - Top = 98 - Width = 338 - Align = alTop - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - Caption = 'It is using the following great components:' - ParentColor = False - end - object Label6: TLabel - Left = 16 - Height = 53 - Top = 112 - Width = 330 - Align = alTop - BorderSpacing.Left = 16 - BorderSpacing.Right = 8 - Caption = '- Vampyre Imaging Lib by Marek Mauder'#13#10'- lNet by Ales Katona and Micha Nelissen'#13#10'- VirtualTrees by Mike Lischke'#13#10'- Silk Icons by Mark James' - ParentColor = False - end - object Label7: TLabel - Left = 8 - Height = 14 - Top = 84 - Width = 338 - Align = alTop - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - Caption = 'CentrED has been developed using Lazarus and FreePascal.' - ParentColor = False - WordWrap = True - end - object Panel2: TPanel - Left = 0 - Height = 76 - Top = 0 - Width = 354 - Align = alTop - AutoSize = True - BorderSpacing.Bottom = 8 - BevelOuter = bvNone - ClientHeight = 76 - ClientWidth = 354 - TabOrder = 0 - object Panel1: TPanel - Left = 0 - Height = 76 - Top = 0 - Width = 167 - AutoSize = True - BevelInner = bvRaised - BevelOuter = bvLowered - ClientHeight = 76 - ClientWidth = 167 - TabOrder = 0 - object Label1: TLabel - Left = 2 - Height = 38 - Top = 2 - Width = 163 - Align = alTop - Alignment = taCenter - AutoSize = False - Caption = 'UO CentrED' - Font.Height = -29 - Font.Style = [fsBold] - Layout = tlCenter - ParentColor = False - ParentFont = False - end - object lblVersion: TLabel - Left = 6 - Height = 14 - Top = 40 - Width = 155 - Align = alTop - Alignment = taRightJustify - BorderSpacing.Left = 4 - BorderSpacing.Right = 4 - ParentColor = False - end - object lblCopyright: TLabel - Left = 6 - Height = 14 - Top = 58 - Width = 155 - Align = alTop - Alignment = taCenter - BorderSpacing.Around = 4 - ParentColor = False - end - end - end + LCLVersion = '0.9.30.2' object Panel3: TPanel + AnchorSideTop.Control = Label3 Left = 8 - Height = 25 - Top = 250 - Width = 338 - Align = alTop + Height = 22 + Top = 225 + Width = 308 + Align = alBottom BorderSpacing.Around = 8 BevelOuter = bvNone - ClientHeight = 25 - ClientWidth = 338 + ClientHeight = 22 + ClientWidth = 308 TabOrder = 1 object btnClose: TButton - Left = 263 - Height = 25 + AnchorSideTop.Control = Panel3 + Left = 0 + Height = 22 Top = 0 - Width = 75 - Align = alRight + Width = 96 + Align = alLeft BorderSpacing.InnerBorder = 4 - Caption = 'Close' + Caption = 'Закрыть' OnClick = btnCloseClick TabOrder = 0 end end + object Panel4: TPanel + Left = 0 + Height = 96 + Top = 124 + Width = 324 + Align = alTop + BevelOuter = bvNone + ClientHeight = 96 + ClientWidth = 324 + Color = clBlack + ParentColor = False + TabOrder = 2 + object Label3: TLabel + Left = 8 + Height = 28 + Top = 61 + Width = 308 + Align = alTop + BorderSpacing.Left = 8 + BorderSpacing.Top = 12 + BorderSpacing.Right = 8 + Caption = 'Ultima(tm) Online (c) 1997 Electronic Arts Inc. Ultima, the UO logo, Are You With Us?, ORIGIN, the ORIGIN logo and We create worlds are trademarks or registered trademarks of Electronic Arts Inc. in the U.S. and/or other countries. All rights reserved.' + Font.CharSet = RUSSIAN_CHARSET + Font.Color = 6836796 + Font.Height = -8 + Font.Name = 'Microsoft Sans Serif' + Font.Pitch = fpVariable + Font.Quality = fqDraft + ParentColor = False + ParentFont = False + WordWrap = True + end + object Label8: TLabel + AnchorSideTop.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 8 + Height = 49 + Top = 0 + Width = 308 + Align = alTop + BorderSpacing.Left = 8 + BorderSpacing.Right = 8 + Caption = '"UO CentrED+" (c) 2013 StaticZ (email: staticz@uoquint.ru)'#13#10'Special for "UO: Quintessence" (www.uoquint.ru) server.'#13#10'"UO CentrED+" is a modification of "UO CentrED" ver 0.6.1'#13#10'original "UO CentrED" (c) 2009 Andreas Schneider' + Font.CharSet = ANSI_CHARSET + Font.Color = 14405055 + Font.Height = -9 + Font.Name = 'Microsoft Sans Serif' + Font.Pitch = fpVariable + Font.Quality = fqDraft + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + WordWrap = True + end + end + object Panel2: TPanel + Left = 0 + Height = 116 + Top = 0 + Width = 324 + Align = alTop + BorderSpacing.Bottom = 8 + BevelOuter = bvNone + ClientHeight = 116 + ClientWidth = 324 + Color = clOlive + ParentColor = False + TabOrder = 0 + OnClick = Panel2Click + object imgLogo: TImage + Left = 0 + Height = 116 + Top = 0 + Width = 324 + Align = alClient + Proportional = True + Stretch = True + end + object lblVersion: TLabel + Left = 200 + Height = 31 + Top = 80 + Width = 99 + Align = alCustom + BorderSpacing.Left = 4 + BorderSpacing.Right = 4 + Caption = 'Version: 0.0.0'#13#10' Build: 1401' + Font.CharSet = RUSSIAN_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblCopyright: TLabel + AnchorSideLeft.Control = imgLogo + AnchorSideRight.Control = imgLogo + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = imgLogo + AnchorSideBottom.Side = asrBottom + Left = 28 + Height = 15 + Top = 97 + Width = 162 + Align = alCustom + Alignment = taCenter + Anchors = [akLeft, akBottom] + BorderSpacing.Left = 24 + BorderSpacing.Around = 4 + Caption = 'Project of uoquint team' + Font.CharSet = RUSSIAN_CHARSET + Font.Color = clWhite + Font.Height = -12 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblWebLink: TLabel + AnchorSideLeft.Control = imgLogo + AnchorSideTop.Control = lblVersion + AnchorSideRight.Control = lblVersion + AnchorSideRight.Side = asrBottom + Cursor = crHandPoint + Left = 26 + Height = 16 + Top = 80 + Width = 148 + Align = alCustom + Alignment = taRightJustify + BorderSpacing.Left = 26 + BorderSpacing.Right = 4 + Caption = 'http://dev.uoquint.ru' + Font.CharSet = RUSSIAN_CHARSET + Font.Color = 14781009 + Font.Height = -13 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + Font.Style = [fsBold, fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lblWebLinkClick + OnMouseEnter = lblWebLinkMouseEnter + OnMouseLeave = lblWebLinkMouseLeave + end + end + object Panel5: TPanel + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 186 + Height = 40 + Top = 207 + Width = 130 + Align = alCustom + Anchors = [akRight, akBottom] + BorderSpacing.Around = 8 + BevelOuter = bvNone + BorderStyle = bsSingle + ClientHeight = 36 + ClientWidth = 126 + ParentColor = False + TabOrder = 3 + Visible = False + object imgBaner: TImage + Cursor = crHandPoint + Left = 0 + Height = 36 + Hint = 'Перейти на сайт "www.uoquint.ru"' + Top = 0 + Width = 126 + Align = alClient + Center = True + OnClick = imgBanerClick + OnMouseEnter = imgBanerMouseEnter + OnMouseLeave = imgBanerMouseLeave + ParentShowHint = False + Proportional = True + ShowHint = True + end + end end diff --git a/Client/UfrmAbout.pas b/Client/UfrmAbout.pas index 97e495c..d571ef0 100644 --- a/Client/UfrmAbout.pas +++ b/Client/UfrmAbout.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - ExtCtrls; + ExtCtrls, ShellAPI, MMSystem; type @@ -39,22 +39,35 @@ type TfrmAbout = class(TForm) btnClose: TButton; - Label1: TLabel; + imgLogo: TImage; + imgBaner: TImage; Label3: TLabel; - Label5: TLabel; - Label6: TLabel; - Label7: TLabel; + Label8: TLabel; lblCopyright: TLabel; lblVersion: TLabel; - Panel1: TPanel; + lblWebLink: TLabel; Panel2: TPanel; Panel3: TPanel; + Panel4: TPanel; + Panel5: TPanel; procedure btnCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormHide(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure imgBanerClick(Sender: TObject); + procedure imgBanerMouseEnter(Sender: TObject); + procedure imgBanerMouseLeave(Sender: TObject); + procedure lblWebLinkClick(Sender: TObject); + procedure lblWebLinkMouseEnter(Sender: TObject); + procedure lblWebLinkMouseLeave(Sender: TObject); + procedure Panel2Click(Sender: TObject); private { private declarations } + pSound: Pointer; public { public declarations } + lbVersion: string; + lbBuild: string; end; var @@ -62,8 +75,10 @@ var implementation +uses vinfo, Language, UResourceManager; {$I version.inc} + { TfrmAbout } procedure TfrmAbout.btnCloseClick(Sender: TObject); @@ -73,8 +88,81 @@ end; procedure TfrmAbout.FormCreate(Sender: TObject); begin - lblVersion.Caption := Format('Version %s', [ProductVersion]); - lblCopyright.Caption := Format('Copyright %s', [Copyright]); + pSound:= nil; + LanguageTranslate(Self); + lblVersion.Caption := Format('%s %s%s %s %d', + [lbVersion, VersionInfo.GetFileVersionString, #13#10, lbBuild, VersionInfo.Build]); + imgLogo.Picture.Bitmap.LoadFromStream(ResourceManager.GetResource('Overlay/About.bmp')); + //lblVersion.Caption := Format('Version %s', [ProductVersion]); + //lblCopyright.Caption := Format('Copyright %s', [Copyright]); +end; + +procedure TfrmAbout.FormShow(Sender: TObject); +var + stream: TStream; +begin + if (pSound = nil) then begin + stream := ResourceManager.GetResource('Sounds/MusicInf.wav'); + GetMem(pSound, stream.Size); + stream.Read(pSound^, stream.Size); + end; + sndPlaySound(pSound, SND_MEMORY or SND_ASYNC or SND_LOOP); +end; + +procedure TfrmAbout.FormHide(Sender: TObject); +begin + if pSound = nil then Exit; + sndPlaySound(nil, SND_ASYNC or SND_LOOP); + FreeMem(pSound); + pSound := nil; +end; + +procedure TfrmAbout.imgBanerClick(Sender: TObject); +begin + // Открываем сайт в браузере по умолчанию + ShellExecute(Handle, 'open', PChar('http://uoquint.ru'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmAbout.imgBanerMouseEnter(Sender: TObject); +var stream: TMemoryStream; +begin + stream := TMemoryStream.Create; + stream.Write(baner_h[0],SizeOf(baner_h)); + stream.Position:=0; + imgBaner.Picture.Bitmap.LoadFromStream(stream); + stream.Free; +end; + +procedure TfrmAbout.imgBanerMouseLeave(Sender: TObject); +var stream: TMemoryStream; +begin + stream := TMemoryStream.Create; + stream.Write(baner_u[0],SizeOf(baner_u)); + stream.Position:=0; + imgBaner.Picture.Bitmap.LoadFromStream(stream); + stream.Free; +// sndPlaySound +end; + +procedure TfrmAbout.lblWebLinkClick(Sender: TObject); +begin + // Открываем сайт в браузере по умолчанию + ShellExecute(Handle, 'open', PChar('http://dev.uoquint.ru/projects/centred'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmAbout.lblWebLinkMouseEnter(Sender: TObject); +begin + lblWebLink.Font.Color := TColor($00EAAE86); +end; + +procedure TfrmAbout.lblWebLinkMouseLeave(Sender: TObject); +begin + lblWebLink.Font.Color := TColor($00E18A51); +end; + +procedure TfrmAbout.Panel2Click(Sender: TObject); +begin + end; initialization diff --git a/Client/UfrmAccountControl.lfm b/Client/UfrmAccountControl.lfm index 094889c..7fc9c0a 100644 --- a/Client/UfrmAccountControl.lfm +++ b/Client/UfrmAccountControl.lfm @@ -1,73 +1,74 @@ object frmAccountControl: TfrmAccountControl - Left = 290 + Left = 1433 Height = 378 - Top = 171 - Width = 369 + Top = 46 + Width = 341 ActiveControl = vstAccounts BorderIcons = [biSystemMenu] BorderStyle = bsDialog - Caption = 'Account Management' + Caption = 'Управление Аккаунтами' ClientHeight = 378 - ClientWidth = 369 + ClientWidth = 341 Font.Height = -11 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '0.9.29' + ShowInTaskBar = stAlways + LCLVersion = '0.9.30.2' object tbMain: TToolBar Left = 0 Height = 26 Top = 0 - Width = 369 + Width = 341 Caption = 'tbMain' Images = ilToolbar TabOrder = 0 object tbRefresh: TToolButton Left = 1 - Hint = 'Refresh' + Hint = 'Обновить список' Top = 2 - Caption = 'Refresh' + Caption = 'Обновить' ImageIndex = 0 + OnClick = tbRefreshClick ParentShowHint = False ShowHint = True - OnClick = tbRefreshClick end object tbAddUser: TToolButton - Left = 32 - Hint = 'Add User' + Left = 28 + Hint = 'Добавить пользователя' Top = 2 - Caption = 'Add User' + Caption = 'Добавить' ImageIndex = 1 + OnClick = tbAddUserClick ParentShowHint = False ShowHint = True - OnClick = tbAddUserClick end object tbEditUser: TToolButton - Left = 55 - Hint = 'Edit User' + Left = 51 + Hint = 'Редактировать пользователя' Top = 2 - Caption = 'Edit User' + Caption = 'Редактировать' ImageIndex = 2 + OnClick = tbEditUserClick ParentShowHint = False ShowHint = True - OnClick = tbEditUserClick end object tbDeleteUser: TToolButton - Left = 78 - Hint = 'Delete User' + Left = 74 + Hint = 'Удалить пользователя' Top = 2 - Caption = 'Delete User' + Caption = 'Удалить' ImageIndex = 3 + OnClick = tbDeleteUserClick ParentShowHint = False ShowHint = True - OnClick = tbDeleteUserClick end object tbSeparator1: TToolButton Left = 24 Top = 2 - Width = 8 + Width = 4 Caption = 'tbSeparator1' Style = tbsDivider end @@ -76,7 +77,7 @@ object frmAccountControl: TfrmAccountControl Left = 0 Height = 352 Top = 26 - Width = 369 + Width = 341 Align = alClient DefaultText = 'Node' Header.AutoSizeIndex = 1 @@ -87,294 +88,631 @@ object frmAccountControl: TfrmAccountControl end item Position = 1 - Text = 'Username' - Width = 200 + Text = 'Имя пользователя' + Width = 130 end item Position = 2 - Text = 'Accesslevel' + Text = 'Права' Width = 100 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coShowDropMark, coVisible, coFixed, coAllowFocus] + Position = 3 + Text = 'Регионы' + Width = 60 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoColumnResize, hoDrag, hoShowSortGlyphs, hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + HintMode = hmHint Images = ilAccesslevel + ParentShowHint = False + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical + SelectionCurveRadius = 8 + ShowHint = True TabOrder = 1 - TreeOptions.AutoOptions = [toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.AutoOptions = [toAutoScrollOnExpand, toAutoSort, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning] TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] TreeOptions.SelectionOptions = [toFullRowSelect] + OnCompareNodes = vstAccountsCompareNodes OnDblClick = vstAccountsDblClick OnFreeNode = vstAccountsFreeNode OnGetText = vstAccountsGetText OnGetImageIndex = vstAccountsGetImageIndex + OnGetHint = vstAccountsGetHint + OnHeaderClick = vstAccountsHeaderClick end object ilToolbar: TImageList - left = 144 + left = 40 + top = 56 Bitmap = { - 4C69040000001000000010000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000047994FFF419149FF000000000000 - 0000000000000000000000000000000000000000000000000000000000005BB4 - 65FF56AD5FFF50A65AFF4B9E53FF45964DFF60A868FF5BA262FF347E3AFF0000 - 000000000000000000000000000000000000000000005EB968FF79C383FF89CA - 92FF94D09CFF95D19EFF90CF99FF8CCB94FF87C98FFF80C487FF4E9554FF276D - 2CFF000000000000000000000000000000005CB667FF85C98EFF9BD4A4FF8FCE - 98FF92CF9AFF8DCC95FF88CA90FF83C68BFF7EC485FF79C17FFF478D4CFF2265 - 25FF0000000000000000000000000000000075BF7EFF98D2A1FF94CF9CFF86C7 - 8DFF5EA765FF398640FF347E3AFF2E7633FF49904FFF458B4AFF206324FF0000 - 000000000000000000000000000054AB5EFF80C389FF8DCC95FF83C48AFF3D8B - 44FF37833EFF000000000000000000000000236627FF1F6123FF000000000000 - 00000000000000000000000000004DA155FF47994FFF419149FF3B8842FF3580 - 3CFF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000004DA155FF4799 - 4FFF419149FF3B8842FF35803CFF000000000000000000000000000000000000 - 000063C06EFF5FBB6AFF0000000000000000000000004B9E53FF45964DFF86C6 - 8EFF88C98FFF6FB376FF2E7633FF0000000000000000000000000000000062BE - 6DFF7BC785FF77C281FF54AB5EFF4EA357FF499B51FF63AC6BFF83C38BFF87C9 - 8FFF82C689FF509756FF0000000000000000000000000000000060BC6CFF79C4 - 83FF9ED7A7FF9BD4A4FF97D29FFF92CF9AFF8DCC95FF88CA90FF7AC282FF7EC4 - 85FF5DA463FF266B2AFF000000000000000000000000000000005BB465FF73BD - 7CFF96D19FFF94CF9CFF8FCD96FF8ACA91FF85C78BFF7ABE81FF65AD6CFF4B92 - 51FF246829FF0000000000000000000000000000000000000000000000004EA3 - 57FF66B06EFF61AA68FF3D8B44FF37833EFF327B37FF2C7432FF276D2CFF0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000419149FF3B8842FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000012488DFF104B90FF0F488AFF11427DFF15335BFF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000114E96FF12589BFF125899FF115393FF0F4A87FF0E3E71FF132E4BFF0000 - 0000000000000000000000000000000000000000000000000000000000000F4B - 97FF12589FFF0F4A8AFF0F4B87FF114B87FF154C85FF124175FF0F335CFF0000 - 0000000000000000000000000000000000000000000000000000000000000C3E - 87FF7C97B8FF8AB7E4FF719CC8FF15406EFF194472FF22456BFF113B66FF0000 - 0000000000000000000000000000000000000000000000000000000000001F5E - 9BFFD9E8F7FF97C5F1FF8EBBE5FF7FA9D1FF89B5DFFFCDDFEEFF2368A7FF0000 - 0000000000000000000000000000000000000000000000000000000000002A5B - 92FFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2D629AFF0000 - 0000000000000000000000000000000000000000000000000000000000006A3C - 25FF346DA7FF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF3474AEFF683E2DFF0000 - 000000000000000000000000000000000000000000000000000000000000BC48 - 1CFFF4E2D4FF4E7BA9FF4D7BA8FF4D7BA8FF4E7BA9FFF3D6C3FFBE461CFF0000 - 0000000000000000000000000000000000000000000000000000C44C1FFFF6E4 - D6FFFFE4A4FFFFD472FFFFC969FFFFC063FFFFB65FFFAEAB78FF609772FF4F8E - 66FF428357FF000000000000000000000000000000008A5444FFFCC8ABFFFFD1 - 98FFFEC76DFFFEBF68FFFEB964FFFEB15EFFA79B61FF61AB81FF95D4B4FFBAE6 - D0FF6ABB8FFF2D8F57FF196B37FF00000000287CCEFF78B3EAFFB39E94FFFFB7 - 60FFFFB663FFFEB261FFFEAC5DFFFEA559FF4A885DFF90D3B1FF92D6B1FFFFFF - FFFF65BC8CFF67BC8FFF196B37FF00000000297DD1FF82BAEEFF9F6658FFF5BB - 84FFFFAC5BFFFEA85AFFFEA257FFFE9C53FF317B4CFF9CD4B6FFFFFFFFFFFFFF - FFFFFFFFFFFF95D2B2FF196B37FF00000000000000002579CDFF866161FFBF60 - 35FFFEB961FFFEB962FFFEB962FFFEB962FF226E3AFF62BA8BFF60BA87FFFFFF - FFFF60B987FF67BC8FFF196B37FF00000000000000000000000000000000B350 - 20FFA0401FFFAA4522FFAC4622FFAB4422FF5C572DFF288C53FF64BA8DFF95D2 - B2FF64BA8DFF288C53FF196B37FF000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000196B37FF196B37FF196B - 37FF196B37FF196B37FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000012488DFF104B90FF0F488AFF11427DFF15335BFF00000000000000000000 - 000000000000000000000000000000000000000000000000000000000000114E - 96FF12589BFF125899FF115393FF0F4A87FF0E3E71FF132E4BFF000000000000 - 00000000000000000000000000000000000000000000000000000F4B97FF1258 - 9FFF0F4A8AFF0F4B87FF114B87FF154C85FF124175FF0F335CFF000000000000 - 00000000000000000000000000000000000000000000000000000C3E87FF7C97 - B8FF8AB7E4FF719CC8FF15406EFF194472FF22456BFF113B66FF000000000000 - 00000000000000000000000000000000000000000000000000001F5E9BFFD9E8 - F7FF97C5F1FF8EBBE5FF7FA9D1FF89B5DFFFCDDFEEFF2368A7FF0000000058A5 - D8FF85B1DBFF469DD0FF000000000000000000000000000000002A5B92FFA6CA - EEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2884B7FF77BEE7FFB4D2 - F0FFE5F3FFFFACD2EFFF488CC7FF0000000000000000000000006A3C25FF346D - A7FF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF2E8ABFFF7ED3EBFFB2E3F9FF8BC0 - E7FFAED3F6FFC4E0FCFF669FD3FF000000000000000000000000BC481CFFF4E2 - D4FF4E7BA9FF4D7BA8FF4D7BA8FF428CBAFF7DD4EEFFC4F6FDFF6CDDF6FF6DCA - EDFF63A3D7FF5D9BD2FF000000000000000000000000C44C1FFFF6E4D6FFFFE4 - A4FFFFD472FFFFC969FFBFBB86FF79D3EEFFC7F7FDFF5FDCF5FF5BE2F7FF7AD6 - F2FF4099DFFF0000000000000000000000008A5444FFFCC8ABFFFFD198FFFEC7 - 6DFFFEBF68FFB0A780FF77CBE7FFC7F7FDFF5EDCF5FF5AE1F7FF7BD4F1FF4691 - D4FF686672FF0000000000000000287CCEFF78B3EAFFB39E94FFFFB760FFFFB6 - 63FFB3A37DFF76B8D3FFC2F6FDFF63DFF7FF5DE2F8FF79D3F0FF4795D8FF75B2 - EAFF2974C7FF0000000000000000297DD1FF82BAEEFF9F6658FFF5BB84FFA792 - 74FF7AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0EDFF5196D2FF96645DFF83BC - EFFF2A77CAFF0000000000000000000000002579CDFF866161FFBF6035FF4389 - AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF4988B7FF9C5442FF7A646DFF2E7E - CEFF6DA2D3FF0000000000000000000000000000000000000000B35020FF2D64 - 81FF94C7F9FF91C9F9FF4185C9FF2362A4FF89493DFFB24F24FF000000000000 - 000000000000000000000000000000000000000000000000000000000000113D - 55FF285F87FF4988BDFF428DBCFF000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000012488DFF104B90FF0F488AFF11427DFF15335BFF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000114E96FF12589BFF125899FF115393FF0F4A87FF0E3E71FF132E4BFF0000 - 0000000000000000000000000000000000000000000000000000000000000F4B - 97FF12589FFF0F4A8AFF0F4B87FF114B87FF154C85FF124175FF0F335CFF0000 - 0000000000000000000000000000000000000000000000000000000000000C3E - 87FF7C97B8FF8AB7E4FF719CC8FF15406EFF194472FF22456BFF113B66FF0000 - 0000000000000000000000000000000000000000000000000000000000001F5E - 9BFFD9E8F7FF97C5F1FF8EBBE5FF7FA9D1FF89B5DFFFCDDFEEFF2368A7FF0000 - 0000000000000000000000000000000000000000000000000000000000002A5B - 92FFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2D629AFF0000 - 0000000000000000000000000000000000000000000000000000000000006A3C - 25FF346DA7FF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF3474AEFF683E2DFF0000 - 000000000000000000000000000000000000000000000000000000000000BC48 - 1CFFF4E2D4FF4E7BA9FF4D7BA8FF4D7BA8FF4E7BA9FFF3D6C3FFBE461CFF0000 - 0000000000000000000000000000000000000000000000000000C44C1FFFF6E4 - D6FFFFE4A4FFFFD472FFFFC969FFFFC063FFFFB65FFF9590A0FF295DC1FF0542 - BBFF0B45B0FF000000000000000000000000000000008A5444FFFCC8ABFFFFD1 - 98FFFEC76DFFFEBF68FFFEB964FFFEB15EFF95828BFF3D74CEFF8DB5F7FFB8D6 - FEFF72A8F5FF2D6BCAFF0000000000000000287CCEFF78B3EAFFB39E94FFFFB7 - 60FFFFB663FFFEB261FFFEAC5DFFFEA559FF2450ABFF8DB5F6FF4D92FFFF1177 - FFFF2186FFFF408AEBFF0344B9FF00000000297DD1FF82BAEEFF9F6658FFF5BB - 84FFFFAC5BFFFEA85AFFFEA257FFFE9C53FF0542BCFFAECDFEFFFFFFFFFFFFFF - FFFFFFFFFFFF187FEFFF0442BCFF00000000000000002579CDFF866161FFBF60 - 35FFFEB961FFFEB962FFFEB962FFFEB962FF1F52AFFF639DF4FF187FFFFF0076 - F8FF0076EEFF0368E1FF0345B9FF00000000000000000000000000000000B350 - 20FFA0401FFFAA4522FFAC4622FFAB4422FF5F4C74FF2763C6FF2177E6FF0579 - EAFF0164DDFF044DBDFF00000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000345B9FF0442 - BCFF0345B9FF0000000000000000 + 4C69050000001000000010000000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000D8D8 + D8FF7A7A7AFF323232FF161616FF151515FF2D2D2DFF7C7C7CFFCDCDCDFF3333 + 33FF3D3D3DFFF0F0F000F0F0F000F0F0F000F0F0F000F0F0F000A0A0A0FF0F0F + 0FFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FFF0F0F000F0F0F000F0F0F000F0F0F0009D9D9DFF010101FF0000 + 00FF474747FFB5B5B5FFE0E0E0FFE0E0E0FFA0A0A0FF020202FF000000FF0000 + 00FF000000FFF0F0F000F0F0F000F0F0F000D6D6D6FF0E0E0EFF000000FF7E7E + 7EFFF0F0F000F0F0F000F0F0F000F0F0F000323232FF000000FF000000FF0000 + 00FF000000FFF0F0F000F0F0F000F0F0F000656565FF000000FF484848FFEFEF + EFFFF0F0F000F0F0F000F0F0F000F0F0F000383838FF000000FF000000FF0000 + 00FF3C3C3CFFF0F0F000F0F0F000F0F0F0001D1D1DFF000000FFBBBBBBFFF0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000373737FF3E3E3EFFF0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000404040FF3E3E3EFFF0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000B8B8 + B8FF000000FF1F1F1FFFF0F0F000F0F0F000F0F0F000404040FF000000FF0000 + 00FF000000FF444444FFF0F0F000F0F0F000F0F0F000F0F0F000EFEFEFFF4545 + 45FF000000FF686868FFF0F0F000F0F0F000F0F0F000000000FF000000FF0000 + 00FF000000FF303030FFF0F0F000F0F0F000F0F0F000F0F0F0007B7B7BFF0000 + 00FF0F0F0FFFD8D8D8FFF0F0F000F0F0F000F0F0F000000000FF000000FF0000 + 00FF020202FF9D9D9DFFE8E8E8FFE8E8E8FFB4B4B4FF454545FF000000FF0202 + 02FFA0A0A0FFF0F0F000F0F0F000F0F0F000F0F0F000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF101010FFA2A2 + A2FFF0F0F000F0F0F000F0F0F000F0F0F000F0F0F000373737FF303030FFC1C1 + C1FF767676FF2A2A2AFF090909FF0B0B0BFF303030FF7B7B7BFFD9D9D9FFF0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0F000F0F0 + F000F0F0F000F0F0F000F0F0F000FFFFFF009696960096969600969696002828 + 2842343434B7333436DC25272ADE151515D7171717B322222271292929079696 + 96009696960096969600FFFFFF00FFFFFF009696960096969600282828202C2C + 2CFB323232FF222222FF101010FF0D0D0DFF121212FF181818FF3131314A9696 + 96009696960096969600FFFFFF00FFFFFF009696960096969600343434643232 + 32FF313E4AFF7993A1FF5F727DFF45545CFF2A343CFF344759D8353535079696 + 96009696960096969600FFFFFF00FFFFFF0096969600969696003A3A3A742727 + 27FF2F404EFFBFE8FDFFC2E9FEFFBFE7FEFFABD9F6FF5798D1D2969696009696 + 96009696960096969600FFFFFF00FFFFFF009696960096969600343434501515 + 15FF23313DFFBFE7FDFFC2E9FDFFAADDFCFFACDAF6FF5798D1D2969696009696 + 96009696960096969600FFFFFF00FFFFFF0096969600969696002A2A2A121011 + 12EE598DB9FFBDE6FDFFC1E8FDFFA8DCFBFFA6D5F3FF5498CBC800902C160090 + 2C169696960096969600FFFFFF00FFFFFF009696960096969600969696001B1D + 1E96395D7DFDB9E4FBFFBFE6FDFFB4E1FCFF9ED0EEFF0D9344F401982ECE0098 + 2DCE00902C1696969600FFFFFF004B4B4B009696960096969600969696002424 + 2427436E94D77EB7E3FFA7D7F4FFADDBF7FF62B5AEFF10B849F502FF3EFF00C9 + 32E900902C6A96969600FFFFFF004B4B4B009696960096969600969696004D4D + 4D1E909396817AA9D1975E9BD1DF5C9AD1EA389390DE04BA38E200F837FF00C2 + 31E900902C6A96969600FFFFFF004B4B4B004343431249494971525252E04343 + 43FF7D7D7DFFE4E4E4FF379023FF30A654FF1D9340FE08AF33FF00EB35FF00D6 + 34FC00932CC900932CC900932CC64B4B4B00606060BF343434FF343434FF3434 + 34FF565656FFB8D8C2FF259C2AFF06F53FFF02ED37FF00EB35FF00DD35FF00CF + 35FF00C034FB00BD33FB00A630E04B4B4B00424242FB252525FF252525FF2525 + 25FF383838FFB2D2BCFF24A229FF00F837FF00EB35FF00DD35FF00CF35FF00C5 + 35FF00C134FF00BE34FF00A52FE04B4B4B00212121FE1A1A1AFF1A1A1AFF1A1A + 1AFF1D1D1DFFF1F1F1FF228C27FF2EA852FF148D38FF039D2EFF00C535FF00BB + 33FF01902CD400932DCE00922CD019191909191919FF191919FF191919FF1919 + 19FF191919FFD2D2D2FFA3550FFFD2DED5FF336141FF04902CFF00C134FF029D + 2EFF09732A9000902C1600902C0E3030300B353535E62D2D2DFE2E2E2EFF2E2E + 2EFF2E2E2EFFB3B3B3FF8F3511FFC7C7C7FF3D6B4BFF0A9532FF01B833FF03A1 + 30F90B85307D4B4B4B00FFFFFF004B4B4B004B4B4B004B4B4B006262629E6A6A + 6AB36F6F6FC0A8A8A894AFAFAF9DAFAFAF8F7C7C7C97098D31DA068C2FDC048F + 2ED307892F144B4B4B00FFFFFF00000000000000000000000000000000002828 + 2842343434B7333436DC25272ADE151515D7171717B322222271292929070000 + 0000000000000000000000000000000000000000000000000000282828202C2C + 2CFB323232FF222222FF101010FF0D0D0DFF121212FF181818FF3131314A0000 + 0000000000000000000000000000000000000000000000000000343434643232 + 32FF313E4AFF7993A1FF5F727DFF45545CFF2A343CFF344759D8353535070000 + 00002A466101515E8303000000000000000000000000000000003A3A3A742727 + 27FF2F404EFFBFE8FDFFC2E9FEFFBFE7FEFFABD9F6FF5798D1D2000000003C4B + 59062B45644755628C5DC7CFE427000000000000000000000000343434501515 + 15FF23313DFFBFE7FDFFC2E9FDFFAADDFCFFACDAF6FF5798D1D2000000003B49 + 5B824956A2EC7474D9FF7E86C1940000000000000000000000002A2A2A121011 + 12EE598DB9FFBDE6FDFFC1E8FDFFA8DCFBFFA6D5F3FF5798D1C6707D843C5D6D + 83F29082CBFF4743A6F96370A266000000000000000000000000000000001B1D + 1E96395D7DFDB9E4FBFFBFE6FDFFB4E1FCFFA2D2F3FF5D99CFC76F8F9BC499D0 + E2FF7391B4FF233354AD808DA303000000000000000000000000000000002424 + 2427436E94D77EB7E3FFA7D7F4FFADDBF7FF90C6EBFF456C8DDB7BBCCCFC61CF + FDFF055190E7526F842F00000000000000000000000000000000000000004D4D + 4D1E909396817AA9D1975E9BD1DF5C9AD1EA5384B1D7668F9FE689E5FEFF086C + BEFF2B58877D0000000000000000000000004343431249494971525252E04343 + 43FF7D7D7DFFE4E4E4FFC37700FFE0E0E0FF647178FE97D7E4FF35A2E9FF0F45 + 81DB728DA114000000000000000000000000606060BF343434FF343434FF3434 + 34FF565656FFEDEDEDFFB05903FFACB1B4FF83A9B3FF6ED2FDFF024D9DFF414C + 57E600000000000000000000000000000000424242FB252525FF252525FF2525 + 25FF383838FFE5E5E5FFA97116FF84999FFF92E2FBFF1777C7FF244262FF2828 + 29FD25252503000000000000000000000000212121FE1A1A1AFF1A1A1AFF1A1A + 1AFF1D1D1DFFF1F1F1FF836C3DFF92C9D6FF44AAF1FF034285FF262A2EFF1A1A + 1AFF1D1D1D1D000000000000000019191909191919FF191919FF191919FF1919 + 19FF191919FFCDCECFFF777060FF82D7FDFF105DB2FF2A3C4EFF191919FF1919 + 19FF232323400E0E0E01595959013030300B353535E62D2D2DFE2E2E2EFF2E2E + 2EFF2E2E2EFFAEAFB0FF5D6B74FF407FABFF375979FF434648FE343434EB3535 + 35B74646462111111102585858014B4B4B004B4B4B004B4B4B006262629E6A6A + 6AB36F6F6FC093979AB4394854FA55626CD073797DA0565656654B4B4B004B4B + 4B004B4B4B000000000000000000000000000000000000000000000000002828 + 2842343434B7333436DC25272ADE151515D7171717B322222271292929070000 + 0000000000000000000000000000000000000000000000000000282828202C2C + 2CFB323232FF222222FF101010FF0D0D0DFF121212FF181818FF3131314A0000 + 0000000000000000000000000000000000000000000000000000343434643232 + 32FF313E4AFF7993A1FF5F727DFF45545CFF2A343CFF344759D8353535070000 + 00000000000000000000000000000000000000000000000000003A3A3A742727 + 27FF2F404EFFBFE8FDFFC2E9FEFFBFE7FEFFABD9F6FF5798D1D2000000000000 + 0000000000000000000000000000000000000000000000000000343434501515 + 15FF23313DFFBFE7FDFFC2E9FDFFAADDFCFFACDAF6FF5798D1D2000000000000 + 00000000000000000000000000000000000000000000000000002A2A2A121011 + 12EE598DB9FFBDE6FDFFC1E8FDFFA8DCFBFFA6D5F3FF5798D1C6000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1D + 1E96395D7DFDB9E4FBFFBFE6FDFFB4E1FCFFA2D2F3FF5798D1C3000000000000 + 0000000000000000000000000000000000000000000000000000000000002424 + 2427436E94D77EB7E3FFA7D7F4FFADDBF7FF90C6EBFF5798D1BD000000000000 + 0000000000000000000000000000000000000000000000000000000000004D4D + 4D1E909396817AA9D1975E9BD1DF5C9AD1EA5895CBCE558BBA3A000000000000 + 0000000000000000000000000000000000004343431249494971525252E04343 + 43FF7D7D7DFFE4E4E4FFC37700FFD2D1DCFF7E7D88FC3E3D48FF44434FD93735 + 50650A0081160A0081160A00810E00000000606060BF343434FF343434FF3434 + 34FF565656FFEDEDEDFF351B6BFF3C369BFF2A2387FF1B1579FF1B1579FF1B16 + 7CF9150E89CE150E89CE100886D000000000424242FB252525FF252525FF2525 + 25FF383838FFCAC9D9FF382275FF664AF8FF664AF8FF5D4AF0FF514AE2FF454A + D6FF3D4ACCFF3D4ACCFF2426A5E000000000212121FE1A1A1AFF1A1A1AFF1A1A + 1AFF1D1D1DFFD4D3E3FF341C75FF3904EBFF2C02DEFF1B00CCFF0C00BBFF0100 + B0FF0100B2FB0100B2FB0A059CE019191909191919FF191919FF191919FF1919 + 19FF191919FFD2D2D2FF3E1E66FF3A319AFF191079FF0E056DFF0D056DFF0D05 + 6DFF0B027DD7090084C90A0184C63030300B353535E62D2D2DFE2E2E2EFF2E2E + 2EFF2E2E2EFFB3B3B3FF8F3511FFC7C7C7FF595959FF414141FE343434EB3434 + 34B74646462100000000000000004B4B4B004B4B4B004B4B4B006262629E6A6A + 6AB36F6F6FC0A8A8A894AFAFAF9DAFAFAF8F7C7C7C97565656654B4B4B004B4B + 4B004B4B4B000000000000000000000000000000000000000000000000002828 + 2842343434B7333436DC25272ADE151515D7171717B322222271292929070000 + 0000000000000000000000000000000000000000000000000000282828202C2C + 2CFB323232FF222222FF101010FF0D0D0DFF121212FF181818FF3131314A0000 + 0000000000000000000000000000000000000000000000000000343434643232 + 32FF313E4AFF7993A1FF5F727DFF45545CFF2A343CFF344759D8353535070000 + 00000000000000000000000000000000000000000000000000003A3A3A742727 + 27FF2F404EFFBFE8FDFFC2E9FEFFBFE7FEFFABD9F6FF5798D1D2000000000000 + 0000000000000000000000000000000000000000000000000000343434501515 + 15FF23313DFFBFE7FDFFC2E9FDFFAADDFCFFACDAF6FF5798D1D2000000000000 + 00000000000000000000000000000000000000000000000000002A2A2A121011 + 12EE598DB9FFBDE6FDFFC1E8FDFFA8DCFBFFA6D5F3FF5798D1C6000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1D + 1E96395D7DFDB9E4FBFFBFE6FDFFB4E1FCFFA2D2F3FF5798D1C3000000000000 + 0000197D38D612752E8600000000000000000000000000000000000000002424 + 2427436E94D77EB7E3FFA7D7F4FFADDBF7FF90C6EBFF5798D1BD10732C09187C + 37DD3DA565F4157933F01478328F000000000000000000000000000000004D4D + 4D1E909396817AA9D1975E9BD1DF5C9AD1EA5895CBCE4C88A840197D37D947B0 + 71F98FFECBFF4BB376FC187C36E1000000004343431249494971525252E04343 + 43FF7D7D7DFFCBD7CEFFC37700FFE4E4E4FF868887FC1F7439FF42AC6BFE84FC + C2FF48B675FE157932F01478318F00000000606060BF343434FF343434FF3434 + 34FF28733FFF20823EFF506E21FFDFE0DFFF287D42FF39A863FF72F9B2FF69ED + A6FF137831F210732C140000000000000000424242FB252525FF252525FF1969 + 31FF2EA056FF5DF59EFF26863BFF318B4CFF32A75CFF5DF59EFF56EA94FF1374 + 2FFF136A2B19000000000000000000000000212121FE1A1A1AFF1A1A1AFF1661 + 2CFF22984AFF46F18AFF46F18AFF3CDA79FF46F18AFF41E682FF12732EFF1922 + 1CFF1D1D1D1D000000000000000019191909191919FF191919FF191919FF1919 + 19FF155F2AFF249E4BFF31ED76FF31ED76FF2EE270FF11732DFF18211BFF1919 + 19FF2323234000000000000000003030300B353535E62D2D2DFE2E2E2EFF2E2E + 2EFF2E2E2EFF3F8C55FF1B983EFF1EE061FF11742DFF3D453FFE343434EB3434 + 34B74646462100000000000000004B4B4B004B4B4B004B4B4B006262629E6A6A + 6AB36F6F6FC0A8A8A894298443E913772FFC6D7B71A0565656654B4B4B004B4B + 4B004B4B4B000000000000000000 } end object ilAccesslevel: TImageList - left = 176 + left = 104 + top = 56 Bitmap = { - 4C69040000001000000010000000000000000000000000000000000000000000 - 0000A3A3A3FFA0A0A0FF9D9D9DFF9A9A9AFF979797FF949494FF000000000000 - 000000000000000000000000000000000000000000000000000000000000A2A2 - A2FFBCBCBCFFCACACAFFCCCCCCFFCACACAFFC2C2C2FFADADADFF8C8C8CFF0000 - 0000000000000000000000000000000000000000000000000000A1A1A1FFC4C4 - C4FFBEBEBEFFA1A1A1FF969696FF939393FF979797FFAEAEAEFFAEAEAEFF8484 - 84FF000000000000000000000000000000000000000000000000BABABAFFBFBF - BFFF989898FF00000000000000000000000000000000878787FFA8A8A8FF9E9E - 9EFF00000000000000000000000000000000000000009D9D9DFFC4C4C4FFA1A1 - A1FF000000000000000000000000000000000000000000000000898989FFA9A9 - A9FF797979FF00000000000000000000000000000000999999FFC6C6C6FF9494 - 94FF0000000000000000000000000000000000000000000000007D7D7DFFABAB - ABFF767676FF00000000000000000000000061C3E1FF88A0A8FF919191FF8E8E - 8EFF5AB9DCFF55B8DFFF51B5DEFF4DB1DDFF49ADDCFF46A8D7FF787878FF7676 - 76FF657E8DFF3199D8FF000000000000000060C2E1FFC9F3FCFFCBF3FDFFD4F6 - FEFFD7F6FFFFD8F4FFFFE0F8FFFFDFF8FFFFDAF5FFFFCDF1FCFFC2EDFAFFBDEB - FAFFBDEBFAFF2B93D6FF00000000000000005CBFE0FFC8F3FCFF75DFF9FF89E6 - FDFF95E7FFFF9AE5FFFFAAEEFFFFA8EDFFFF99E3FFFF74D5F9FF59CCF3FF4FC8 - F1FFBBE9FAFF248DD5FF000000000000000058BBDFFFC7F1FCFF6FDCF9FF56BB - EDFF61BDEFFF9BE7FFFF35A6E2FF4BA4E1FF90E2FFFF49ADE9FF38A4E3FF49C4 - F0FFB8E8F9FF1E88D4FF000000000000000053B7DEFFC6F0FCFF6AD9F8FF7CE2 - FDFF90E8FFFF99E9FFFF329FDFFF548BB2FF8AE2FFFF6AD0F9FF50C5F1FF46C1 - F0FFB6E7F9FF1883D3FF00000000000000004EB2DDFFC3EFFBFF65D6F8FF4CB6 - ECFF5ABDEFFF95EBFFFF3097DDFF4D82ABFF84E1FFFF41A9E9FF329FE1FF42BE - EFFFB4E5F9FF137ED2FF000000000000000049ADDCFFC1EEFBFF5FD3F7FF6CDB - FCFF7FE5FFFF8FEDFFFF97F2FFFF93EDFFFF7CDFFFFF5BCCF8FF46BEEFFF3CBA - EEFFB3E3F9FF0E79D1FF000000000000000043A8DBFFBFECFBFF59CFF5FF41B0 - ECFF4EBAEFFF5AC2EFFF60C6EFFF5CC4EFFF4CB6EFFF37A5E6FF2A9AE1FF38B8 - EEFFB1E3F8FF0975D0FF00000000000000003DA3DAFFBCEBFAFFBCEBFCFFBFEE - FEFFC6F4FFFFCEF8FFFFD3FAFFFFD0F8FFFFC7F2FFFFBAE9FCFFB3E4F9FFB0E2 - F8FFB0E2F8FF0571CFFF0000000000000000369DD9FF3199D8FF2C94D7FF2890 - D6FF238CD5FF1E88D4FF1A84D3FF1580D2FF117CD1FF0E79D1FF0A76D0FF0773 - CFFF0470CFFF016ECEFF00000000000000000000000000000000000000000000 + 4C690D0000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00999A8E70999A8ED9999A8ED9999A8ED9999A8ED9999A8E70FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999A + 8E5F999A8ED9D0D1C5FFF4F6E5FFF4F6E5FFD0D1C5FF999A8ED9999A8E5FFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8E4F999A + 8EC8CCCDC1FF999A8ED9999A8ED9999A8ED9999A8ED9CCCDC1FF999A8ED9999A + 8E70FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009B9C90BCC8C9 + BDFF999A8EC8999A8E5FFFFFFF00FFFFFF00999A8E5F9A9B8FDBD0D1C5FF999A + 8ED9FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009B9C90F1BABB + B1FF999A8EEBFFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8EEBBABBB1FF999A + 8EEBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8EFFBDBE + B4FF999A8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8EFFBDBEB4FF999A + 8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8EFFBDBE + B4FF999A8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00999A8EFFBDBEB4FF999A + 8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098988DFF98988DFF9898 + 8DFF98988DFF98988DFF98988DFF98988DFF98988DFF98988DFF98988DFF9898 + 8DFF98988DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0098988DFFD2D3C6FFEBED + DDFFD6D8CAFFD6D8CAFFD6D8CAFFD6D7CAFFD5D7C9FFD5D7C9FFE8EADBFFD2D3 + C6FF98988DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0098988DFFB3B4AAFFDCDD + CFFFB3B4AAFFB3B4AAFFB3B4AAFFB3B4AAFFB3B4AAFFB3B4AAFFD9DBCDFFB3B4 + AAFF98988DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0098988DFFAEAFA4FFD5D7 + C9FFAEAFA4FFAEAFA4FFAEAFA4FFAEAFA4FFAEAFA4FFAEAFA4FFD2D4C6FFAEAF + A4FF98988DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF000268A4FF40B9E8FF3054 + 5FFF2B5F72FF01B1FBFF05A9EDFF2E5A68FF2E5A69FF00B2FDFF06A8ECFF3E65 + 71FF313A3BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00293940FF40C2F5FF64C7 + ECFF305560FF2A6276FF04ADF4FF05A9EDFF2E5A68FF2E5A69FF01AFF8FF40BB + EDFF2D3A3EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF002E3A3DFF3F8198FF67D2 + FAFF1FA7DDFF335D6BFF2E7088FF1DAFE9FF1EAAE3FF33606FFF326C81FF40C5 + FBFF0566A0FFFFFFFF00FFFFFF00FFFFFF00FFFFFF0098988DFF9C9D91FFB7B8 + ABFF9C9D91FF9C9D91FF9C9D91FF9C9D91FF9C9D91FF9C9D91FFB2B4A6FF9C9D + 91FF98988DFFFFFFFF00FFFFFF00FFFFFF00000000327C7E75FF7C7E75FF7C7E + 75FF7C7E75FF7C7E75FF7C7E75FF7C7E75FF7C7E75FF7C7E75FF7C7E75FF7C7E + 75FF7C7E75FF00000032FFFFFF00FFFFFF000000000000000000000000000000 + 0000113D6D47185586FF1B578AFF174C7CFA113F714800000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000001138 + 67331E699CFF3685B7FF3F85B5FF346A98FF1A3D69FF102D5B33000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000001240 + 70FA2A79AAFF458BBAFF578EBAFF436C98FF25416DFF113261FA000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000E3F + 6DFF1E608FFF376D9AFF6899BFFF7CB4D6FF487299FF0D2F5FFF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000835 + 67FF88CEEDFFA3E7FFFF91D3F2FF86C8E7FF649CBEFF0A2F62FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000831 + 60AA88C9EAFF92D5F4FF82C3E4FF7AB9D9FF649DBFFF0B3663AA000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 001E85C8E8E486C8E9FF79B8DAFF6FACCFFF5E9BBEE40000001E000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 00005B7888657CBFE1FF70B1D4FF5F9FC3FF3F5A6A5500000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF0000000000000000006361606D6966 + 63FFCDD1D3FF6D98ADFF547A8FFF3A6075FFB6BCBFFF676361F46362606E0000 + 000000000000FFFFFF00FFFFFF00FFFFFF009E9E9E21ACACACF84E4D4CFF504F + 4DFFDFDCDAFF3F3B38FF423D39FF423E3BFFCFCBCAFF52504FFF4F4E4CFFACAC + ACE49E9E9E21FFFFFF00FFFFFF00FFFFFF00A1A1A1FFFFFFFF00454342FF4C4A + 49FF5D5C5CFFFFFFFF00FFFFFF00FFFFFF005E5C5CFF4C4B4AFF454442FFFFFF + FF00A3A3A3FFFFFFFF00FFFFFF00FFFFFF00B6B6B6FFFFFFFF003B3A3AFF4746 + 46FF414040FFB0AFAFFFF3F2F1FFB0AFAFFF414040FF474646FF3C3A3BFFFFFF + FF009A9A9AFFFFFFFF00FFFFFF00FFFFFF00B8B8B8FFFFFFFF00353434FF4241 + 41FF3F3E3EFF4D4C4CFFFFFFFF004D4C4CFF3F3E3EFF424141FF353434FFFFFF + FF009B9B9BFFFFFFFF00FFFFFF00FFFFFF00909090C0A5A5A5FF313030FF3B3A + 3AFF3B3A3AFF313030FFAEAFAFFF313030FF3B3A3AFF3B3A3AFF313030FFA6A6 + A6FF929292C0FFFFFF00FFFFFF00FFFFFF000000002300000033000000330000 + 0033000000330000003300000033000000330000003300000033000000330000 + 003300000023FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 000011457647185586FF1B5788FF174B7BFA113E6E3300000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000001035 + 6348206E9FFF3685B7FF3F85B5FF336995FF193B67FF102D5B35000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000001142 + 71F82B7AABFF468ABAFF568DBAFF426B96FF24406EFF10305FD2000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000114174240F41 + 70FF1F608FFF386E9BFF6DA0C6FF7BB3D4FF477098FF0D2E5FFF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF0000000000000000000A2C50170730 + 61FFA9F1FFFFA2E4FFFF90D3F2FF86C7E7FF639BBDFF0A3063FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00000000000000000000000003082F + 5CAA92D3F3FF91D2F2FF83C3E3FF79B8D8FF5C94B8FF0B3461AB000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 001E86C6E5E486C7E7FF79B7D8FF6EACCDFF609AB9D40000001E000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000466E87677CBBDBFF70AED1FF619CBFFF344E5D4A00000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000649CBA5A68A1 + BECB7EBAD8FF6B9FBAFF4F7E95FF2E5971FF6DA6C3FF6AA4C2B7649CBA460000 + 000000000000FFFFFF00FFFFFF00FFFFFF00659DBB2168A1BFF984C2E2FF9ADF + FEFF9CE1FFFF9CE1FFFF86C9E9FF86C7E7FF98DCFAFF9BE0FFFF84C2E2FF68A1 + BFE5659EBC22FFFFFF00FFFFFF00FFFFFF00689FBDFF99DDFCFF8BCDEDFF87C8 + E8FF87C7E7FF89C9E9FF85C6E6FF85C5E5FF88C9E9FF88C8E8FF8CCDEDFF9ADD + FCFF69A1BFFFFFFFFF00FFFFFF00FFFFFF0072AECBFFA5EBFFFF73B1D2FF76B4 + D5FF76B4D6FF76B4D5FF76B4D5FF76B4D5FF76B4D6FF76B4D5FF73B1D3FFA6ED + FFFF629AB8FFFFFFFF00FFFFFF00FFFFFF0073AFCDFFA8EFFFFF6CA8CCFF5383 + A0FF65A1C3FF64A0C1FF64A0C1FF64A0C1FF65A1C3FF5383A0FF67A3C5FFA9F0 + FFFF649CB9FFFFFFFF00FFFFFF00FFFFFF005D90ACC0649DBBFF66A0BEFF5585 + 9EFF68A1C0FF67A0BEFF67A0BDFF67A0BEFF68A1C0FF56859FFF67A0BEFF659D + BBFF5D91ADC0FFFFFF00FFFFFF00FFFFFF000000002300000033000000330000 + 0033000000330000003300000033000000330000003300000033000000330000 + 003300000023FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4A004A4A4A004A4A4A004A4A + 4A004D4D4D065353533B5353535E5353535E5353533B4D4D4D064A4A4A004A4A + 4A004A4A4A004A4A4A00FFFFFF00FFFFFF004747470047474700474747004747 + 47004747473D8A8A8A9CCFCFCFECC9C9C9EC8181819C4747473D474747004747 + 47004747470047474700FFFFFF00FFFFFF003636360036363600363636003636 + 36003636366AADADADF1BCBCBCFFB4B4B4FFA0A0A0F13636366A363636003636 + 36003636360036363600FFFFFF00FFFFFF00153A6000153A6000153A6000153B + 61002424247C99C0DFFF99CCF6FF99CCF6FF99C0DFFF2424247C153B6100153A + 6000153A6000153A6000FFFFFF00FFFFFF00024C9800024C9800024C9800024D + 99814C4C4CC1A1D4FAFF98CBF5FF98CBF5FFA1D4FAFF4C4C4CC1024D9981024C + 9800024C9800024C9800FFFFFF00FFFFFF00024C9700024C9700024C9700024C + 9783215890C498CBF5FF91C4F1FF91C4F1FF98CBF5FF215890C4024C9783024C + 9700024C9700024C9700FFFFFF00FFFFFF00024B9400024B9400024B9400024B + 9400024A929E7FB4E4F694A6B8FF94A6B8FF7FB4E4F6024A929E024B9400024B + 9400024B9400024B9400FFFFFF00FFFFFF000000260001134300013776000148 + 8F0001488F463574B1D480B3E3FF80B3E3FF3574B1D401488F4601488F000137 + 76000113430000002600FFFFFF00FFFFFF000000260000002800000029000000 + 2A0000002A0C014385C64A7DB0FF4A7DB0FF014385C600002A0C00002A000000 + 29000000280000002600FFFFFF00FFFFFF000000260000002800000029000000 + 2A2700002A5B4D7AA6E680B3E3FF80B3E3FF4D7AA6E600002A5B00002A270000 + 29000000280000002600FFFFFF00FFFFFF00000026000000281B000029530000 + 296C9F9FB0FFC9D6E2FF959EB3FF959EB3FFC9D6E2FF9E9EAFFF0000296C0000 + 29530000281B00002600FFFFFF00FFFFFF00000026321F1F4086585873B7AEAE + BFFF9B9BACFFF3F3F3FF9AAEE0FF9AAEE0FFF3F3F3FF9A9AABFFADADBEFF5959 + 74B71F1F418600002632FFFFFF00FFFFFF000000247A8E8EA0F39898A9FFA9A9 + BAFF9696A7FFEAEAEAFF6E87C7FF6E87C7FFEAEAEAFF9595A6FFA8A8B9FF9898 + A9FF8F8FA1F30000247AFFFFFF00FFFFFF0001011F9B9494A5FF9797A8FFA9A9 + BAFF9191A2FFDDDDDDF43D5CAAFF3D5CAAFFDDDDDDF49090A1FFA8A8B9FF9797 + A8FF9595A6FF01011F9BFFFFFF00FFFFFF0001011B5601011BAA02021DA50202 + 1F9D030321952F2F2F6200157FCA00157FCA2F2F2F620303219602021F9D0202 + 1DA501011CAA01011B56FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4A004A4A4A004A4A4A004A4A + 4A004D4D4D065353533B5353535E5353535E5353533B4D4D4D064A4A4A004A4A + 4A004A4A4A004A4A4A00FFFFFF00FFFFFF004747470047474700474747004747 + 47004747473D8A8A8A9CCFCFCFECC9C9C9EC8181819C4747473D474747004747 + 47004747470047474700FFFFFF00FFFFFF003636360036363600363636003636 + 36003636366AADADADF1BCBCBCFFB4B4B4FFA0A0A0F13636366A363636003636 + 36003636360036363600FFFFFF00FFFFFF00153A6000153A6000153A6000153B + 61002424247C99C0DFFF99CCF6FF99CCF6FF99C0DFFF2424247C153B6100153A + 6000153A6000153A6000FFFFFF00FFFFFF00024C9800024C9800024C9800024D + 99814C4C4CC1A1D4FAFF98CBF5FF98CBF5FFA1D4FAFF4C4C4CC1024D9981024C + 9800024C9800024C9800FFFFFF00FFFFFF00024C9700024C9700024C9700024C + 9783215890C498CBF5FF91C4F1FF91C4F1FF98CBF5FF215890C4024C9783024C + 9700024C9700024C9700FFFFFF00FFFFFF00024B9400024B9400024B9400024B + 9400024A929E7FB4E4F694A6B8FF94A6B8FF7FB4E4F6024A929E024B9400024B + 9400024B9400024B9400FFFFFF00FFFFFF002A000000201325000C376C000148 + 8F0001488F463574B1D480B3E3FF80B3E3FF3574B1D401488F4601488F000C37 + 6C00201325002A000000FFFFFF00FFFFFF002A0000002A0000002A0000002B00 + 00002B000019014385C64A7DB0FF4A7DB0FF014385C62B0000192B0000002A00 + 00002A0000002A000000FFFFFF00FFFFFF002A0000002A0000002A0000002B00 + 004C2B0000B44D7AA6E680B3E3FF80B3E3FF4D7AA6E62B0000B42B00004C2A00 + 00002A0000002A000000FFFFFF00FFFFFF002A0000002A0000322A00009A2A00 + 00CB5F3D3DFFC9D6E2FF959EB3FF959EB3FFC9D6E2FF5F3D3DFF2A0000CB2A00 + 009A2A0000322A000000FFFFFF00FFFFFF002A000057320909D3492323E97351 + 51FF5B3939FFF3F3F3FF9AAEE0FF9AAEE0FFF3F3F3FF5B3939FF725050FF4A24 + 24E9320A0AD32A000057FFFFFF00FFFFFF00290000C8583535FC5D3B3BFF6E4C + 4CFF563434FFEAEAEAFF6E87C7FF6E87C7FFEAEAEAFF563434FF6D4B4BFF5D3B + 3BFF593636FC290000C8FFFFFF00FFFFFF00270000E2593737FF5C3A3AFF6E4C + 4CFF512F2FFFDDDDDDF43D5CAAFF3D5CAAFFDDDDDDF4512F2FFF6D4B4BFF5C3A + 3AFF5A3838FF270000E2FFFFFF00FFFFFF0026000078230000FE240000F52600 + 00E9280000DD2F2F2F6200157FCA00157FCA2F2F2F62280000DE260000EA2400 + 00F5230000FE26000078FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000202250002022500020225000202 + 2500020226100202265C02022676020226760202265C02022610020225000202 + 25000202250002022500FFFFFF00FFFFFF000202230002022300020223000202 + 25000202255F4A4A65A89D9DB0EE9D9DAFEE494964A80202255F020225000202 + 23000202230002022300FFFFFF00FFFFFF000101210001012100010121000101 + 2211424258A7C8C8CCF9EAEAEEFFE8E8ECFFC5C5C9F9424258A7010122110101 + 21000101210001012100FFFFFF00FFFFFF000101200001012000010120350101 + 207B34344CC6767687FF9191A2FF9696A7FF7E7E8FFF36364FC60101207B0101 + 20350101200001012000FFFFFF00FFFFFF0002275C0002275C0002275C00024D + 99810E0E20EF83B6E3FF7FB2E0FF7FB2E0FF83B6E3FF0E0E20EF024D99810227 + 5C0002275C0002275C00FFFFFF00FFFFFF00024C9700024C9700024C9700024C + 9783073E7AC498CBF5FF91C4F1FF91C4F1FF98CBF5FF073E7AC4024C9783024C + 9700024C9700024C9700FFFFFF00FFFFFF00024B9400024B9400024B9400024B + 9400024A929E7FB4E4F6546783FF546783FF7FB4E4F6024A929E024B9400024B + 9400024B9400024B9400FFFFFF00FFFFFF000000260001134300013776000148 + 8F0001488F463574B1D480B3E3FF80B3E3FF3574B1D401488F4601488F000137 + 76000113430000002600FFFFFF00FFFFFF000000260000002800000029000000 + 2A0000002A0C014385C64A7DB0FF4A7DB0FF014385C600002A0C00002A000000 + 29000000280000002600FFFFFF00FFFFFF000000260000002800000029000000 + 2A2700002A5B4D7AA6E680B3E3FF80B3E3FF4D7AA6E600002A5B00002A270000 + 29000000280000002600FFFFFF00FFFFFF00000026000000281B000029530000 + 296C9F9FB0FFC9D6E2FFB3A699FFB3A699FFC9D6E2FF9E9EAFFF0000296C0000 + 29530000281B00002600FFFFFF00FFFFFF00000026321F1F4086585873B7AEAE + BFFF9B9BACFFF3F3F3FFDEC0A2FFDEC0A2FFF3F3F3FF9A9AABFFADADBEFF5959 + 74B71F1F418600002632FFFFFF00FFFFFF000000247A8E8EA0F39898A9FFA9A9 + BAFF9696A7FFEAEAEAFFC19A74FFC09A74FFEAEAEAFF9595A6FFA8A8B9FF9898 + A9FF8F8FA1F30000247AFFFFFF00FFFFFF0001011F9B9494A5FF9797A8FFA9A9 + BAFF9191A2FFE1E1E1FF9D6F40FF9D6F40FFE1E1E1FF9090A1FFA8A8B9FF9797 + A8FF9595A6FF01011F9BFFFFFF00FFFFFF0001011B5601011BAA02021DA50202 + 1F9D030321952F2F2F626A2A00CA6A2A00CA2F2F2F620303219602021F9D0202 + 1DA501011CAA01011B56FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B0000002B0000002B0000002B00 + 00002B00001B2B00009B2B0000C72B0000C72B00009B2B00001B2B0000002B00 + 00002B0000002B000000FFFFFF00FFFFFF002B0000002B0000002B0000002B00 + 00002B00009C4C2525DE7E5B5BF97E5A5AF94A2323DE2B00009C2B0000002B00 + 00002B0000002B000000FFFFFF00FFFFFF002A0000002A0000002A0000002B00 + 001A5A3D3DD9C0B8B8FDE1D8D8FFDFD6D6FFBCB3B3FD5A3D3DD92B00001A2A00 + 00002A0000002A000000FFFFFF00FFFFFF002A0000002A0000002A00004E2A00 + 00B6401A1AE7654343FF805E5EFF856363FF6D4B4BFF421C1CE72A0000B62A00 + 004E2A0000002A000000FFFFFF00FFFFFF0016264C0016264C0016264C00024D + 99810E0E20EF83B6E3FF7FB2E0FF7FB2E0FF83B6E3FF0E0E20EF024D99811626 + 4C0016264C0016264C00FFFFFF00FFFFFF00024C9700024C9700024C9700024C + 9783073E7AC498CBF5FF91C4F1FF91C4F1FF98CBF5FF073E7AC4024C9783024C + 9700024C9700024C9700FFFFFF00FFFFFF00024B9400024B9400024B9400024B + 9400024A929E7FB4E4F6546783FF546783FF7FB4E4F6024A929E024B9400024B + 9400024B9400024B9400FFFFFF00FFFFFF002A000000201325000C376C000148 + 8F0001488F463574B1D480B3E3FF80B3E3FF3574B1D401488F4601488F000C37 + 6C00201325002A000000FFFFFF00FFFFFF002A0000002A0000002A0000002B00 + 00002B000019014385C64A7DB0FF4A7DB0FF014385C62B0000192B0000002A00 + 00002A0000002A000000FFFFFF00FFFFFF002A0000002A0000002A0000002B00 + 004C2B0000B44D7AA6E680B3E3FF80B3E3FF4D7AA6E62B0000B42B00004C2A00 + 00002A0000002A000000FFFFFF00FFFFFF002A0000002A0000322A00009A2A00 + 00CB5F3D3DFFC9D6E2FFB3A699FFB3A699FFC9D6E2FF5F3D3DFF2A0000CB2A00 + 009A2A0000322A000000FFFFFF00FFFFFF002A000057320909D3492323E97351 + 51FF5B3939FFF3F3F3FFDEC0A2FFDEC0A2FFF3F3F3FF5B3939FF725050FF4A24 + 24E9320A0AD32A000057FFFFFF00FFFFFF00290000C8583535FC5D3B3BFF6E4C + 4CFF563434FFEAEAEAFFC19A74FFC09A74FFEAEAEAFF563434FF6D4B4BFF5D3B + 3BFF593636FC290000C8FFFFFF00FFFFFF00270000E2593737FF5C3A3AFF6E4C + 4CFF512F2FFFDDDDDDF49D6E40FF9D6E40FFDDDDDDF4512F2FFF6D4B4BFF5C3A + 3AFF5A3838FF270000E2FFFFFF00FFFFFF0026000078230000FE240000F52600 + 00E9280000DD2F2F2F626A2A00CA6A2A00CA2F2F2F62280000DE260000EA2400 + 00F5230000FE26000078FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000D5D4D24EDEDE + DCA8DDDCDBFFE6E0DEFFF0E5E2FFE8E1DEFFDDDBDBFFDFDFDEA8D7D6D44D0000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000DEDCDCFFE9E9 + E7FFFEF7F3FFDAF4FFFF00C3FFFFDCFFFFFFFFF7F6FFE9E8E8FFDDDDDCFFDADA + DA1700000000FFFFFF00FFFFFF00FFFFFF000000000000000000B8B6B58A0000 + 00FF200E07FF343F49FF00CEFFFF394C4DFF200D07FF000000FFB6B5B389BFBF + BF1E00000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000160100 + 00FF00C8FFFF00CEFFFF00D8FFFF00E5FFFF00F9FFFF000000FF000000150000 + 000500000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000B3B + 72FFBBFFFFFF060000FF270A01FF573D35FF8FC9EBFF123F76FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000938 + 6EFFB0F7FFFFA1E5FFFF92D6F8FF84C5E7FF7BBADAFF103F72FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000A36 + 64AB85C7E9FF8ED0F0FF80C0E1FF74B3D4FF66A2C3FF0D3B69AB000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 001E69A6C8D382C4E5FF73B1D3FF69A7CAFF548DAEC30000001E000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000325164528BD1F1FF66A5C5FF4F86A4FF18303E3E00000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF0000000000000000002D8CB7976C64 + 5FC9697076FFF8FFFFFFE8F3F9FFD6E1E7FF707273FF6A6766B7646363460000 + 000000000000FFFFFF00FFFFFF00FFFFFF00656463206A6461F85B8CA1FF857C + 77FF4C4744FFB9B6B3FFFFFFFF00BBB8B5FF4C4847FF837F7DFF7A797AFF6666 + 67E565656522FFFFFF00FFFFFF00FFFFFF00666565FF7C7470FF228CBCFF6053 + 50FF433D3AFF4E4848FFFFFFFF004E4A49FF44403EFF5D5958FF645F5EFF7977 + 76FF656565FFFFFFFF00FFFFFF00FFFFFF00666565FF6C635FFF1893C5FF707C + 82FF897773FF43322FFF3F696EFF423834FF59514AFF564F4BFF544D4CFF6964 + 63FF656565FFFFFFFF00FFFFFF00FFFFFF00615F5FFF524C4AFF4A4C4CFF00B8 + FCFF0BAEDDFF05C1EDFF02CCEDFF55463FFF0285FFFF7C80C7FF5BE5CCFF4F49 + 49FF666565FFFFFFFF00FFFFFF00FFFFFF005E5E5EC0676665FF696462FF6B61 + 5DFF6C5F5CFF6C5F5CFF6B605EFF6A6360FF69635DFF67625DFF666160FF6664 + 64FF5D5D5DC0FFFFFF00FFFFFF00FFFFFF000000002300000033000000330000 + 0033000000330000003300000033000000330000003300000033000000330000 + 003300000023FFFFFF00FFFFFF00FFFFFF0000000000000000005B77564E5C77 + 57A8577250FF5F7552FF657752FF5F7451FF57724FFF5F7859A8637D5E4D0000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000577351FF5D76 + 55FF6F8361FF67968CFF00D3FFFF669D8AFF6F8260FF5C7755FF587452FF5773 + 521700000000FFFFFF00FFFFFF00FFFFFF000000000000000000495E438A4260 + 3BFF586B42FF557F6EFF00CFFFFF5A8D74FF5C6D48FF476340FF4A5E44894B64 + 471E00000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000164760 + 32FF00C2FFFF00CBFFFF00D7FFFF00E1FFFF00F3FFFF4C6237FF000000150000 + 000500000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000D3A + 73FFBAFCFFFF060000FF270A01FF563C34FF8DC7EAFF143E78FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000938 + 6EFFB0F7FFFFA1E5FFFF92D6F8FF84C5E7FF7BBADAFF113F73FF000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000B36 + 64AB85C6E9FF8ED0F0FF80C0E1FF74B3D4FF66A2C4FF0E3A6AAB000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 001E6AA5C9D382C4E5FF73B1D3FF69A7CAFF548CAFC30000001E000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000305161528BCFF1FF66A5C5FF4F85A4FF192E3F3E00000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF0000000000000000002491AC975E72 + 4BC9678770FFF6FFFFFFE8F2F8FFD5DEE6FF6E876EFF5B7753B753704D460000 + 000000000000FFFFFF00FFFFFF00FFFFFF0056714F205C724FF85FA4A3FF98AC + 89FF5C6B54FFC4CDBEFFFFFFFF00C6CFC0FF5C6D56FF95AE8FFF7D9678FF5975 + 54E555715022FFFFFF00FFFFFF00FFFFFF00587351FF8B9F7CFF2A9FC4FF7384 + 60FF516147FF586451FFFFFFFF00596653FF51644BFF6F8768FF768E70FF87A1 + 82FF54704FFFFFFFFF00FFFFFF00FFFFFF005F7858FF809471FF1CA1CAFF789B + 89FF929B7BFF4E5838FF4A8D77FF4D5D3DFF667E54FF637C55FF617956FF7D95 + 76FF54704FFFFFFFFF00FFFFFF00FFFFFF00597553FF667F5BFF587658FF00BC + FFFF10B9E0FF07C8EFFF06D3F2FF68784EFF017DFFFF7C7AC8FF5ADECDFF647D + 5BFF557150FFFFFFFF00FFFFFF00FFFFFF004F694AC0577150FF59704DFF5B6E + 48FF5C6D46FF5C6D47FF5B6E49FF5A704AFF597148FF577048FF566F4BFF5670 + 4FFF50694AC0FFFFFF00FFFFFF00FFFFFF000000002300000033000000330000 + 0033000000330000003300000033000000330000003300000033000000330000 + 003300000023FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF002B579DFF2B579D38FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B51 + 93FF2968B84C2B579DFF70B0EBFF2A5BA3FF2968B83B2B5193FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B57 + 9DFF2968B8FF70B0EBFF70B0EBFF70B0EBFF2968B8FF2A5EA7FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B52 + 95FF646464FF7F7F7FFFB7B7B7FFA7A7A7FF656565FF2B5295FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005757 + 57FF5E5E5EFF757575FF777777FF5287BEFF5287BEFF5D5D5DFFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005757 + 57FF558ABFFF6D9BC9FF78A4CEFF7FA9D1FF558ABFFF5C5C5CFFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E69 + 86FF558ABFFF82ABD2FF82ABD2FF82ABD2FF558ABFFF486B90FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003770 + A9CE558ABFFF86ADD3FF82ABD2FF82ABD2FF5086BCFF3871AACAFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0095999D389599 + 9DFF3E75ADFE699ACBFF73A1CEFF6697CAFF3871A9FD95999DFF95999D38FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0095999D3895999DFFFAFA + FAFF83A1C0FB568CC1FF5E94C8FF528AC0FF82A0C1FBFAFAFAFF95999DFF9599 + 9D38FFFFFF00FFFFFF00FFFFFF00FFFFFF00878F9D3E95999DFFECECECFFE5E5 + E5FFFAFAFAFF7B9FC2FF30679EFF82A8CEFFFAFAFAFFE5E5E5FFECECECFF9599 + 9DFF878F9D3EFFFFFF00FFFFFF000A38A0510938A1E83358A9FFC7C8CAFF8B8B + 8BFFE5E5E5FFBCBCBCFFA8C0D7FFFAFAFAFFE5E5E5FF717171FFC7C8CAFF355C + B1EB0A38A0E10A389F4EFFFFFF000938A1F4033DB9FF0837A1FF3257AAFFC7C8 + CAFF9F9F9FFFBCBCBCFFE5E5E5FFCBCBCBFFAEAEAEFFC7C8CAFF2D5CC0FF023E + BDFF033DB9FF0A389FE3FFFFFF000A389FFF023EBDFF023EBDFF0837A1FF3257 + AAFFBCBCBCFFE5E5E5FFCBCBCBFF7F7F7FFFBCBCBCFF2D5CC0FF023EBDFF023E + BDFF023EBDFF0A389FFFFFFFFF000A389FFF0A389FFF0A389FFF0A389FFF7688 + B1FFBCBCBCFFBCBCBCFFB1B1B1FFBCBCBCFF3458A8FF0A389FFF0A389FFF0A38 + 9FFF0A389FFF0A389FFFFFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF002B579DFF2C579C39FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B51 + 93FF4D6C929E2B579DFF70B0EBFF2A5BA3FF596D86BF2B5193FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B51 + 93FF2968B8FF70B0EBFF70B0EBFF70B0EBFF2968B8FF2B5193FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B51 + 93FF646464FF7F7F7FFFB7B7B7FFA7A7A7FF656565FF2B5193FF615C5A09FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006F6F6F0B5757 + 57FF5E5E5EFF757575FF777777FF5381B7FF5186BDFF5D5D5DFF615C5A12FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00615C5A10615C5A225757 + 57FF575757FF82ABD2FF82ABD2FF82ABD2FF558ABFFF5C5C5CFF615C5A2C615C + 5A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00615C5A34615C5ADD5757 + 57FF558ABFFF82ABD2FF82ABD2FF82ABD2FF558ABFFF5E6F82FF615C5AE5615C + 5A1FFFFFFF00FFFFFF00FFFFFF00FFFFFF00615C5A09615C5AFF615C5AFF6E6F + 70FF5D82A6FF86ADD3FF82ABD2FF82ABD2FF5086BCFF516E8AFF615C5AFF615C + 5AFF615C5A07FFFFFF00FFFFFF00FFFFFF00615C5A11615C5AFF6C6969FF9599 + 9DFF4275A8FE699ACBFF73A1CEFF6697CAFF3871A9FD95999DFF6C6969FF615C + 5AFF615C5A10FFFFFF00FFFFFF00FFFFFF00615C5A0C726F6FB195999DFFFAFA + FAFF87A1BCFF568CC1FF5E94C8FF528AC0FF83A1C0FFFAFAFAFF95999DFF6F6C + 6CD3615C5A07FFFFFF00FFFFFF00FFFFFF00868D9A4195999DFFECECECFFE5E5 + E5FFFAFAFAFF7B9FC2FF30679EFF82A8CEFFFAFAFAFFE5E5E5FFECECECFF9599 + 9DFF868E9B40FFFFFF00FFFFFF0009369F510937A0E83359B0F9C7C8CAFF8B8B + 8BFFE5E5E5FFBCBCBCFFA8C0D7FFFAFAFAFFE5E5E5FF717171FFC7C8CAFF365B + AFEF09369FE109369E4EFFFFFF000937A0F4033DB9FF023EBDFF2D5CC0FFC7C8 + CAFF9F9F9FFFBCBCBCFFE5E5E5FFCBCBCBFFAEAEAEFFC7C8CAFF2D5CC0FF023E + BDFF033DB9FF09369EE3FFFFFF0009369EFF023EBDFF023EBDFF023EBDFF2D5C + C0FFBCBCBCFFE5E5E5FFCBCBCBFF7F7F7FFFBCBCBCFF2D5CC0FF023EBDFF023E + BDFF023EBDFF09369EFFFFFFFF0009369EFF09369EFF09369EFF09369EFF7687 + B0FFBCBCBCFFBCBCBCFFB1B1B1FFBCBCBCFF3356A8FF09369EFF09369EFF0936 + 9EFF09369EFF09369EFFFFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000565D68FF133F7AFF0D3E7DFF0C3C76FF123969FF4E5663FF000000000000 - 0000000000000000000000000000000000000000000000000000000000005F63 - 69FF284D7DFF2D6196FF0F4988FF2C6093FF0C3E73FF1B3D60FF595E63FF0000 - 0000000000000000000000000000000000000000000000000000000000003752 - 79FF255A93FF0C3E76FF245485FF0E3E73FF265584FF163E69FF143050FF0000 - 0000000000000000000000000000000000000000000000000000000000001136 - 67FF2A4B71FF4C759EFF3B638EFF11355BFF28527BFF1C3959FF103255FF0000 - 0000000000000000000000000000000000000000000000000000000000001848 - 78FF9BB7D1FFA3C9EDFF9FC5E8FF74A1CDFF81B0DDFF96B3CEFF1A4C7EFF0000 - 000000000000000000000000000000000000000000000000000000000000305D - 8FFFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2E629AFF0000 - 0000000000000000000000000000000000000000000000000000000000003D3D - 3DFF416F9EFF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF4176A6FF373737FF0000 - 0000000000000000000000000000000000000000000000000000494949FF4B4B - 4BFF989898FF5C5C5CFF557CA3FF557CA3FF4C4C4CFF989898FF4E4E4EFF4C4C - 4CFF0000000000000000000000000000000000000000777777FF4C4C4CFF4E4E - 4EFF979797FF595959FFABABABFFA5A5A5FF545454FF868686FF626262FF4A4A - 4AFF0000000000000000000000000000000000000000636363FFA4A4A4FF5050 - 50FF525252FF5B5B5BFFB8B8B8FFC1C1C1FF575757FF4D4D4DFF5A5A5AFF7E7E - 7EFF606060FF000000000000000000000000287CCEFF78B3EAFF7A7A7AFF8383 - 83FF7E7E7EFF5D5D5DFF494949FF4C4C4CFF555555FF646464FF5F5F5FFF6D6D - 6DFF7EB8EDFF2974C7FF0000000000000000297DD1FF82BAEEFF5F5F5FFF8F8F - 8FFF7A7A7AFF777777FF6D6D6DFF4E4E4EFF727272FF6F6F6FFF848484FF5555 - 55FF83BCEFFF2A77CAFF0000000000000000000000002579CDFF5E5E5EFF4F4F - 4FFF848484FF848484FF808080FF545454FF838383FF848484FF4A4A4AFF4545 - 45FF2E7ECEFF6DA2D3FF00000000000000000000000000000000000000003D3D - 3DFF4D4D4DFF494949FF474747FF474747FF454545FF474747FF383838FF0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000027B2E5FF1BA7F3FF1CACF4FF1CA8F4FF1BA1F1FF27ACDEFF000000000000 - 00000000000000000000000000000000000000000000000000000000000028B5 - E5FF1BB6F5FF1CB6F5FF1CB6F5FF1CB2F5FF1CABF4FF1DAAF0FF28B0E0FF0000 - 0000000000000000000000000000000000000000000000000000000000001DBA - F5FF1CB6F5FF1CAAF4FF1CACF4FF1CACF4FF1CACF3FF1CA1F0FF1C93E4FF0000 - 0000000000000000000000000000000000000000000000000000000000001B9E - F3FF62ABCEFF8AB7E4FF3EC6EBFF1C9FEDFF1DA4EEFF1EA5EBFF1C9AE9FF0000 - 0000000000000000000000000000000000000000000000000000000000001E6D - ADFFBDD7EFFFA3C9EDFF9DC5E8FF44CEEFFF5BCDEFFFA8DCF1FF207CBDFF0000 - 0000000000000000000000000000000000000000000000000000000000002C61 - 8EFFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2D6299FF0000 - 0000000000000000000000000000000000000000000000000000000000004C72 - 49FF347499FF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF357AA1FF4A6A46FF0000 - 000000000000000000000000000000000000000000000000000079935DFF2785 - 4EFFB3F5C8FF49898FFF4B7FA0FF4B7FA0FF49898FFFA9E8BAFF26844DFF738C - 59FF0000000000000000000000000000000000000000AFE0ACFF37945DFF9FFD - C6FF91EFB8FF78D69FFF6FCD96FF69C68FFF62BF88FF73CF98FF94F0B9FF3088 - 51FF788754FF000000000000000000000000849D6CFF45A26BFF82E0A9FF82E0 - A9FF6FCD96FF69C790FF64C28BFF5EBC85FF57B57EFF50AE77FF6BC891FF67C0 - 8AFF4F9A66FF769264FF0000000000000000287CCEFF78B3EAFF5AB881FF62C0 - 89FF62C089FF5FBD86FF5AB881FF55B37CFF4FAD76FF49A770FF419E67FF4DAB - 74FF7EB8EDFF2974C7FF0000000000000000297DD1FF82BAEEFF409E67FF6ECC - 95FF5BB881FF58B57EFF53B17AFF4FAC75FF54B17AFF51AD76FF67C18AFF3B92 - 5CFF83BCEFFF2A77CAFF0000000000000000000000002579CDFF429D67FF318F - 58FF63C18AFF63C18AFF63C18AFF63C18AFF63C18AFF63C18AFF2D8A53FF2F88 - 53FF2E7ECEFF6DA2D3FF0000000000000000000000000000000000000000668C - 57FF428B55FF338952FF2E8851FF2D8750FF2E854EFF39854EFF4F824EFF0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000565D68FF133F7AFF0D3E7DFF0C3C76FF123969FF4E5663FF000000000000 - 0000000000000000000000000000000000000000000000000000000000005F63 - 69FF284D7DFF0F498AFF0F4988FF0E4581FF0C3E73FF1B3D60FF595E63FF0000 - 0000000000000000000000000000000000000000000000000000000000003752 - 79FF0F498FFF0C3E76FF0C3E73FF0E3E73FF113F70FF0F3661FF143050FF0000 - 0000000000000000000000000000000000000000000000000000000000001037 - 73FF7893B5FF8AB7E4FF6793C3FF11355BFF15395FFF1C3959FF103255FF0000 - 0000000000000000000000000000000000000000000000000000000000001F5C - 99FFBDD7EFFFA3C9EDFF9FC5E8FF74A1CDFF81B0DDFFB7D3EBFF2365A4FF0000 - 000000000000000000000000000000000000000000000000000000000000395F - 89FFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCCEAFFA7CDEEFF2F6299FF0000 - 000000000000000000000000000000000000000000000000000000000000966B - 3EFF537291FF9CCCF8FFAFD4F7FFAFD4F7FFA5CFF6FF51799AFF8C643CFF0000 - 0000000000000000000000000000000000000000000000000000A57645FFB17D - 3FFFD8BEA0FF968271FF5572A4FF435EB5FFA2795FFFD9BEA0FFB48042FFA875 - 46FF0000000000000000000000000000000000000000C29A70FFB27D41FFB480 - 42FFDCBF9EFFBE8A4CFFC4B6BCFF5E67C8FFB3814DFFD3B088FFC29159FFAF7A - 3EFF9F6F41FF000000000000000000000000A5774AFFC3925BFFE2CAB0FFB682 - 44FFB78345FFB88855FF4A5BD0FF5060D2FFBA874CFFB37F41FFBF8A4EFFD0A9 - 7DFFBE8D57FF9C6F46FF0000000000000000287CCEFF78B3EAFFCEA679FFD2AE - 83FFD0A97DFFB78859FF4D4EA6FF77627CFFB6844BFFC4935CFFC18E55FFC79A - 67FF7EB8EDFF2974C7FF0000000000000000297DD1FF82BAEEFFC18F55FFD8B9 - 94FFCEA678FFCCA375FFBA9370FFB27F44FFCA9F6EFFC89C69FFD3AE85FFB884 - 49FF83BCEFFF2A77CAFF0000000000000000000000002579CDFFC08E54FFB581 - 43FFD3AF85FFD3AF85FFD1AB7FFFB98547FFD2AE83FFD3AF85FFB07B3FFFA976 - 3CFF2E7ECEFF6DA2D3FF00000000000000000000000000000000000000009966 - 34FFAF7A41FFAE793DFFAD783CFFAD783CFFAA7539FFAA753CFF936131FF0000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0035353534353535B0343535EB3A3C3EFB414141FF363636F433333347FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00363636F5505050FF6A6A6AFF5C5C5CFF4E4E4EFF484848FF323437E6FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF003A3A3AF3626262FF707070FF6D6D6DFF535353FF565656FF353638FE3333 + 33EE333333ADFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF003D3D3DF7565656FF5E5E5EFF555555FF4F4F4EFF4C4C4CFF4E4E4AFF3737 + 37FF313131D2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00353535383537 + 39CD404040FF606058FF83836DFF767665FF4E4E4CFF424242FF333333FF2E2F + 2FE93C3D3D72FFFFFF00FFFFFF00FFFFFF00FFFFFF0033333324333333FC3636 + 36FD373737FF323232FF333333FF343434FF313131FF2B2B2BFF1E2327FF3B42 + 4775FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00353A + 4024223549F8151515FF1C1E21FF4F6275FF202020FF202020FF293D52FE3856 + 743EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005353 + 53F736404BFF5482B1FF6F9ECDFF86ADD3FF73A1CEFF6296C9FF3F5164FF5454 + 54EDFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00696462205453 + 53FF4E4D4DFF467DB2FF6195C9FF6B9BCCFF6396C9FF4C82B9FF4A4A4BFD5958 + 58FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005E5957034342 + 42FF444343FC3A628AFF4F84B9FF5D91C5FF558ABEFF396086FF363637E84544 + 44FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0044413F084542405D3737 + 37FD3B3A3AFF394857FF2B6299FF2A6097FF2C639AFF394D60FF3A3939FF3636 + 36FA44413F5B44413F08FFFFFF00FFFFFF0045424051464341E84F4B49F34744 + 43FF3B3A39FF363739FF4070A0FF4381BFFF3F70A0FF353C43FF3C3E41FF4745 + 44FF4E4A48E6454240E144413F4EFFFFFF00464341F45D5957FF615C5AFF615C + 5AFF4F4C4BFF383737FF37424DFF4381BFFF374654FF383737FF504D4BFF615C + 5AFF615C5AFF5D5957FF44413FE3FFFFFF0044413FFF615C5AFF615C5AFF615C + 5AFF53504EFF504D4CFF383737FF3D4E5FFF383737FF4F545CFF615C5AFF615C + 5AFF615C5AFF615C5AFF44413FFF615C5A0144413FFF44413FFF44413FFF4441 + 3FFF44413FFF44413FFF44413FFF44413FFF44413FFF44413FFF44413FFF4441 + 3FFF44413FFF44413FFF44413FFFFFFFFF000000003800000038000000380000 + 0038000000380000003800000038000000380000003800000038000000380000 + 0038000000380000003C00000038000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 + 0000DE8D077BDD8A00FFDD8A00FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DD8A0054DD8A + 00FFDD8B00FFE19A20FFDD8A00FF000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DD8A0054DA8900FFE29D + 27FFE9BB64FFE9BB64FFDA8900FF000000000000000000000000000000000000 + 000000000000000000000000000000000000DD8A0054D78600FFE19C25FFE7B8 + 60FFE8B960FFE8B960FFD88600FF000000000000000000000000000000000000 + 000000000000000000000000000000000000D38300FFE09B23FFE6B55AFFE5B5 + 5BFFE5B65BFFE6B55BFFD48300FF000000000000000000000000000000000000 + 0000000000000000000000000000DD8A0054CF8000FFE3B154FFE3B154FFE3B1 + 55FFE3B155FFE3B154FFD08000FF00000000000000000000000000000000DD8A + 002E000000000000000000000000CB7C00FFDE971EFFE0AC4DFFE0AC4DFFE0AD + 4DFFE0AD4DFFDF981EFFCB7C00FF0000000000000000DD8A0054C77800FFC779 + 00FF0000000000000000DD8A0054C77900FFDEA846FFDDA745FFDEA846FFDD96 + 1BFFC67800FFC67800FFDD8A008CDD8A0054C27500FFC17400FFDB9A29FFC275 + 00FFDD8A015500000000C17400FFDC9418FFDAA23DFFDAA23DFFDC9418FFC175 + 00FFDD8A00540000000000000000BC7100FFCB8615FFD79D36FFD79E36FFD997 + 23FFBC7100FFDD8A0054BC7000FFD79E35FFD79D35FFDB9115FFBD7100FFDD8A + 0054000000000000000000000000DA8E0D7AB76D00FFC78821FFD3982EFFD398 + 2DFFD7931EFFB86D00FFD7931EFFD3982DFFDA9012FFB46A00FFDD8A00540000 + 000000000000000000000000000000000000DD8A0155B36900FFC5851CFFD094 + 26FFD09425FFD59019FFD19426FFC5851CFFB36900FFDD8A0054000000000000 + 00000000000000000000000000000000000000000000DD8A0054AF6600FFC281 + 17FFCE8F1FFFCE8F1FFFCE8F1EFFAF6600FFDD8A005400000000000000000000 + 0000000000000000000000000000000000000000000000000000DD8A0054AA62 + 00FFC07F12FFCB8B18FFC07F12FFAA6200FF0000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DD8A + 0054A66000FFBF7C0EFFB86E00FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 + 0000DD8A0054A35D00FFDD8A0054000000000000000000000000000000000000 0000000000000000000000000000 } end diff --git a/Client/UfrmAccountControl.pas b/Client/UfrmAccountControl.pas index b9c5135..3f738a6 100644 --- a/Client/UfrmAccountControl.pas +++ b/Client/UfrmAccountControl.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls, - VirtualTrees, Math, UEnhancedMemoryStream, UEnums; + StdCtrls, ExtCtrls, VirtualTrees, Math, UEnhancedMemoryStream, UEnums; type @@ -55,18 +55,41 @@ type procedure tbAddUserClick(Sender: TObject); procedure tbDeleteUserClick(Sender: TObject); procedure tbRefreshClick(Sender: TObject); + procedure vstAccountsCompareNodes(Sender: TBaseVirtualTree; Node1, + Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); procedure vstAccountsDblClick(Sender: TObject); procedure vstAccountsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure vstAccountsGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; + var HintText: String); + procedure GetAccountImageIndex(AccessLevel: TAccessLevel; var ImageIndex: Integer); procedure vstAccountsGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); procedure vstAccountsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); + procedure vstAccountsHeaderClick(Sender: TVTHeader; Column: TColumnIndex; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); protected procedure OnModifyUserResponse(ABuffer: TEnhancedMemoryStream); procedure OnDeleteUserResponse(ABuffer: TEnhancedMemoryStream); procedure OnListUsersPacket(ABuffer: TEnhancedMemoryStream); function FindNode(AUsername: string): PVirtualNode; + private + procedure OnListModified; + public + lbDlgDelConfCaption: string; + lbDlgDelConf: string; + lbDlgAddNotiCaption: string; + lbDlgAddNoti: string; + lbDlgModNotiCaption: string; + lbDlgModNoti: string; + lbDlgInvlErrCaption: string; + lbDlgInvlErr: string; + lbDlgDelNotiCaption: string; + lbDlgDelNoti: string; + lbDlgDelfErrCaption: string; + lbDlgDelfErr: string; end; var @@ -75,7 +98,8 @@ var implementation uses - UdmNetwork, UPacket, UPacketHandlers, UAdminHandling, UfrmEditAccount; + UdmNetwork, UPacket, UPacketHandlers, UAdminHandling, UfrmEditAccount, UfrmMain, + UGUIPlatformUtils, Language; type PAccountInfo = ^TAccountInfo; @@ -146,6 +170,8 @@ end; procedure TfrmAccountControl.FormCreate(Sender: TObject); begin + LanguageTranslate(Self); + vstAccounts.NodeDataSize := SizeOf(TAccountInfo); AssignAdminPacketHandler($05, TPacketHandler.Create(0, @OnModifyUserResponse)); @@ -198,6 +224,7 @@ end; procedure TfrmAccountControl.FormShow(Sender: TObject); begin + SetWindowParent(Handle, frmMain.Handle); tbRefreshClick(Sender); end; @@ -233,7 +260,7 @@ begin if selected <> nil then begin accountInfo := vstAccounts.GetNodeData(selected); - if MessageDlg('Confirmation', Format('Do you really want to delete "%s"?', + if MessageDlg(lbDlgDelConfCaption, Format(lbDlgDelConf, [accountInfo^.Username]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then dmNetwork.Send(TDeleteUserPacket.Create(accountInfo^.Username)); end; @@ -244,6 +271,19 @@ begin dmNetwork.Send(TRequestUserListPacket.Create); end; +procedure TfrmAccountControl.vstAccountsCompareNodes(Sender: TBaseVirtualTree; + Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); +var + accountInfo1, accountInfo2: PAccountInfo; +begin + accountInfo1 := Sender.GetNodeData(Node1); + accountInfo2 := Sender.GetNodeData(Node2); + case Column of + 1: Result := CompareText(accountInfo1^.Username, accountInfo2^.Username); + 2: Result := Integer(accountInfo1^.AccessLevel) - Integer(accountInfo2^.AccessLevel); + end; +end; + procedure TfrmAccountControl.vstAccountsDblClick(Sender: TObject); begin tbEditUserClick(Sender); @@ -259,21 +299,63 @@ begin if accountInfo^.Regions <> nil then FreeAndNil(accountInfo^.Regions); end; +procedure TfrmAccountControl.vstAccountsGetHint(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; + var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: String); +var + accountInfo: PAccountInfo; +begin + if Column = 3 then + begin + accountInfo := Sender.GetNodeData(Node); + if accountInfo^.Regions.Count > 0 then + HintText := Trim(accountInfo^.Regions.Text); + end; +end; + +procedure TfrmAccountControl.GetAccountImageIndex(AccessLevel: TAccessLevel; var ImageIndex: Integer); +begin + case AccessLevel of + alNone: ImageIndex := 0; + alView: ImageIndex := 1; + alNormal: ImageIndex := 6; + alDeveloper: ImageIndex := 8; + alAdministrator: ImageIndex := 10; + end; +end; + procedure TfrmAccountControl.vstAccountsGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); var accountInfo: PAccountInfo; begin + accountInfo := Sender.GetNodeData(Node); if Column = 0 then begin - accountInfo := Sender.GetNodeData(Node); case accountInfo^.AccessLevel of alNone: ImageIndex := 0; alView: ImageIndex := 1; - alNormal: ImageIndex := 2; - alAdministrator: ImageIndex := 3; + alNormal: + begin + if accountInfo^.Regions.Count > 0 then + ImageIndex := 5 + else + ImageIndex := 6; + end; + alDeveloper: + begin + if accountInfo^.Regions.Count > 0 then + ImageIndex := 7 + else + ImageIndex := 8; + end; + alAdministrator: ImageIndex := 10; end; + end else if Column = 3 then + begin + if accountInfo^.Regions.Count > 0 then + ImageIndex := 12; end; end; @@ -286,12 +368,32 @@ begin accountInfo := Sender.GetNodeData(Node); case Column of 1: CellText := accountInfo^.Username; - 2: CellText := GetAccessLevelString(accountInfo^.AccessLevel); + 2: CellText := GetAccessLevel(accountInfo^.AccessLevel); else CellText := ''; end; end; +procedure TfrmAccountControl.vstAccountsHeaderClick(Sender: TVTHeader; + Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Column in [1, 2] then + begin + if Sender.SortColumn <> Column then + begin + Sender.SortColumn := Column; + Sender.SortDirection := sdAscending; + end else + begin + case Sender.SortDirection of + sdAscending: Sender.SortDirection := sdDescending; + sdDescending: Sender.SortDirection := sdAscending; + end; + end; + Sender.Treeview.SortTree(Sender.SortColumn, Sender.SortDirection); + end; +end; + procedure TfrmAccountControl.OnModifyUserResponse(ABuffer: TEnhancedMemoryStream); var node: PVirtualNode; @@ -313,8 +415,9 @@ begin regions := ABuffer.ReadByte; for i := 0 to regions - 1 do accountInfo^.Regions.Add(ABuffer.ReadStringNull); + OnListModified; - Messagedlg('Success', Format('The user "%s" has been added.', [username]), + Messagedlg(lbDlgAddNotiCaption, Format(lbDlgAddNoti, [username]), mtInformation, [mbOK], 0); end; muModified: @@ -328,13 +431,14 @@ begin regions := ABuffer.ReadByte; for i := 0 to regions - 1 do accountInfo^.Regions.Add(ABuffer.ReadStringNull); + OnListModified; - Messagedlg('Success', Format('The user "%s" has been modified.', [username]), + Messagedlg(lbDlgModNotiCaption, Format(lbDlgModNoti, [username]), mtInformation, [mbOK], 0); end; end; muInvalidUsername: - MessageDlg('Error', Format('The username "%s" is not valid.', [username]), + MessageDlg(lbDlgInvlErrCaption, Format(lbDlgInvlErr, [username]), mtError, [mbOK], 0); end; end; @@ -354,13 +458,14 @@ begin if node <> nil then begin vstAccounts.DeleteNode(node); - Messagedlg('Success', Format('The user "%s" has been deleted.', [username]), + OnListModified; + + Messagedlg(lbDlgDelNotiCaption, Format(lbDlgDelNoti, [username]), mtInformation, [mbOK], 0); end; end; duNotFound: - MessageDlg('Error', Format('The user "%s" could not be deleted. Maybe ' + - 'your list is out of date or you tried to delete yourself.', [username]), + MessageDlg(lbDlgDelfErrCaption, Format(lbDlgDelfErr, [username]), mtError, [mbOK], 0); end; end; @@ -386,6 +491,7 @@ begin accountInfo^.Regions.Add(ABuffer.ReadStringNull); end; vstAccounts.EndUpdate; + OnListModified; end; function TfrmAccountControl.FindNode(AUsername: string): PVirtualNode; @@ -404,6 +510,11 @@ begin end; end; +procedure TfrmAccountControl.OnListModified; +begin + vstAccounts.Header.SortColumn := -1; +end; + initialization {$I UfrmAccountControl.lrs} diff --git a/Client/UfrmEditAccount.lfm b/Client/UfrmEditAccount.lfm index e6e3549..bf210e8 100644 --- a/Client/UfrmEditAccount.lfm +++ b/Client/UfrmEditAccount.lfm @@ -1,39 +1,39 @@ object frmEditAccount: TfrmEditAccount - Left = 290 + Left = 1146 Height = 214 - Top = 171 + Top = 205 Width = 261 - ActiveControl = PageControl1 BorderIcons = [biSystemMenu] BorderStyle = bsDialog - Caption = 'Edit Account' + Caption = 'Редактирование аккаунта' ClientHeight = 214 ClientWidth = 261 Font.Height = -11 OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow - ParentFont = False Position = poOwnerFormCenter - LCLVersion = '0.9.27' + LCLVersion = '0.9.30.2' object PageControl1: TPageControl + Left = 0 Height = 173 + Top = 0 Width = 261 ActivePage = tsGeneral Align = alClient TabIndex = 0 TabOrder = 0 object tsGeneral: TTabSheet - Caption = 'General' - ClientHeight = 148 - ClientWidth = 259 + Caption = 'Общие' + ClientHeight = 147 + ClientWidth = 253 object lblPasswordHint: TLabel Left = 86 Height = 28 Top = 64 Width = 160 AutoSize = False - Caption = 'Leave empty to leave the password unchanged.' + Caption = 'Не заполнять поле, если не хотите изменить пароль.' Enabled = False ParentColor = False WordWrap = True @@ -42,29 +42,29 @@ object frmEditAccount: TfrmEditAccount Left = 6 Height = 14 Top = 12 - Width = 58 - Caption = 'Username:' + Width = 46 + Caption = 'Аккаунт:' ParentColor = False end object lblPassword: TLabel Left = 6 Height = 14 Top = 44 - Width = 54 - Caption = 'Password:' + Width = 44 + Caption = 'Пароль:' ParentColor = False end object lblAccessLevel: TLabel Left = 6 Height = 14 Top = 108 - Width = 63 - Caption = 'Accesslevel:' + Width = 37 + Caption = 'Права:' ParentColor = False end object edUsername: TEdit Left = 86 - Height = 23 + Height = 21 Top = 8 Width = 160 Color = clBtnFace @@ -73,7 +73,7 @@ object frmEditAccount: TfrmEditAccount end object edPassword: TEdit Left = 86 - Height = 23 + Height = 21 Top = 40 Width = 160 EchoMode = emPassword @@ -82,13 +82,15 @@ object frmEditAccount: TfrmEditAccount end object cbAccessLevel: TComboBox Left = 86 - Height = 25 + Height = 21 Top = 104 Width = 160 + ItemHeight = 13 Items.Strings = ( 'None' 'Viewer' 'Normal' + 'Developer' 'Administrator' ) Style = csDropDownList @@ -96,35 +98,34 @@ object frmEditAccount: TfrmEditAccount end end object tsRegions: TTabSheet - Caption = 'Regions' - ClientHeight = 148 - ClientWidth = 259 + Caption = 'Регионы' + ClientHeight = 147 + ClientWidth = 253 object Label1: TLabel Left = 8 Height = 14 Top = 8 - Width = 243 + Width = 237 Align = alTop BorderSpacing.Left = 8 BorderSpacing.Top = 8 BorderSpacing.Right = 8 BorderSpacing.Bottom = 4 - Caption = 'Allowed Regions:' + Caption = 'Разрешенные регионы:' ParentColor = False end object cbRegions: TCheckListBox Left = 8 - Height = 114 + Height = 113 Top = 26 - Width = 243 + Width = 237 Align = alClient BorderSpacing.Left = 8 BorderSpacing.Top = 4 BorderSpacing.Right = 8 BorderSpacing.Bottom = 8 - ItemHeight = 13 + ItemHeight = 0 TabOrder = 0 - TopIndex = -1 end end end @@ -142,18 +143,20 @@ object frmEditAccount: TfrmEditAccount object btnCancel: TButton Left = 170 Height = 25 + Top = 0 Width = 75 Align = alRight BorderSpacing.Left = 4 BorderSpacing.InnerBorder = 4 Cancel = True - Caption = 'Cancel' + Caption = 'Отмена' ModalResult = 2 TabOrder = 0 end object btnOK: TButton Left = 91 Height = 25 + Top = 0 Width = 75 Align = alRight BorderSpacing.Right = 4 diff --git a/Client/UfrmEditAccount.pas b/Client/UfrmEditAccount.pas index 5ff9216..fa9ec68 100644 --- a/Client/UfrmEditAccount.pas +++ b/Client/UfrmEditAccount.pas @@ -33,10 +33,11 @@ uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, UEnums, ComCtrls, ExtCtrls, CheckLst, UfrmRegionControl, VirtualTrees; +function GetAccessLevel(AAccessLevel: TAccessLevel): string; + type { TfrmEditAccount } - TfrmEditAccount = class(TForm) btnCancel: TButton; btnOK: TButton; @@ -56,6 +57,7 @@ type procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); + //constructor Create();// override; public function GetAccessLevel: TAccessLevel; function GetRegions: TStrings; @@ -72,20 +74,52 @@ var implementation +uses Language; + { TfrmEditAccount } +function GetAccessLevel(AAccessLevel: TAccessLevel): string; +var + index: Integer; + form: TfrmEditAccount; +begin + if frmEditAccount = nil + then form := TfrmEditAccount.Create(nil) + else form := frmEditAccount; + case AAccessLevel of + alNone: index := 0; + alView: index := 1; + alNormal: index := 2; + alDeveloper: index := 3; + alAdministrator: index := 4; + end; + Result := form.cbAccessLevel.Items[index]; + if frmEditAccount = nil + then form.Destroy; +end; + +//procedure TfrmEditAccount.Create;// override; +//begin +// LanguageTranslate(Self); +//end; + procedure TfrmEditAccount.FormCreate(Sender: TObject); begin - frmRegionControl.OnRegionModified := @RegionModified; - frmRegionControl.OnRegionDeleted := @RegionDeleted; - frmRegionControl.OnRegionList := @RegionList; + LanguageTranslate(Self); + if frmRegionControl <> nil then begin + frmRegionControl.OnRegionModified := @RegionModified; + frmRegionControl.OnRegionDeleted := @RegionDeleted; + frmRegionControl.OnRegionList := @RegionList; + end; end; procedure TfrmEditAccount.FormDestroy(Sender: TObject); begin - frmRegionControl.OnRegionModified := nil; - frmRegionControl.OnRegionDeleted := nil; - frmRegionControl.OnRegionList := nil; + if frmRegionControl <> nil then begin + frmRegionControl.OnRegionModified := nil; + frmRegionControl.OnRegionDeleted := nil; + frmRegionControl.OnRegionList := nil; + end; end; procedure TfrmEditAccount.FormShow(Sender: TObject); @@ -99,7 +133,8 @@ begin 0: Result := alNone; 1: Result := alView; 2: Result := alNormal; - 3: Result := alAdministrator; + 3: Result := alDeveloper; + 4: Result := alAdministrator; end; end; @@ -123,7 +158,8 @@ begin alNone: cbAccessLevel.ItemIndex := 0; alView: cbAccessLevel.ItemIndex := 1; alNormal: cbAccessLevel.ItemIndex := 2; - alAdministrator: cbAccessLevel.ItemIndex := 3; + alDeveloper: cbAccessLevel.ItemIndex := 3; + alAdministrator: cbAccessLevel.ItemIndex := 4; end; end; diff --git a/Client/UfrmInitialize.lfm b/Client/UfrmInitialize.lfm index 10afafb..e374df8 100644 --- a/Client/UfrmInitialize.lfm +++ b/Client/UfrmInitialize.lfm @@ -1,40 +1,48 @@ object frmInitialize: TfrmInitialize - Left = 290 - Height = 65 - Top = 171 - Width = 241 + Cursor = crHourGlass + Left = 1190 + Height = 360 + Top = 662 + Width = 640 + AlphaBlend = True + AlphaBlendValue = 240 BorderIcons = [] - BorderStyle = bsDialog - Caption = 'Please wait ...' - ClientHeight = 65 - ClientWidth = 241 + BorderStyle = bsNone + Caption = 'Пожалуйста подождите ...' + ClientHeight = 360 + ClientWidth = 640 Font.Height = -11 OnClose = FormClose OnCreate = FormCreate Position = poScreenCenter - LCLVersion = '0.9.25' - object pnlMain: TPanel - Left = 8 - Height = 50 - Top = 8 - Width = 226 - BevelInner = bvRaised - BevelOuter = bvLowered - ClientHeight = 50 - ClientWidth = 226 - ParentFont = True - TabOrder = 0 - object lblStatus: TLabel - Left = 8 - Height = 32 - Top = 8 - Width = 208 - Alignment = taCenter - AutoSize = False - Layout = tlCenter - ParentColor = False - ParentFont = True - WordWrap = True - end + LCLVersion = '0.9.30.2' + object imgSplah: TImage + Cursor = crHourGlass + Left = 0 + Height = 360 + Top = 0 + Width = 640 + Align = alClient + Center = True + end + object lblStatus: TLabel + Cursor = crHourGlass + Left = 0 + Height = 32 + Top = 304 + Width = 640 + Alignment = taCenter + AutoSize = False + Caption = 'Пожалуйста подождите...' + Font.CharSet = RUSSIAN_CHARSET + Font.Color = clWhite + Font.Height = -16 + Font.Name = 'Consolas' + Font.Pitch = fpFixed + Font.Quality = fqDraft + Layout = tlCenter + ParentColor = False + ParentFont = False + WordWrap = True end end diff --git a/Client/UfrmInitialize.pas b/Client/UfrmInitialize.pas index 0fefdd1..e09c8de 100644 --- a/Client/UfrmInitialize.pas +++ b/Client/UfrmInitialize.pas @@ -38,8 +38,8 @@ type { TfrmInitialize } TfrmInitialize = class(TForm) + imgSplah: TImage; lblStatus: TLabel; - pnlMain: TPanel; procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); protected @@ -48,6 +48,15 @@ type public procedure SetModal; procedure UnsetModal; + procedure SetStatusLabel(message: string); + public // Локализация + SplashConnection: string; + SplashAuthorization: string; + SplashInicialization: string; + SplashLoading: string; + SplashUpdates: string; + SplashSuspend: string; + SplashUpdatingMiniMap: string; end; var @@ -55,6 +64,8 @@ var implementation +uses UResourceManager; + { TfrmInitialize } procedure TfrmInitialize.FormClose(Sender: TObject; @@ -66,6 +77,7 @@ end; procedure TfrmInitialize.FormCreate(Sender: TObject); begin FModal := False; + imgSplah.Picture.Bitmap.LoadFromStream(ResourceManager.GetResource('Overlay/Splash.bmp')); end; procedure TfrmInitialize.SetModal; @@ -89,6 +101,15 @@ begin FModal := False; end; +procedure TfrmInitialize.SetStatusLabel(message: string); +begin + frmInitialize.lblStatus.Caption := message; + frmInitialize.Update; + frmInitialize.Repaint; + frmInitialize.lblStatus.Repaint; + Application.ProcessMessages; +end; + initialization {$I UfrmInitialize.lrs} diff --git a/Client/UfrmLargeScaleCommand.lfm b/Client/UfrmLargeScaleCommand.lfm index 58d64aa..aab3bc4 100644 --- a/Client/UfrmLargeScaleCommand.lfm +++ b/Client/UfrmLargeScaleCommand.lfm @@ -1,10 +1,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand - Left = 290 + Left = 1190 Height = 390 - Top = 171 + Top = 54 Width = 620 - ActiveControl = vstActions - Caption = 'Large Scale Commands' + Caption = 'Глобальные Операции' ClientHeight = 390 ClientWidth = 620 Constraints.MinHeight = 390 @@ -15,7 +14,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand OnShow = FormShow Position = poOwnerFormCenter ShowInTaskBar = stAlways - LCLVersion = '0.9.29' + LCLVersion = '0.9.30.2' object nbActions: TNotebook AnchorSideLeft.Control = vstActions AnchorSideLeft.Side = asrBottom @@ -28,21 +27,21 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand Top = 0 Width = 468 Anchors = [akTop, akLeft, akRight, akBottom] - PageIndex = 1 + PageIndex = 5 ShowTabs = False TabOrder = 0 object pgArea: TPage - Caption = 'pgArea' - ClientWidth = 462 - ClientHeight = 316 + Caption = 'Выбрать Область' + ClientWidth = 460 + ClientHeight = 341 object sbArea: TScrollBox Left = 0 - Height = 316 + Height = 341 Top = 0 - Width = 462 + Width = 460 Align = alClient - ClientHeight = 314 - ClientWidth = 460 + ClientHeight = 337 + ClientWidth = 456 TabOrder = 0 object pbArea: TPaintBox Left = 0 @@ -56,9 +55,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand end end object pgCopyMove: TPage - Caption = 'Copy/Move' - ClientWidth = 462 - ClientHeight = 343 + Caption = 'Копировать/Двигать' + ClientWidth = 460 + ClientHeight = 341 object rgCMAction: TRadioGroup AnchorSideLeft.Control = pgCopyMove AnchorSideTop.Control = pgCopyMove @@ -68,7 +67,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand Width = 184 AutoFill = True BorderSpacing.Around = 8 - Caption = 'Action' + Caption = 'Действие' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize @@ -77,13 +76,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 26 - ClientWidth = 182 + ClientHeight = 22 + ClientWidth = 180 Columns = 2 ItemIndex = 0 Items.Strings = ( - 'Copy' - 'Move' + 'Копировать' + 'Двигать' ) TabOrder = 0 end @@ -95,9 +94,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand Height = 81 Top = 56 Width = 121 - Caption = 'Offset' - ClientHeight = 67 - ClientWidth = 119 + Caption = 'Смещение' + ClientHeight = 63 + ClientWidth = 117 TabOrder = 1 object Label9: TLabel AnchorSideLeft.Control = gbCMOffset @@ -105,8 +104,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 8 Height = 14 - Top = 10 - Width = 11 + Top = 11 + Width = 10 BorderSpacing.Around = 8 Caption = 'X:' ParentColor = False @@ -117,8 +116,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 8 Height = 14 - Top = 37 - Width = 10 + Top = 40 + Width = 9 Caption = 'Y:' ParentColor = False end @@ -127,10 +126,10 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbCMOffset AnchorSideRight.Control = btnGrabOffset - Left = 27 - Height = 19 + Left = 26 + Height = 21 Top = 8 - Width = 62 + Width = 61 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 BorderSpacing.Bottom = 4 @@ -143,10 +142,10 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrBottom AnchorSideRight.Control = seCMOffsetX AnchorSideRight.Side = asrBottom - Left = 27 - Height = 19 - Top = 35 - Width = 62 + Left = 26 + Height = 21 + Top = 37 + Width = 61 Anchors = [akTop, akLeft, akRight] BorderSpacing.Bottom = 8 TabOrder = 1 @@ -156,14 +155,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbCMOffset AnchorSideRight.Side = asrBottom - Left = 93 + Left = 91 Height = 22 - Hint = 'Grab coordinates and calculate the offset in relation to the selected area.' - Top = 22 + Hint = 'Выбрать тайл в главном окне и взять смещение для выбранной области из его координат.' + Top = 20 Width = 22 Anchors = [akTop, akRight] BorderSpacing.Around = 4 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -212,28 +210,30 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Control = gbCMOffset AnchorSideTop.Side = asrBottom Left = 8 - Height = 22 + Height = 19 Top = 145 - Width = 170 + Width = 248 BorderSpacing.Top = 8 - Caption = 'Erase target area (at offset)' + Caption = 'Стереть выбраную область (по смещению)' TabOrder = 2 end end object pgModifyAltitude: TPage - Caption = 'Modify altitude' - ClientWidth = 462 - ClientHeight = 316 + Caption = 'Изменить высоту' + ClientWidth = 460 + ClientHeight = 341 object Label2: TLabel - AnchorSideLeft.Control = rbSetTerrainAltitude - AnchorSideTop.Control = rbSetTerrainAltitude - AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = seTerrainAltitude1 Left = 30 - Height = 46 - Top = 30 - Width = 142 + Height = 40 + Top = 27 + Width = 185 + Align = alCustom + Anchors = [akTop, akLeft, akRight] + AutoSize = False BorderSpacing.Left = 22 - Caption = 'The statics will be elevated according to the terrain change.' + BorderSpacing.Right = 13 + Caption = 'Высота статики будет изменена согласно изменению высоты рельефа.' Enabled = False ParentColor = False WordWrap = True @@ -241,10 +241,10 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand object Label3: TLabel AnchorSideTop.Control = rbSetTerrainAltitude Left = 228 - Height = 30 + Height = 14 Top = 8 - Width = 125 - Caption = 'Set the altitude to a value from this range:' + Width = 207 + Caption = 'Установить высоту из этого диапазона' ParentColor = False WordWrap = True end @@ -255,46 +255,45 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 286 Height = 14 - Top = 48 - Width = 12 + Top = 33 + Width = 14 BorderSpacing.Left = 8 - Caption = 'to' + Caption = 'до' ParentColor = False end object rbSetTerrainAltitude: TRadioButton AnchorSideLeft.Control = pgModifyAltitude AnchorSideTop.Control = pgModifyAltitude Left = 8 - Height = 22 + Height = 19 Top = 8 - Width = 123 + Width = 168 BorderSpacing.Left = 8 BorderSpacing.Top = 8 - Caption = 'Set terrain altitude' + Caption = 'Установить высоту рельефа' Checked = True - State = cbChecked TabOrder = 0 + TabStop = True end object rbRelativeAltitudeChange: TRadioButton AnchorSideLeft.Control = rbSetTerrainAltitude AnchorSideTop.Control = Label2 AnchorSideTop.Side = asrBottom Left = 8 - Height = 22 - Top = 84 - Width = 153 + Height = 19 + Top = 75 + Width = 207 BorderSpacing.Top = 8 - Caption = 'Relative altitude change' + Caption = 'Изменение относительной высоты' TabOrder = 1 - TabStop = False end object seTerrainAltitude1: TSpinEdit AnchorSideLeft.Control = Label3 AnchorSideTop.Control = Label3 AnchorSideTop.Side = asrBottom Left = 228 - Height = 19 - Top = 46 + Height = 21 + Top = 30 Width = 50 BorderSpacing.Top = 8 MaxValue = 127 @@ -305,9 +304,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Control = Label4 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = seTerrainAltitude1 - Left = 306 - Height = 19 - Top = 46 + Left = 308 + Height = 21 + Top = 30 Width = 50 BorderSpacing.Left = 8 MaxValue = 127 @@ -319,8 +318,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Control = rbRelativeAltitudeChange AnchorSideTop.Side = asrBottom Left = 30 - Height = 19 - Top = 106 + Height = 21 + Top = 94 Width = 50 MaxValue = 127 MinValue = -128 @@ -328,36 +327,38 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand end end object pgDrawTerrain: TPage - Caption = 'Draw Terrain' - ClientWidth = 462 - ClientHeight = 316 + Caption = 'Рисовать рельеф' + ClientWidth = 460 + ClientHeight = 341 object gbDrawTerrainTiles: TGroupBox AnchorSideLeft.Control = pgDrawTerrain AnchorSideTop.Control = pgDrawTerrain AnchorSideBottom.Control = pgDrawTerrain AnchorSideBottom.Side = asrBottom Left = 8 - Height = 300 + Height = 325 Top = 8 Width = 225 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Around = 8 - Caption = 'Tiles' - ClientHeight = 286 - ClientWidth = 223 + Caption = 'Тайлы' + ClientHeight = 307 + ClientWidth = 221 TabOrder = 0 object lblDrawTerrainTilesDesc: TLabel AnchorSideLeft.Control = gbDrawTerrainTiles AnchorSideTop.Control = gbDrawTerrainTiles AnchorSideRight.Control = gbDrawTerrainTiles + AnchorSideRight.Side = asrBottom Left = 4 - Height = 62 + Height = 53 Top = 0 - Width = 215 + Width = 213 + Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 - Caption = 'Drag terrain tiles from the main window and drop them on the list. For each cell in the target area, one of these (random) will be used.' + Caption = 'Перетащите в список тайлы рельефа из главного окна. Для каждой клетки указанной области будет случайно перерисован один из этих тайлов.' ParentColor = False WordWrap = True end @@ -370,13 +371,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Control = btnDeleteTerrain Cursor = 63 Left = 4 - Height = 200 - Top = 66 + Height = 220 + Top = 57 Width = 215 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 + Color = 16052980 DefaultNodeHeight = 44 DragMode = dmAutomatic DragType = dtVCL @@ -385,25 +387,97 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 2 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 0 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] - TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] OnDragOver = vdtTerrainTilesDragOver OnDragDrop = vdtTerrainTilesDragDrop OnDrawNode = vdtTerrainTilesDrawNode @@ -415,11 +489,10 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Side = asrBottom Left = 30 Height = 22 - Hint = 'Clear' - Top = 270 + Hint = 'Очистить список' + Top = 281 Width = 22 Anchors = [akLeft, akBottom] - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -467,12 +540,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Side = asrBottom Left = 4 Height = 22 - Hint = 'Delete' - Top = 270 + Hint = 'Удалить выбраное' + Top = 281 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -517,23 +589,23 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand end end object pgDeleteStatics: TPage - Caption = 'Delete statics' - ClientWidth = 462 - ClientHeight = 316 + Caption = 'Удалить статику' + ClientWidth = 460 + ClientHeight = 341 object gbDeleteStaticsTiles: TGroupBox AnchorSideLeft.Control = pgDeleteStatics AnchorSideTop.Control = pgDeleteStatics AnchorSideBottom.Control = pgDeleteStatics AnchorSideBottom.Side = asrBottom Left = 8 - Height = 300 + Height = 325 Top = 8 Width = 225 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Around = 8 - Caption = 'Tiles' - ClientHeight = 286 - ClientWidth = 223 + Caption = 'Тайлы' + ClientHeight = 307 + ClientWidth = 221 TabOrder = 0 object lblDeleteStaticsTilesDesc: TLabel AnchorSideLeft.Control = gbDeleteStaticsTiles @@ -541,14 +613,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = gbDeleteStaticsTiles AnchorSideRight.Side = asrBottom Left = 4 - Height = 78 + Height = 53 Top = 0 Width = 213 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 - Caption = 'Drag statics tiles from the main window and drop them on the list. Only statics matching these tiles will be deleted. If the list is empty, every static will be deleted.' + Caption = 'Перетащите в список тайлы статики из главного окна. Только выбранная статика будет удалена, Если список пуст, будет удалена вся статика.' ParentColor = False WordWrap = True end @@ -562,13 +634,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Control = btnDeleteDStaticsTiles Cursor = 63 Left = 4 - Height = 184 - Top = 82 + Height = 220 + Top = 57 Width = 213 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 + Color = 16052980 DefaultNodeHeight = 44 DragMode = dmAutomatic DragType = dtVCL @@ -577,25 +650,97 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 2 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 0 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] - TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] OnDragOver = vdtTerrainTilesDragOver OnDragDrop = vdtTerrainTilesDragDrop OnDrawNode = vdtTerrainTilesDrawNode @@ -607,11 +752,10 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Side = asrBottom Left = 30 Height = 22 - Hint = 'Clear' - Top = 270 + Hint = 'Очистить список' + Top = 281 Width = 22 Anchors = [akLeft, akBottom] - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -659,12 +803,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Side = asrBottom Left = 4 Height = 22 - Hint = 'Delete' - Top = 270 + Hint = 'Удалить выбранное' + Top = 281 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -712,13 +855,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbDeleteStaticsTiles Left = 241 - Height = 79 + Height = 95 Top = 8 - Width = 176 + Width = 142 AutoSize = True - Caption = 'Z Boundaries' - ClientHeight = 65 - ClientWidth = 174 + Caption = 'Границы по высоте' + ClientHeight = 77 + ClientWidth = 138 TabOrder = 1 object Label7: TLabel AnchorSideLeft.Control = GroupBox1 @@ -726,14 +869,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = GroupBox1 AnchorSideRight.Side = asrBottom Left = 4 - Height = 30 + Height = 40 Top = 0 - Width = 164 + Width = 130 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 - Caption = 'Only statics within this Z range will be deleted.' + Caption = 'Будет удалена только статика на высоте в указанном диапазоне.' ParentColor = False WordWrap = True end @@ -744,17 +887,17 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 62 Height = 14 - Top = 40 - Width = 12 - Caption = 'to' + Top = 51 + Width = 14 + Caption = 'до' ParentColor = False end object seDeleteStaticsZ1: TSpinEdit AnchorSideTop.Control = Label7 AnchorSideTop.Side = asrBottom Left = 4 - Height = 19 - Top = 38 + Height = 21 + Top = 48 Width = 50 BorderSpacing.Around = 8 MaxValue = 127 @@ -766,9 +909,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Control = Label8 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = seDeleteStaticsZ1 - Left = 82 - Height = 19 - Top = 38 + Left = 84 + Height = 21 + Top = 48 Width = 50 BorderSpacing.Left = 8 MaxValue = 127 @@ -779,23 +922,23 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand end end object pgInsertStatics: TPage - Caption = 'Insert statics' - ClientWidth = 462 - ClientHeight = 316 + Caption = 'Добавить статику' + ClientWidth = 460 + ClientHeight = 341 object gbInserStaticsTiles: TGroupBox AnchorSideLeft.Control = pgInsertStatics AnchorSideTop.Control = pgInsertStatics AnchorSideBottom.Control = pgInsertStatics AnchorSideBottom.Side = asrBottom Left = 8 - Height = 300 + Height = 325 Top = 8 Width = 225 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Around = 8 - Caption = 'Tiles' - ClientHeight = 286 - ClientWidth = 223 + Caption = 'Тайлы' + ClientHeight = 307 + ClientWidth = 221 TabOrder = 0 object lblInsertStaticsTiles: TLabel AnchorSideLeft.Control = gbInserStaticsTiles @@ -803,14 +946,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = gbInserStaticsTiles AnchorSideRight.Side = asrBottom Left = 4 - Height = 62 + Height = 53 Top = 0 Width = 213 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 - Caption = 'Drag statics tiles from the main window and drop them on the list. For each cell in the target area, one of these (random) will be used.' + Caption = 'Перетащите в список тайлы статики из главного окна. На каждую клетку указанной области будет случайно нарисован один из этих тайлов.' ParentColor = False WordWrap = True end @@ -823,13 +966,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnDeleteIStaticsTiles Left = 4 - Height = 200 - Top = 66 + Height = 220 + Top = 57 Width = 213 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 + Color = 16052980 DefaultNodeHeight = 44 DragMode = dmAutomatic DragType = dtVCL @@ -838,25 +982,97 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 2 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 0 + TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] - TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] OnDragOver = vdtTerrainTilesDragOver OnDragDrop = vdtTerrainTilesDragDrop OnDrawNode = vdtTerrainTilesDrawNode @@ -867,10 +1083,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Control = btnDeleteIStaticsTiles Left = 30 Height = 22 - Hint = 'Clear' - Top = 270 + Hint = 'Очистить список' + Top = 281 Width = 22 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -918,12 +1133,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Side = asrBottom Left = 4 Height = 22 - Hint = 'Delete' - Top = 270 + Hint = 'Удалить выбранное' + Top = 281 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -971,13 +1185,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbInserStaticsTiles Left = 241 - Height = 75 + Height = 78 Top = 8 - Width = 185 + Width = 147 + Anchors = [akTop, akLeft, akRight] AutoSize = True - Caption = 'Probability' - ClientHeight = 61 - ClientWidth = 183 + Caption = 'Вероятность' + ClientHeight = 60 + ClientWidth = 143 TabOrder = 1 object Label5: TLabel AnchorSideLeft.Control = gbStaticsProbability @@ -985,14 +1200,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = gbStaticsProbability AnchorSideRight.Side = asrBottom Left = 4 - Height = 30 + Height = 27 Top = 0 - Width = 173 + Width = 135 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 - Caption = 'A tile will only be placed with this probability:' + Caption = 'Тайл будет нирисован с вероятностью:' ParentColor = False WordWrap = True end @@ -1003,8 +1218,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 58 Height = 14 - Top = 36 - Width = 12 + Top = 34 + Width = 10 BorderSpacing.Left = 4 Caption = '%' ParentColor = False @@ -1014,8 +1229,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Control = Label5 AnchorSideTop.Side = asrBottom Left = 4 - Height = 19 - Top = 34 + Height = 21 + Top = 31 Width = 50 BorderSpacing.Bottom = 8 TabOrder = 0 @@ -1030,15 +1245,15 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = gbStaticsProbability AnchorSideRight.Side = asrBottom Left = 241 - Height = 111 - Top = 87 - Width = 185 + Height = 108 + Top = 90 + Width = 147 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 - Caption = 'Z Placement' - ClientHeight = 97 - ClientWidth = 183 + Caption = 'Расположение по оси Z' + ClientHeight = 90 + ClientWidth = 143 TabOrder = 2 object rbPlaceStaticsOnTerrain: TRadioButton AnchorSideLeft.Control = gbStaticsPlacement @@ -1046,17 +1261,17 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = gbStaticsPlacement AnchorSideRight.Side = asrBottom Left = 4 - Height = 22 + Height = 19 Top = 4 - Width = 173 + Width = 135 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 4 BorderSpacing.Right = 4 - Caption = 'Place tiles on terrain' + Caption = 'Размещать на рельефе' Checked = True - State = cbChecked TabOrder = 0 + TabStop = True end object rbPlaceStaticsOnTop: TRadioButton AnchorSideLeft.Control = rbPlaceStaticsOnTerrain @@ -1065,13 +1280,12 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = rbPlaceStaticsOnTerrain AnchorSideRight.Side = asrBottom Left = 4 - Height = 22 - Top = 26 - Width = 173 + Height = 19 + Top = 23 + Width = 135 Anchors = [akTop, akLeft, akRight] - Caption = 'Place tiles on top' + Caption = 'Размещать на верху' TabOrder = 1 - TabStop = False end object rbPlaceStaticsOnZ: TRadioButton AnchorSideLeft.Control = rbPlaceStaticsOnTop @@ -1080,21 +1294,20 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = rbPlaceStaticsOnTop AnchorSideRight.Side = asrBottom Left = 4 - Height = 22 - Top = 48 - Width = 173 + Height = 19 + Top = 42 + Width = 135 Anchors = [akTop, akLeft, akRight] - Caption = 'Place tiles on:' + Caption = 'Размещать на высоте:' TabOrder = 2 - TabStop = False end object seInsertStaticsZ: TSpinEdit AnchorSideLeft.Control = rbPlaceStaticsOnZ AnchorSideTop.Control = rbPlaceStaticsOnZ AnchorSideTop.Side = asrBottom Left = 26 - Height = 19 - Top = 70 + Height = 21 + Top = 61 Width = 50 BorderSpacing.Left = 22 BorderSpacing.Bottom = 8 @@ -1108,14 +1321,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 548 + Left = 536 Height = 25 Top = 357 - Width = 64 + Width = 76 Anchors = [akRight, akBottom] BorderSpacing.Around = 8 BorderSpacing.InnerBorder = 4 - Caption = 'Close' + Caption = 'Закрыть' OnClick = btnCloseClick TabOrder = 1 end @@ -1123,13 +1336,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = btnClose AnchorSideBottom.Control = btnClose AnchorSideBottom.Side = asrBottom - Left = 476 + Left = 452 Height = 25 Top = 357 - Width = 64 + Width = 76 Anchors = [akRight, akBottom] BorderSpacing.InnerBorder = 4 - Caption = 'Execute' + Caption = 'Выполнить' OnClick = btnExecuteClick TabOrder = 2 end @@ -1141,11 +1354,12 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnDeleteArea Left = 4 - Height = 122 + Height = 118 Top = 154 Width = 144 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Bottom = 4 + Color = 16052980 DefaultText = 'Node' Header.AutoSizeIndex = 0 Header.Columns = <> @@ -1172,7 +1386,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand BorderSpacing.Left = 4 BorderSpacing.Top = 4 BorderSpacing.Right = 4 - Caption = 'Area:' + Caption = 'Область:' ParentColor = False end object vstActions: TVirtualStringTree @@ -1182,12 +1396,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand Height = 136 Top = 0 Width = 152 + Color = 16052980 DefaultText = 'Node' Header.AutoSizeIndex = 0 Header.Columns = < item Position = 0 - Text = 'Actions' + Text = 'Действия' Width = 148 end> Header.DefaultHeight = 17 @@ -1208,46 +1423,45 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideRight.Control = btnDeleteArea Left = 39 Height = 22 - Hint = 'Add area' - Top = 280 + Hint = 'Добавить область' + Top = 276 Width = 22 Anchors = [akTop, akRight] - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003A8C44FF368940FF32873CFF2F84 - 37FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000459653FF419950FF7DC28FFF96D0A6FF96CFA6FF78BE - 89FF368D42FF2C8134FF00000000000000000000000000000000000000000000 - 0000000000004D9C5DFF64B478FFA8DBB5FF87CC98FF66BC7DFF64BA7CFF86CB - 98FFA5D9B4FF58AA6BFF2C8134FF000000000000000000000000000000000000 - 000056A366FF6AB97DFFA8DBB2FF60BC77FF5CBA73FF59B870FF59B56FFF58B5 - 6FFF5BB774FFA5D9B3FF5AAA6CFF2C8234FF0000000000000000000000000000 - 000053AB68FFAADDB4FF64C179FF5FBE71FF60BC77FFFFFFFFFFFFFFFFFF59B8 - 70FF58B56EFF5CB774FFA6DAB4FF388F43FF00000000000000000000000061AC - 75FF8ACC98FF89D396FF6BC67AFF63C170FF55AB65FFFFFFFFFFFFFFFFFF59B8 - 70FF59B870FF5BB972FF85CC97FF7BBE8DFF308539FF000000000000000065AF - 7AFFA9DDB3FF7DCF8AFF75CC81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF67BE7DFF9CD4ABFF34883DFF000000000000000069B2 - 7EFFB6E2BEFF8BD597FF7AC986FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF69C17EFF9DD4AAFF388B42FF00000000000000006DB5 - 83FFACDDB6FFA6DFAFFF81CB8CFF7CC986FF6EBD79FFFFFFFFFFFFFFFFFF5BAC - 6AFF60BC77FF5CBA73FF8BD199FF80C592FF3C8E47FF00000000000000000000 - 000085C797FFD2EED7FF95D9A0FF8AD394FF7FC889FFFFFFFFFFFFFFFFFF79CD - 85FF6BC37CFF6FC77EFFACDFB5FF459E57FF0000000000000000000000000000 - 000070B887FFAADAB7FFD8F1DCFF92D89DFF88CD93FF84CC8EFF8BD496FF8AD4 - 95FF83D28EFFAFE0B7FF6BB97DFF489856FF0000000000000000000000000000 - 00000000000070B887FFAFDCBBFFDCF2E0FFB6E4BDFF9BDBA5FF96D9A0FFA5DF - AFFFC0E8C5FF79C28AFF509E5FFF000000000000000000000000000000000000 - 0000000000000000000071B887FF94CEA4FFC3E6CBFFCFEBD4FFC9E9CEFFAFDD - B8FF6DB97FFF58A569FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000006EB684FF6AB380FF67B17CFF63AE - 77FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnAddAreaClick @@ -1261,48 +1475,47 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideBottom.Control = seX1 Left = 65 Height = 22 - Hint = 'Delete area' - Top = 280 + Hint = 'Удалить область' + Top = 276 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 4 BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003853BEFF3551BDFF304BBCFF2E4E - B8FF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FF00000000000000000000000000000000000000000000 - 0000000000004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FF000000000000000000000000000000000000 - 00005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FF0000000000000000000000000000 - 00004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF0000000000000000000000005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF00000000000000005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF00000000000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF0000000000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF00000000000000000000 - 00007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF0000000000000000000000000000 - 00006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF0000000000000000000000000000 - 0000000000006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFF000000000000000000000000000000000000 - 000000000000000000006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF00000000000000000000000000000000000000000000 - 000000000000000000000000000000000000686ADDFF6364DCFF6164DAFF5D63 - D9FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnDeleteAreaClick @@ -1315,45 +1528,44 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Control = btnDeleteArea Left = 91 Height = 22 - Hint = 'Delete all areas' - Top = 280 + Hint = 'Удалить все области' + Top = 276 Width = 22 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000 - EFFF0000EDFF0000EDFF00000000000000000000000000000000000000000000 - 0000000000000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443 - F7FF3242F7FF141BF1FF0000EDFF000000000000000000000000000000000000 - 00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909 - F5FF161BF5FF3343F7FF141BF1FF0000EDFF0000000000000000000000000000 - F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333 - F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF00000000000000000000 - FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA - FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF00000000000000000000 - FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1 - FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00000000000000000000 - FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF00000000000000000000 - FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF00000000000000000000 - FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2 - FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FF00000000000000000000 - FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC - FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000000000000000 - FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B - FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000 - 00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D - FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000 - 0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663 - FEFF5461FEFF2227FCFF0000FBFF000000000000000000000000000000000000 - 000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000 - FDFF0000FDFF0000FDFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnClearAreaClick @@ -1366,8 +1578,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 4 Height = 14 - Top = 312 - Width = 8 + Top = 309 + Width = 7 Caption = 'X' Enabled = False ParentColor = False @@ -1375,12 +1587,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand object seX1: TSpinEdit AnchorSideLeft.Control = seY1 AnchorSideBottom.Control = seY1 - Left = 20 - Height = 19 - Top = 310 + Left = 18 + Height = 21 + Top = 306 Width = 50 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 8 + Color = 16052980 Enabled = False OnChange = seX1Change TabOrder = 5 @@ -1390,11 +1603,12 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Control = seX1 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = seX1 - Left = 78 - Height = 19 - Top = 310 + Left = 76 + Height = 21 + Top = 306 Width = 50 BorderSpacing.Left = 8 + Color = 16052980 Enabled = False OnChange = seX1Change TabOrder = 6 @@ -1406,8 +1620,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideTop.Side = asrCenter Left = 4 Height = 14 - Top = 339 - Width = 8 + Top = 338 + Width = 6 BorderSpacing.Left = 4 Caption = 'Y' Enabled = False @@ -1417,13 +1631,14 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Control = lblY AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = btnGrab1 - Left = 20 - Height = 19 - Top = 337 + Left = 18 + Height = 21 + Top = 335 Width = 50 Anchors = [akLeft, akBottom] BorderSpacing.Left = 8 BorderSpacing.Bottom = 4 + Color = 16052980 Enabled = False OnChange = seX1Change TabOrder = 7 @@ -1432,10 +1647,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand object seY2: TSpinEdit AnchorSideLeft.Control = seX2 AnchorSideTop.Control = seY1 - Left = 78 - Height = 19 - Top = 337 + Left = 76 + Height = 21 + Top = 335 Width = 50 + Color = 16052980 Enabled = False OnChange = seX1Change TabOrder = 8 @@ -1446,14 +1662,13 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 34 + Left = 32 Height = 22 - Hint = 'Grab coordinates from the main window.' + Hint = 'Выбрать тайл в главном окне и взять его координаты.' Top = 360 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 8 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -1501,13 +1716,12 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = btnGrab1 AnchorSideBottom.Side = asrBottom - Left = 92 + Left = 90 Height = 22 - Hint = 'Grab coordinates from the main window.' + Hint = 'Выбрать тайл в главном окне и взять его координаты.' Top = 360 Width = 22 Anchors = [akLeft, akBottom] - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -1551,22 +1765,23 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand ParentShowHint = False end object pmSelectOffset: TPopupMenu - left = 421 - top = 82 + left = 536 + top = 264 object mnuSelectTopLeft: TMenuItem - Caption = 'Select Top-Left Corner' + Caption = 'Выбрать Верхний Левый Угол' OnClick = mnuSelectTopLeftClick end object mnuSelectTopRight: TMenuItem - Caption = 'Select Top-Right Corner' + Caption = 'Выбрать Верхний Правый Угол' OnClick = mnuSelectTopLeftClick end object mnuSelectBottomLeft: TMenuItem - Caption = 'Select Bottom-Left Corner' + Caption = 'Выбрать Нижний Левый Угол' + Checked = True OnClick = mnuSelectTopLeftClick end object mnuSelectBottomRight: TMenuItem - Caption = 'Select Bottom-Right Corner' + Caption = 'Выбрать Нижний Правый Угол' OnClick = mnuSelectTopLeftClick end end diff --git a/Client/UfrmLargeScaleCommand.pas b/Client/UfrmLargeScaleCommand.pas index 58c8927..6805bc3 100644 --- a/Client/UfrmLargeScaleCommand.pas +++ b/Client/UfrmLargeScaleCommand.pas @@ -31,8 +31,8 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Math, - VirtualTrees, ExtCtrls, ImagingComponents, StdCtrls, Buttons, Spin, LCLIntf, - Menus, UPlatformTypes, UEnhancedMemoryStream, UWorldItem; + VirtualTrees, VirtualList, ExtCtrls, ImagingComponents, StdCtrls, Buttons, Spin, + LCLIntf, Menus, UPlatformTypes, UEnhancedMemoryStream, UWorldItem; type @@ -113,8 +113,11 @@ type btnGrab2: TSpeedButton; btnGrabOffset: TSpeedButton; vdtTerrainTiles: TVirtualDrawTree; + vdlTerrainTiles: TVirtualList; vdtInsertStaticsTiles: TVirtualDrawTree; + vdlInsertStaticsTiles: TVirtualList; vdtDeleteStaticsTiles: TVirtualDrawTree; + vdlDeleteStaticsTiles: TVirtualList; vstActions: TVirtualStringTree; vstArea: TVirtualStringTree; procedure btnGrab1Click(Sender: TObject); @@ -159,6 +162,7 @@ type procedure vstAreaChange(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vstAreaGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); + procedure RenameNode(AActionID: Integer; ACaption: String); protected FLastX: Integer; FLastY: Integer; @@ -176,7 +180,7 @@ type function FindNode(AActionID: Integer): PVirtualNode; procedure TileSelection(AWorldItem: TWorldItem); procedure OffsetSelection(AWorldItem: TWorldItem); - procedure SerializeTiles(ATileList: TVirtualDrawTree; + procedure SerializeTiles(ATileList: TVirtualList; AStream: TEnhancedMemoryStream); public { public declarations } @@ -189,7 +193,7 @@ implementation uses UGameResources, UfrmRadar, UfrmMain, UdmNetwork, UPacket, UPackets, - UGUIPlatformUtils; + UGUIPlatformUtils, Language; type PNodeInfo = ^TNodeInfo; @@ -200,19 +204,29 @@ type PTileInfo = ^TTileInfo; TTileInfo = record ID: Word; + ptr: Pointer; end; { TfrmLargeScaleCommand } procedure TfrmLargeScaleCommand.FormCreate(Sender: TObject); begin + vdlTerrainTiles := TVirtualList.Create(vdtTerrainTiles); + vdtTerrainTiles := vdlTerrainTiles; + vdlInsertStaticsTiles := TVirtualList.Create(vdtInsertStaticsTiles); + vdtInsertStaticsTiles := vdlInsertStaticsTiles; + vdlDeleteStaticsTiles := TVirtualList.Create(vdtDeleteStaticsTiles); + vdtDeleteStaticsTiles := vdlDeleteStaticsTiles; + + LanguageTranslate(Self); + vstActions.NodeDataSize := SizeOf(TNodeInfo); - FAreaNode := AddNode(-1, 'Target Area'); - FCopyMoveNode := AddNode( 0, 'Copy/Move'); - FAltitudeNode := AddNode( 1, 'Modify altitude'); - FDrawTerrainNode := AddNode( 2, 'Draw terrain'); - FDelStaticsNode := AddNode( 3, 'Delete statics'); - FAddStaticsNode := AddNode( 4, 'Insert statics'); + FAreaNode := AddNode(-1, pgArea.Caption); + FCopyMoveNode := AddNode( 0, pgCopyMove.Caption); + FAltitudeNode := AddNode( 1, pgModifyAltitude.Caption); + FDrawTerrainNode := AddNode( 2, pgDrawTerrain.Caption); + FDelStaticsNode := AddNode( 3, pgDeleteStatics.Caption); + FAddStaticsNode := AddNode( 4, pgInsertStatics.Caption); vstActions.Selected[vstActions.GetFirst] := True; vstArea.NodeDataSize := SizeOf(TRect); @@ -224,9 +238,9 @@ begin seY1.MaxValue := ResMan.Landscape.CellHeight; seY2.MaxValue := ResMan.Landscape.CellHeight; - vdtTerrainTiles.NodeDataSize := SizeOf(TTileInfo); - vdtInsertStaticsTiles.NodeDataSize := SizeOf(TTileInfo); - vdtDeleteStaticsTiles.NodeDataSize := SizeOf(TTileInfo); + vdlTerrainTiles.NodeDataSize := SizeOf(TTileInfo); + vdlInsertStaticsTiles.NodeDataSize := SizeOf(TTileInfo); + vdlDeleteStaticsTiles.NodeDataSize := SizeOf(TTileInfo); seCMOffsetX.MinValue := -ResMan.Landscape.CellWidth; seCMOffsetX.MaxValue := ResMan.Landscape.CellWidth; @@ -349,17 +363,17 @@ end; procedure TfrmLargeScaleCommand.btnClearDStaticsTilesClick(Sender: TObject); begin - vdtDeleteStaticsTiles.Clear; + vdlDeleteStaticsTiles.Clear; end; procedure TfrmLargeScaleCommand.btnClearIStaticsTilesClick(Sender: TObject); begin - vdtInsertStaticsTiles.Clear; + vdlInsertStaticsTiles.Clear; end; procedure TfrmLargeScaleCommand.btnClearTerrainClick(Sender: TObject); begin - vdtTerrainTiles.Clear; + vdlTerrainTiles.Clear; end; procedure TfrmLargeScaleCommand.btnCloseClick(Sender: TObject); @@ -369,17 +383,17 @@ end; procedure TfrmLargeScaleCommand.btnDeleteDStaticsTilesClick(Sender: TObject); begin - vdtDeleteStaticsTiles.DeleteSelectedNodes; + vdlDeleteStaticsTiles.DeleteSelectedNodes; end; procedure TfrmLargeScaleCommand.btnDeleteIStaticsTilesClick(Sender: TObject); begin - vdtInsertStaticsTiles.DeleteSelectedNodes; + vdlInsertStaticsTiles.DeleteSelectedNodes; end; procedure TfrmLargeScaleCommand.btnDeleteTerrainClick(Sender: TObject); begin - vdtTerrainTiles.DeleteSelectedNodes; + vdlTerrainTiles.DeleteSelectedNodes; end; procedure TfrmLargeScaleCommand.btnExecuteClick(Sender: TObject); @@ -447,7 +461,7 @@ begin if vstActions.CheckState[node] = csCheckedNormal then begin stream.WriteBoolean(True); - SerializeTiles(vdtTerrainTiles, stream); + SerializeTiles(vdlTerrainTiles, stream); end else stream.WriteBoolean(False); @@ -456,7 +470,7 @@ begin if vstActions.CheckState[node] = csCheckedNormal then begin stream.WriteBoolean(True); - SerializeTiles(vdtDeleteStaticsTiles, stream); + SerializeTiles(vdlDeleteStaticsTiles, stream); stream.WriteShortInt(Min(seDeleteStaticsZ1.Value, seDeleteStaticsZ2.Value)); stream.WriteShortInt(Max(seDeleteStaticsZ1.Value, seDeleteStaticsZ2.Value)); end else @@ -467,7 +481,7 @@ begin if vstActions.CheckState[node] = csCheckedNormal then begin stream.WriteBoolean(True); - SerializeTiles(vdtInsertStaticsTiles, stream); + SerializeTiles(vdlInsertStaticsTiles, stream); stream.WriteByte(seStaticsProbability.Value); if rbPlaceStaticsOnZ.Checked then begin @@ -565,30 +579,32 @@ procedure TfrmLargeScaleCommand.vdtTerrainTilesDragDrop(Sender: TBaseVirtualTree Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); var - sourceTree: TVirtualDrawTree; - selected, node: PVirtualNode; + SenderTVList: TVirtualList; + sourceTree: TVirtualList; + selected: PVirtualItem; + node: PVirtualItem; sourceTileInfo, targetTileInfo: PTileInfo; begin - sourceTree := Source as TVirtualDrawTree; - if (sourceTree <> Sender) and (sourceTree <> nil) and - (sourceTree.Tag = 1) then + SenderTVList := Sender as TVirtualList; + sourceTree := Source as TVirtualList; + if (sourceTree <> Sender) and (sourceTree <> nil) then begin - Sender.BeginUpdate; + SenderTVList.BeginUpdate; selected := sourceTree.GetFirstSelected; while selected <> nil do begin sourceTileInfo := sourceTree.GetNodeData(selected); - if ((Sender = vdtTerrainTiles) and (sourceTileInfo^.ID < $4000)) or - ((Sender = vdtInsertStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) or - ((Sender = vdtDeleteStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) then + if ((Sender = vdlTerrainTiles) and (sourceTileInfo^.ID < $4000)) or + ((Sender = vdlInsertStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) or + ((Sender = vdlDeleteStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) then begin - node := Sender.AddChild(nil); - targetTileInfo := Sender.GetNodeData(node); + node := SenderTVList.AddItem(nil); + targetTileInfo := SenderTVList.GetNodeData(node); targetTileInfo^.ID := sourceTileInfo^.ID; end; selected := sourceTree.GetNextSelected(selected); end; - Sender.EndUpdate; + SenderTVList.EndUpdate; end; end; @@ -596,8 +612,7 @@ procedure TfrmLargeScaleCommand.vdtTerrainTilesDragOver(Sender: TBaseVirtualTree Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean); begin - if (Source <> Sender) and (Source is TVirtualDrawTree) and - (TVirtualDrawTree(Source).Tag = 1) then + if (Source <> Sender) and (Source is TVirtualDrawTree) then begin Accept := True; end; @@ -717,6 +732,16 @@ begin end; end; +procedure TfrmLargeScaleCommand.RenameNode(AActionID: Integer; ACaption: String); +var + nodeInfo: PNodeInfo; +begin + nodeInfo := vstActions.GetNodeData(FindNode(AActionID)); + if (nodeInfo = nil) then exit; + nodeInfo^.Caption := ACaption; + vstActions.Repaint; +end; + procedure TfrmLargeScaleCommand.TileSelection(AWorldItem: TWorldItem); begin if FSelectFirst then @@ -759,19 +784,19 @@ begin WindowState := FOldWindowState; end; -procedure TfrmLargeScaleCommand.SerializeTiles(ATileList: TVirtualDrawTree; +procedure TfrmLargeScaleCommand.SerializeTiles(ATileList: TVirtualList; AStream: TEnhancedMemoryStream); var - node: PVirtualNode; + item: PVirtualItem; tileInfo: PTileInfo; begin AStream.WriteWord(ATileList.RootNodeCount); - node := ATileList.GetFirst; - while node <> nil do + item := ATileList.GetFirst; + while item <> nil do begin - tileInfo := ATileList.GetNodeData(node); + tileInfo := ATileList.GetNodeData(item); AStream.WriteWord(tileInfo^.ID); - node := ATileList.GetNext(node); + item := ATileList.GetNext(item); end; end; diff --git a/Client/UfrmLogin.lfm b/Client/UfrmLogin.lfm index 8fd30cc..2287eab 100644 --- a/Client/UfrmLogin.lfm +++ b/Client/UfrmLogin.lfm @@ -1,21 +1,760 @@ object frmLogin: TfrmLogin - Left = 290 + Cursor = crArrow + Left = 1246 Height = 266 - Top = 171 - Width = 481 - ActiveControl = btnOK - AutoSize = True + Top = 133 + Width = 494 BorderIcons = [biSystemMenu] BorderStyle = bsDialog - Caption = 'UO CentrED' + Caption = 'UO CentrED+' ClientHeight = 266 - ClientWidth = 481 + ClientWidth = 494 Font.Height = -11 + OnActivate = FormActivate OnClose = FormClose OnCreate = FormCreate + OnShow = FormShow Position = poScreenCenter ShowInTaskBar = stAlways - LCLVersion = '0.9.29' + LCLVersion = '0.9.30.2' + object pLayout: TPanel + Left = 6 + Height = 240 + Top = 3 + Width = 482 + Align = alClient + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 + BorderSpacing.Right = 6 + BorderSpacing.Bottom = 23 + BevelOuter = bvNone + ClientHeight = 240 + ClientWidth = 482 + Color = 16052980 + ParentColor = False + TabOrder = 0 + object gbConnection: TGroupBox + AnchorSideLeft.Control = pLayout + AnchorSideTop.Control = pLayout + AnchorSideRight.Control = gbActions + AnchorSideBottom.Side = asrCenter + Cursor = crArrow + Left = 2 + Height = 138 + Top = 1 + Width = 315 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Left = 2 + BorderSpacing.Top = 1 + Caption = 'Настройки соединения' + ClientHeight = 120 + ClientWidth = 311 + TabOrder = 0 + object lblHost: TLabel + AnchorSideLeft.Control = imgHost + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edHost + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 32 + Height = 14 + Top = 11 + Width = 43 + BorderSpacing.Left = 8 + Caption = 'Сервер:' + ParentColor = False + end + object lblUsername: TLabel + AnchorSideLeft.Control = imgUsername + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edUsername + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 32 + Height = 14 + Top = 49 + Width = 46 + BorderSpacing.Left = 8 + Caption = 'Аккаунт:' + ParentColor = False + end + object lblPassword: TLabel + AnchorSideLeft.Control = imgPassword + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edPassword + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 32 + Height = 14 + Top = 86 + Width = 44 + BorderSpacing.Left = 8 + Caption = 'Пароль:' + ParentColor = False + end + object imgHost: TImage + AnchorSideLeft.Control = gbConnection + AnchorSideTop.Control = lblHost + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 8 + Height = 16 + Top = 10 + Width = 16 + AutoSize = True + BorderSpacing.Left = 8 + Picture.Data = { + 07544269746D617036050000424D360500000000000036040000280000001000 + 000010000000010008000000000000000000C40E0000C40E0000000100000001 + 0000020202FF060606FF0B0B0BFF0F0F0FFF101010FF131313FF141414FF1717 + 17FF1C1C1CFF202020FF242424FF282828FF2D2D2DFF313131FF3C3C3CFF7171 + 71FF7F7F7FFF9E9E9EFFA7A7A7FFABABABFFB5B5B5FFB8B8B8FFB9B9B9FFC4C4 + C4FFE3E3E3FFE4E4E4FFF0F0F0FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A + 1A1A1A14141414040000000004141414141A060101010101171A1A1401010101 + 01060202020202021A1A1A1A0202020202020310151515031A1A1A1A03151515 + 0F03090505050505131616110505050505091A1A1A1A180A070707070A1A1A1A + 1A1A1A1A1A1A1A1A081A08081A1A1A1A1A1A1A1A1A1A1A1A091A09091A1A1A1A + 1A1A1A1A1A1A1A1A0A1A0A0A1A1A1A1A1A1A1A1A1A1A1A1A0B1A0B0B1A1A1A1A + 1A1A1A1A1A1A1A190C120C0C1A1A1A1A1A1A1A1A1A1A1A190E0D0D0E1A1A1A1A + 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A + 1A1A + } + Transparent = True + end + object imgUsername: TImage + AnchorSideLeft.Control = imgHost + AnchorSideTop.Control = lblUsername + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 8 + Height = 16 + Top = 48 + Width = 16 + AutoSize = True + Picture.Data = { + 07544269746D617036050000424D360500000000000036040000280000001000 + 000010000000010008000000000000000000C40E0000C40E0000000100000001 + 0000020202FF050505FF080808FF0B0B0BFF0E0E0EFF101010FF121212FF1515 + 15FF181818FF1B1B1BFF212121FF252525FF282828FF2B2B2BFF2E2E2EFF3131 + 31FF3F3F3FFF555555FF565656FF575757FF5B5B5BFF5E5E5EFF606060FF6969 + 69FF777777FFABABABFFC7C7C7FFD5D5D5FFD6D6D6FFD7D7D7FFE2E2E2FFE3E3 + E3FFE4E4E4FFF0F0F0FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF211E1405000000000000000005141E212110010101010101010101010101 + 1021210202020202020202020202020202212103030303030303030303030303 + 0321210404040404040404040404040404212112060606060606060606060606 + 1221211907070707071A1A070707070719212121170808081721211708080817 + 212121211F18090C1B21211B0C0918212121212121212121211C212121212121 + 212121212121211F110A0A111F21212121212121212121130B0B0B0B13212121 + 212121212121210C0C0C0C0C0C1D2121212121212121210D0D0D0D0D0D212121 + 21212121212121150E0E0E0E152121212121212121212120160F0F1620212121 + 2121 + } + Transparent = True + end + object imgPassword: TImage + AnchorSideLeft.Control = imgUsername + AnchorSideTop.Control = lblPassword + AnchorSideTop.Side = asrCenter + Cursor = crArrow + Left = 8 + Height = 16 + Top = 85 + Width = 16 + AutoSize = True + Picture.Data = { + 07544269746D617036050000424D360500000000000036040000280000001000 + 000010000000010008000000000000000000C30E0000C30E0000000000000000 + 00000202020005050500080808000B0B0B000E0E0E0010101000121212001515 + 150018181800191919001B1B1B001E1E1E002121210022222200252525002828 + 28002B2B2B002D2D2D002E2E2E003030300031313100343434003A3A3A003C3C + 3C003D3D3D003F3F3F0040404000424242004444440046464600494949004B4B + 4B0050505000525252005C5C5C00636363006464640066666600696969006B6B + 6B007070700075757500787878007D7D7D007E7E7E0081818100888888008D8D + 8D009090900097979700A7A7A700ABABAB00B2B2B200B3B3B300B6B6B600BCBC + BC00C6C6C600C7C7C700CACACA00CBCBCB00D5D5D500D8D8D800E4E4E400F0F0 + F000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001800052E3F3F3F3F3F3F3F3F3F3F3F3F190D0101323F3F3F3F3F3F3F3F3F + 3F3F1B021B0202363F3F3F3F3F3F3F3F3F3F2B03031C03092C3F3F3F3F3F3F3F + 3F3F3F2304041D0404383F3F3F3F3F3F3F3F3F3F2406061E06112D332D2D333F + 3F3F3F3F3F2507071F07070707070713393F3F3F3F3F2608081A080808080808 + 0E3C3F3F3F3F3F270A0A0A0A0A0A0A0A0A273F3F3F3F3F370B0B0B0B0B0B0B0B + 0B103F3F3F3F3F2E0C0C0C0C0C0C110C0C0C3F3F3F3F3F310E0E0E0E0E3A3F28 + 0E0E3F3F3F3F3F3B0F0F0F0F0F3F3F340F153F3F3F3F3F3F2210101010293520 + 102F3F3F3F3F3F3F3D16121212121212213E3F3F3F3F3F3F3F3E2A1714141730 + 3E3F + } + Transparent = True + end + object edHost: TEdit + AnchorSideLeft.Control = lblUsername + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = gbConnection + AnchorSideRight.Control = edPort + Cursor = crIBeam + Left = 86 + Height = 21 + Top = 8 + Width = 154 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 8 + BorderSpacing.Top = 8 + TabOrder = 0 + Text = 'localhost' + end + object edUsername: TEdit + AnchorSideLeft.Control = edHost + AnchorSideTop.Control = edHost + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = edPort + AnchorSideRight.Side = asrBottom + Cursor = crIBeam + Left = 86 + Height = 21 + Top = 46 + Width = 217 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 17 + TabOrder = 2 + end + object edPassword: TEdit + AnchorSideLeft.Control = edUsername + AnchorSideTop.Control = edUsername + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = edUsername + AnchorSideRight.Side = asrBottom + Cursor = crIBeam + Left = 86 + Height = 21 + Top = 83 + Width = 217 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 16 + BorderSpacing.Bottom = 16 + EchoMode = emPassword + PasswordChar = '*' + TabOrder = 3 + end + object edPort: TSpinEdit + AnchorSideLeft.Control = edHost + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edHost + AnchorSideRight.Control = gbConnection + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = edHost + AnchorSideBottom.Side = asrBottom + Cursor = crIBeam + Left = 248 + Height = 21 + Top = 8 + Width = 55 + Anchors = [akTop, akRight, akBottom] + BorderSpacing.Left = 8 + BorderSpacing.Right = 8 + MaxValue = 65565 + MinValue = 1024 + TabOrder = 1 + Value = 2597 + end + end + object gbActions: TGroupBox + AnchorSideLeft.Control = gbConnection + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = gbBaner + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = pLayout + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbProfiles + Cursor = crArrow + Left = 325 + Height = 78 + Top = 75 + Width = 155 + Anchors = [akRight, akBottom] + AutoSize = True + BorderSpacing.Left = 8 + BorderSpacing.Top = 4 + BorderSpacing.Right = 2 + ClientHeight = 60 + ClientWidth = 151 + TabOrder = 1 + object btnOK: TButton + AnchorSideLeft.Control = gbActions + AnchorSideTop.Control = gbActions + AnchorSideRight.Control = gbActions + AnchorSideRight.Side = asrBottom + Cursor = crArrow + Left = 6 + Height = 24 + Top = 0 + Width = 139 + BorderSpacing.Left = 6 + BorderSpacing.Right = 6 + BorderSpacing.Bottom = 6 + BorderSpacing.InnerBorder = 4 + Caption = '&Подключение к серверу' + Default = True + OnClick = btnOKClick + TabOrder = 0 + end + object btnCancel: TButton + AnchorSideLeft.Control = btnOK + AnchorSideTop.Control = btnOK + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = btnOK + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbActions + AnchorSideBottom.Side = asrBottom + Cursor = crArrow + Left = 62 + Height = 22 + Top = 30 + Width = 83 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 56 + BorderSpacing.Bottom = 8 + BorderSpacing.InnerBorder = 4 + Caption = '&Выход' + ModalResult = 2 + OnClick = btnCancelClick + TabOrder = 1 + end + end + object gbData: TGroupBox + AnchorSideLeft.Control = gbConnection + AnchorSideTop.Control = gbConnection + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbConnection + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbProfiles + AnchorSideBottom.Side = asrBottom + Cursor = crArrow + Left = 2 + Height = 95 + Top = 143 + Width = 315 + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = True + BorderSpacing.Top = 4 + Caption = 'Файлы данных' + ClientHeight = 77 + ClientWidth = 311 + TabOrder = 2 + object lblData: TLabel + AnchorSideLeft.Control = gbData + AnchorSideTop.Control = gbData + AnchorSideRight.Control = gbData + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = edData + Cursor = crArrow + Left = 8 + Height = 40 + Top = 0 + Width = 295 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 8 + BorderSpacing.Top = 4 + BorderSpacing.Right = 8 + BorderSpacing.Bottom = 8 + Caption = 'Укажите папку содержащую следующие файлы: art.mul, artidx.mul, hues.mul, tiledata.mul, animdata.mul, texmaps.mul, texidx.mul, light.mul и lightidx.mul.' + Font.Height = -11 + ParentColor = False + ParentFont = False + WordWrap = True + end + object edData: TDirectoryEdit + AnchorSideLeft.Control = lblData + AnchorSideTop.Control = lblData + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbData + AnchorSideBottom.Side = asrBottom + Cursor = crIBeam + Left = 8 + Height = 21 + Top = 48 + Width = 264 + ShowHidden = False + ButtonWidth = 23 + NumGlyphs = 1 + Anchors = [akLeft, akBottom] + BorderSpacing.Top = 4 + BorderSpacing.Bottom = 8 + MaxLength = 0 + TabOrder = 0 + end + end + object gbProfiles: TGroupBox + AnchorSideLeft.Control = gbActions + AnchorSideTop.Control = gbActions + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = gbActions + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = pLayout + AnchorSideBottom.Side = asrBottom + Cursor = crArrow + Left = 325 + Height = 77 + Top = 161 + Width = 155 + Anchors = [akLeft, akRight, akBottom] + AutoSize = True + BorderSpacing.Top = 8 + BorderSpacing.Bottom = 2 + Caption = 'Профиль' + ClientHeight = 59 + ClientWidth = 151 + TabOrder = 3 + object btnSaveProfile: TSpeedButton + AnchorSideTop.Control = btnDeleteProfile + AnchorSideRight.Control = btnDefaultOptions + Cursor = crArrow + Left = 63 + Height = 22 + Hint = 'Сохранить профиль' + Top = 31 + Width = 22 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + Caption = 'ererere' + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 00120303034A1F1F1F527B7B7B628A8A8A699090906E8F8F8F708D8D8D6E8B8B + 8B697676765F181718500404054F0404054F040404410000000700000000100F + 116B2A292DFD302F33FF9D9D9DFFA2A2A2FF9D9D9DFF929292FF8D8D8DFF8A8A + 8AFF878787FF242327FF252428FF2B2A2EFF2C2B2FFE0101020B000000003231 + 34F9323135FF373639FFB0B0B0FF242326FF212122FFA9A9A9FFA2A2A2FF9D9D + 9DFF969696FF2D2C2FFF2C2B2FFF333236FF353438FF00000000000000003938 + 3BFF39383BFF3B3A3EFFBABABBFF313033FF2B2B2DFFB9B9B9FFB4B4B4FFAFAF + AFFFA9A9A9FF373639FF353437FF3A393CFF3E3D41FF00000000000000003F3E + 42FF3F3E42FF434245FFBCBCBCFF3E3D3FFF373638FFC4C4C4FFC3C3C3FFBFBF + BFFFBABABAFF3D3C3FFF3A393BFF3F3E41FF414043FF00000000000000004645 + 48FF464548FF48474AFFBFBFBFFFCBCBCBFFCBCBCBFFCACACAFFCACACAFFCBCB + CBFFC7C7C7FF38373AFF353537FF464548FF48474AFF00000000000000004B4A + 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4D4C4FFF504F52FF515053FF525154FF5251 + 54FF504F52FF4E4D50FF4C4B4DFF4B4A4DFF4D4C4FFF00000000000000004E4D + 50FF4E4D50FF4E4D50FF4E4D50FF4E4D50FF4E4D50FF4F4E50FF4F4E50FF4F4E + 50FF4E4D50FF4E4D50FF4E4D50FF4E4D50FF515053FF00000000000000005251 + 53FF525153FF9F9993FFC1B8AFFFC4BBB2FFC6BDB4FFC7BEB5FFC7BEB4FFC5BC + B2FFC3B9B0FFBFB6ABFF9E9791FF525153FF555456FF00000000000000005554 + 56FF555456FFC3BCB5FFE7DBCDFFE7DBCEFFE7DACDFFE6DACDFFE6DACCFFE6D9 + CBFFE5D8CBFFE5D8C9FFC1B9B1FF555456FF58575AFF00000000000000005958 + 5AFF59585AFFC7C1BBFFF3EDE7FFF3EDE7FFF3EDE7FFF2ECE6FFF2ECE5FFF1EB + E4FFF1EAE2FFF0E8E0FFC5BFB8FF59585AFF5C5B5DFF00000000000000005C5B + 5DFF5C5B5DFFCBC7C2FFF0E9E1FFF0E9E1FFF0E8E1FFF0E8E0FFEFE8DFFFEFE7 + DEFFEEE6DDFFEDE5DCFFC9C4BFFF5C5B5DFF605F61FF0000000000000000605F + 61FF605F61FFCECAC7FFFEFDFCFFFEFDFCFFFEFDFCFFFEFDFCFFFDFDFCFFFDFC + FBFFFCFBFAFFFBF9F8FFCCC8C4FF605F61FF646365FF00000000000000005E5D + 5EFF5E5D5FFFCDC8C4FFF2EAE3FFF2EAE3FFF2EAE3FFF2EAE3FFF3EBE4FFF3EC + E5FFF3EDE6FFF4EEE8FFCECBC8FF636264FF676668FF00000000000000006362 + 63F5636264FFC6C0BBFFEEE7E3FFEFE8E4FFEFE9E5FFF0EAE6FFF1EBE7FFF1EC + E8FFF0ECEAFFF0EDEBFFC7C3C0FF6A696AFF706F71F500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 + } + NumGlyphs = 0 + OnClick = btnSaveProfileClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object btnDeleteProfile: TSpeedButton + AnchorSideTop.Control = cbProfile + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = cbProfile + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Cursor = crArrow + Left = 123 + Height = 22 + Hint = 'Удалить профиль' + Top = 31 + Width = 22 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + BorderSpacing.Bottom = 6 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000FFFFFF02FFFFFF0AFFFFFF11FFFFFF16FFFFFF1AFFFFFF16FFFF + FF11FFFFFF0AFFFFFF0200000000000000000000000000000000000000000000 + 0000FFFFFF07828282243B3B3B65272727971E1E1EBE191919D61E1E1EBF2626 + 26973B3B3B6582828224FFFFFF0700000000000000000000000000000000FFFF + FF074242424A2323239E181818D8151515DC121212E0111111E2121212E11616 + 16DB1A1A1AD62424249D4242424AFFFFFF070000000000000000FFFFFF023B3B + 3B481E1E1EB0151515D8101010E20B0B0BC609090989080808600A0A0A771111 + 11B2171717D5191919D21F1F1FAF3B3B3B48FFFFFF02000000005A5A5A1C1F1F + 1F9E141414D70E0E0EDD08080872060606030000000000000000FFFFFF055959 + 593F191919CA161616D4161616D41F1F1F9E5A5A5A1C00000000262626621313 + 13D60F0F0FDC0808085E000000000000000000000000FFFFFF055757573F1515 + 15CA101010DA0E0E0EDA101010DB121212D72626266200000000191919991111 + 11D50F0F0FC0000000000000000000000000FFFFFF055757573F141414C90F0F + 0FD90A0A0ADD0808083A101010AB101010D61919199900000000111111C10E0E + 0ED5131313800000000000000000FFFFFF055555553F111111C90D0D0DD90808 + 08DD0505053B00000000141414660E0E0ED7111111C1000000000A0A0AD90C0C + 0CD51A1A1A6A00000000FFFFFF055454543F101010C80C0C0CD8070707DC0404 + 043B00000000000000001C1C1C540C0C0CD50A0A0AD9000000000A0A0AC20B0B + 0BD41C1C1C80FFFFFF065353533F0D0D0DC8090909D8060606DC0404043B0000 + 000000000000000000002121216C0A0A0AD50A0A0AC2000000000A0A0A980808 + 08D60E0E0EB9545454410B0B0BC8080808D8050505DC0303033B000000000000 + 000000000000FFFFFF0A111111AA080808D70A0A0A98000000000505055C0505 + 05DD060606D2080808CB060606D2050505D60303033A00000000000000000000 + 0000FFFFFF0B2B2B2B63060606D4050505DD0505055C00000000010101140505 + 05A1040404DA050505D1050505CF3F3F3F47FFFFFF0EFFFFFF0AFFFFFF0FFFFF + FF1628282868050505CE040404DA050505A10101011400000000000000000101 + 013F020202B6020202DB020202D4090909B51B1B1B802B2B2B66181818840909 + 09B5020202D5020202DC020202B60101013F0000000000000000000000000000 + 00000000003F020202A2010101E2010101DC010101D9010101D8010101D90101 + 01DC010101E2020202A20000003F000000000000000000000000000000000000 + 000000000000000000140000005C0000009B000000CA000000E5000000CA0000 + 009B0000005C0000001400000000000000000000000000000000 + } + NumGlyphs = 0 + OnClick = btnDeleteProfileClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object cbProfile: TComboBox + AnchorSideLeft.Control = gbProfiles + AnchorSideTop.Control = gbProfiles + AnchorSideRight.Control = gbProfiles + AnchorSideRight.Side = asrBottom + Cursor = crArrow + Left = 6 + Height = 21 + Top = 4 + Width = 139 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 4 + BorderSpacing.Right = 6 + ItemHeight = 13 + OnChange = cbProfileChange + Style = csDropDownList + TabOrder = 0 + end + object btnDefaultOptions: TSpeedButton + AnchorSideTop.Control = btnDeleteProfile + AnchorSideRight.Control = btnDeleteProfile + Cursor = crArrow + Left = 93 + Height = 22 + Hint = 'Очистить кэш профиля' + Top = 31 + Width = 22 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000000000000000000300000028282828582B2B2A6E2323226C1D1E + 1C56000000260000000200000000000000000000000000000000000000000000 + 0000000000000D0C0C43706F6BD3CDCDCCFFB5B5B4FF8F8E8DFF7D7D7AFFA2A1 + A0FFBCBDBBFF787877CE0C0C0B3C000000000000000000000000000000000000 + 00000000000A656463F65A5A58FF706F6EFF868584FF7C7B7BFF727171FF8080 + 7FFF8E8D8DFF828281FF61615FED000000060000000000000000000000000000 + 00000000000E484846FF585755FF706F6EFF80817EFF797877FF706F6EFF8181 + 80FF90908FFF848383FF5B5A5AFF0000000A0000000000000000000000000000 + 00000505051B2E2E2EF4565654FE6D6C6AFF7B7A79FF747372FF6C6C6BFF7F7F + 7EFF90908FFF80807FFD333333F30808081A0000000000000000000000000000 + 00000B0B0B36222222E82C2C2CE7545454F169696AF8656564F9595958F86B6B + 6AF7767676F35F5F5FED252525E90F0F0F360000000000000000000000000000 + 00000E0E0E52262626E8292929E54A4A4AEA5C5C5CEE565656EE464646EB5858 + 59EC6F6F6FED606060ED282828E9111111510000000000000000000000000000 + 00000E0E0E6D292929E7272727E5474747EB585858EE555555EF464646EA5959 + 59EB6C6C6CEE5F5F5FEC2A2A2AE80F0F0F6D0000000000000000000000000000 + 00000D0D0D89292929E7252525E5454545EB545454EE535353EE464646EA5656 + 56EC696969ED5C5C5CEC2C2C2CE80D0D0D870000000000000000000000000000 + 00000B0B0BA4272727E6242424E5424242EB515151EC515151EE454545EA5353 + 53EC646464ED595959EC2D2D2DE7090909A30000000000000000000000000000 + 0000090909BF232323E6262626E6484848EB545454EE555555ED4C4C4CEB5353 + 53EB636363EC595959EB2E2E2EE7050505BE0000000000000000000000000000 + 0000171717DD333333DA323232CE454545CC575757CC5A5A5ACB474747C63636 + 36C32B2B2BC72B2B2BCE282828DA0D0D0DDC0000000000000000000000001616 + 1602252525DA080808B41C1C1CB93F3F3FC0545454C5565656C7454545C23535 + 35BE2A2A2ABC202020B9121212B50C0C0CD70707070200000000000000000000 + 00003E3E3E512D2D2DB82B2B2BCA444444C7525252C8545454C8454545C53737 + 37C1323232C2252525C91D1D1DB71111114F0000000000000000000000000000 + 000000000000000000002F2F2F1D3737374A424242644646466F3E3E3E6E3030 + 3062202020491818181D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 + } + NumGlyphs = 0 + OnClick = btnDefaultOptionsClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object cbLanguage: TComboBox + AnchorSideLeft.Control = cbProfile + AnchorSideTop.Control = btnSaveProfile + AnchorSideRight.Control = btnSaveProfile + AnchorSideBottom.Control = btnSaveProfile + AnchorSideBottom.Side = asrBottom + Cursor = crArrow + Left = 6 + Height = 21 + Top = 31 + Width = 49 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Right = 8 + ItemHeight = 13 + OnChange = cbLanguageChange + ParentShowHint = False + ShowHint = True + Style = csDropDownList + TabOrder = 1 + end + end + object gbBaner: TGroupBox + AnchorSideLeft.Control = gbActions + AnchorSideTop.Control = gbConnection + AnchorSideRight.Control = gbActions + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbActions + Cursor = crArrow + Left = 325 + Height = 70 + Top = 1 + Width = 155 + Anchors = [akTop, akLeft, akRight, akBottom] + Caption = 'Проект сервера' + ClientHeight = 52 + ClientWidth = 151 + TabOrder = 4 + object lblPlusCopyright: TLabel + AnchorSideLeft.Control = gbBaner + AnchorSideTop.Control = gbBaner + AnchorSideRight.Control = gbBaner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbBaner + AnchorSideBottom.Side = asrBottom + Cursor = crHandPoint + Left = 4 + Height = 36 + Hint = 'Перейти на сайт "uoquint.ru"' + Top = 8 + Width = 143 + Alignment = taCenter + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = False + BorderSpacing.Left = 4 + BorderSpacing.Top = 8 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 8 + Caption = 'uoquint.ru edition'#13#10'modified by StaticZ' + Font.Height = -11 + Font.Style = [fsBold] + ParentBidiMode = False + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowHint = True + WordWrap = True + OnClick = BanerClick + OnMouseEnter = BanerMouseEnter + OnMouseLeave = BanerMouseLeave + end + object imgBaner: TImage + Cursor = crHandPoint + Left = 0 + Height = 52 + Hint = 'Перейти на сайт "dev.uoquint.ru"' + Top = 0 + Width = 151 + Align = alClient + Center = True + OnClick = BanerClick + OnMouseEnter = BanerMouseEnter + OnMouseLeave = BanerMouseLeave + ParentShowHint = False + Proportional = True + ShowHint = True + end + end + end object lblCopyright: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbData @@ -24,661 +763,22 @@ object frmLogin: TfrmLogin AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom + Cursor = crArrow Left = 0 - Height = 19 - Top = 239 - Width = 481 + Height = 1 + Top = 249 + Width = 494 Alignment = taCenter Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ParentColor = False end - object gbConnection: TGroupBox - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Owner - AnchorSideRight.Control = gbActions - AnchorSideBottom.Side = asrCenter - Left = 8 - Height = 128 - Top = 4 - Width = 314 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - BorderSpacing.Left = 8 - BorderSpacing.Top = 4 - Caption = 'Connection' - ClientHeight = 114 - ClientWidth = 312 - TabOrder = 0 - object lblHost: TLabel - AnchorSideLeft.Control = imgHost - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edHost - AnchorSideTop.Side = asrCenter - Left = 32 - Height = 14 - Top = 10 - Width = 28 - BorderSpacing.Left = 8 - Caption = 'Host:' - ParentColor = False - end - object lblUsername: TLabel - AnchorSideLeft.Control = imgUsername - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edUsername - AnchorSideTop.Side = asrCenter - Left = 32 - Height = 14 - Top = 46 - Width = 58 - BorderSpacing.Left = 8 - Caption = 'Username:' - ParentColor = False - end - object lblPassword: TLabel - AnchorSideLeft.Control = imgPassword - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edPassword - AnchorSideTop.Side = asrCenter - Left = 32 - Height = 14 - Top = 81 - Width = 54 - BorderSpacing.Left = 8 - Caption = 'Password:' - ParentColor = False - end - object imgHost: TImage - AnchorSideLeft.Control = gbConnection - AnchorSideTop.Control = lblHost - AnchorSideTop.Side = asrCenter - Left = 8 - Height = 16 - Top = 9 - Width = 16 - AutoSize = True - BorderSpacing.Left = 8 - Picture.Data = { - 07545069786D61702E0A00002F2A2058504D202A2F0A73746174696320636861 - 72202A64756D6D795B5D3D7B0A223136203136203132342032222C0A22517420 - 63204E6F6E65222C0A22236E20632023333739343337222C0A22236D20632023 - 343261313362222C0A22236620632023353661393530222C0A22233520632023 - 363036303630222C0A22233420632023363336333633222C0A22235920632023 - 363436343634222C0A22233320632023363736373637222C0A22235420632023 - 363836383638222C0A22233220632023366236623662222C0A22234920632023 - 366436643664222C0A22233120632023373037303730222C0A22237920632023 - 373337333733222C0A22233020632023373437343734222C0A22237020632023 - 373837383738222C0A22235A20632023373937393739222C0A22236820632023 - 376537653765222C0A22232E20632023383438343834222C0A222E3020632023 - 386138613861222C0A222E3220632023386238623862222C0A222E5A20632023 - 386438643864222C0A222E5920632023386638663866222C0A222E5420632023 - 393139313931222C0A222E4720632023393139313932222C0A222E4620632023 - 393339333934222C0A222E4520632023393539353936222C0A222E4420632023 - 393739373938222C0A222E4920632023393839383938222C0A22234A20632023 - 396239623962222C0A222E7A20632023396539653965222C0A22237A20632023 - 613261326132222C0A22235520632023613361336133222C0A22236520632023 - 613463386130222C0A222E7020632023613561356135222C0A22237120632023 - 613861386138222C0A222E6720632023616261626162222C0A22235220632023 - 616561666237222C0A22235120632023616562316239222C0A22236920632023 - 616661666166222C0A22234720632023616662316239222C0A222E6620632023 - 623062306230222C0A22235020632023623062316239222C0A22234620632023 - 623162326261222C0A22237720632023623162336262222C0A22234520632023 - 623262346262222C0A22234B20632023623362336233222C0A22237620632023 - 623362346262222C0A22234F20632023623362356264222C0A22234420632023 - 623462356263222C0A22237520632023623462366264222C0A22232320632023 - 623562356235222C0A22234320632023623562366265222C0A222E6520632023 - 623662366236222C0A22237420632023623662376265222C0A22236C20632023 - 623662386265222C0A22237320632023623762396330222C0A222E3820632023 - 623862396330222C0A22236420632023623962616331222C0A222E3720632023 - 623962626331222C0A22236320632023626162626332222C0A222E6420632023 - 626262626262222C0A222E3620632023626262636333222C0A222E5220632023 - 626262646333222C0A222E3520632023626362656334222C0A22234E20632023 - 626462666335222C0A222E5120632023626562666335222C0A222E3420632023 - 626562666336222C0A222E5020632023626663316336222C0A222E6320632023 - 633063306330222C0A222E5820632023633063316337222C0A222E7820632023 - 633163316337222C0A222E4F20632023633163326338222C0A222E7720632023 - 633163336338222C0A222E4E20632023633263336338222C0A222E7620632023 - 633363346361222C0A222E6220632023633463346334222C0A22235620632023 - 633463356336222C0A222E4320632023633463366362222C0A222E7520632023 - 633563366362222C0A222E4A20632023633663366336222C0A222E6120632023 - 633963396339222C0A222E7420632023633963616366222C0A222E7120632023 - 636263626362222C0A222E6820632023636363636363222C0A222E2320632023 - 636463646364222C0A22235320632023636463656433222C0A22234820632023 - 636563666434222C0A22237820632023636664306434222C0A22236F20632023 - 643064316436222C0A22236720632023643164336437222C0A22234220632023 - 643264326434222C0A222E3920632023643364336437222C0A22237220632023 - 643364346435222C0A22235720632023643364346439222C0A22234C20632023 - 643464346434222C0A222E3120632023643464356439222C0A22236B20632023 - 643564356437222C0A222E5320632023643564366461222C0A222E4820632023 - 643664376462222C0A22236220632023643864386439222C0A222E7920632023 - 643864396463222C0A222E3320632023643964396461222C0A222E6E20632023 - 646264626465222C0A222E6D20632023646264636466222C0A222E6920632023 - 646364636463222C0A222E5720632023646364636464222C0A222E6C20632023 - 646364636466222C0A222E6B20632023646364656531222C0A222E4D20632023 - 646464646464222C0A22236120632023646564656465222C0A222E7220632023 - 646664666466222C0A22234D20632023646664666531222C0A222E5620632023 - 653065306530222C0A222E4C20632023653165316531222C0A222E4220632023 - 653165316532222C0A222E6A20632023653365336536222C0A22235820632023 - 653565356538222C0A222E4120632023653965396539222C0A222E7320632023 - 656165616561222C0A22236A20632023656265626562222C0A222E5520632023 - 656365636563222C0A222E6F20632023656365636565222C0A222E4B20632023 - 656665666566222C0A22234120632023663066306630222C0A22517451745174 - 5174517451745174517451745174517451745174517451745174222C0A225174 - 51745174517451742E232E612E622E632E642E652E662E67517451745174222C - 0A2251745174517451742E682E692E6A2E6B2E6C2E6D2E6E2E6F2E7051745174 - 5174222C0A225174517451742E712E722E732E742E752E762E772E782E792E7A - 517451745174222C0A22517451742E712E412E412E422E432E442E452E462E47 - 2E482E49517451745174222C0A22517451742E4A2E4B2E4C2E4D2E4E2E4F2E50 - 2E512E522E532E54517451745174222C0A22517451742E632E552E562E572E58 - 2E472E592E5A2E302E312E32517451745174222C0A22517451742E642E552E72 - 2E332E342E352E362E372E382E39232E517451745174222C0A22517451742323 - 2E55236123622E52236323642365236623672368517451745174222C0A225174 - 51742369236A2E4D236B2E372E38236C236D236E236F2370517451745174222C - 0A225174517423712E732E4D2372237323742375237623772378237951745174 - 5174222C0A2251745174237A23412E5623422343234423452346234723482349 - 517451745174222C0A2251745174234A234B234C234D234E234F235023512352 - 23532354517451745174222C0A2251745174517451742E302355235623572348 - 2353235323582359517451745174222C0A22517451745174517451745174235A - 233023312332233323342335517451745174222C0A2251745174517451745174 - 51745174517451745174517451745174517451745174227D3B0A - } - Transparent = True - end - object imgUsername: TImage - AnchorSideLeft.Control = imgHost - AnchorSideTop.Control = lblUsername - AnchorSideTop.Side = asrCenter - Left = 8 - Height = 16 - Top = 45 - Width = 16 - AutoSize = True - Picture.Data = { - 07545069786D61702E0A00002F2A2058504D202A2F0A73746174696320636861 - 72202A64756D6D795B5D3D7B0A223136203136203132342032222C0A22517420 - 63204E6F6E65222C0A222E3220632023316334366265222C0A222E5820632023 - 316334386263222C0A22233420632023316633643966222C0A22235A20632023 - 316634306130222C0A22236120632023316634396335222C0A222E3320632023 - 316634636334222C0A22235920632023323035306233222C0A22233320632023 - 323134316137222C0A22233220632023323234346162222C0A22233020632023 - 323234356161222C0A22233120632023323234366163222C0A22235520632023 - 323434396231222C0A22233520632023323434666232222C0A222E5120632023 - 323533633661222C0A222E5720632023326433653638222C0A22235220632023 - 333536306266222C0A22236D20632023343235303838222C0A22237820632023 - 343338646666222C0A22236220632023343435343861222C0A22234D20632023 - 346135656134222C0A222E6B20632023346232653133222C0A22237720632023 - 346539376665222C0A22234B20632023353039666666222C0A22234920632023 - 353339636665222C0A22237620632023353339656664222C0A22236A20632023 - 353461306664222C0A22234A20632023353561336666222C0A22234820632023 - 353761326665222C0A22234420632023353836363966222C0A22237520632023 - 353961356665222C0A22236920632023353961386665222C0A22234720632023 - 356161386665222C0A222E6420632023356233333135222C0A22234620632023 - 356261636666222C0A222E7320632023356333333066222C0A22237420632023 - 356461636665222C0A22236820632023356562316665222C0A222E3920632023 - 356662366666222C0A22237120632023363062376666222C0A22235120632023 - 363136313836222C0A22237320632023363162326665222C0A22235320632023 - 363162396665222C0A22235420632023363262396665222C0A22237220632023 - 363362366666222C0A222E3820632023363363306666222C0A22236720632023 - 363462396665222C0A222E4120632023363633623131222C0A22236620632023 - 363862666665222C0A222E3720632023363963396666222C0A222E7A20632023 - 366234353232222C0A22235620632023366436343761222C0A22236520632023 - 366463376665222C0A222E7820632023366534303135222C0A222E6A20632023 - 373133653065222C0A222E7920632023373234343139222C0A222E3620632023 - 373264346666222C0A222E7220632023373534313132222C0A22234C20632023 - 373861656638222C0A22236B20632023376162376666222C0A222E6320632023 - 376434323131222C0A22236C20632023383061396665222C0A22232E20632023 - 383063316666222C0A22237920632023383238666263222C0A22234520632023 - 383462626635222C0A222E7120632023383534633135222C0A222E7420632023 - 383733653063222C0A222E6920632023383734613066222C0A222E6F20632023 - 383734623066222C0A222E7020632023383734623131222C0A222E6220632023 - 386134383066222C0A222E6E20632023386134613066222C0A222E2320632023 - 386434383132222C0A222E6120632023393034623130222C0A222E4A20632023 - 393235623261222C0A222E6820632023393335333131222C0A22237020632023 - 393439656233222C0A222E6520632023393634653131222C0A222E6C20632023 - 393734623066222C0A22236420632023393864316666222C0A222E6720632023 - 393935383132222C0A222E5020632023396136323264222C0A222E6620632023 - 396235383132222C0A222E4220632023396235653166222C0A222E6D20632023 - 396635383132222C0A222E3520632023613465346666222C0A222E4920632023 - 613736383233222C0A222E5220632023613736643334222C0A222E3020632023 - 613837623464222C0A222E5A20632023613937623465222C0A22236320632023 - 616263386663222C0A222E5620632023616537343334222C0A222E7520632023 - 623839373763222C0A222E3120632023633364366633222C0A22232320632023 - 633664376636222C0A22234120632023633737343239222C0A222E7720632023 - 633839633731222C0A22234F20632023636137373261222C0A22235020632023 - 636437393235222C0A22236E20632023636537633238222C0A22235720632023 - 636537653265222C0A22234220632023643137643239222C0A222E4620632023 - 643161393766222C0A22235820632023643361323664222C0A222E5920632023 - 643465326634222C0A222E3420632023643665346636222C0A222E4720632023 - 646662353839222C0A222E7620632023653462373861222C0A222E4520632023 - 653562623865222C0A22236F20632023656162333738222C0A222E4C20632023 - 656163636162222C0A22237A20632023656462383765222C0A22234320632023 - 656562613832222C0A222E4B20632023656563616136222C0A222E4F20632023 - 656563646137222C0A222E4820632023656564666364222C0A22234E20632023 - 656662633833222C0A222E4420632023663163353937222C0A222E5520632023 - 663663666135222C0A222E4D20632023663664306137222C0A222E4E20632023 - 663664306138222C0A222E5420632023663764346166222C0A222E4320632023 - 663765386439222C0A222E5320632023663863633963222C0A22517451745174 - 5174517451745174517451745174517451745174517451745174222C0A225174 - 517451745174517451742E232E612E622E632E6451745174517451745174222C - 0A22517451745174517451742E652E662E672E682E692E6A2E6B517451745174 - 5174222C0A2251745174517451742E6C2E6D2E6E2E6F2E702E712E722E735174 - 517451745174222C0A2251745174517451742E742E752E762E772E782E792E7A - 2E415174517451745174222C0A2251745174517451742E422E432E442E452E46 - 2E472E482E495174517451745174222C0A2251745174517451742E4A2E4B2E4C - 2E4D2E4E2E4C2E4F2E505174517451745174222C0A2251745174517451742E51 - 2E522E532E542E542E552E562E575174517451745174222C0A22517451745174 - 51742E582E592E5A2E302E302E5A2E312E325174517451745174222C0A225174 - 517451742E332E342E352E362E372E382E39232E23232361517451745174222C - 0A225174517423622363236423652366236723682369236A236B236C236D5174 - 5174222C0A225174236E236F2370237123722373237423752376237723782379 - 237A23415174222C0A22517423422343234423452346234723482349234A234B - 234C234D234E234F5174222C0A22517451742350235123522353235423542354 - 2353235323552356235723585174222C0A2251745174517451742359235A2330 - 233123322333233423355174517451745174222C0A2251745174517451745174 - 51745174517451745174517451745174517451745174227D3B0A - } - Transparent = True - end - object imgPassword: TImage - AnchorSideLeft.Control = imgUsername - AnchorSideTop.Control = lblPassword - AnchorSideTop.Side = asrCenter - Left = 8 - Height = 16 - Top = 80 - Width = 16 - AutoSize = True - Picture.Data = { - 07545069786D6170DE0800002F2A2058504D202A2F0A73746174696320636861 - 72202A64756D6D795B5D3D7B0A223136203136203130332032222C0A22517420 - 63204E6F6E65222C0A22236F20632023623238383338222C0A22237620632023 - 623538623339222C0A22234220632023623738643339222C0A22236420632023 - 623838333333222C0A222E4E20632023626138363334222C0A22234820632023 - 626139303361222C0A222E5820632023626238383335222C0A222E3820632023 - 626638623335222C0A22236720632023633138653336222C0A22234B20632023 - 633239353362222C0A22234120632023633838383331222C0A222E6B20632023 - 633839353339222C0A22234720632023633938613332222C0A22236320632023 - 636138613332222C0A22237520632023636138623332222C0A22236E20632023 - 636238623332222C0A22234A20632023636339303333222C0A22234920632023 - 643139363336222C0A222E4420632023643637633239222C0A22236520632023 - 643637643239222C0A222E4D20632023643637663239222C0A222E5720632023 - 643738313262222C0A222E3720632023643738323262222C0A22236620632023 - 643838353263222C0A222E7720632023646139303330222C0A222E7120632023 - 646439383332222C0A222E6A20632023646661313339222C0A222E6620632023 - 646661623432222C0A22234320632023653161633432222C0A222E3420632023 - 653361393365222C0A222E6F20632023653361633432222C0A222E2320632023 - 653362303434222C0A222E4F20632023653362323435222C0A222E4520632023 - 656163343666222C0A222E5020632023656163353736222C0A22237220632023 - 656563353238222C0A22236B20632023656563383238222C0A22232320632023 - 656663393262222C0A222E5620632023656663393332222C0A222E4B20632023 - 656663643334222C0A222E4220632023663063653338222C0A222E3120632023 - 663064323238222C0A22237120632023663164313339222C0A222E4720632023 - 663164313364222C0A22237820632023663164363433222C0A222E5520632023 - 663263653363222C0A222E5220632023663264363339222C0A222E4120632023 - 663264363437222C0A22236120632023663364363364222C0A222E4A20632023 - 663364373530222C0A22232E20632023663364383465222C0A222E7420632023 - 663364613862222C0A22236C20632023663464373431222C0A22236A20632023 - 663464383433222C0A222E3220632023663564343337222C0A22237920632023 - 663564623438222C0A222E5320632023663564623464222C0A222E4820632023 - 663564623564222C0A222E7520632023663564643439222C0A22237A20632023 - 663565313832222C0A22237320632023663664633465222C0A222E4920632023 - 663664663639222C0A222E3320632023663665303833222C0A22234520632023 - 663665313766222C0A222E3020632023663665343762222C0A22236220632023 - 663765313861222C0A22237420632023663765323835222C0A22236D20632023 - 663765323839222C0A222E5420632023663765343635222C0A222E6C20632023 - 663765343765222C0A222E4620632023663765353830222C0A222E7220632023 - 663765353831222C0A222E7A20632023663765353832222C0A22234620632023 - 663765363966222C0A22234420632023663765626334222C0A222E7920632023 - 663865373839222C0A222E6720632023663865373864222C0A222E6D20632023 - 663865393934222C0A222E6E20632023663865396263222C0A222E3920632023 - 663965616162222C0A222E6320632023663965623965222C0A222E6820632023 - 663965636131222C0A222E5120632023666165656163222C0A22236920632023 - 666165656230222C0A22237020632023666165666262222C0A222E4C20632023 - 666265663835222C0A222E5A20632023666266316262222C0A222E7320632023 - 666266316263222C0A222E6420632023666266326265222C0A22237720632023 - 666266346336222C0A222E3520632023666366336130222C0A222E3620632023 - 666366356139222C0A222E4320632023666366356165222C0A222E6220632023 - 666366356365222C0A222E7820632023666366376435222C0A222E6120632023 - 666366386465222C0A222E7620632023666466386331222C0A222E7020632023 - 666566636565222C0A22236820632023666566636630222C0A222E5920632023 - 666566636631222C0A222E6520632023666666666665222C0A222E6920632023 - 666666666666222C0A22517451745174517451745174517451742E232E232E23 - 2E235174517451745174222C0A2251745174517451745174517451742E232E23 - 2E612E612E232E23517451745174222C0A225174517451745174517451742E23 - 2E232E622E632E642E652E232E6651745174222C0A2251745174517451745174 - 2E232E232E622E672E682E232E232E692E6A2E6B5174222C0A22517451745174 - 517451742E232E612E672E6C2E6D2E6E2E232E6F2E702E712E6B222C0A225174 - 51745174517451742E232E642E6C2E6C2E722E6D2E732E742E752E762E77222C - 0A22517451745174517451742E232E782E792E6C2E6C2E6C2E7A2E412E422E43 - 2E44222C0A22517451745174517451742E232E452E462E472E482E492E4A2E4B - 2E4C2E4D2E4E222C0A22517451742E232E232E4F2E502E512E522E532E542E55 - 2E562E4C2E572E585174222C0A22517451742E232E592E5A2E302E312E322E33 - 2E342E352E362E372E3851745174222C0A222E232E232E232E39232E23232361 - 236223632364236523662367517451745174222C0A222E2323682369236A236B - 236C236D236E236F5174517451745174517451745174222C0A222E2323702371 - 2372237323742375237651745174517451745174517451745174222C0A222E23 - 237723782379237A23412342517451745174517451745174517451745174222C - 0A22234323442345234623472348517451745174517451745174517451745174 - 5174222C0A2251742349234A236E234B51745174517451745174517451745174 - 517451745174227D3B0A - } - Transparent = True - end - object edHost: TEdit - AnchorSideLeft.Control = lblUsername - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = gbConnection - AnchorSideRight.Control = edPort - Left = 98 - Height = 19 - Top = 8 - Width = 143 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - TabOrder = 0 - Text = 'localhost' - end - object edUsername: TEdit - AnchorSideLeft.Control = edHost - AnchorSideTop.Control = edHost - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edPort - AnchorSideRight.Side = asrBottom - Left = 98 - Height = 19 - Top = 44 - Width = 206 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 17 - TabOrder = 2 - end - object edPassword: TEdit - AnchorSideLeft.Control = edUsername - AnchorSideTop.Control = edUsername - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edUsername - AnchorSideRight.Side = asrBottom - Left = 98 - Height = 19 - Top = 79 - Width = 206 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 16 - BorderSpacing.Bottom = 16 - EchoMode = emPassword - PasswordChar = '*' - TabOrder = 3 - end - object edPort: TSpinEdit - AnchorSideLeft.Control = edHost - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edHost - AnchorSideRight.Control = gbConnection - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = edHost - AnchorSideBottom.Side = asrBottom - Left = 249 - Height = 19 - Top = 8 - Width = 55 - Anchors = [akTop, akRight, akBottom] - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - MaxValue = 65565 - MinValue = 1024 - TabOrder = 1 - Value = 2597 - end - end - object gbActions: TGroupBox - AnchorSideLeft.Control = gbConnection - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = gbConnection - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 330 - Height = 78 - Top = 12 - Width = 143 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - ClientHeight = 76 - ClientWidth = 141 - TabOrder = 2 - object btnOK: TButton - AnchorSideLeft.Control = gbActions - AnchorSideTop.Control = gbActions - AnchorSideRight.Control = gbActions - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 25 - Top = 8 - Width = 125 - BorderSpacing.Around = 8 - BorderSpacing.InnerBorder = 4 - Caption = '&OK' - Default = True - OnClick = btnOKClick - TabOrder = 0 - end - object btnCancel: TButton - AnchorSideLeft.Control = btnOK - AnchorSideTop.Control = btnOK - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = btnOK - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 25 - Top = 41 - Width = 125 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Bottom = 8 - BorderSpacing.InnerBorder = 4 - Caption = '&Cancel' - ModalResult = 2 - OnClick = btnCancelClick - TabOrder = 1 - end - end - object gbData: TGroupBox - AnchorSideLeft.Control = gbConnection - AnchorSideTop.Control = gbConnection - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = gbConnection - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 95 - Top = 136 - Width = 314 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - BorderSpacing.Top = 4 - Caption = 'Data files' - ClientHeight = 81 - ClientWidth = 312 - TabOrder = 1 - object lblData: TLabel - AnchorSideLeft.Control = gbData - AnchorSideTop.Control = gbData - AnchorSideRight.Control = gbData - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 46 - Top = 4 - Width = 296 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 8 - BorderSpacing.Top = 4 - BorderSpacing.Right = 8 - Caption = 'Select the directory containing art.mul, artidx.mul, hues.mul, tiledata.mul, animdata.mul, texmaps.mul, texidx.mul, light.mul and lightidx.mul.' - ParentColor = False - WordWrap = True - end - object edData: TDirectoryEdit - AnchorSideLeft.Control = lblData - AnchorSideTop.Control = lblData - AnchorSideTop.Side = asrBottom - Left = 8 - Height = 19 - Top = 54 - Width = 272 - ShowHidden = False - ButtonWidth = 23 - NumGlyphs = 1 - BorderSpacing.Top = 4 - BorderSpacing.Bottom = 8 - MaxLength = 0 - TabOrder = 0 - end - end - object gbProfiles: TGroupBox - AnchorSideLeft.Control = gbActions - AnchorSideTop.Control = gbActions - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = gbActions - AnchorSideRight.Side = asrBottom - Left = 330 - Height = 85 - Top = 98 - Width = 143 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - BorderSpacing.Top = 8 - Caption = 'Profiles' - ClientHeight = 71 - ClientWidth = 141 - TabOrder = 3 - object btnSaveProfile: TSpeedButton - AnchorSideTop.Control = btnDeleteProfile - AnchorSideRight.Control = btnDeleteProfile - Left = 81 - Height = 22 - Hint = 'Save profile' - Top = 41 - Width = 22 - Anchors = [akTop, akRight] - BorderSpacing.Right = 8 - Color = clBtnFace - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000BA6A36FFB969 - 35FFB86935FFB76835FFB56835FFB46734FFB26634FFB06533FFAE6433FFAC63 - 32FFAA6232FFA96132FFA86031FFA76031FFA66031FFA86131FFBA6A35FFEBC6 - ADFFEAC5ADFFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB - F8FFFEFBF8FFFEFBF8FFFEFBF8FFC89A7CFFC79879FFA76031FFBA6B37FFEDCA - B3FFE0A27AFFFEFAF7FF62C088FF62C088FF62C088FF62C088FF62C088FF62C0 - 88FF62C088FF62C088FFFDF9F6FFCA8D65FFC99B7CFFA76031FFBB6C38FFEECC - B6FFE1A27AFFFEFAF7FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDC - C2FFBFDCC2FFBFDCC2FFFDF9F6FFCD9068FFCC9E81FFA86132FFBB6B38FFEFCE - B8FFE1A279FFFEFAF7FF62C088FF62C088FF62C088FF62C088FF62C088FF62C0 - 88FF62C088FF62C088FFFDF9F6FFCF936AFFCEA384FFAA6132FFBA6A36FFEFD0 - BBFFE2A27AFFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB - F8FFFEFBF8FFFEFBF8FFFEFBF8FFD3966DFFD2A78AFFAB6232FFBB6A36FFF0D2 - BEFFE2A37AFFE2A37AFFE1A37AFFE2A37BFFE1A37BFFE0A178FFDE9F77FFDD9F - 76FFDC9D74FFD99B72FFD89971FFD69970FFD5AB8EFFAD6333FFBB6A36FFF2D5 - C2FFE3A37AFFE3A37AFFE2A37BFFE2A37BFFE2A47BFFE1A279FFE0A178FFDEA0 - 77FFDE9E75FFDC9D74FFDA9B73FFD99B73FFDAB095FFAF6433FFBB6A36FFF2D8 - C5FFE3A47BFFE3A37AFFE3A47AFFE2A47BFFE2A37BFFE1A37BFFE1A279FFDFA0 - 77FFDE9F76FFDD9E74FFDB9C72FFDC9D74FFDDB59AFFB16534FFBB6B36FFF4D9 - C7FFE6A67DFFC88C64FFC98D65FFC98E67FFCB926CFFCB926DFFCA9069FFC88C - 65FFC88C64FFC88C64FFC88C64FFDA9C74FFE1BA9FFFB36634FFBB6B36FFF4DC - C9FFE7A77DFFF9ECE1FFF9ECE1FFF9EDE3FFFCF4EEFFFDFAF7FFFDF7F3FFFAED - E5FFF7E7DBFFF7E5D9FFF6E5D8FFDEA077FFE4BEA4FFB46734FFBC6B36FFF5DD - CCFFE7A87EFFFAF0E8FFFAF0E8FFC98D66FFFAF0E9FFFDF8F3FFFEFAF8FFFCF4 - EFFFF9E9DFFFF7E7DBFFF7E5D9FFE0A278FFE7C2A9FFB66835FFBC6B36FFF6DF - D0FFE8A87EFFFCF6F1FFFCF6F1FFC88C64FFFAF1E9FFFBF4EEFFFDFAF7FFFDF9 - F6FFFAF0E8FFF8E8DDFFF7E6DBFFE1A37AFFEFD5C3FFB76935FFBC6B36FFF6DF - D1FFE9AA80FFFEFAF6FFFDFAF6FFC88C64FFFBF3EEFFFBF1EAFFFCF6F2FFFEFB - F8FFFCF6F1FFF9ECE2FFF8E7DBFFEED0BAFFECD0BDFFBB703EFFBC6B36FFF6E0 - D1FFF7E0D1FFFEFBF8FFFEFBF7FFFDF9F6FFFCF5F0FFFAF0EAFFFBF2EDFFFDF9 - F6FFFDFAF7FFFBF1EBFFF8E9DFFFECD0BDFFC9895EFF0000000000000000BC6B - 36FFBC6B36FFBC6B36FFBC6B36FFBB6B36FFBB6B36FFBB6A36FFBB6A36FFBC6C - 39FFBD6E3BFFBB6D3AFFBB6B38FFBB703EFF0000000000000000 - } - NumGlyphs = 0 - OnClick = btnSaveProfileClick - ShowCaption = False - ShowHint = True - ParentShowHint = False - end - object btnDeleteProfile: TSpeedButton - AnchorSideTop.Control = cbProfile - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = cbProfile - AnchorSideRight.Side = asrBottom - Left = 111 - Height = 22 - Hint = 'Delete profile' - Top = 41 - Width = 22 - Anchors = [akTop, akRight] - BorderSpacing.Top = 8 - BorderSpacing.Bottom = 8 - Color = clBtnFace - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000004F4CF2FF403EEDFF000000000000000000000000000000000000 - 0000000000002422E4FF312FEAFF000000000000000000000000000000000000 - 00005856F5FF6361FAFF5855F6FF413FEDFF0000000000000000000000000000 - 00002C2AE6FF413FF1FF4C4AF6FF312FEAFF0000000000000000000000000000 - 00005B58F6FF6562FAFF7170FFFF5956F6FF4240EEFF00000000000000003532 - E9FF4745F2FF6362FFFF4A48F4FF2F2DE9FF0000000000000000000000000000 - 0000000000005B59F6FF6663FAFF7471FFFF5A58F6FF4341EEFF3E3CECFF504D - F4FF6867FFFF504EF5FF3634EBFF000000000000000000000000000000000000 - 000000000000000000005C5AF6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6C - FFFF5755F7FF3F3DEEFF00000000000000000000000000000000000000000000 - 00000000000000000000000000005D5BF7FF7976FFFF5956FFFF5754FFFF7270 - FFFF4846F0FF0000000000000000000000000000000000000000000000000000 - 00000000000000000000000000005D5AF6FF7D79FFFF5E5BFFFF5B58FFFF7674 - FFFF4643EFFF0000000000000000000000000000000000000000000000000000 - 000000000000000000006663F9FF706DFBFF807EFFFF7E7BFFFF7C79FFFF7977 - FFFF5E5CF7FF4744EFFF00000000000000000000000000000000000000000000 - 0000000000006E6BFCFF7774FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6A - FAFF7B79FFFF605DF7FF4845EFFF000000000000000000000000000000000000 - 00007471FEFF7D7AFEFF8A87FFFF7C79FDFF6C69FBFF0000000000000000615E - F8FF6E6CFAFF7D7AFFFF615FF7FF4946F0FF0000000000000000000000000000 - 00007A77FFFF817EFFFF817EFEFF7471FDFF0000000000000000000000000000 - 0000625FF8FF6F6DFBFF7E7CFFFF625FF8FF0000000000000000000000000000 - 0000000000007A77FFFF7976FEFF000000000000000000000000000000000000 - 0000000000006461F8FF6A68F9FF5451F3FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 - } - NumGlyphs = 0 - OnClick = btnDeleteProfileClick - ShowCaption = False - ShowHint = True - ParentShowHint = False - end - object cbProfile: TComboBox - AnchorSideLeft.Control = gbProfiles - AnchorSideTop.Control = gbProfiles - AnchorSideRight.Control = gbProfiles - AnchorSideRight.Side = asrBottom - Left = 8 - Height = 29 - Top = 4 - Width = 125 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 8 - BorderSpacing.Top = 4 - BorderSpacing.Right = 8 - ItemHeight = 0 - OnChange = cbProfileChange - Style = csDropDownList - TabOrder = 0 - end + object BanerAnim: TTimer + Tag = 1 + Enabled = False + Interval = 100 + OnTimer = BanerAnimTimer + left = 456 + top = 8 end end diff --git a/Client/UfrmLogin.pas b/Client/UfrmLogin.pas index c0fcae6..90137d5 100644 --- a/Client/UfrmLogin.pas +++ b/Client/UfrmLogin.pas @@ -31,7 +31,8 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, - ExtCtrls, Spin, EditBtn, Buttons, IniFiles; + ExtCtrls, Spin, EditBtn, Buttons, IniFiles, LConvEncoding, LazHelpHTML, + ShellAPI, Registry, AeroGlass; type @@ -40,46 +41,66 @@ type TfrmLogin = class(TForm) btnOK: TButton; btnCancel: TButton; + btnDefaultOptions: TSpeedButton; cbProfile: TComboBox; + cbLanguage: TComboBox; edData: TDirectoryEdit; edHost: TEdit; edUsername: TEdit; edPassword: TEdit; + gbBaner: TGroupBox; gbConnection: TGroupBox; gbData: TGroupBox; gbActions: TGroupBox; gbProfiles: TGroupBox; + imgBaner: TImage; imgHost: TImage; imgUsername: TImage; imgPassword: TImage; lblCopyright: TLabel; lblHost: TLabel; + lblPlusCopyright: TLabel; lblUsername: TLabel; lblPassword: TLabel; edPort: TSpinEdit; lblData: TLabel; btnSaveProfile: TSpeedButton; btnDeleteProfile: TSpeedButton; + BanerAnim: TTimer; + pLayout: TPanel; + procedure BanerAnimTimer(Sender: TObject); procedure btnCancelClick(Sender: TObject); + procedure btnDefaultOptionsClick(Sender: TObject); procedure btnDeleteProfileClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnSaveProfileClick(Sender: TObject); + procedure cbLanguageChange(Sender: TObject); procedure cbProfileChange(Sender: TObject); + procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure BanerClick(Sender: TObject); + procedure BanerMouseEnter(Sender: TObject); + procedure BanerMouseLeave(Sender: TObject); + procedure BanerDrawImage(baner : array of Byte); protected FProfilePath: string; public { public declarations } + SaveProfileCaption: string; + SaveProfileDescription: string; end; var frmLogin: TfrmLogin; + sprofile: string; + LastTickCount: DWORD; implementation uses - UdmNetwork; + UdmNetwork, Logging, vinfo, Language; {$I version.inc} @@ -90,22 +111,67 @@ begin Close; end; + + +procedure TfrmLogin.btnDefaultOptionsClick(Sender: TObject); +begin + if cbProfile.ItemIndex > -1 then + begin + DeleteFile(FProfilePath + UTF8ToCP1251(cbProfile.Text) + PathDelim + 'RadarMap.cache'); + DeleteFile(FProfilePath + UTF8ToCP1251(cbProfile.Text) + PathDelim + 'TilesEntry.cache'); + DeleteFile(FProfilePath + UTF8ToCP1251(cbProfile.Text) + PathDelim + 'Config.xml'); + end; +end; + procedure TfrmLogin.btnDeleteProfileClick(Sender: TObject); begin if cbProfile.ItemIndex > -1 then begin - DeleteFile(FProfilePath + cbProfile.Text + '.ini'); + DeleteFile(FProfilePath + UTF8ToCP1251(cbProfile.Text) + PathDelim + 'login.ini'); + RemoveDir(FProfilePath + UTF8ToCP1251(cbProfile.Text)); cbProfile.Items.Delete(cbProfile.ItemIndex); + sprofile := ''; end; end; procedure TfrmLogin.btnOKClick(Sender: TObject); var path: string; + configDir: string; + settings: TIniFile; + ARegistry: TRegistry; begin - path := IncludeTrailingPathDelimiter(edData.Text); + // Загрузка настроек + ARegistry := TRegistry.Create(); + ARegistry.RootKey := HKEY_LOCAL_MACHINE; + ARegistry.OpenKey('\SOFTWARE\Quintessence\UO CentrED+', False); + if ARegistry.ReadBool('UseConfigDir') + then configDir := GetAppConfigDir(False) + else configDir := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + + '..' + PathDelim + 'LocalData' + PathDelim + 'UsersData' + PathDelim ; + ARegistry.Free; + + // Сохранение настроек + settings := TIniFile.Create(configDir + 'LoginSettings.ini'); + settings.WriteString('Connection', 'Host', edHost.Text); + settings.WriteInteger('Connection', 'Port', edPort.Value); + settings.WriteString('Connection', 'Username', edUsername.Text); + settings.WriteString('Data', 'Path', edData.Text); + if (cbProfile.ItemIndex > -1) and (cbProfile.ItemIndex < cbProfile.Items.Count) then + settings.WriteString('Profile', 'Last', cbProfile.Items[cbProfile.ItemIndex]) + else + settings.WriteString('Profile', 'Last', ''); + if (cbLanguage.ItemIndex > -1) and (cbLanguage.ItemIndex < cbLanguage.Items.Count) then + settings.WriteString('Profile', 'Lang', LanguageGetName) + else + settings.WriteString('Profile', 'Lang', ''); + settings.Free; + { + // Проверка путей + path := IncludeTrailingPathDelimiter(UTF8ToCP1251(edData.Text)); if (not FileExists(path + 'art.mul')) or - (not FileExists(path + 'artidx.mul')) or + (not FileExists(path + 'artidx.mul')) or LangDirectory := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + PathDelim + 'Language' + PathDelim; + (not FileExists(path + 'hues.mul')) or (not FileExists(path + 'tiledata.mul')) or (not FileExists(path + 'animdata.mul')) or @@ -114,11 +180,12 @@ begin (not FileExists(path + 'light.mul')) or (not FileExists(path + 'lightidx.mul')) then begin - MessageDlg('Incorrect directory', 'The data path you specified does not ' - + 'seem to be correct.', mtWarning, [mbOK], 0); + MessageDlg('Неверный путь', 'Указанный вами путь, не является коректным,' + + ' т.к. не содержит требуемые файлы.', mtWarning, [mbOK], 0); edData.SetFocus; - end else + end else } ModalResult := mrOK; + Logger.Send([lcClient, lcInfo], 'Начинаем соеденинение с сервером'); end; procedure TfrmLogin.btnSaveProfileClick(Sender: TObject); @@ -127,40 +194,64 @@ var profile: TIniFile; begin profileName := cbProfile.Text; - if InputQuery('Save profile', 'Enter the name of the profile:', profileName) then + if InputQuery(SaveProfileCaption, SaveProfileDescription, profileName) then begin - profile := TIniFile.Create(FProfilePath + profileName + '.ini'); - profile.WriteString('Connection', 'Host', edHost.Text); + if not DirectoryExists(FProfilePath + UTF8ToCP1251(profileName)) + then ForceDirectories(FProfilePath + UTF8ToCP1251(profileName)); + profile := TIniFile.Create(FProfilePath + UTF8ToCP1251(profileName) + PathDelim + 'login.ini'); + profile.WriteString('Connection', 'Host', UTF8ToCP1251(edHost.Text)); profile.WriteInteger('Connection', 'Port', edPort.Value); - profile.WriteString('Connection', 'Username', edUsername.Text); - profile.WriteString('Data', 'Path', edData.Text); + profile.WriteString('Connection', 'Username', UTF8ToCP1251(edUsername.Text)); + profile.WriteString('Data', 'Path', UTF8ToCP1251(edData.Text)); profile.Free; cbProfile.ItemIndex := cbProfile.Items.IndexOf(profileName); if cbProfile.ItemIndex = -1 then begin cbProfile.Items.Add(profileName); cbProfile.ItemIndex := cbProfile.Items.Count - 1; + cbProfileChange(nil); end; end; end; +procedure TfrmLogin.cbLanguageChange(Sender: TObject); +begin + LanguageSet(cbLanguage.ItemIndex); + LanguageTranslate(Self); + cbLanguage.Hint := LanguageGetName(); + Self.Repaint; +end; + procedure TfrmLogin.cbProfileChange(Sender: TObject); var profile: TIniFile; begin if cbProfile.ItemIndex > -1 then begin - profile := TIniFile.Create(FProfilePath + cbProfile.Text + '.ini'); - edHost.Text := profile.ReadString('Connection', 'Host', ''); + btnDefaultOptions.Enabled := true; + btnDeleteProfile.Enabled := true; + sprofile := cbProfile.Text; + profile := TIniFile.Create(FProfilePath + UTF8ToCP1251(cbProfile.Text) + PathDelim + 'login.ini'); + edHost.Text := CP1251ToUTF8(profile.ReadString('Connection', 'Host', '')); edPort.Value := profile.ReadInteger('Connection', 'Port', 2597); - edUsername.Text := profile.ReadString('Connection', 'Username', ''); + edUsername.Text := CP1251ToUTF8(profile.ReadString('Connection', 'Username', '')); edPassword.Text := ''; - edData.Text := profile.ReadString('Data', 'Path', ''); - edPassword.SetFocus; + edData.Text := CP1251ToUTF8(profile.ReadString('Data', 'Path', '')); + if Sender <> nil then + edPassword.SetFocus; profile.Free; + end else begin + btnDefaultOptions.Enabled := false; + btnDeleteProfile.Enabled := false; + sprofile := ''; end; end; +procedure TfrmLogin.FormActivate(Sender: TObject); +begin + GlassForm(frmLogin); +end; + procedure TfrmLogin.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin if ModalResult <> mrOK then @@ -170,19 +261,128 @@ end; procedure TfrmLogin.FormCreate(Sender: TObject); var searchRec: TSearchRec; + iniSettings: TIniFile; + lastProfile: string; + lastLanguage: string; + nodeindex: integer; + langDirectory: string; + langFileName : string; + ARegistry: TRegistry; + configDir: string; begin - lblCopyright.Caption := Format('UO CentrED Client Version %s (c) %s', - [ProductVersion, Copyright]); + Width := 494; + Height := 266; - FProfilePath := GetAppConfigDir(False) + 'Profiles' + PathDelim; + Caption := Format('UO CentrED+ v%s build: %d', + //Caption := Format('UO CentrED+ v%s build: %d !!! pre-release (not stable version) !!! ', + [VersionInfo.GetProductVersionString, VersionInfo.Build]); + lblCopyright.Caption := Format('%s || "UO CentrED+" ver %s (c) %s', + [Original, VersionInfo.GetFileVersionString, Copyright]); + BanerMouseLeave(Sender); + edData.DialogTitle:=lblData.Caption; + + // Загрузка настроек + ARegistry := TRegistry.Create(); + ARegistry.RootKey := HKEY_LOCAL_MACHINE; + ARegistry.OpenKey('\SOFTWARE\Quintessence\UO CentrED+', False); + if ARegistry.ReadBool('UseConfigDir') + then configDir := GetAppConfigDir(False) + else configDir := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + + '..' + PathDelim + 'LocalData' + PathDelim + 'UsersData' + PathDelim ; + ARegistry.Free; + + sprofile := ''; + iniSettings := TIniFile.Create(configDir + 'LoginSettings.ini'); + lastProfile := iniSettings.ReadString('Profile', 'Last', ''); + lastLanguage:= iniSettings.ReadString('Profile', 'Lang', ''); + + FProfilePath := configDir + 'Profiles' + PathDelim; ForceDirectories(FProfilePath); - if FindFirst(FProfilePath + '*.ini', faAnyFile, searchRec) = 0 then + if FindFirst(FProfilePath + '*', faDirectory, searchRec) = 0 then begin repeat - cbProfile.Items.Add(ChangeFileExt(searchRec.Name, '')); + if FileExists(FProfilePath + PathDelim + searchRec.Name + PathDelim + 'login.ini') then + begin + nodeindex := cbProfile.Items.Add(CP1251ToUTF8(searchRec.Name)); + if (cbProfile.Items[nodeindex] <> '') and (cbProfile.Items[nodeindex] = lastProfile) then + begin + cbProfile.ItemIndex := nodeindex; + cbProfileChange(nil); + end; + end; until FindNext(searchRec) <> 0; end; FindClose(searchRec); + + if (cbProfile.ItemIndex < 0) or (lastprofile = '') then + begin + edHost.Text := iniSettings.ReadString('Connection', 'Host', 'localhost'); + edPort.Value := iniSettings.ReadInteger('Connection', 'Port', 2597); + edUsername.Text := iniSettings.ReadString('Connection', 'Username', ''); + edPassword.Text := ''; + edData.Text := iniSettings.ReadString('Data', 'Path', ''); + end; + + iniSettings.Free; + + // Загрузка локализаций + LangDirectory := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + + PathDelim + '..' + PathDelim +'Language' + PathDelim; + LanguageLoad(Self, lastLanguage, LangDirectory); +end; + +procedure TfrmLogin.FormShow(Sender: TObject); +begin + edPassword.SetFocus; +end; + +procedure TfrmLogin.BanerClick(Sender: TObject); +begin + // Открываем сайт в браузере по умолчанию + ShellExecute(Handle, 'open', PChar('http://dev.uoquint.ru'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmLogin.BanerDrawImage(baner : array of Byte); +var stream: TMemoryStream; +begin + stream := TMemoryStream.Create; + stream.Write(baner[0],SizeOf(baner)); + stream.Position:=0; + imgBaner.Picture.Bitmap.LoadFromStream(stream); + imgBaner.Update; + stream.Free; +end; + +//function GetTickCount:DWORD; external 'kernel32' name 'GetTickCount'; +procedure TfrmLogin.BanerAnimTimer(Sender: TObject); +var NowsTickCount : DWORD; +begin { Таймер и GetTickCount вообще не работают!!! + NowsTickCount := GetTickCount; + if (NowsTickCount - LastTickCount) < 10000 then exit; + LastTickCount := NowsTickCount; + + if BanerAnim.Tag = 1 then begin + BanerAnim.Tag := 2; BanerDrawImage(baner_u); + end; + if BanerAnim.Tag = 2 then begin + BanerAnim.Tag := 1; BanerDrawImage(baner_h); + end; } +end; + +procedure TfrmLogin.BanerMouseEnter(Sender: TObject); +var stream: TMemoryStream; +begin + lblPlusCopyright.Font.Color:= $FF0000; + lblPlusCopyright.Font.Size := 10; + BanerDrawImage(baner_h); +end; + +procedure TfrmLogin.BanerMouseLeave(Sender: TObject); +var stream: TMemoryStream; +begin + lblPlusCopyright.Font.Color:= $000000; + lblPlusCopyright.Font.Size := 8; + BanerDrawImage(baner_u); end; initialization diff --git a/Client/UfrmMain.lfm b/Client/UfrmMain.lfm index 0bcc9ba..0ece062 100644 --- a/Client/UfrmMain.lfm +++ b/Client/UfrmMain.lfm @@ -1,172 +1,159 @@ object frmMain: TfrmMain - Left = 257 - Height = 579 - Top = 141 - Width = 755 - ActiveControl = oglGameWindow - Caption = 'UO CentrED' - ClientHeight = 559 - ClientWidth = 755 - Constraints.MinHeight = 500 - Constraints.MinWidth = 750 + Left = 294 + Height = 680 + Top = 123 + Width = 982 + Caption = 'UO CentrED+' + ClientHeight = 660 + ClientWidth = 982 + Constraints.MinHeight = 680 + Constraints.MinWidth = 980 Font.Height = -11 Menu = MainMenu1 OnActivate = FormActivate OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy - Position = poScreenCenter - SessionProperties = 'acFlat.Checked;acNoDraw.Checked;Height;Left;mnuFlatShowHeight.Checked;mnuSecurityQuestion.Checked;mnuShowAnimations.Checked;spTileList.Top;tbStatics.Down;tbTerrain.Down;Top;Width;WindowState;mnuWhiteBackground.Checked' - ShowInTaskBar = stAlways - LCLVersion = '0.9.29' + OnKeyDown = FormKeyDown + OnShow = FormShow + OnWindowStateChange = FormWindowStateChange + SessionProperties = 'acFlat.Checked;acLightlevel.Tag;acNoDraw.Checked;acStatics.Checked;acTerrain.Checked;acWalkable.Checked;cbStatics.Checked;cbTerrain.Checked;Height;Left;mnuAutoHideGroupList.Checked;mnuAutoHideGroupList.Tag;mnuAutoHideRandomList.Checked;mnuAutoHideRandomList.Tag;mnuAutoShowFilterWindow.Checked;mnuCompactHueSettings.Checked;mnuFlatShowHeight.Checked;mnuMiscTileListCentre.Checked;mnuMiscTileListClip.Checked;mnuMiscTileListDrawInfo.Checked;mnuMiscTileListLarge.Checked;mnuMiscTileListMidle.Checked;mnuMiscTileListSmall.Checked;mnuMiscTileListStretch.Checked;mnuMiscTileListTable.Checked;mnuSecurityQuestion.Checked;mnuShowAnimations.Checked;mnuShowBlocks.Checked;mnuShowBridges.Checked;mnuShowFoliage.Checked;mnuShowGrid.Checked;mnuShowLightSource.Checked;mnuShowNoDrawTiles.Checked;mnuShowRoofs.Checked;mnuShowSurfaces.Checked;mnuShowWalls.Checked;mnuShowWater.Checked;mnuTileListCentre.Checked;mnuTileListClip.Checked;mnuTileListDrawInfo.Checked;mnuTileListLarge.Checked;mnuTileListMidle.Checked;mnuTileListSmall.Checked;mnuTileListStretch.Checked;mnuTileListTable.Checked;mnuWhiteBackground.Checked;mnuWindowedMode.Checked;mnuWindowedMode.Tag;pcLeft.TabIndex;spGroupList.Top;spTileList.Top;Tag;Top;Width;WindowState;mnuMiscTileListDrawInfo.Enabled;mnuTileListDrawInfo.Enabled' + LCLVersion = '0.9.30.2' WindowState = wsMaximized - object pnlBottom: TPanel - Left = 0 - Height = 31 - Top = 528 - Width = 755 - Align = alBottom - BevelOuter = bvNone - ClientHeight = 31 - ClientWidth = 755 - TabOrder = 0 - object lblX: TLabel - Left = 11 - Height = 14 - Top = 7 - Width = 10 - Caption = 'X:' - ParentColor = False - end - object lblY: TLabel - Left = 88 - Height = 14 - Top = 7 - Width = 9 - Caption = 'Y:' - ParentColor = False - end - object lblTileInfo: TLabel - Left = 240 - Height = 14 - Top = 7 - Width = 4 - Caption = ' ' - ParentColor = False - end - object lblTip: TLabel - Left = 523 - Height = 31 - Top = 0 - Width = 224 - Align = alRight - Alignment = taRightJustify - BorderSpacing.Right = 8 - Caption = 'Right click shows a menu with all the tools.' - Layout = tlCenter - ParentColor = False - end - object lblTipC: TLabel - Left = 500 - Height = 31 - Top = 0 - Width = 23 - Align = alRight - Caption = 'Tip: ' - Font.Height = -11 - Font.Style = [fsBold] - Layout = tlCenter - ParentColor = False - ParentFont = False - end - object edX: TSpinEdit - Left = 24 - Height = 21 - Top = 3 - Width = 55 - MaxValue = 100000 - TabOrder = 0 - end - object edY: TSpinEdit - Left = 104 - Height = 21 - Top = 3 - Width = 52 - MaxValue = 100000 - TabOrder = 1 - end - object btnGoTo: TButton - Left = 168 - Height = 23 - Top = 3 - Width = 51 - BorderSpacing.InnerBorder = 4 - Caption = 'GoTo' - OnClick = btnGoToClick - TabOrder = 2 - end - end object pcLeft: TPageControl + Cursor = crArrow Left = 0 - Height = 504 - Top = 24 + Height = 660 + Top = 0 Width = 224 ActivePage = tsTiles Align = alLeft TabIndex = 0 - TabOrder = 1 + TabOrder = 0 + OnChange = pcLeftChange + OnResize = pcLeftResize object tsTiles: TTabSheet - Caption = 'Tiles' - ClientHeight = 478 + Caption = ' Тайлы ' + ClientHeight = 634 ClientWidth = 216 - object lblFilter: TLabel - AnchorSideLeft.Control = cbTerrain - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cbTerrain - Left = 75 - Height = 14 - Top = 8 - Width = 30 - BorderSpacing.Left = 16 - Caption = 'Filter:' - ParentColor = False - end object vdtTiles: TVirtualDrawTree - Tag = 1 + Tag = -1 AnchorSideLeft.Control = tsTiles - AnchorSideTop.Control = cbStatics + AnchorSideTop.Control = spGroupList AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tsTiles AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = spTileList - Left = 4 - Height = 234 + Left = 0 + Height = 64 Hint = '-' - Top = 50 - Width = 208 + Top = 295 + Width = 213 Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 4 - BorderSpacing.Top = 4 - BorderSpacing.Right = 4 + BorderSpacing.Top = 1 + BorderSpacing.Right = 3 + Color = 6316128 + Colors.BorderColor = 3158064 + Colors.DropMarkColor = clRed + Colors.DropTargetColor = clAqua + Colors.DropTargetBorderColor = clLime + Colors.FocusedSelectionColor = 5781560 + Colors.FocusedSelectionBorderColor = 9465968 + Colors.GridLineColor = 4210752 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 6834248 + Colors.UnfocusedSelectionBorderColor = 5781560 + Constraints.MinHeight = 64 DefaultNodeHeight = 44 - DragMode = dmAutomatic DragOperations = [] DragType = dtVCL + DrawSelectionMode = smBlendedRectangle + Font.Height = -11 Header.AutoSizeIndex = 2 Header.Columns = < item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 2 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 Header.MainColumn = 2 @@ -174,203 +161,251 @@ object frmMain: TfrmMain Header.ParentFont = True Header.Style = hsFlatButtons HintMode = hmHint + ParentFont = False ParentShowHint = False PopupMenu = pmTileList + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical ShowHint = True TabOrder = 0 TreeOptions.AutoOptions = [toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.MiscOptions = [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toFullRowDrag] - TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] + OnChange = vdtTilesChange OnClick = vdtTilesClick + OnDragAllowed = vdtTilesDragAllowed OnDrawHint = vdtTilesDrawHint OnDrawNode = vdtTilesDrawNode OnEnter = vdtTilesEnter OnGetHintSize = vdtTilesGetHintSize + OnKeyDown = FormKeyDown OnKeyPress = vdtTilesKeyPress + OnMouseDown = FormMouseDown + OnMouseMove = FormMouseMove OnScroll = vdtTilesScroll end + object spTileList: TSplitter + AnchorSideLeft.Control = tsTiles + AnchorSideRight.Control = tsTiles + AnchorSideRight.Side = asrBottom + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 290 + Width = 216 + Align = alNone + Anchors = [akTop, akLeft, akRight] + OnMoved = spTileListMoved + ResizeAnchor = akBottom + end + object lblFilter: TLabel + AnchorSideLeft.Control = cbTerrain + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = tsTiles + Cursor = crArrow + Left = 79 + Height = 14 + Top = 0 + Width = 85 + BorderSpacing.Left = 16 + Caption = 'Фильтр / Поиск:' + ParentColor = False + end object gbRandom: TGroupBox + AnchorSideLeft.Control = tsTiles AnchorSideTop.Control = spTileList AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = tsTiles AnchorSideBottom.Control = tsTiles - AnchorSideBottom.Side = asrBottom + Cursor = crArrow Left = 0 - Height = 189 - Top = 289 + Height = 339 + Top = 295 Width = 216 Align = alBottom Anchors = [akTop, akLeft, akRight, akBottom] - Caption = 'Random pool' - ClientHeight = 171 + BidiMode = bdRightToLeft + Caption = 'Набор случайных тайлов' + ClientHeight = 321 ClientWidth = 212 + Constraints.MinHeight = 1 + ParentBidiMode = False + ParentColor = False TabOrder = 1 object btnAddRandom: TSpeedButton - AnchorSideLeft.Control = gbRandom - AnchorSideTop.Control = gbRandom - Left = 4 + AnchorSideLeft.Control = btnDeleteRandom + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnClearRandom + Cursor = crArrow + Left = 47 Height = 22 - Hint = 'Add' - Top = 0 + Hint = 'Добавить выделенное' + Top = -4 Width = 23 - BorderSpacing.Left = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003A8C44FF368940FF32873CFF2F84 - 37FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000459653FF419950FF7DC28FFF96D0A6FF96CFA6FF78BE - 89FF368D42FF2C8134FF00000000000000000000000000000000000000000000 - 0000000000004D9C5DFF64B478FFA8DBB5FF87CC98FF66BC7DFF64BA7CFF86CB - 98FFA5D9B4FF58AA6BFF2C8134FF000000000000000000000000000000000000 - 000056A366FF6AB97DFFA8DBB2FF60BC77FF5CBA73FF59B870FF59B56FFF58B5 - 6FFF5BB774FFA5D9B3FF5AAA6CFF2C8234FF0000000000000000000000000000 - 000053AB68FFAADDB4FF64C179FF5FBE71FF60BC77FFFFFFFFFFFFFFFFFF59B8 - 70FF58B56EFF5CB774FFA6DAB4FF388F43FF00000000000000000000000061AC - 75FF8ACC98FF89D396FF6BC67AFF63C170FF55AB65FFFFFFFFFFFFFFFFFF59B8 - 70FF59B870FF5BB972FF85CC97FF7BBE8DFF308539FF000000000000000065AF - 7AFFA9DDB3FF7DCF8AFF75CC81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF67BE7DFF9CD4ABFF34883DFF000000000000000069B2 - 7EFFB6E2BEFF8BD597FF7AC986FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF69C17EFF9DD4AAFF388B42FF00000000000000006DB5 - 83FFACDDB6FFA6DFAFFF81CB8CFF7CC986FF6EBD79FFFFFFFFFFFFFFFFFF5BAC - 6AFF60BC77FF5CBA73FF8BD199FF80C592FF3C8E47FF00000000000000000000 - 000085C797FFD2EED7FF95D9A0FF8AD394FF7FC889FFFFFFFFFFFFFFFFFF79CD - 85FF6BC37CFF6FC77EFFACDFB5FF459E57FF0000000000000000000000000000 - 000070B887FFAADAB7FFD8F1DCFF92D89DFF88CD93FF84CC8EFF8BD496FF8AD4 - 95FF83D28EFFAFE0B7FF6BB97DFF489856FF0000000000000000000000000000 - 00000000000070B887FFAFDCBBFFDCF2E0FFB6E4BDFF9BDBA5FF96D9A0FFA5DF - AFFFC0E8C5FF79C28AFF509E5FFF000000000000000000000000000000000000 - 0000000000000000000071B887FF94CEA4FFC3E6CBFFCFEBD4FFC9E9CEFFAFDD - B8FF6DB97FFF58A569FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000006EB684FF6AB380FF67B17CFF63AE - 77FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnAddRandomClick + ShowCaption = False ShowHint = True + ParentBidiMode = False ParentShowHint = False end object btnDeleteRandom: TSpeedButton - AnchorSideLeft.Control = btnAddRandom + AnchorSideLeft.Control = btnClearRandom AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = btnAddRandom - Left = 31 + AnchorSideTop.Control = btnClearRandom + Cursor = crArrow + Left = 24 Height = 22 - Hint = 'Delete' - Top = 0 + Hint = 'Удалить выделенное' + Top = -4 Width = 23 BorderSpacing.Left = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003853BEFF3551BDFF304BBCFF2E4E - B8FF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FF00000000000000000000000000000000000000000000 - 0000000000004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FF000000000000000000000000000000000000 - 00005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FF0000000000000000000000000000 - 00004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF0000000000000000000000005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF00000000000000005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF00000000000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF0000000000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF00000000000000000000 - 00007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF0000000000000000000000000000 - 00006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF0000000000000000000000000000 - 0000000000006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFF000000000000000000000000000000000000 - 000000000000000000006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF00000000000000000000000000000000000000000000 - 000000000000000000000000000000000000686ADDFF6364DCFF6164DAFF5D63 - D9FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnDeleteRandomClick + ShowCaption = False ShowHint = True + ParentBidiMode = False ParentShowHint = False end object btnClearRandom: TSpeedButton AnchorSideLeft.Control = btnDeleteRandom AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnDeleteRandom - Left = 58 + Cursor = crArrow + Left = -3 Height = 22 - Hint = 'Clear' - Top = 0 + Hint = 'Очистить список' + Top = -4 Width = 23 - BorderSpacing.Left = 4 - Color = clBtnFace + Anchors = [] + BorderSpacing.Left = 2 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000 - EFFF0000EDFF0000EDFF00000000000000000000000000000000000000000000 - 0000000000000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443 - F7FF3242F7FF141BF1FF0000EDFF000000000000000000000000000000000000 - 00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909 - F5FF161BF5FF3343F7FF141BF1FF0000EDFF0000000000000000000000000000 - F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333 - F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF00000000000000000000 - FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA - FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF00000000000000000000 - FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1 - FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00000000000000000000 - FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF00000000000000000000 - FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF00000000000000000000 - FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2 - FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FF00000000000000000000 - FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC - FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000000000000000 - FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B - FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000 - 00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D - FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000 - 0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663 - FEFF5461FEFF2227FCFF0000FBFF000000000000000000000000000000000000 - 000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000 - FDFF0000FDFF0000FDFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnClearRandomClick + ShowCaption = False ShowHint = True + ParentBidiMode = False ParentShowHint = False end object btnRandomPresetSave: TSpeedButton AnchorSideTop.Control = cbRandomPreset AnchorSideRight.Control = btnRandomPresetDelete - Left = 160 + Cursor = crArrow + Left = 162 Height = 22 - Hint = 'Save Preset' - Top = 146 + Hint = 'Сохранить набор' + Top = 296 Width = 22 Anchors = [akTop, akRight] BorderSpacing.Right = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -411,20 +446,20 @@ object frmMain: TfrmMain OnClick = btnRandomPresetSaveClick ShowCaption = False ShowHint = True + ParentBidiMode = False ParentShowHint = False end object btnRandomPresetDelete: TSpeedButton AnchorSideTop.Control = btnRandomPresetSave - AnchorSideRight.Control = gbRandom + AnchorSideRight.Control = vdtRandom AnchorSideRight.Side = asrBottom - Left = 186 + Cursor = crArrow + Left = 188 Height = 22 - Hint = 'Delete Preset' - Top = 146 + Hint = 'Удалить набор' + Top = 296 Width = 22 Anchors = [akTop, akRight] - BorderSpacing.Right = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 @@ -465,10 +500,11 @@ object frmMain: TfrmMain OnClick = btnRandomPresetDeleteClick ShowCaption = False ShowHint = True + ParentBidiMode = False ParentShowHint = False end object vdtRandom: TVirtualDrawTree - Tag = 1 + Tag = -1 AnchorSideLeft.Control = gbRandom AnchorSideTop.Control = btnAddRandom AnchorSideTop.Side = asrBottom @@ -476,15 +512,25 @@ object frmMain: TfrmMain AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbRandomPreset Cursor = 63 - Left = 4 - Height = 118 - Top = 24 - Width = 204 + Left = 2 + Height = 272 + Top = 20 + Width = 208 Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 4 + BorderSpacing.Left = 2 BorderSpacing.Top = 2 - BorderSpacing.Right = 4 + BorderSpacing.Right = 2 BorderSpacing.Bottom = 4 + Color = 16052980 + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 DefaultNodeHeight = 44 DragType = dtVCL Header.AutoSizeIndex = 0 @@ -492,78 +538,198 @@ object frmMain: TfrmMain item Position = 0 Text = 'ID' + Width = 40 end item Position = 1 - Text = 'Tile' + Text = 'Тайл' Width = 44 end item Position = 2 - Text = 'Name' - Width = 100 + Text = 'Название' + Width = 108 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 3 + Text = 'tile_separator' + Width = 2 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 4 + Text = 'tile_S1' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 5 + Text = 'tile_S2' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 6 + Text = 'tile_S3' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 7 + Text = 'tile_S4' + Width = 46 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 8 + Text = 'tile_M1' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 9 + Text = 'tile_M2' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 10 + Text = 'tile_M3' + Width = 62 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 11 + Text = 'tile_L1' + Width = 93 + end + item + Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coAllowFocus] + Position = 12 + Text = 'tile_L2' + Width = 93 + end + item + MaxWidth = 10 + MinWidth = 0 + Position = 13 + Text = 'tile_separator' + Width = 2 end> Header.DefaultHeight = 17 - Header.Options = [hoColumnResize, hoDrag, hoVisible] + Header.Options = [hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + LineStyle = lsCustomStyle + ParentBiDiMode = False + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical TabOrder = 0 TreeOptions.AutoOptions = [toAutoDropExpand, toAutoScroll, toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] - TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] - TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.MiscOptions = [toAcceptOLEDrop, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toStaticBackground] + TreeOptions.SelectionOptions = [toFullRowSelect] OnClick = vdtRandomClick OnDragOver = vdtRandomDragOver OnDragDrop = vdtRandomDragDrop OnDrawNode = vdtTilesDrawNode OnLoadNode = vdtRandomLoadNode + OnMouseMove = FormMouseMove OnSaveNode = vdtRandomSaveNode OnUpdating = vdtRandomUpdating end object cbRandomPreset: TComboBox - AnchorSideLeft.Control = gbRandom + AnchorSideLeft.Control = vdtRandom AnchorSideRight.Control = btnRandomPresetSave AnchorSideBottom.Control = gbRandom AnchorSideBottom.Side = asrBottom - Left = 4 + Cursor = crArrow + Left = 2 Height = 21 - Top = 146 - Width = 152 + Top = 296 + Width = 156 Anchors = [akLeft, akRight, akBottom] - BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 ItemHeight = 13 OnChange = cbRandomPresetChange + ParentBidiMode = False Sorted = True Style = csDropDownList TabOrder = 1 end end - object spTileList: TSplitter + object cbStatics: TCheckBox + AnchorSideLeft.Control = cbTerrain + AnchorSideTop.Control = cbTerrain + Cursor = crArrow + Left = 4 + Height = 19 + Top = 18 + Width = 62 + BorderSpacing.Top = 16 + Caption = 'Статика' + OnChange = cbStaticsChange + TabOrder = 4 + end + object cbTerrain: TCheckBox + AnchorSideLeft.Control = tsTiles + AnchorSideTop.Control = tsTiles + Cursor = crArrow + Left = 4 + Height = 19 + Top = 2 + Width = 59 + BorderSpacing.Left = 4 + BorderSpacing.Top = 2 + Caption = 'Рельеф' + OnChange = cbTerrainChange + TabOrder = 5 + end + object edFilter: TEdit + AnchorSideLeft.Control = lblFilter + AnchorSideTop.Control = lblFilter + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = tsTiles + AnchorSideRight.Side = asrBottom + Cursor = crIBeam + Left = 79 + Height = 21 + Top = 14 + Width = 121 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Right = 16 + OnEditingDone = edFilterEditingDone + TabOrder = 3 + end + object spGroupList: TSplitter AnchorSideLeft.Control = tsTiles AnchorSideRight.Control = tsTiles AnchorSideRight.Side = asrBottom Cursor = crVSplit Left = 0 Height = 5 - Top = 284 + Top = 289 Width = 216 Align = alNone Anchors = [akLeft, akRight, akBottom] - ResizeAnchor = akBottom + OnMoved = spGroupListMoved + ResizeAnchor = akTop end object edSearchID: TEdit AnchorSideRight.Control = vdtTiles AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = vdtTiles AnchorSideBottom.Side = asrBottom - Left = 108 + Left = 97 Height = 21 Hint = 'Append S or T to restrict the search to Statics or Terrain.' - Top = 255 + Top = 330 Width = 96 Anchors = [akRight, akBottom] - BorderSpacing.Right = 8 + BorderSpacing.Right = 20 BorderSpacing.Bottom = 8 CharCase = ecUppercase OnExit = edSearchIDExit @@ -573,261 +739,371 @@ object frmMain: TfrmMain TabOrder = 2 Visible = False end - object edFilter: TEdit - AnchorSideLeft.Control = lblFilter - AnchorSideTop.Control = lblFilter + object tvGroups: TVirtualStringTree + AnchorSideLeft.Control = tsTiles + AnchorSideTop.Control = cbStatics AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tsTiles AnchorSideRight.Side = asrBottom - Left = 75 - Height = 21 - Top = 22 - Width = 125 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Right = 16 - OnEditingDone = edFilterEditingDone - TabOrder = 4 - end - object cbStatics: TCheckBox - AnchorSideLeft.Control = cbTerrain - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = cbTerrain - AnchorSideTop.Side = asrBottom - Left = 5 - Height = 19 - Top = 27 - Width = 53 - Caption = 'Statics' - Checked = True - OnChange = cbStaticsChange - State = cbChecked - TabOrder = 5 - end - object cbTerrain: TCheckBox - AnchorSideLeft.Control = tsTiles - AnchorSideTop.Control = tsTiles - Left = 4 - Height = 19 - Top = 8 - Width = 55 - BorderSpacing.Left = 4 - BorderSpacing.Top = 8 - Caption = 'Terrain' - Checked = True - OnChange = cbTerrainChange - State = cbChecked - TabOrder = 6 - end - end - object tsClients: TTabSheet - Caption = 'Clients' - ClientHeight = 478 - ClientWidth = 216 - object lbClients: TListBox + AnchorSideBottom.Control = spGroupList + Cursor = crArrow Left = 0 - Height = 478 - Top = 0 - Width = 216 - Align = alClient - ItemHeight = 0 - OnDblClick = mnuGoToClientClick - PopupMenu = pmClients - Sorted = True - TabOrder = 0 + Height = 251 + Top = 38 + Width = 213 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Top = 1 + BorderSpacing.Right = 3 + ButtonFillMode = fmWindowColor + Color = 16052980 + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 + Constraints.MinHeight = 1 + DefaultText = 'NoName' + Header.AutoSizeIndex = 0 + Header.Columns = <> + Header.DefaultHeight = 17 + Header.MainColumn = -1 + LineStyle = lsSolid + ScrollBarOptions.AlwaysVisible = True + ScrollBarOptions.ScrollBars = ssVertical + SelectionCurveRadius = 8 + TabOrder = 8 + TextMargin = 0 + TreeOptions.MiscOptions = [toAcceptOLEDrop, toFullRepaintOnResize, toToggleOnDblClick, toWheelPanning] + TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowRoot, toShowTreeLines] + TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect] + TreeOptions.StringOptions = [] + OnChange = tvGroupsChange + OnDrawText = tvGroupsDrawText + OnFreeNode = tvGroupFreeNode + OnGetText = tvGroupsGetText + OnKeyDown = FormKeyDown + OnMouseDown = FormMouseDown + OnMouseMove = FormMouseMove end end - object tsLocations: TTabSheet - Caption = 'Locations' - ClientHeight = 478 + object tsObjects: TTabSheet + Caption = 'Объекты' + TabVisible = False + end + object tsNavigation: TTabSheet + Caption = 'Навигация' + ClientHeight = 634 ClientWidth = 216 - object btnClearLocations: TSpeedButton - AnchorSideLeft.Control = btnDeleteLocation - AnchorSideLeft.Side = asrBottom + OnContextPopup = tsNavigationContextPopup + object gbGoTo: TGroupBox + AnchorSideLeft.Control = tsNavigation AnchorSideTop.Control = btnDeleteLocation - Left = 125 - Height = 22 - Hint = 'Clear' - Top = 452 - Width = 23 - BorderSpacing.Left = 4 - Color = clBtnFace - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000 - EFFF0000EDFF0000EDFF00000000000000000000000000000000000000000000 - 0000000000000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443 - F7FF3242F7FF141BF1FF0000EDFF000000000000000000000000000000000000 - 00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909 - F5FF161BF5FF3343F7FF141BF1FF0000EDFF0000000000000000000000000000 - F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333 - F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF00000000000000000000 - FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA - FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF00000000000000000000 - FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1 - FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00000000000000000000 - FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF00000000000000000000 - FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF00000000000000000000 - FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2 - FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FF00000000000000000000 - FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC - FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000000000000000 - FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B - FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000 - 00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D - FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000 - 0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663 - FEFF5461FEFF2227FCFF0000FBFF000000000000000000000000000000000000 - 000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000 - FDFF0000FDFF0000FDFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 - } - NumGlyphs = 0 - OnClick = btnClearLocationsClick - ShowHint = True - ParentShowHint = False - end - object btnDeleteLocation: TSpeedButton - AnchorSideLeft.Control = tsLocations - AnchorSideLeft.Side = asrCenter - AnchorSideBottom.Control = tsLocations + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = tsNavigation + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = tsNavigation AnchorSideBottom.Side = asrBottom - Left = 98 - Height = 22 - Hint = 'Delete' - Top = 452 - Width = 23 - Anchors = [akLeft, akBottom] + Cursor = crArrow + Left = 0 + Height = 52 + Top = 578 + Width = 216 + Anchors = [akLeft, akRight, akBottom] + BidiMode = bdRightToLeft BorderSpacing.Bottom = 4 - Color = clBtnFace - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003853BEFF3551BDFF304BBCFF2E4E - B8FF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FF00000000000000000000000000000000000000000000 - 0000000000004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FF000000000000000000000000000000000000 - 00005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FF0000000000000000000000000000 - 00004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF0000000000000000000000005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF00000000000000005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF00000000000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF0000000000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF00000000000000000000 - 00007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF0000000000000000000000000000 - 00006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF0000000000000000000000000000 - 0000000000006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFF000000000000000000000000000000000000 - 000000000000000000006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF00000000000000000000000000000000000000000000 - 000000000000000000000000000000000000686ADDFF6364DCFF6164DAFF5D63 - D9FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 - } - NumGlyphs = 0 - OnClick = btnDeleteLocationClick - ShowHint = True - ParentShowHint = False - end - object btnAddLocation: TSpeedButton - AnchorSideTop.Control = btnDeleteLocation - AnchorSideRight.Control = btnDeleteLocation - Left = 71 - Height = 22 - Hint = 'Add' - Top = 452 - Width = 23 - Anchors = [akTop, akRight] - BorderSpacing.Right = 4 - Color = clBtnFace - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003A8C44FF368940FF32873CFF2F84 - 37FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000459653FF419950FF7DC28FFF96D0A6FF96CFA6FF78BE - 89FF368D42FF2C8134FF00000000000000000000000000000000000000000000 - 0000000000004D9C5DFF64B478FFA8DBB5FF87CC98FF66BC7DFF64BA7CFF86CB - 98FFA5D9B4FF58AA6BFF2C8134FF000000000000000000000000000000000000 - 000056A366FF6AB97DFFA8DBB2FF60BC77FF5CBA73FF59B870FF59B56FFF58B5 - 6FFF5BB774FFA5D9B3FF5AAA6CFF2C8234FF0000000000000000000000000000 - 000053AB68FFAADDB4FF64C179FF5FBE71FF60BC77FFFFFFFFFFFFFFFFFF59B8 - 70FF58B56EFF5CB774FFA6DAB4FF388F43FF00000000000000000000000061AC - 75FF8ACC98FF89D396FF6BC67AFF63C170FF55AB65FFFFFFFFFFFFFFFFFF59B8 - 70FF59B870FF5BB972FF85CC97FF7BBE8DFF308539FF000000000000000065AF - 7AFFA9DDB3FF7DCF8AFF75CC81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF67BE7DFF9CD4ABFF34883DFF000000000000000069B2 - 7EFFB6E2BEFF8BD597FF7AC986FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF69C17EFF9DD4AAFF388B42FF00000000000000006DB5 - 83FFACDDB6FFA6DFAFFF81CB8CFF7CC986FF6EBD79FFFFFFFFFFFFFFFFFF5BAC - 6AFF60BC77FF5CBA73FF8BD199FF80C592FF3C8E47FF00000000000000000000 - 000085C797FFD2EED7FF95D9A0FF8AD394FF7FC889FFFFFFFFFFFFFFFFFF79CD - 85FF6BC37CFF6FC77EFFACDFB5FF459E57FF0000000000000000000000000000 - 000070B887FFAADAB7FFD8F1DCFF92D89DFF88CD93FF84CC8EFF8BD496FF8AD4 - 95FF83D28EFFAFE0B7FF6BB97DFF489856FF0000000000000000000000000000 - 00000000000070B887FFAFDCBBFFDCF2E0FFB6E4BDFF9BDBA5FF96D9A0FFA5DF - AFFFC0E8C5FF79C28AFF509E5FFF000000000000000000000000000000000000 - 0000000000000000000071B887FF94CEA4FFC3E6CBFFCFEBD4FFC9E9CEFFAFDD - B8FF6DB97FFF58A569FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000006EB684FF6AB380FF67B17CFF63AE - 77FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 - } - NumGlyphs = 0 - OnClick = btnAddLocationClick - ShowHint = True - ParentShowHint = False + Caption = 'Быстрый переход' + ClientHeight = 34 + ClientWidth = 212 + ParentBidiMode = False + ParentColor = False + TabOrder = 1 + object lblX: TLabel + AnchorSideLeft.Control = gbGoTo + AnchorSideTop.Control = btnGoTo + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = edX + Cursor = crArrow + Left = 15 + Height = 14 + Top = 12 + Width = 10 + Anchors = [akTop, akRight] + BidiMode = bdRightToLeftReadingOnly + BorderSpacing.Right = 2 + Caption = ':X' + ParentBidiMode = False + ParentColor = False + end + object edX: TSpinEdit + AnchorSideTop.Control = btnGoTo + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblY + Cursor = crIBeam + Left = 27 + Height = 21 + Top = 9 + Width = 55 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + MaxValue = 100000 + TabOrder = 0 + end + object lblY: TLabel + AnchorSideTop.Control = btnGoTo + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = edY + Cursor = crArrow + Left = 90 + Height = 14 + Top = 12 + Width = 9 + Anchors = [akTop, akRight] + BorderSpacing.Right = 2 + Caption = ':Y' + ParentBidiMode = False + ParentColor = False + end + object edY: TSpinEdit + AnchorSideTop.Control = btnGoTo + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = btnGoTo + Cursor = crIBeam + Left = 101 + Height = 21 + Top = 9 + Width = 52 + Anchors = [akTop, akRight] + BorderSpacing.Right = 2 + MaxValue = 100000 + TabOrder = 1 + end + object btnGoTo: TButton + AnchorSideRight.Control = gbGoTo + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbGoTo + AnchorSideBottom.Side = asrBottom + Left = 157 + Height = 22 + Top = 8 + Width = 51 + Anchors = [akRight, akBottom] + BorderSpacing.Around = 4 + BorderSpacing.InnerBorder = 4 + Caption = 'Идти' + ParentBidiMode = False + OnClick = btnGoToClick + TabOrder = 2 + end + object btnAddLocation: TSpeedButton + AnchorSideLeft.Control = btnDeleteLocation + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnDeleteLocation + AnchorSideRight.Control = btnDeleteLocation + Left = 56 + Height = 22 + Hint = 'Add' + Top = -17 + Width = 23 + BorderSpacing.Left = 4 + BorderSpacing.Right = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnAddLocationClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object btnDeleteLocation: TSpeedButton + AnchorSideLeft.Control = btnClearLocations + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = gbGoTo + AnchorSideBottom.Control = gbGoTo + Left = 29 + Height = 22 + Hint = 'Delete' + Top = -17 + Width = 23 + Anchors = [] + BorderSpacing.Bottom = 4 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnDeleteLocationClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end + object btnClearLocations: TSpeedButton + AnchorSideLeft.Control = vstLocations + AnchorSideTop.Control = btnDeleteLocation + AnchorSideRight.Control = btnDeleteLocation + Left = -2 + Height = 22 + Hint = 'Clear' + Top = -17 + Width = 23 + Anchors = [akTop, akRight] + BorderSpacing.Left = 4 + BorderSpacing.Right = 8 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnClearLocationsClick + ShowCaption = False + ShowHint = True + ParentShowHint = False + end end object vstLocations: TVirtualStringTree - AnchorSideLeft.Control = tsLocations - AnchorSideTop.Control = tsLocations - AnchorSideRight.Control = tsLocations + AnchorSideLeft.Control = tsNavigation + AnchorSideTop.Control = spGroupList1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = tsNavigation AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = btnDeleteLocation + AnchorSideBottom.Control = gbGoTo Cursor = 63 - Left = 4 - Height = 444 - Top = 4 - Width = 208 + Left = 0 + Height = 141 + Top = 433 + Width = 213 Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Around = 4 + BorderSpacing.Right = 3 + BorderSpacing.Bottom = 4 + Color = 16052980 + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 DefaultText = 'Node' Header.AutoSizeIndex = 1 Header.Columns = < item Position = 0 - Text = 'Coords' + Text = 'Кординаты' Width = 75 end item Position = 1 - Text = 'Name' - Width = 133 + Text = 'Название' + Width = 134 end> Header.DefaultHeight = 17 Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible] Header.ParentFont = True Header.Style = hsFlatButtons + SelectionCurveRadius = 8 TabOrder = 0 TreeOptions.AutoOptions = [toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] @@ -839,231 +1115,786 @@ object frmMain: TfrmMain OnNewText = vstLocationsNewText OnSaveNode = vstLocationsSaveNode end + object pbRadar: TPaintBox + AnchorSideLeft.Control = vstLocations + AnchorSideTop.Control = tsNavigation + AnchorSideRight.Control = vstLocations + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = tsNavigation + AnchorSideBottom.Side = asrBottom + Cursor = crCross + Left = 0 + Height = 213 + Top = 4 + Width = 213 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + Color = clBlack + ParentColor = False + OnMouseDown = pbRadarMouseDown + OnPaint = pbRadarPaint + end + object spGroupList1: TSplitter + AnchorSideLeft.Control = vstLocations + AnchorSideRight.Control = vstLocations + AnchorSideRight.Side = asrBottom + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 428 + Width = 213 + Align = alNone + Anchors = [akLeft, akRight] + OnMoved = spGroupListMoved + ResizeAnchor = akTop + end + object vstClients: TVirtualStringTree + AnchorSideLeft.Control = vstLocations + AnchorSideTop.Control = pbRadar + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = vstLocations + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = spGroupList1 + Cursor = 63 + Left = 0 + Height = 211 + Top = 217 + Width = 213 + Anchors = [akTop, akLeft, akRight, akBottom] + Color = 16052980 + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 + DefaultText = 'Node' + Header.AutoSizeIndex = 1 + Header.Columns = < + item + Position = 0 + Width = 18 + end + item + Position = 1 + Text = 'Пользователь' + Width = 91 + end + item + Position = 2 + Text = 'Время входа' + Width = 100 + end> + Header.DefaultHeight = 17 + Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible] + Header.ParentFont = True + Header.Style = hsFlatButtons + Images = frmAccountControl.ilAccesslevel + PopupMenu = pmClients + SelectionCurveRadius = 8 + TabOrder = 3 + TreeOptions.AutoOptions = [toAutoScrollOnExpand, toAutoTristateTracking, toAutoDeleteMovedNodes] + TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages] + TreeOptions.SelectionOptions = [toFullRowSelect] + OnDblClick = mnuGoToClientClick + OnGetText = vstClientsGetText + OnGetImageIndex = vstClientsGetImageIndex + end end end object tbMain: TToolBar - Left = 0 + AnchorSideLeft.Control = oglGameWindow + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Cursor = crArrow + Left = 224 Height = 24 Top = 0 - Width = 755 + Width = 758 + Align = alNone + Anchors = [akTop, akLeft, akRight] Caption = 'tbMain' + Color = 16052980 Images = ImageList1 + ParentColor = False ParentShowHint = False ShowHint = True - TabOrder = 2 + TabOrder = 1 object tbDisconnect: TToolButton + Cursor = crArrow Left = 1 Hint = 'Disconnect' Top = 2 Caption = 'Disconnect' ImageIndex = 0 + OnClick = mnuDisconnectClick ParentShowHint = False ShowHint = True - OnClick = mnuDisconnectClick + Visible = False end object tbSeparator1: TToolButton + Cursor = crArrow Left = 24 Top = 2 - Width = 16 + Width = 4 Style = tbsDivider end object tbSelect: TToolButton - Left = 40 + Cursor = crArrow + Left = 28 + Hint = 'Выбор тайлов' Top = 2 Action = acSelect + Caption = 'Выбор' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end object tbDrawTile: TToolButton - Left = 63 + Cursor = crArrow + Left = 201 + Hint = 'Рисование тайлов' Top = 2 Action = acDraw + Caption = 'Рисование тайлов' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end object tbMoveTile: TToolButton - Left = 86 + Cursor = crArrow + Left = 78 + Hint = 'Перемещение статики' Top = 2 Action = acMove + Caption = 'Перемещение статики' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end object tbElevateTile: TToolButton - Left = 109 + Cursor = crArrow + Left = 101 + Hint = 'Изменение высоты рельефа и статики' Top = 2 Action = acElevate + Caption = 'Изменение высоты' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end object tbDeleteTile: TToolButton - Left = 132 + Cursor = crArrow + Left = 270 + Hint = 'Удаление тайлов' Top = 2 Action = acDelete + Caption = 'Удаление тайлов' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end object tbSetHue: TToolButton - Left = 155 + Cursor = crArrow + Left = 224 + Hint = 'Цвет статики' Top = 2 Action = acHue + Caption = 'Цвет статики' Grouped = True ParentShowHint = False ShowHint = True Style = tbsCheck end - object tbSeparator3: TToolButton - Left = 209 + object tbFill: TToolButton + Cursor = crArrow + Left = 247 Top = 2 - Width = 16 + Action = acFill + Grouped = True + ParentShowHint = False + ShowHint = True + Style = tbsCheck + Visible = False + end + object tbSelection: TToolButton + Cursor = crArrow + Left = 55 + Top = 2 + Action = acSelection + Grouped = True + ParentShowHint = False + ShowHint = True + Style = tbsCheck + Visible = False + end + object tbSurfSmooth: TToolButton + Cursor = crArrow + Left = 174 + Top = 2 + Action = acSurfSmooth + Grouped = True + ParentShowHint = False + ShowHint = True + Style = tbsCheck + Visible = False + end + object tbSurfStretch: TToolButton + Cursor = crArrow + Left = 151 + Top = 2 + Action = acSurfStretch + Grouped = True + ParentShowHint = False + ShowHint = True + Style = tbsCheck + Visible = False + end + object tbSurfElevate: TToolButton + Cursor = crArrow + Left = 128 + Top = 2 + Action = acSurfElevate + Grouped = True + ParentShowHint = False + ShowHint = True + Style = tbsCheck + Visible = False + end + object tbSeparator3: TToolButton + Cursor = crArrow + Left = 124 + Top = 2 + Width = 4 Caption = 'tbSeparator3' Style = tbsDivider end object tbBoundaries: TToolButton - Left = 225 + Cursor = crArrow + Left = 370 + Hint = 'Границы видимости' Top = 2 Action = acBoundaries + Caption = 'Границы видимости' ParentShowHint = False ShowHint = True end object tbSeparator4: TToolButton - Left = 294 + Cursor = crArrow + Left = 583 Top = 2 - Width = 17 + Width = 4 Caption = 'tbSeparator4' Style = tbsDivider end object tbTerrain: TToolButton - Left = 311 - Hint = 'Show Terrain' + Cursor = crArrow + Left = 416 Top = 2 - Caption = 'Terrain' - Down = True - ImageIndex = 10 - ParentShowHint = False - ShowHint = True - Style = tbsCheck - OnClick = tbTerrainClick + Action = acTerrain + DropdownMenu = pmViewTerrainSettings + Style = tbsDropDown end object tbStatics: TToolButton - Left = 334 - Hint = 'Show Statics' + Cursor = crArrow + Left = 451 Top = 2 - Caption = 'Statics' - Down = True - ImageIndex = 11 - ParentShowHint = False - ShowHint = True - Style = tbsCheck - OnClick = tbStaticsClick + Action = acStatics + DropdownMenu = pmViewStaticSettings + Style = tbsDropDown end object tbSeparator5: TToolButton - Left = 461 + Cursor = crArrow + Left = 645 Top = 2 - Width = 17 + Width = 4 Caption = 'tbSeparator5' Style = tbsDivider end object tbRadarMap: TToolButton - Left = 478 - Hint = 'Radar Map' + Cursor = crArrow + Left = 649 + Hint = 'Открыть миникарту' Top = 2 - Caption = 'Radar Map' - ImageIndex = 13 + Caption = 'Миникарта' + ImageIndex = 46 + OnClick = tbRadarMapClick ParentShowHint = False ShowHint = True - OnClick = tbRadarMapClick end object tbVirtualLayer: TToolButton - Left = 248 + Cursor = crArrow + Left = 347 + Hint = 'Виртуальный слой' Top = 2 Action = acVirtualLayer + Caption = 'Виртуальный слой' end object tbFilter: TToolButton - Left = 271 + Cursor = crArrow + Left = 393 + Hint = 'Фильтрация статики' Top = 2 Action = acFilter + Caption = 'Фильтр статики' + OnMouseDown = tbFilterMouseDown + OnMouseUp = tbFilterMouseUp Style = tbsCheck - OnMouseMove = tbFilterMouseMove end object tbFlat: TToolButton - Left = 426 + Cursor = crArrow + Left = 548 + Hint = 'Плоский вид' Top = 2 Action = acFlat + Caption = 'Плоский вид' DropdownMenu = pmFlatViewSettings Style = tbsDropDown end object tbNoDraw: TToolButton - Left = 357 + Cursor = crArrow + Left = 486 + Hint = 'Отображать "No Draw" тайлы' Top = 2 Action = acNoDraw - Style = tbsCheck + DropdownMenu = pmNoDrawSettings + Style = tbsDropDown end object tbSeparator2: TToolButton - Left = 178 + Cursor = crArrow + Left = 293 Top = 2 - Width = 8 + Width = 4 Caption = 'tbSeparator2' Style = tbsDivider end object tbUndo: TToolButton - Left = 186 + Cursor = crArrow + Left = 297 + Hint = 'Отменить последнее действие (0).' Top = 2 Action = acUndo + Caption = 'Отмена' + end + object tbRedo: TToolButton + Cursor = crArrow + Left = 320 + Top = 2 + Action = acRedo + Visible = False end object tbLightlevel: TToolButton - Left = 403 + Cursor = crArrow + Left = 587 + Hint = 'Установка уровня освещенности' Top = 2 Action = acLightlevel + Caption = 'Освещенность' end object tbWalkable: TToolButton - Left = 380 + Cursor = crArrow + Left = 525 + Hint = 'Подсвечивание (не)проходимых поверхностей' Top = 2 Action = acWalkable + Caption = 'Проходимость' Style = tbsCheck end + object tbZoom: TToolButton + Tag = 1000 + Cursor = crArrow + Left = 610 + Hint = 'Масштаб отображения карты' + Top = 2 + Caption = 'Zoom Mode' + DropdownMenu = pmZoomSettings + ImageIndex = 35 + OnClick = mnuZoomClick + Style = tbsDropDown + end + object tbSeparator6: TToolButton + Cursor = crArrow + Left = 197 + Top = 2 + Width = 4 + Caption = 'tbSeparator2' + Style = tbsDivider + Visible = False + end + object tbSeparator7: TToolButton + Cursor = crArrow + Left = 51 + Top = 2 + Width = 4 + Caption = 'tbSeparator2' + Style = tbsDivider + end + object tbSeparator8: TToolButton + Cursor = crArrow + Left = 521 + Top = 2 + Width = 4 + Caption = 'tbSeparator2' + Style = tbsDivider + end + object tbSeparator9: TToolButton + Cursor = crArrow + Left = 343 + Top = 2 + Width = 4 + Caption = 'tbSeparator2' + Style = tbsDivider + end end object pnlChatHeader: TPanel - AnchorSideLeft.Control = pnlChat - AnchorSideTop.Control = spChat - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = pnlChat + AnchorSideLeft.Control = pcLeft + AnchorSideLeft.Side = asrBottom + AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = spChat + Cursor = crArrow Left = 224 - Height = 22 - Top = 392 - Width = 531 + Height = 20 + Top = 495 + Width = 758 Anchors = [akLeft, akRight, akBottom] BevelInner = bvRaised BevelOuter = bvLowered - ClientHeight = 22 - ClientWidth = 531 - TabOrder = 3 + ClientHeight = 20 + ClientWidth = 758 + TabOrder = 2 object lblChatHeaderCaption: TLabel Cursor = crHandPoint Left = 10 - Height = 18 + Height = 16 Top = 2 - Width = 101 + Width = 95 Align = alLeft BorderSpacing.Left = 8 - Caption = 'Chat and Messages' + Caption = 'Чат и Сообщения' Layout = tlCenter ParentColor = False OnClick = lblChatHeaderCaptionClick OnMouseEnter = lblChatHeaderCaptionMouseEnter OnMouseLeave = lblChatHeaderCaptionMouseLeave end + object lblTileInfoHueValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = pnlChatHeader + AnchorSideRight.Side = asrBottom + Cursor = crArrow + Left = 720 + Height = 14 + Top = 3 + Width = 32 + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 4 + Caption = '0x001' + Font.Color = 747267 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoHueLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoHueValue + Cursor = crArrow + Left = 686 + Height = 14 + Top = 3 + Width = 32 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Цвет:' + Font.Color = 747267 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoZValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoHueLabel + Cursor = crArrow + Left = 662 + Height = 14 + Top = 3 + Width = 22 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = '-127' + Font.Color = 10093825 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoZLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoZValue + Cursor = crArrow + Left = 648 + Height = 14 + Top = 3 + Width = 12 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Z:' + Font.Color = 10093825 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoYValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoZLabel + Cursor = crArrow + Left = 622 + Height = 14 + Top = 3 + Width = 24 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = '8192' + Font.Color = 10093825 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoYLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoYValue + Cursor = crArrow + Left = 608 + Height = 14 + Top = 3 + Width = 12 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Y:' + Font.Color = 10093825 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoXValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoYLabel + Cursor = crArrow + Left = 576 + Height = 14 + Top = 3 + Width = 30 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = '12288' + Font.Color = 10093825 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoXLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoXValue + Cursor = crArrow + Left = 562 + Height = 14 + Top = 3 + Width = 12 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'X:' + Font.Color = 10093825 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoIDValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoXLabel + Cursor = crArrow + Left = 520 + Height = 14 + Top = 3 + Width = 40 + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = '0x0001' + Font.Color = 1319028 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoIDLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoIDValue + Cursor = crArrow + Left = 448 + Height = 14 + Top = 3 + Width = 70 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Статика ID:' + Font.Color = 1319028 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoCLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoIDLabel + Cursor = crArrow + Left = 438 + Height = 14 + Top = 3 + Width = 8 + Alignment = taCenter + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = ']' + Font.Color = 4210752 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoHValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoCLabel + Cursor = crArrow + Left = 418 + Height = 14 + Top = 3 + Width = 20 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + Caption = '100' + Font.Color = 4210752 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoHLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoHValue + Cursor = crArrow + Left = 370 + Height = 14 + Top = 3 + Width = 46 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Высота:' + Font.Color = 4210752 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoWValue: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoHLabel + Cursor = crArrow + Left = 348 + Height = 14 + Top = 3 + Width = 20 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = '800' + Font.Color = 4210752 + Font.Height = -11 + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lblTileInfoWLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoWValue + Cursor = crArrow + Left = 298 + Height = 14 + Top = 3 + Width = 48 + Alignment = taRightJustify + Anchors = [akTop, akRight] + AutoSize = False + BorderSpacing.Right = 2 + Caption = 'Ширина:' + Font.Color = 4210752 + Font.Height = -11 + ParentColor = False + ParentFont = False + end + object lblTileInfoOLabel: TLabel + AnchorSideTop.Control = pnlChatHeader + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = lblTileInfoWLabel + Cursor = crArrow + Left = 292 + Height = 14 + Top = 3 + Width = 6 + Alignment = taCenter + Anchors = [akTop, akRight] + AutoSize = False + Caption = '[' + Font.Color = 4210752 + Font.Height = -11 + ParentColor = False + ParentFont = False + end end object pnlChat: TPanel AnchorSideLeft.Control = pcLeft @@ -1072,41 +1903,52 @@ object frmMain: TfrmMain AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = pnlBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom Left = 224 - Height = 109 - Top = 419 - Width = 531 + Height = 140 + Top = 520 + Width = 758 Anchors = [akTop, akLeft, akRight, akBottom] BevelOuter = bvNone - ClientHeight = 109 - ClientWidth = 531 - TabOrder = 4 + ClientHeight = 140 + ClientWidth = 758 + TabOrder = 3 Visible = False object vstChat: TVirtualStringTree Cursor = 63 Left = 0 - Height = 88 + Height = 119 Top = 0 - Width = 531 + Width = 758 Align = alClient + Color = 16052980 + Colors.DropMarkColor = 16762250 + Colors.DropTargetColor = 16762250 + Colors.DropTargetBorderColor = 16762250 + Colors.FocusedSelectionColor = 16762250 + Colors.FocusedSelectionBorderColor = 16762250 + Colors.SelectionRectangleBlendColor = 16762250 + Colors.SelectionRectangleBorderColor = 16762250 + Colors.UnfocusedSelectionColor = 16769734 + Colors.UnfocusedSelectionBorderColor = 16769734 DefaultText = 'Node' Header.AutoSizeIndex = 2 Header.Columns = < item Position = 0 - Text = 'Time' + Text = 'Время' Width = 75 end item Position = 1 - Text = 'Sender' + Text = 'Отправил' Width = 75 end item Position = 2 - Text = 'Message' - Width = 381 + Text = 'Сообщение' + Width = 604 end> Header.DefaultHeight = 17 Header.MainColumn = 2 @@ -1123,28 +1965,30 @@ object frmMain: TfrmMain OnPaintText = vstChatPaintText end object edChat: TEdit + Cursor = crIBeam Left = 0 Height = 21 - Top = 88 - Width = 531 + Top = 119 + Width = 758 Align = alBottom + Anchors = [akLeft, akRight] OnKeyPress = edChatKeyPress TabOrder = 1 end end object spChat: TSplitter - AnchorSideLeft.Control = pcLeft - AnchorSideLeft.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Cursor = crVSplit - Left = 224 + Left = 222 Height = 5 - Top = 414 - Width = 531 - Align = alNone + Top = 515 + Width = 760 + Align = alCustom Anchors = [akLeft, akRight, akBottom] AutoSnap = False + Color = 16052980 + ParentColor = False ResizeAnchor = akBottom Visible = False end @@ -1157,10 +2001,11 @@ object frmMain: TfrmMain AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlChatHeader Left = 224 - Height = 368 + Height = 471 Top = 24 - Width = 531 + Width = 758 Anchors = [akTop, akLeft, akRight, akBottom] + OnClick = oglGameWindowClick OnDblClick = oglGameWindowDblClick OnKeyDown = oglGameWindowKeyDown OnMouseDown = oglGameWindowMouseDown @@ -1174,12 +2019,102 @@ object frmMain: TfrmMain end object MainMenu1: TMainMenu Images = ImageList1 - left = 232 + left = 296 top = 33 object mnuCentrED: TMenuItem - Caption = '&CentrED' + Caption = '&CentrED+' + object mnuMakeScreenShot: TMenuItem + Caption = 'Сделать скриншот' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A9A8A8003030 + 30178A8A8A20CECECE21C4C4C421C4C4C421C4C4C421C4C4C421C4C4C421C4C4 + C421C4C4C421C4C4C421CECECF218A8A8A202728281988898800A8A7A7133435 + 359C2C2D2DBA474747BB434444BB434444BB434444BB404141BB404141BB4344 + 44BB434444BB434444BB474748BB2D2E2EBA2C2D2DA587888718848484710506 + 06FF010202FF000000FF000000FF000000FF000000FF010202FF030404FF0000 + 00FF000000FF000000FF000000FF010202FF060707FF696A69915B5C5CA60304 + 04FF0A0B0BFF0A0B0BFF090A0AFF070808FF626262FFB4B4B4FFB6B6B6FF6D6D + 6DFF0B0C0CFF090A0AFF0A0B0BFF0A0B0BFF050606FF454646C25B5C5CA50405 + 05FF0A0A0BFF0A0B0BFF010101FF747575FFDCDCDCFF6C6D6DFF666666FFD7D7 + D7FF868686FF010202FF090B0BFF0A0B0BFF060707FF444545C25B5C5DA50405 + 05FF0A0B0BFF040505FF1D1E1EFFD4D4D4FF4D4D4DFF000000FF000000FF3D3E + 3EFFD6D6D6FF2C2D2DFF020303FF0A0B0BFF060707FF444545C25B5C5CA50405 + 05FF0A0B0BFF010202FF313232FFD5D5D5FF212121FF050606FF050606FF1718 + 18FFCDCDCDFF434444FF000000FF0A0B0BFF060707FF444545C25B5C5CA50405 + 05FF0A0B0BFF070808FF0D0E0EFFC4C4C4FF8C8D8DFF040505FF000101FF7A7B + 7BFFCECECEFF181818FF050606FF0A0B0BFF060707FF444545C25A5B5BA70405 + 05FF0A0B0BFF0A0B0BFF020303FF404040FFDBDBDBFFC3C3C3FFBFBFBFFFDFE0 + E0FF4F4F4FFF010202FF0A0B0BFF0A0B0BFF060707FF424343C46465659F0001 + 02FF0A0B0BFF0A0B0BFF0A0B0BFF040505FF212222FF6F6F6FFF727373FF292A + 2AFF030504FF0A0B0CFF0A0B0BFF0A0B0BFF030404FF4E4F4FBD828282520D0E + 0EFF000000FF020303FF040505FF090A0AFF070808FF000000FF000000FF0708 + 08FF090A0BFF040505FF020303FF000101FF090A0AFF6B6B6B617A7A7A026667 + 673C979898658D8E8E6472737389141515FA000000FF020303FF020303FF0000 + 00FF0D0E0EFF6A6B6B948E908F6296979768595A5A4161616102757575007777 + 7700BDBEBE00ADAEAE00B3B3B31B505151BD292A2ADF303030DD303030DD2A2B + 2BDE464746CBA4A4A42CAFB0B000BBBCBC00696A6A005D5D5D00767676007474 + 7400B6B6B600A9AAAA00CDCDCD04999999558181816E8484846A8484846A8181 + 816C9494945DBEBEBE0EA9A9A900B4B5B500666767005E5E5E00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + ImageIndex = 33 + ShortCut = 16467 + OnClick = mnuMakeScreenShotClick + end + object mnuReloadGroups: TMenuItem + Caption = 'Перезагрузить группы' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 00000000000000000000000000005C403029C68B68A9CE906BE3D2936DE7D494 + 6EB89E6F52660000000000000000000000000000000000000000000000000000 + 00000000000000000000D4956E18D99972BFDA9972C4D99972DCE09F77FAE7A5 + 7EFFD89771EFD4946EB6D2926D0C000000000000000000000000000000000000 + 000000000000DA966E54D6906813000000000000000000000000D5956F94DA9B + 74F3EEB189FFE09D75F8D6946EB3000000000000000000000000000000000000 + 0000DA966E1EDB976FF4DC9870B400000000000000000000000000000000D795 + 6E97E1A37BF7EEB088FFDB9971F0D5946D52000000000000000000000000DA97 + 6F01DC9971CAE8A981FDDF9D75F0DB987056000000000000000000000000D694 + 6E03D8956FE4F1B991FFE6A37BFFD99670BA000000000000000000000000DB98 + 706DE19F77F1EFB289FFEDAF86FFDB9A72ECDA98701500000000D999737FDB9B + 74EDD99771F4E5A67EFDEBA881FFD9966FF7DA9B73F5DA9A73BEDA976F22DB9A + 71F5EAAC83FFEFB289FFECAF86FFE4A47CFCDC9A73BA0000000000000000DA97 + 6FBAECB28BFEEAA982FFECAB83FFE9A67FFFDB976FF5DA966E22DA9972ACDB99 + 73DDDB9A74EDEFB189FFEAAC83FBDA9973F0DB9A75ECDB9C759B00000000DA96 + 6E15DB986FEDF0BD97FFEDAB84FFE09D75F1DB976F6D00000000000000000000 + 0000DA9973BAE9AB83FFEDAF87FFDA9A76E4D898730300000000000000000000 + 0000DB976F56DF9F77F4F3C29BFFDB9870CADA966E0100000000000000000000 + 0000D7987252DFA27DF1F4C49CFFE7AF89F6DCA17B9C00000000000000000000 + 000000000000DB976FB4DB9971F8DA966E1E0000000000000000000000000000 + 000000000000D99B76B3E8B18AF9F6CAA4FFE3AC87F3D89C7894000000000000 + 000000000000D6906813DA966E54000000000000000000000000000000000000 + 000000000000D599750CD79C78B6DBA07BEFE9AC85FFE3A781FADCA17BDBDDA1 + 7BC3DBA07ABCD79B761800000000000000000000000000000000000000000000 + 0000000000000000000000000000D69B774DD99D79B8D69C79E7D79D79DED99E + 7A9DD49976120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 + } + ImageIndex = 31 + ShortCut = 16466 + OnClick = mnuReloadGroupsClick + end + object mnuSetLanguage: TMenuItem + Caption = 'Язык интерфейса' + end + object mnuSeparator1: TMenuItem + Caption = '-' + end object mnuDisconnect: TMenuItem - Caption = '&Disconnect' + Caption = '&Разъединиться' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 200000000000000400006400000064000000000000000000000028415200AB66 @@ -1219,18 +2154,52 @@ object frmMain: TfrmMain ImageIndex = 0 OnClick = mnuDisconnectClick end - object mnuSeparator1: TMenuItem - Caption = '-' - end object mnuExit: TMenuItem - Caption = 'E&xit' + Caption = '&Выйти' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C3DC32D1D3DC1AF1B3CBEE3193ABAFF1535B8FF0E30 + B8E3092CB8AF0428B82DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF002848C6AF2746C4FF0F33C6FF022AC8FF0028C9FF0028C9FF0129 + C8FF062BC2FF092CB7FF0528B6AFFFFFFF00FFFFFF00FFFFFF00FFFFFF008090 + CF083653C9E31E40C8FF0028C9FF0028C9FF0026BCFF0021A2FF001E95FF001E + 95FF0021A2FF0026BCFF062BBDFF0528B4E303209608FFFFFF00FFFFFF003856 + CDAF2445CBFF0028C9FF0028C9FF3F59C3FFBFC7E4FFFFFFFF00FFFFFF00BFC7 + E4FF3F56AFFF001E95FF0023AFFF062BBDFF0528B6AFFFFFFF004863D234415D + CFFF0028C9FF0028C9FF7F92DDFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF007F8ECAFF001E95FF0026BCFF092CB7FF0628B334405DD2BA1E40 + CDFF0028C9FF3F5DD6FFFFFFFF00FFFFFF007084D4FF1035CCFF1035CCFF7086 + E1FFFFFFFF00FFFFFF003F56AFFF0021A2FF062BC2FF082BB9BA5670D7E4052C + CAFF0028C9FFBFC9F1FFFFFFFF006F80C3FF0027C6FF0028C9FF0028C9FF0028 + C9FF6F86E1FFFFFFFF00BFC7E4FF001E95FF0129C8FF0F31B6E45D76D9FF0028 + C9FF0028C9FFFFFFFF00FFFFFF00102C9CFF0027C6FF0028C9FF0027C6FF0027 + C6FF1035CCFFFFFFFF00FFFFFF00001E95FF0028C9FF1535B8FF627ADBFF0028 + C9FF0028C9FFFFFFFF00FFFFFF000F2B9BFF0024B2FF0F35CCFF0F2CA2FF001F + 9CFF0F35CCFFFFFFFF00FFFFFF000021A5FF0028C9FF193ABAFF647CDDE4062D + CAFF0028C9FFAFBCEEFFFFFFFF006F80C3FF001E95FFDFE4F8FFDFE3F2FF001E + 95FF6F86E1FFFFFFFF00AFB8DEFF0025B9FF022AC8FF1D3EBDE4526EDABA2748 + D1FF0028C9FF506BDAFFFFFFFF00FFFFFF00001E95FFFFFFFF00FFFFFF00001E + 95FFFFFFFF00FFFFFF005067C4FF0028C9FF0F33C6FF1B3CC1BA627BDE355E77 + DDFF0028C9FF0028C9FF9FAEEBFFFFFFFF000025B9FFFFFFFF00FFFFFF00001F + 9CFFFFFFFF009FADE5FF0028C9FF0028C9FF2746C4FF2443C235FFFFFF005873 + DCAF3C5BD6FF0028C9FF0028C9FF506BDAFF0028C9FFDFE4F8FFDFE4F8FF0027 + C6FF506BDAFF0028C9FF0028C9FF1E40C8FF2848C6AFFFFFFF00FFFFFF00D9DF + F708637BDEE33C5BD6FF0028C9FF0028C9FF0028C9FF1035CCFF1035CCFF0028 + C9FF0028C9FF0028C9FF2445CBFF3653C9E36C7EC608FFFFFF00FFFFFF00FFFF + FF00FFFFFF005873DCAF5E77DDFF2748D1FF062DCAFF0028C9FF0028C9FF052C + CAFF1E40CDFF415DCFFF3856CDAFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF004B67D92E5772DBAF5D76DCE3627ADBFF5D76D9FF506B + D6E34460D2AF3655D02EFFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + ImageIndex = 98 OnClick = mnuExitClick end end object mnuAdministration: TMenuItem - Caption = '&Administration' + Caption = '&Администирование' object mnuFlush: TMenuItem - Caption = '&Flush' + Caption = '&Сброс даных на ЖД' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000BA6A36FFB969 @@ -1271,92 +2240,92 @@ object frmMain: TfrmMain OnClick = mnuFlushClick end object mnuShutdown: TMenuItem - Caption = '&Shutdown' + Caption = '&Выключить сервер' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 000000000000E8E340000000000000000000080000000000000007CE03000000 - 000003CE0700FFFFFF0000000000000000000000000000000000000000000000 - 00000000000000000000E0000000444BD9FF474FDAFF434BD9FF4048D7FF3E47 - D8FF353ED5FF3E5B6800000000000400000020E44000D4E3400000000000C0FF - 0700C0FF0700C0FF0700636CE4FF8997FAFF8495FFFF7F90FCFF7D8EFAFF7D8D - F7FF7D8BF2FF5159DDFFC0FF0700C0FF0700000000000000000000F8FF000000 - 000000F8FF006C75E4FF96A5FAFF5A74FFFF3250FFFF304FFFFF2C49FEFF2542 - FAFF4860F9FF8694F4FF5159DDFF000000000000000000000000000000001800 - 18007981E7FF9FADFBFF6781FFFF405EFFFF405EFFFF3C59FFFF3755FFFF3350 - FFFF2846FDFF4A65FDFF8996F6FF545EDEFF0800000000000000000000007178 - E3FFA2B2FCFF738FFFFF4F70FFFF4F6EFFFF4B69FFFF4664FFFF415EFFFF3C5A - FFFF3755FFFF2C4BFFFF4E67FFFF8493FAFF4048D8FF38394100000000007D84 - E5FFA6BBFFFF5F7FFFFF5F7EFFFF5A79FFFF5573FFFF506EFFFF4B69FFFF4664 - FFFF415EFFFF3B59FFFF314FFFFF8799FFFF4D55DBFFC0FF070008000000858A - E6FFABBEFFFF6D8DFFFF6989FFFF6583FFFF5F7EFFFF5A79FFFF5574FFFF506F - FFFF4B69FFFF4663FFFF3F5CFFFF8A9BFFFF535BDCFF00000000010001008B91 - E7FFB1C4FFFF7698FFFF7393FFFF6E8EFFFF6989FFFF6583FFFF5F7EFFFF5A79 - FFFF5573FFFF4F6EFFFF4867FFFF90A1FFFF5A62DEFF00000000C0FF07009298 - E9FFB8CDFFFF7DA0FFFF7C9DFFFF7899FFFF7393FFFF6E8EFFFF6989FFFF6583 - FFFF607EFFFF5978FFFF4F70FFFF98AAFFFF636AE0FFE000000000000000959A - EAFFBCCDFCFF9CBBFFFF81A5FFFF81A2FFFF7C9EFFFF7899FFFF7493FFFF6F8E - FFFF6989FFFF6080FFFF7893FFFF9EADFBFF656CE0FFC0FF070068E140001CE1 - 4000A5ACEFFFC1D1FCFFA0BFFFFF86AAFFFF85A7FFFF81A2FFFF7C9DFFFF7898 - FFFF6F90FFFF85A1FFFFACBAFBFF838BE8FF0000000000000000FEFF7F00FCFF - 3F0000000000A6ADEEFFC4D4FCFFA3C2FFFF8BAFFFFF89ABFFFF84A7FFFF7EA0 - FFFF91AEFFFFB4C3FBFF8C93EAFF275B68000000000004000000000000000000 - 0000FCFF3F00FEFF7F00A9B1F0FFC2D3FCFFC1D6FFFFBDD1FFFFBBCFFFFFB9CE - FFFFB7C8FCFF989FEDFFFEFF7F00FEFF7F00FEFF7F00FEFF7F00080000000000 - 00000000000000000000000000009EA3EBFFA0A5ECFF9DA2EBFF9BA0EBFF989E - EAFF9297E9FF0000000000000000000000000000000000000000F0A3E300183A - EE00187D7C00B81A1B000851A500225B6800000000000400000088E040003CE0 - 400000000000000000000000000050E040000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C3DC32D1D3DC1AF1B3CBEE3193ABAFF1535B8FF0E30 + B8E3092CB8AF0428B82DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF002848C6AF2746C4FF0F33C6FF022AC8FF0028C9FF0028C9FF0129 + C8FF062BC2FF092CB7FF0528B6AFFFFFFF00FFFFFF00FFFFFF00FFFFFF008090 + CF083653C9E31E40C8FF0028C9FF0028C9FF0026BCFF0021A2FF001E95FF001E + 95FF0021A2FF0026BCFF062BBDFF0528B4E303209608FFFFFF00FFFFFF003856 + CDAF2445CBFF0028C9FF0028C9FF3F59C3FFBFC7E4FFFFFFFF00FFFFFF00BFC7 + E4FF3F56AFFF001E95FF0023AFFF062BBDFF0528B6AFFFFFFF004863D234415D + CFFF0028C9FF0028C9FF7F92DDFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF007F8ECAFF001E95FF0026BCFF092CB7FF0628B334405DD2BA1E40 + CDFF0028C9FF3F5DD6FFFFFFFF00FFFFFF007084D4FF1035CCFF1035CCFF7086 + E1FFFFFFFF00FFFFFF003F56AFFF0021A2FF062BC2FF082BB9BA5670D7E4052C + CAFF0028C9FFBFC9F1FFFFFFFF006F80C3FF0027C6FF0028C9FF0028C9FF0028 + C9FF6F86E1FFFFFFFF00BFC7E4FF001E95FF0129C8FF0F31B6E45D76D9FF0028 + C9FF0028C9FFFFFFFF00FFFFFF00102C9CFF0027C6FF0028C9FF0027C6FF0027 + C6FF1035CCFFFFFFFF00FFFFFF00001E95FF0028C9FF1535B8FF627ADBFF0028 + C9FF0028C9FFFFFFFF00FFFFFF000F2B9BFF0024B2FF0F35CCFF0F2CA2FF001F + 9CFF0F35CCFFFFFFFF00FFFFFF000021A5FF0028C9FF193ABAFF647CDDE4062D + CAFF0028C9FFAFBCEEFFFFFFFF006F80C3FF001E95FFDFE4F8FFDFE3F2FF001E + 95FF6F86E1FFFFFFFF00AFB8DEFF0025B9FF022AC8FF1D3EBDE4526EDABA2748 + D1FF0028C9FF506BDAFFFFFFFF00FFFFFF00001E95FFFFFFFF00FFFFFF00001E + 95FFFFFFFF00FFFFFF005067C4FF0028C9FF0F33C6FF1B3CC1BA627BDE355E77 + DDFF0028C9FF0028C9FF9FAEEBFFFFFFFF000025B9FFFFFFFF00FFFFFF00001F + 9CFFFFFFFF009FADE5FF0028C9FF0028C9FF2746C4FF2443C235FFFFFF005873 + DCAF3C5BD6FF0028C9FF0028C9FF506BDAFF0028C9FFDFE4F8FFDFE4F8FF0027 + C6FF506BDAFF0028C9FF0028C9FF1E40C8FF2848C6AFFFFFFF00FFFFFF00D9DF + F708637BDEE33C5BD6FF0028C9FF0028C9FF0028C9FF1035CCFF1035CCFF0028 + C9FF0028C9FF0028C9FF2445CBFF3653C9E36C7EC608FFFFFF00FFFFFF00FFFF + FF00FFFFFF005873DCAF5E77DDFF2748D1FF062DCAFF0028C9FF0028C9FF052C + CAFF1E40CDFF415DCFFF3856CDAFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF004B67D92E5772DBAF5D76DCE3627ADBFF5D76D9FF506B + D6E34460D2AF3655D02EFFFFFF00FFFFFF00FFFFFF00FFFFFF00 } - ImageIndex = 2 + ImageIndex = 98 OnClick = mnuShutdownClick end object mnuSeparator2: TMenuItem Caption = '-' end object mnuAccountControl: TMenuItem - Caption = '&Account Management' + Caption = '&Управление Аккаунтами' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 - 00000000000000000000366A820020B3F9000D8BD2000D629300526471000000 - 00000000000033606A00236889003173930047899F00458B9F004B8B9C00578D - 9C00669BA6007BB1C400B35020FFA0401FFFAA4522FFAC4622FFAB4422FFA741 - 21FF9F3D1FFFB24F24FF00000000000000000000000000000000000000000000 - 00002579CDFF866161FFBF6035FFFEB961FFFEB962FFFEB962FFFEB962FFFEB9 - 61FFFEB961FFB14924FF7A646DFF2E7ECEFF6DA2D3FF418DA600638D9900297D - D1FF82BAEEFF9F6658FFF5BB84FFFFAC5BFFFEA85AFFFEA257FFFE9C53FFFFA3 - 55FFFF9F50FFF8AE78FFA45E4AFF83BCEFFF2A77CAFF0000000000000000287C - CEFF78B3EAFFB39E94FFFFB760FFFFB663FFFEB261FFFEAC5DFFFEA559FFFD9E - 53FFFE974EFFFF8D43FFBC8F82FF7EB8EDFF2974C7FF5D8C9C004F889900638B - 94008A5444FFFCC8ABFFFFD198FFFEC76DFFFEBF68FFFEB964FFFEB15EFFFEA8 - 59FFFDA054FFFFB77AFFFEA980FF885042FF00000000000000000A1129000000 - 000000000000C44C1FFFF6E4D6FFFFE4A4FFFFD472FFFFC969FFFFC063FFFFB6 - 5FFFFFC180FFF6D7C6FFC5491FFF197498003E869A004F899A00307793003F77 - 90004877860052849100BC481CFFF4E2D4FF4E7BA9FF4D7BA8FF4D7BA8FF4E7B - A9FFF3D6C3FFBE461CFF000000000000000012121500202035002244C200171A - 310000000000000000006A3C25FF346DA7FF9CCCF8FFAFD4F7FFAFD4F7FFA5CF - F6FF3474AEFF683E2DFF176B92001F7399001C6A8F002E7C9C00153E6400153F - 590010324A00204E5F002A5B92FFA6CAEEFFABCCEAFFA7D0F6FFA8D0F6FFABCC - EAFFA7CDEEFF2D629AFF000000003E3D4C001B286B00222E8700013BF4005676 - DC0000000000000000001F5E9BFFD9E8F7FF97C5F1FF8EBBE5FF7FA9D1FF89B5 - DFFFCDDFEEFF2368A7FF3A7F9000417F8C002C587300164A7200546C8100657A - 87007C8D9900899DA6000C3E87FF7C97B8FF8AB7E4FF719CC8FF15406EFF1944 - 72FF22456BFF113B66FF0000000052536800031F8600011B8F00093DF5006478 - C80000000000000000000F4B97FF12589FFF0F4A8AFF0F4B87FF114B87FF154C - 85FF124175FF0F335CFF5C828500627B8100546C7E0050647B00736976007D70 - 78008A838A00908990009A929500114E96FF12589BFF125899FF115393FF0F4A - 87FF0E3E71FF132E4BFF000000001B1B1B002B3C8B0001239F00071E6A000000 - 00000000000000000000000000000000000012488DFF104B90FF0F488AFF1142 - 7DFF15335BFF657174006B777D0057717E0061707D006C627200F0A3E30008E0 - 400000000000000000005D5C68005C637000686E7F0076889700BEC7CC004746 - 4500000000000000000000000000000000003E4560000E32B600 + 000000000000000000000902B52F0B06B9CB0B08C4D00D0AD4CF0E0AD9CF0C09 + CBD00B08C6CB0B06B6920402C315000000000000000000000000000000000000 + 000000000000000000001410C0802020E5FF1113E8FF1617EBFF1717EEFF1617 + EAFF1517E8FF1214DEFC0000CD6A000000000000000000000000000000000000 + 00000000000000000000322FD7BD475DFFFF192FFDFF1D2CFBFF121AFAFF2030 + FDFF243AFEFF1232FFFF2A11A682000000000000000000000000000000000000 + 000000000000000000001700FF656A86FFFF2644F9FF3E6EFAFF7DD7FFFF365F + FAFF3457FAFF0320FFFF8E4A3FD4CA6F03B7AE5E1BB4AC591C46000000002254 + 172823500936286B1C2F06139F4B5E5AE3FE6A90FFFF50C1FDFF5ACBEAFF4AB0 + FAFF2B4CFFFF5139CCFFFFB811FFE6AA33FFE7AB34FFD1892CFF398439B931AA + 46FF3DB557FF40C654FF41D230FF041965FB213793FF47A6F3FF208AEBFF1B69 + D6FF000080FF7F684FFFFFCC4AFFE5B455FFEFC45CFFD8993EF971C582FF43E7 + 7EFF3EDA70FF42D874FF47EB74FF1B656AFF21388DFF52D7FFFF31C7FFFF3DCA + FFFF001754FFB39061FFFFE162FFFFD66DFFEFCA75FFD8973D9662A366B66BEA + B0FF26D170FF3AD873FF40EF6FFF22A373FF5172BBFFB0FFFFFF7DE2FFFF7DF3 + FFFF204292FF65A5DFFF3E8BE6FFBEA88DFFFFCF45EAEDA9350829892C1F84D6 + 9AFF57E4A2FF29BB96FF33C2A0FF1C8583FF2D4CAAFFCDFFFFFF9BE4F6FF1A3B + 8EFF0E2E8CFF1CA5FFFF1BBAFFFF1591FDFF00000000000000000000000039A5 + 44255BA8D0E54BAAFFFF2991FFFF257BE0FF0E2993FF3666B6FF2656A8FF0A25 + 8CFF2558B8FF63DBFFFF47CAFFFF51DFFFFF024CD04700000000000000000000 + 00007ACBFFFD3CC8FFFF32C3FFFF3DCCFFFF2562C9E61438A9DD1A43AECC1A40 + A6F3405B81FFA3EDF1FFB3FFFFFFAAFDFFFF352A1C7E00000000000000000000 + 000093CCE3FF97FAFFFF81E2FFFF87F9FFFF458AC5A400000000000000003B47 + 60683A1D03FF44474CFF93D1D8FF536268FF2F201C9E00000000000000000000 + 00002F1D15FF3E3732FFB1FFFFFFA1E2EAFF352413D400000000000000005543 + 2F074F4B48FF483C39FF3F3230FF3F312CFF433D3B3D00000000000000000000 + 00004A4441FF403230FF50595EFF413B39FF3B2F2AC400000000000000000000 + 0000524B4C2C524C4B4D504A48424D4846290000000000000000000000000000 + 0000524A4A6D504B4AEB473A36E1493F3CE64B47444300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 } - ImageIndex = 3 + ImageIndex = 110 OnClick = mnuAccountControlClick end object mnuRegionControl: TMenuItem - Caption = '&Region Management' + Caption = '&Управление Регионами' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000454D47FF5F6A @@ -1397,81 +2366,489 @@ object frmMain: TfrmMain OnClick = mnuRegionControlClick end object mnuLargeScaleCommands: TMenuItem - Caption = 'Large Scale Commands' + Caption = 'Глобальные операции' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000338037FF317D34FF2F7A32FF2F7A32FF2F7A - 32FF2F7A32FF00000000000000000000FF00FF00000000000000000000000000 - 0000000000003D8F43FF3A8A3FFF9BC59DFFB3C29DFFBDC19CFFBEC39DFFB0D2 - B1FF7EC09AFF2F7A32FF2F7A32FF0000FF00FF00000000000000000000000000 - 0000469B4DFF70B786FFAEE8C7FFC0D2A0FFC5B381FFCAB47DFFCCAF78FFB9A7 - 78FF80CC95FFA0DABCFF66A87AFF2F7A32FFFF00000000000000000000004EA8 - 57FF76C08DFF99D7B3FF79C080FFBCC27EFFC6A96AFFD7B169FFD6AD65FFBC9B - 5EFF60AD6AFF599768FF81C199FF67A97BFF2F7A32FF000000000000000053AF - 5DFFB5EAD3FF69BC74FF6EBD71FFBEB66DFFC9A35BFFDFAB5BFFDDA858FFC192 - 4EFF9DA958FF78B166FF5A9667FFA6DCC0FF2F7A32FF000000005ABA66FF92D7 - AFFFA0DEB4FF84C670FFA8D080FFC5A55CFFD0A757FFE0AA56FFDAA651FFC798 - 4AFFB98C47FFB69B57FF819F65FF79BF90FF81BE9CFF2F7A32FF5EBF6AFFB0E9 - CFFF83D490FFBFDC8AFFC3CB82FFCCA256FFDAAF5CFFDCAF5BFFC99A4BFFBF86 - 43FFB78443FFB99A52FF96A562FF65A676FFA2D8BDFF2F7A32FF60C36DFFBEEF - DDFF73D17DFF90D16CFFBCE09EFFC7A75EFFD3B05EFFC69953FFC6BC6EFFAFD1 - 7AFFB4C46DFFAFA95FFF7BA957FF5AA367FFB1E3CEFF317E35FF61C46EFFBEF0 - DCFF81D883FF77DB6DFFBFE59AFFCCDFA7FFCAA85DFFC2BD6CFFB8DA8BFFA6D8 - 60FF77D13FFF6AD046FF59BC50FF63AB6CFFB2E4CEFF358239FF61C46EFFB3EC - D2FF9BE2A2FF9DEA8DFFD4EDB7FFD0EAC7FFCFB96EFFCCB166FFCBC975FF76DB - 67FF66D94DFF65D74DFF6CD35DFF73BB7EFFA5DBC2FF39883EFF61C46EFF98DE - B5FFB5EBCCFFB1EFA7FFC9EEA9FFD1EAC9FFD5CF8DFFD9CB8BFFCDB466FFBCBC - 67FF9AD671FF82DE73FF7ADC71FF91D0A3FF88C8A4FF3D8F43FF0000000061C4 - 6EFFC0F3E2FFB5EFB4FFB5F0ACFFC1EDB7FFD4E3B7FFD9D89CFFDAD395FFCDB5 - 6DFFC7B36DFFB5CB84FF94DF9AFFAFE7CDFF469B4DFF000000000000000061C4 - 6EFF87D7A0FFC0F2DEFFC7F2D6FFD5EFD5FFD0E9CFFFD5DBA6FFDCDEABFFDBCD - 90FFD7C88BFFC9C18EFFBDD5AFFF7AC791FF4AA353FF00000000FFFFFF00FFFF - FF0061C46EFF8CD8A2FFCDF5E8FFD4EDDAFFCEEDD3FFCFDFAFFFD6DEB5FFD4D4 - A2FFCED0A1FFC4D0AAFF87C991FF53AF5DFFFF00000000000000080000003737 - 37003636360061C46EFF61C46EFFA5E1BBFFBAEACCFFC5E0BEFFC5DAB4FFBDD7 - B0FFA6D7ACFF5DBE69FF5ABA66FF00000000EFFFFF00FFFFFF00F0A3E300B8EB - 760000000000000000000851A50061C46EFF61C46EFF61C46EFF61C46EFF61C4 - 6EFF61C46EFF000000000000000050E912000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00DAB68F009F3000439A2802AAA14106DEAA5508F7AC5909FDA74C + 07ED9B3005C9AB4F447ADBB3B714FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00EBD5D90E9F2D24A58C5E14FEA98616FFBF800BFFBC800DFFBC800DFFBC81 + 0DFFBD810CFFB16500FF942200E0C27E804CFFFFFF00FFFFFF00FFFFFF00ECD5 + DA0C9F331FB7B36200FF43CB50FF859B29FFC47506FFBA7B0CFFBA7B0CFFBA7B + 0CFFBA7B0CFFBB7F0DFFC27B07FFA23300F7C380814DFFFFFF00FEFCFD00A745 + 3B76AE5A00FFB78610FF1CD862FF31CD58FFB57E0FFFBE790AFFBA7B0CFFBA7B + 0CFFBA7B0CFFBE790AFF929522FF9C941CFF9A2000E4DCB4B911CA8D9322A03E + 05E1C1800AFFB57E0FFF18DB64FF00F078FF62B03EFFBF7A0BFFBB7C0DFFBA7C + 0DFFBD7A0CFFB57E0EFF1FD761FF17E167FFA16E09FFAE4E43768D0E048AB167 + 09FFC37B09FF819C2BFF0AE46EFF06E872FF05EA74FF8B9C2DFFC47B0EFFBC7F + 11FFC2790BFF949223FF06E66FFF00ED75FF54C045FF9A3406CE962301DABE72 + 08FF9B901EFF0FE26CFF08E974FF10E875FF0AF07DFF63BE50FFC7821AFFC183 + 19FFC67D10FF999324FF0BE56FFF01E973FF2ED55AFFAC4B04EF9B3005FCC576 + 07FF8F9726FF03EC76FF0AEE7BFF2AE576FF88B750FFBBA03EFFCC9635FFC096 + 32FFC48A22FF67B748FF03EC77FF0BE46EFF1AE065FF7B7724FE9C2B02F1AA84 + 15FF8E9929FF51C353FF58CB5FFFADAB49FFDBA54CFFDDB25DFFC9BD68FF75E1 + 84FF58DE78FF2DE476FF11E975FF09E671FF00F074FF3E9A45F9762C09BA65A9 + 3BFF9C9324FFCB8017FFCE9230FFD9AA53FFE1C77BFFEDD692FFD4E5A0FF8DF9 + A9FF5EF395FF35ED84FF18EA79FF08EA75FF2DD85EFF508334E3955044587C81 + 23FB969C2BFFBD8D25FFD19B3DFFDBBC6CFFEDDE9DFFF9F4BDFFF8F6BEFFC6F5 + B2FF7DF49FFF45EE89FF2EE273FF28D865FF1FDD60FF5C7442AEEFCCD3054C87 + 49B904F175FF5EC65AFFCDA042FFE4BD6EFFF1E4A5FFFCFCCAFFFFFBC7FFDFEE + AFFF9BE896FF96C160FF9DA138FF73B23FFF1FB146FFB1938642FFFFFF00B796 + 8B3B1CAF4AF92DE872FF59E17AFFBBC975FFE4D994FFF4EBAFFFF5EAAFFFE1DB + 96FF99DD87FF6ED26EFF31E372FF2FC64FFF795D34A8F4E0E400FFFFFF00FFFD + FF009DAB8E6132A443FC65C45CFF60ED8AFFC1CC79FFE7C87DFFE4C97EFFD1C2 + 70FF9FC867FF57DA6BFF24C857FF43A35CBCECDADB10FFFFFF00FFFFFF00FFFF + FF00FFFFFF00B9918241807130BD62AF52FC9BB556FFD4A148FFD0A64BFFC898 + 3DFFBC7725FF688337E0798C5F83EEDADB0CFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00BDFFDC003FD06E08367D395C76411CB1A0300EEB9F3912F89928 + 0BD28D0C0280CD8C9027FFFDFF00FFFFFF00FFFFFF00FFFFFF00 } - ImageIndex = 14 + ImageIndex = 97 OnClick = mnuLargeScaleCommandsClick end end object mnuSettings: TMenuItem - Caption = '&Settings' + Caption = '&Настройки' + object mnuWindowedMode: TMenuItem + AutoCheck = True + Caption = 'Оконный режим' + Checked = True + OnClick = mnuWindowedModeClick + end + object mnuSeparator6: TMenuItem + Caption = '-' + end + object mnuTileList: TMenuItem + Caption = 'Основной список объектов' + object mnuTileListTable: TMenuItem + AutoCheck = True + Caption = 'Таблица' + GroupIndex = 11 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuTileListSmall: TMenuItem + AutoCheck = True + Caption = 'Мелкие иконки' + GroupIndex = 11 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuTileListMidle: TMenuItem + AutoCheck = True + Caption = 'Средние иконки' + Checked = True + GroupIndex = 11 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuTileListLarge: TMenuItem + AutoCheck = True + Caption = 'Крупные иконки' + GroupIndex = 11 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuSeparator7: TMenuItem + Caption = '-' + end + object mnuTileListStretch: TMenuItem + AutoCheck = True + Caption = 'Растягивать' + Checked = True + GroupIndex = 12 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuTileListClip: TMenuItem + AutoCheck = True + Caption = 'Обезать' + GroupIndex = 12 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuTileListCentre: TMenuItem + AutoCheck = True + Caption = 'Центрировать' + Enabled = False + GroupIndex = 12 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuSeparator8: TMenuItem + Caption = '-' + end + object mnuTileListDrawInfo: TMenuItem + AutoCheck = True + Caption = 'Показать описание' + OnClick = mnuTileListDrawClick + end + end + object mnuMiscTileList: TMenuItem + Caption = 'Прочие списки объектов' + object mnuMiscTileListTable: TMenuItem + AutoCheck = True + Caption = 'Таблица' + GroupIndex = 13 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuMiscTileListSmall: TMenuItem + AutoCheck = True + Caption = 'Мелкие иконки' + Checked = True + GroupIndex = 13 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuMiscTileListMidle: TMenuItem + AutoCheck = True + Caption = 'Средние иконки' + GroupIndex = 13 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuMiscTileListLarge: TMenuItem + AutoCheck = True + Caption = 'Крупные иконки' + GroupIndex = 13 + RadioItem = True + OnClick = mnuTileListViewClick + end + object mnuSeparator9: TMenuItem + Caption = '-' + end + object mnuMiscTileListStretch: TMenuItem + AutoCheck = True + Caption = 'Растягивать' + GroupIndex = 14 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuMiscTileListClip: TMenuItem + AutoCheck = True + Caption = 'Обезать' + Checked = True + GroupIndex = 14 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuMiscTileListCentre: TMenuItem + AutoCheck = True + Caption = 'Центрировать' + Enabled = False + GroupIndex = 14 + RadioItem = True + OnClick = mnuTileListDrawClick + end + object mnuSeparator10: TMenuItem + Caption = '-' + end + object mnuMiscTileListDrawInfo: TMenuItem + AutoCheck = True + Caption = 'Показать описание' + Checked = True + OnClick = mnuTileListDrawClick + end + end + object mnuAutoHideGroupList: TMenuItem + AutoCheck = True + Caption = 'Скрывать список груп' + Checked = True + OnClick = mnuAutoHideGroupListClick + end + object mnuAutoHideRandomList: TMenuItem + AutoCheck = True + Caption = 'Скрывать список случайных' + Checked = True + OnClick = mnuAutoHideRandomListClick + end + object mnuAutoShowFilterWindow: TMenuItem + AutoCheck = True + Caption = 'Автопоказ окна фильтра' + end + object mnuSeparator4: TMenuItem + Caption = '-' + end object mnuShowAnimations: TMenuItem AutoCheck = True - Caption = '&Animations' - Checked = True + Caption = '&Анимация' Hint = 'Toggles whether to animate tiles or not.' + ShortCut = 16449 OnClick = mnuShowAnimationsClick end object mnuSecurityQuestion: TMenuItem AutoCheck = True - Caption = '&Security question' + Caption = '&Подтверждение изменений' Checked = True Hint = 'Ask for permission before processing area commands.' end object mnuWhiteBackground: TMenuItem AutoCheck = True - Caption = '&White Background' + Caption = '&Использовать белый фон' OnClick = mnuWhiteBackgroundClick end end object mnuHelp: TMenuItem - Caption = '&?' + Caption = '&Справка' + object mnuDocs: TMenuItem + Caption = '&Обзор справки' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00874A2028874A2085894D23C5884C22F2884C22F28B4F + 25C5884B2185874A2028FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00874A2002874A20798F552EF6CBAF9BFEE5D6CBFFF8F4F1FFF9F5F2FFE8DB + D1FFD3B9A6FD915831F6894C2378874A2002FFFFFF00FFFFFF00FFFFFF00874A + 2002874A20C4AC8264F7F3EDE9FFDDC9BAFFC7A58BFFBB9171FFC19979FFD5B7 + 9FFFE9DACDFFF8F3EFFFB58D71F78B4F26C4874A2002FFFFFF00FFFFFF00874A + 2078AB8163F6F3EEE9FFB78F72FFA5724CFFB38765FFFFFFFF00FFFFFF00C197 + 74FFC59B78FFD7B9A0FFF9F5F1FFB2886BF7884C2278FFFFFF00874A20288E55 + 2DF6F2EBE6FFB18769FF9D6740FFA36F49FFB28462FFFFFFFF00FFFFFF00BD92 + 6FFFC19672FFC59B78FFD6B79DFFF7F1EDFF8F572FF6874A2028874A2085C3A5 + 90FDD3BCADFF945C33FF9A643CFFA16C45FFA97852FFC8A88FFFCCAD94FFB789 + 65FFBB8F6BFFBF9370FFC19673FFE7D7C9FFCFB4A0FD884B2185874A20C5DDCC + C0FFAF866AFF91582FFF976038FF9D6740FFA77651FFE4D4C8FFE5D6CAFFB486 + 62FFB68763FFB98B67FFBA8E6AFFD1B29BFFE6D7CCFF8A4E24C5874A20F2F5F0 + EDFF945E38FF8E532AFF945B33FF99623AFF9F6942FFF3EDE8FFFFFFFF00D0B5 + A0FFB07F5AFFB2835EFFB48560FFBD9475FFF8F3F0FF884B22F2874A20F2F5F0 + EDFF935C36FF8A4F25FF90562DFF955D34FF9A633BFFB58B6DFFFCFBF9FFFEFE + FEFFC19D82FFAC7A54FFAD7C56FFB78D6CFFF7F3EFFF884B21F2874A20C5DDCC + C0FFAC8265FF874A20FF8B5027FF90562DFF955C34FF99623AFFC2A189FFFFFF + FF00F3ECE8FFA5724BFFA6734DFFC3A186FFE1D2C6FF894C23C5874A2085C3A5 + 90FED0B9A9FF874A20FF874A20FF9F6E4BFFA06F4DFF945B32FFA87A59FFFFFF + FF00FDFCFBFFA16D46FF9F6A43FFDAC6B7FFC6A994FD874A2085874A20288E55 + 2DF5F1EAE5FFA57858FF874A20FFB0886CFFFEFDFDFFE9DED6FFF6F2EFFFFFFF + FF00DCCABDFF986038FFB3896BFFF2EBE6FF8D552DF6874A2028FFFFFF00874A + 2079AA7E61F6F2EBE7FFA67859FF9C6947FFDECEC2FFF7F3F0FFF1EAE6FFD0B8 + A7FFA06F4DFFAD8264FFF3EDE8FFA87C5DF7874A2079FFFFFF00FFFFFF00874A + 2002874A20C4A77A5BF6F0E8E3FFD0B9A9FFAC8265FF96603BFF96603BFFAC82 + 65FFD1BAAAFFF0E9E4FFA77B5CF6874A20C4874A2002FFFFFF00FFFFFF00FFFF + FF00874A2002874A20798D542CF5C1A18CFDDBC9BDFFF4EFEBFFF4EFEBFFDBC9 + BDFFC1A28CFD8D542CF6874A2078874A2002FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00874A2028874A2085874A20C5874A20F2874A20F2874A + 20C5874A2085874A2028FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + ImageIndex = 88 + OnClick = mnuDocsClick + end + object mnuSupport: TMenuItem + Caption = '&Поддержка' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 20000000000000040000640000006400000000000000000000003E3E3E00ADAD + AD2CA4A4A45DA4A4A470A4A4A47FA4A4A483A5A5A490A5A5A490A5A5A48FA3A3 + A391A4A4A485A4A4A480A4A4A472A4A4A462AAAAAA3B6464640036363600B7B7 + B716B3B3B335AFAFAE46ABABA54FACACA555A1A1A1569C9C9F7199999E73A1A1 + A157A0A0A057A1A1A14EACACAC49B3B3B339B8B8B81E5E5E5E00000000000000 + 00000000000023232000565689151C1C889F000088F7000087FF2B2BA0FFECEC + E2FCC8C8C8ABAAAAAA2334343400000000000000000000000000000000000000 + 0000262629004242995A00008CFF000098FF0000A2FF0000A4FF4545BAFFF7F7 + EDFFEAEAEAFFE7E7E7FFCACACA74444444000000000000000000000000000E0E + 07004646994900008BFF0000A1FF0202AFFF0808B8FF0303BAFF5C5CCEFFF2F2 + E8FFE5E5E5FFE9E9E9FFEBEBEBFFCACACA671F1F1F0000000000000000007373 + 7100D3D3DAFA1A1AA9FF0000AFFF0D0DB8FF3B3BBA864F4F9A296F6F9125D1D1 + CD77E0E0E0FFE6E6E6FFEAEAE9FFEDEDE8FFA3A39C0F0000000000000000BFBF + BF64F0F0EDFFFDFDEDFF6464C8FF4A4AB6432E2E320000000000000000001717 + 1700B6B6B62AEBEBE3FFF9F9EBFFAAAAD4FF5C5CA68210100C000C0C0C00D7D7 + D7AEEAEAEAFFE6E6E5FFE2E2D9BE4B4B4E000000000000000000000000000000 + 0000303029007878C8A10303B2FF000097FF0E0E8ECB24242C0017171700DDDD + DDC9E9E9E9FFE5E5E5FFD0D0D082000000000000000000000000000000000000 + 0000000000004A4AB3650B0BB8FF0000A0FF0B0B91E81A1A2C0013131300DBDB + DBBEEAEAEAFFE8E8E5FFDFDFD69B1F1F1B000000000000000000000000000000 + 0000080800004949BF7E0C0CB6FF00009FFF101091DA20202E0000000000D0D0 + CE88FFFFF1FFD1D1E2FF6262C5FB585896040000000000000000000000000000 + 000052527B001D1DBCEB0808B0FF00009AFF1C1C91A523232100000000008E8E + 97202020A0FF0000A0FF0000B6FF1F1FB6D75A5A9F1528283400292928009090 + 8F09D1D1D6C41919BBFF0000A3FF00008EFF4B4B973C00000000000000002929 + 35002121959E000096FF0000AAFF0505B7FF0303B8FF9292CFD4E3E3DED1E3E3 + E3FFEAEAE7FFF2F2EAFF1717A1FF13138EBE3C3C550000000000000000000000 + 000052527400161692C9000095FF0000A4FF0000A8FFCCCCE0FFEAEAE7FFE6E6 + E6FFE9E9E9FFEFEFEDFFE0E0DADD5F5F8B020000000000000000000000000000 + 0000000000004C4C6D002D2D998400008FFF000092FFFFFFF2FFEBEBEBFFECEC + ECFFE6E6E6FFD1D1D19791919000010100000000000000000000000000000000 + 00000000000000000000222223003F3F65005C5C914FC2C2BE78BCBCBC7AAFAF + AF557D7D7D072F2F2F0000000000000000000000000000000000 + } + ImageIndex = 90 + object mnuEngCom: TMenuItem + Caption = 'Английское сообщество' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000000000000000000000000000B8B8B8FF4A4A4AFF363636FF5F5F + 5FFFD6D6D6FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AFAFAFFF303030FF545454FF727272FF4242 + 42FF3F3F3FFFD0D0D0FF00000000000000000000000000000000000000000000 + 00000000000000000000AFAFAFFF2C2C2CFF777777FFF7F7F7FFF9F9F9FFE0E0 + E0FF4C4C4CFF424242FFD9D9D9FF000000000000000000000000000000000000 + 000000000000B9B9B9FF2E2E2EFF767676FFFFFFFFFFAEAEAEFF4D4D4DFFDBDB + DBFFE1E1E1FF454545FF484848FFD9D9D9FF0000000000000000000000000000 + 0000AFAFAFFF2F2F2FFF7D7D7DFFF9F9F9FFA5A5A5FF383838FF343434FF4F4F + 4FFFFEFEFEFF8B8B8BFF2F2F2FFF4A4A4AFFD1D1D1FF0000000000000000B0B0 + B0FF2D2D2DFF747474FFFFFFFFFFD6D6D6FF323232FF3C3C3CFF383838FF9393 + 93FFFAFAFAFF6C6C6CFF393939FF383838FF464646FFD6D6D6FFCBCBCBFF3030 + 30FF727272FFFFFFFFFFC9C9C9FFF8F8F8FF9E9E9EFF303030FF505050FFFDFD + FDFF939393FF343434FF3E3E3EFF3C3C3CFF3B3B3BFF5D5D5DFF626262FF4444 + 44FFF4F4F4FFB4B4B4FF303030FF878787FFFFFFFFFF989898FF474747FFFAFA + FAFF9E9E9EFF313131FF353535FFA5A5A5FF737373FF363636FF434343FF5454 + 54FFFFFFFFFF969696FF303030FF333333FF818181FFFFFFFFFF969696FF7979 + 79FFFFFFFFFFACACACFFB5B5B5FFFFFFFFFF555555FF4F4F4FFFA0A0A0FF2C2C + 2CFF989898FFFFFFFFFF858585FF323232FF333333FF828282FFFFFFFFFF9191 + 91FF797979FFEFEFEFFFF1F1F1FF767676FF303030FFBBBBBBFF000000008484 + 84FF292929FF9E9E9EFFFFFFFFFF828282FF323232FF343434FF888888FFFDFD + FDFF777777FF424242FF484848FF2F2F2FFFACACACFF00000000000000000000 + 0000848484FF2A2A2AFFA6A6A6FFFEFEFEFF858585FF303030FF313131FFDEDE + DEFFABABABFF2D2D2DFF373737FFACACACFF0000000000000000000000000000 + 000000000000898989FF2A2A2AFF9E9E9EFFFFFFFFFF919191FFACACACFFFAFA + FAFF6B6B6BFF333333FFB5B5B5FF000000000000000000000000000000000000 + 00000000000000000000848484FF2A2A2AFF969696FFFCFCFCFFF5F5F5FF7979 + 79FF2E2E2EFFACACACFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000828282FF2B2B2BFF535353FF4C4C4CFF2F2F + 2FFFABABABFF0000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A4A4A4FF434343FF505050FFBEBE + BEFF000000000000000000000000000000000000000000000000 + } + ImageIndex = 111 + OnClick = mnuEngComClick + end + object MenuItem1: TMenuItem + Caption = '-' + end + object mnuRusCom: TMenuItem + Caption = 'Русское сообщество' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000DEBA84FFD6AA6BFFDEAE73FF000000000000000000000000000000000000 + 000000000000DEAE73FFD6AA6BFFDEBA84FF0000000000000000000000000000 + 0000CE964AFFCE9642FFE7BE8CFF000000000000000000000000000000000000 + 000000000000E7BE8CFFCE9642FFCE964AFF0000000000000000000000000000 + 0000CE9642FFD6AA6BFF00000000000000000000000000000000000000000000 + 00000000000000000000D6AA6BFFCE9642FF0000000000000000000000000000 + 0000D69E52FF00000000000000000000000000000000D6AE73FFDEAE73FF0000 + 0000000000000000000000000000CE9A52FF0000000000000000000000000000 + 0000E7CBA5FF000000000000000000000000E7C394FFCE9642FFCE9642FFE7C3 + 94FF000000000000000000000000E7CBA5FF0000000000000000000000000000 + 000000000000000000000000000000000000CE9A52FFCE9642FFCE9642FFCE9A + 4AFF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000D6AA6BFFCE9642FFCE9642FFCE9642FFCE96 + 42FFD6AA6BFF0000000000000000000000000000000000000000000000000000 + 00000000000000000000E7C79CFFCE964AFFCE9642FFCE9642FFCE9642FFCE96 + 42FFCE964AFFE7C79CFF00000000000000000000000000000000000000000000 + 00000000000000000000D6A25AFFCE9642FFCE9642FFCE9642FFCE9642FFCE96 + 42FFCE9642FFD6A25AFF00000000000000000000000000000000000000000000 + 000000000000DEAE73FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE96 + 42FFCE9642FFCE9642FFDEAE73FF000000000000000000000000000000000000 + 0000E7C79CFFCE9A4AFFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE96 + 42FFCE9642FFCE9642FFCE9A4AFFE7C79CFF0000000000000000000000000000 + 0000D6A663FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE96 + 42FFCE9642FFCE9642FFCE9642FFD6A663FF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 + } + ImageIndex = 112 + OnClick = mnuRusComClick + end + object mnuEng2Com: TMenuItem + Caption = 'Английское сообщество 2' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A36700FF6D4500FF724900FF714902FF714902FF714902FF714902FF7149 + 02FF714902FF724902FF6F4804FF9E6502FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF008F5E0DFFD89A3AFFD19435FFCF902BFFCF912CFFCF902BFFCF902BFFCF90 + 2BFFCF902AFFCF902DFFCE8D21FF704804FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00966517FFE7AE63FFDFA75CFFDDA453FFDA9D44FFDB9E46FFDB9E45FFDB9E + 45FFDA9D44FFDDA049FFCF912DFF724902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00946314FFE0A759FFDCA254FFDEA558FFDBA14DFFD89A3EFFD89B40FFD89B + 40FFD79A3FFFD99D44FFCF902BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00986717FFF5B863FFDEA556FFDDA456FFDEA659FFDCA24FFFD99B3FFFD99C + 41FFD89B40FFDB9E45FFCF902BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009C6A18FFFFC66AFFF5B65EFFDEA657FFDDA456FFDFA659FFDCA24FFFD99B + 40FFD89B41FFDB9E45FFCF902BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009C6918FFFFC268FFFCBC62FFF7B861FFDEA557FFDDA456FFDFA759FFDCA2 + 4EFFD89A3EFFDB9E45FFCF902BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009C6A18FFFFC368FFFABA60FFFEBD63FFF7B961FFDEA557FFDDA456FFDEA6 + 59FFDCA14EFFDB9D42FFCF902AFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009C6A18FFFFC368FFFABA61FFFBBC62FFFEBE63FFF7B860FFDEA657FFDDA4 + 56FFDEA557FFDFA658FFD29533FF714800FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009C6A17FFFFC266FFF9B95FFFFBBB60FFFABA60FFFCBC61FFF5B75FFFDDA4 + 55FFDBA052FFDFA75DFFD19536FF734900FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF009A6919FFFFC96FFFFDC066FFFFC268FFFFC268FFFFC168FFFFC369FFFABD + 66FFE5B061FFE4AC63FFD59839FF6D4500FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00B37306FFB3781AFFB37818FFB37818FFB37818FFB37818FFB37818FFB579 + 19FFAF7819FFAC7317FFA76D0DFFA86A00FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + ImageIndex = 113 + OnClick = mnuEng2ComClick + end + end + object mnuSeparator5: TMenuItem + Caption = '-' + end object mnuAbout: TMenuItem - Caption = '&About' + Caption = '&О программе' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000945124029451243B94512493945124CE945124E8945124E89451 + 24CE945124939451243B94512402000000000000000000000000000000000000 + 00009451241594512494945124F7945124FF945124FF945124FF945124FF9451 + 24FF945124FF945124F794512494945124150000000000000000000000009451 + 2417945124B3945124FF945124FF945124FF945124FF945124FF945124FF9451 + 24FF945124FF945124FF945124FF945124B39451241700000000945124039451 + 2492945124FF945124FF945124FFD7D7D7FFF3F3F3FFFFFFFFFFFFFFFFFFF3F3 + F3FFD7D7D7FF945124FF945124FF945124FF94512492945124039450233B9350 + 22F8945124FF945124FF945124FF945124FFEFEFEFFFFFFFFFFFFFFFFFFFEFEF + EFFF945124FF945124FF945124FF945124FF945124F89451243B955327929552 + 25FF924E20FF945023FF945124FF945124FFEFEFEFFFFFFFFFFFFFFFFFFFEFEF + EFFF945124FF945124FF945124FF945124FF945124FF945124929D5F37CEA66E + 49FF9B5C32FF945024FF924E20FF934F22FFEFEFEFFFFFFFFFFFFFFFFFFFEFEF + EFFF945124FF945124FF945124FF945124FF945124FF945124CEA36942E8B07E + 5CFFAE7A57FFA7704DFF9F633BFF98572BFFF3F3F3FFFFFFFFFFFFFFFFFFEFEF + EFFF935023FF935023FF945023FF945023FF945124FF945124E8A56B45E8B080 + 5EFFB07E5DFFB1805FFFB1805FFFAF7C5AFFEBEBEBFFEFEFEFFFEFEFEFFFE3E3 + E3FF965428FF945225FF945124FF935023FF935023FF945124E8A0643DCEB383 + 63FFB28161FFB28161FFB28162FFCDCDCDFFD8D8D8FFDDDDDDFFDDDDDDFFD4D4 + D4FFA97550FFA66E49FFA36942FFA0653DFF9E633AFF97572BCE9A5A3092B283 + 63FFB48666FFB48666FFB48666FFB48566FFB28564FFB28262FFB28160FFB180 + 5EFFAF7E5CFFAE7C59FFAC7856FFAA7552FFA7714CFF98582C929350233BAB77 + 54F8B88D6FFFB7896AFFB7896AFFB6896AFFD2BDB0FFFBFBFBFFFBFBFBFFD0BB + ADFFB07F5DFFAE7B59FFAC7955FFAC7855FFA26841F89350243B904B1D039B5D + 3392B78A6CFFBB9075FFB88C6EFFB88B6DFFDCDCDCFFEBEBEBFFEBEBEBFFDCDC + DCFFB18160FFAF7E5CFFAF7D5BFFAB7553FF98582D92924D200300000000914E + 1F17A1663FB3B98D70FFBD9579FFBB9073FFC1AEA1FFCDCDCDFFCDCDCDFFBFAB + 9DFFB38464FFB48364FFAD7A59FF9C5F36B3934F211700000000000000000000 + 0000945124159D5F3794B07F5DF7BB9075FFBD9478FFBC9175FFBA8E71FFB78B + 6DFFB38363FFA8724EF79A5B3194945125150000000000000000000000000000 + 000000000000935023029451233B9C5D3493A56C46CEAB7653E8AA7451E8A368 + 42CE9B5B31939351233B94502302000000000000000000000000 + } + ImageIndex = 89 OnClick = mnuAboutClick end end end object ImageList1: TImageList - left = 264 - top = 32 + left = 328 + top = 33 Bitmap = { - 4C69170000001000000010000000000000000000000000000000000000000000 + 4C69720000001000000010000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000D9A781FFD39E76FF00000000000000000000000000000000000000000000 0000000000000000000000000000ECBEA1FFE7BB9DFFE4B697FFE0B292FFDAAE @@ -2207,106 +3584,3064 @@ object frmMain: TfrmMain 4FFF4C4C4CFF4A4A4AFF474747FF454545FF25679DFF3274A8FF3D7CAFFF4784 B5FF4E8ABAFF3E7EADFF0C578FEAFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D639B1619609839145D9562105A - 92880D5890A4135C92FC0C578FED + 92880D5890A4135C92FC0C578FEDFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFE01FFFFFF00EAEEF100A7BB + C326325C703FBCCBD109EBEFF100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FDFDFE01FFFFFF00FCFDFD00447083653664 + 89EA6E8EB3FF00325590B9C8CE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FEFEFE00FCFCFD03FFFFFF00456F857046709CFCE1E0 + FFFFA9A4FFFA2F4AB9FF194D5D47FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FDFDFE01FFFFFF00FAFBFC00406B816E47708CFDE1D9E0FE9E9E + F1FC3F3CFFFD0E30A7FC426F773AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FDFEFE01FDFDFE03FFFFFF00446B8170216083FA79BADFFF8CB2BBFD958D + CEFA1C3AC3FF00325094BECCD300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFE + FE00FDFDFD03FCFDFE00446D826E1E6083FC77BEE3FE309BD5FE2E88B7FD607D + A0FF013655A786A1AC06FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFDFD01FFFF + FF00FAFBFC00446B816F1F6083FB76BDE3FF389ED4FC1B7DB2FB16597CFF0031 + 50AA849DAB03FFFFFF00FDFDFE01FFFFFF00FFFFFF00FEFEFE00FBFCFC03FFFF + FF00446C81701E5F82FA75BCE3FF389ED4FE1A7DB2FB18597CFF003250AB86A0 + AD09FFFFFF00FBFCFC02FFFFFF00FFFFFF00FEFEFE00FFFFFF00FAFBFC00456D + 816E1E6082FD76BDE3FE399ED4FE197CB1FD175A7CFF003150AB87A1AE06FFFF + FF00F8FAFA01FFFFFF00FFFFFF00FEFFFF00FFFFFF00FDFEFE00476D82641D5D + 82FB74BCE3FF399ED4FD1A7CB1FA18597CFF003352AF839DAB07FFFFFF00FCFD + FD02FEFFFF00FFFFFF00FFFFFF00FEFEFE01FFFFFF00CDD5DA111C5371E37CC1 + DFFF3A9CD0FD197BB0FB195A7DFF003251AF86A0AE0AFFFFFF00FAFCFC02FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FCFDFD01FFFFFF002B59703F3C7C97FEBDEE + F6FC6CB4D2FD0F5379FF003250B0859EAB07FFFFFF00F7F8F902FDFDFD00FEFE + FE00FFFFFF00FFFFFF00FFFFFF00FDFDFE02FFFFFF00467085A27FAEC2FF69AC + C8FC3B7591FF044060A58BA6B30CFFFFFF00FEFEFE01FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0089A3B012003250DE426F82E40D40 + 55932D546731CED2D309E4E3E206DFDFDD09DFDEDE06E2E3E005D5D5D502ECEC + EC00FFFFFF00FEFEFE00FFFFFF00FFFFFF00718C9C23426A8055253134142D24 + 190A2B261E1E26221B311B1C16381F1E1530211F162515150F1736363608E2E2 + E200FFFFFF00FDFDFD00FFFFFF00FFFFFF00DAE2E700EAEEEF00D4CDCB02C8C5 + C807CAC8C808CAC9C80CCACBC90DCCCCCB0ACCCDC906C6C6C603DBDBDB01FFFF + FF00FEFEFE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFE00FEFEFE02F9FAFC00456A + 8B1F001E54AA7C97B152FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FDFDFE00FEFEFE04FCFEFF004A698A1F0639 + 6FD0003773FF7390A956FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FEFEFE00FCFCFD02FEFFFF004567892D063466DA4388 + C7FF013A6FD3859CB205FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FEFEFE00FFFFFF03F8FAFB0043698B26003061DD448DD2FF2A69 + A5FF345A7D95FFFFFF00FCFDFD02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FDFDFE03FEFFFF00496A8D15062D5ACE357BBBFF307DC6FA1644 + 6EFE2D577E2FFFFFFF00FCFDFD01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FDFEFE01FFFFFF00D6DEE70A0E3460B6336FA6FF1F77CBFA2C5C89FF0630 + 60A9D1D9E201FFFFFF00FEFEFE01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCFD + FE01FFFFFF00D3DEE70419426D9D2C6194FF1F7DD6FC235C92FD1A4A75FF486D + 9045FCFCFD00FFFFFF04FEFEFF00FFFFFF00FFFFFF00FFFFFF00FEFEFE01FFFF + FF00F2F1F1046374839A436077FF297AC7FD145EA3FC315C83FF00285FA8ACBD + CC00FFFFFF02FBFCFC01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF02FFFF + FF00898B8B2E9B9E9DFFCDCCC9FD778690FD356189FF0D4376E0839CB220FFFF + FF00FBFCFD01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FBFBFB02FFFF + FF008F939295D3D4D4FFE9E9EAFDADAAA5FB6C7D88FF204A745DFFFFFF00FFFF + FF03FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F9F9F901FFFFFF00BDC1 + C015A1A5A4E7F8F7F7FFBBBBBBFA989B9AFF8489888DCED4DA00FFFFFF01FFFF + FF01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF01F4F4F400ABAAAB037578 + 7691A3A5A4FFD8D8D8FD939694FF7E848487DDDFDF00FFFFFF03FBFBFB01FDFD + FD00FFFFFF00FFFFFF00FFFFFF00FBFBFB01FFFFFF006969690B0D0D0CAC6565 + 66FF414141FC5A5C5BFF8F939187E4E6E600FFFFFF01FEFEFE00FFFFFF00FFFF + FF00FBFBFB00FFFFFF00FFFFFF00FFFFFF0285858500000000A7484848FFA1A1 + A1F9494949FF050505D79B9A9A1BE4E3E300CFCFCF05D4D3D302D3D3D301D5D5 + D500FBFBFB00FFFFFF00FFFFFF00EEEEEE0038383881000000FF0E0E0EFD2222 + 22FB202020FF060606B800000035000000360000002B00000022010101180000 + 000C85858502FFFFFF00FDFDFD0032323200000000F6010101F8000000EE0202 + 02D6010101A5000000420202022C030303280303031E070707150000000D7878 + 7806C2C2C201FFFFFF00FEFEFE00000000000000000000000000000000000000 + 000000000000000000000000000001010104000000001E1F1B78463C30FF5844 + 31FF1D1B178B0000000001000002000000000000000000000000000000000000 + 0000000000000000000000000001010000000306080538332BDB8F5C33FF6D4D + 32FF2E2C27D30000000001010103000000000000000000000000000000000000 + 0000000000000000000005050407171815AE483725E1644A32F95E452EFE3134 + 32FF2E2D27C90000000001010103000000000000000000000000000000000000 + 00000000000102020202000000003C424494836953FF3D3022FE323431F32D2A + 25B61412102E0000000000000001000000000000000000000000000000000000 + 000104040404000000004043428DF1F1F0FFCAC4C0F6403E38FF2A2723B00202 + 0200000000030000000000000000000000000000000000000000000000010303 + 030200000000454C508EECF0F2FFEBDCD4F9A39E99EB1D1D1C641A1815840000 + 0000020202070000000000000000000000000000000000000001020202030000 + 00004245438DCDB8A1FFD1A889FE979188F3171A1B3D00000000020202040000 + 0001000000000000000000000000000000000000000002020202000000004247 + 488DC3A07EFFAE6329FA876B52FA181D1E430000000001010104010100040000 + 0001000000010000000100000000000000000101010100000000474A488DC09E + 7CFFB0682FF88E7864F3171F2541000000000303030700000003000000040000 + 00030000000200000001000000000101010100000000090F131FA4927EFFB86D + 31FF8B7662F61B222643000000000303030C0000000700000008000000080000 + 00060000000500000001000000010101010300000000696660B5ADA49AFF7870 + 66EB1D21234700000000010101130000000E0000000E0000000C0000000B0000 + 000800000005000000020000000100000000190A0232905C36EB51443AA60000 + 0001030303170202021E0000001A0000001800000015000000100000000C0000 + 0009000000050000000200000001100802014B2C17749F7049FD4B280EAE0E08 + 03390000002501000028000000240000001F00000019000000120000000C0000 + 000700000004000000010000000109000026A98569DFD9AD82FF8C5B33FF1308 + 026F000000240101002E00000026000000220000001A00000011000000090000 + 00040000000200000001000000001308012B905D35DAAC7446FF734320E80F08 + 02570000002A01010029000000210000001B000000140000000D000000070000 + 0002000000010000000100000000090502001A0B033315060056140A034A0503 + 0128000000210000001A00000016000000120000000D00000009000000030000 + 00010000000000000000000000000000000001010101000000000D0D0D102829 + 2910030404000000000000000000224A6374276C98BE4D90B9E7478BB6B7296D + 97BC30739DBB2F729CBB256B98BB0000000000000000020202005F6362859499 + 976F0E0F0F00000000002E50666F0734506B211A14008B8B85C85C5B57210000 + 0000030303010000000000000000010101010000000008090815AEB3B2FCA3A7 + A6E012141414000000002D76A4B9000910064B4E4C6AD0D6D7FF555A5A9D0000 + 0000040506090103040501020304010101010000000003040319AFB2B2FFDADC + DCFF6C727176000000002C6B92AF49565B29939593B4D9DDDFFF585B5AA30000 + 0000030303060000000000000000010101010000000006070611B0B3B2E0DFE4 + E6FF949B9AD825201C00317097AA87959868C1C3C1F8E6EBECFF4F5351890000 + 000003030305000000000000000001010100000000000B0B0B0070757288D1D3 + D4FFD6DCDEFF534F4A561D6593A497A6ABDBE6E7E8FFB4BAB9FB5C5F5E500000 + 00000303030300000000000000000000000002030303000000002C2E2D39BEC1 + C0F3DADEE1FF9D9F9CB07595A5CBC1C7CAFFD9DCDDFF959B98D02D2F2E0B0000 + 0000020202010000000000000000000000000101010000000000040404006266 + 65A2EFF2F3FFC2C7C8FAAEAEAAFFDCDEE0FBB8BDBDFF54575670000000000101 + 0101000000000000000000000000000000000000000003030201000000004243 + 4103838582B2D6D8DBFFD6D9DBFDC2C6C7FA878A89D11414141E000000000F0E + 0C0304030300000000000000000000000000000000000202020000000000393D + 3B00646A68438F9899FDAFB6B7FFA1AAACFC373B3B4D00000000101211040C0D + 0D000405050000000000020101000100000100000000140B050B723D189C9059 + 33CA91603ED0895530EA794A28CC8B5732EF7A4927DA7A431DC4814B25BE6B39 + 16320B0602000000000000000000020100020000000075401B9183481FBD522B + 1049854519E87A4119A9130A04005C301174945021FF623617646A3918909552 + 24CC0E0803080000000024130801010100020000000078421CC35B32152F0000 + 000080461F74502C13970000000025150950975224CB0905020128160A149350 + 23D60D070323000000006C3C1A0202010003000000007E451DBA6135167A0100 + 00177E451EB74F2C139C0000000027160A69945123EC1A0E0643301A0B479551 + 23DB0F08042D000000006034170201010005000000003F230F548C4D21E2874A + 1FDF81471EDD26150962000000000805024D653717B78B4C20EB894B20DF5B31 + 158D02010020000000006A3A19010000000000000000050301052A170A392514 + 0963190D063C0000000001000028000000000E08032425150854271509490B06 + 020B00000000000000001A0F0700000000000000000000000000000000000100 + 0000000000000A0603006B37153D231308080000000001010000000000000000 + 0000000000000000000000000000000000000000000000000000010000000000 + 0000060402006634123DAE7043F882482078190D040000000000010100000000 + 0000000000000000000000000000000000000000000000000000010000020000 + 00006737173DB27849F1C49164FDBA8456FF864B22730F080300000000000101 + 0000000000000000000000000000000000000101000000000000010101000000 + 000093572CE6BB8051FFAB7142FCB27A4DF9B4713FFF170A012C000000000201 + 0103010100000000000000000000010100000201000300010101000000000302 + 0106251408484F250AA6B97B49FF6F3D19D0291406560D080417000000000001 + 010101010003020101000000000000000000080402006637163F92572CFF2C18 + 0A56000000003A1E0B73C98A56FF693E1FB8000000000D060218824D26F97E47 + 207A1B0E05000000000001010100090503006533123EB37749F1BB8051FF4E25 + 0AA32F190A5C55280BB3C48B5CFF75421ED8311707663B1B0681A2673AFFC088 + 5AFF81441B761C0F0600000000006D39163AAD7143EDC49163FCAA7142FCB97B + 49FFCC8B57FFC58B5CFFC59569FFC38C5FFFCD8D59FFC0804DFFA96F40FEBF89 + 5AF8B88255FF84471D6E140B05001E1007008348207BBB8456FFB27A4CFF6E3C + 1AD0643B1FAC76421ED8C28C5EFF8A542DEB643A1DB166381ABF9F663AFBC18D + 60FF99592CB0381E0C0D00000000000000001A0D0400844A2173B3713FFF3118 + 085E00000000391C0974CA8C59FF673C1EB8000000000D05001B9E6033FF9D5E + 31B03519070300000000010100010100000000000000130A0404160903320D08 + 041B000000003B1B0985C0804CFF66391BC2010000110A06031214090333160A + 0411040302000000000000000000000000000201010301010009000000000000 + 00008A5128EAA2673AFFA96F40FD9E6539FBA46435FF170B0344000000000101 + 000E020101090000000000000000000000000000000001010013020200250000 + 00004F2D149CC28A5BFFBF8A5BF8CA9262FF764827C9040100420001002B0201 + 0019000000000000000000000000000000000000000000000000000000000101 + 01330000000049260E9FC08656FF714322C90500004400000135010000250000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000100001E0100001B542C1181140B03340000000001000017000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A060301020100040000000000000000000000000000 + 00000000000000000000000000000201000300000000713F1CD8A2673AFF9E67 + 3CFD9F673CFF9E663CFF9F683DFFA0693FFF9F673CFF9F673CFF9F673CFF9D67 + 3CFAA46436FF4827108B000000000201010A00000000794926DED39E6EFFB981 + 53FDBC8556FFBE8758FFB88051FFB37949FFBD8656FFBD8656FFBB8455FFBC87 + 59FAD19968FF46240E8C0000000002010112000000007A4A28E0C58C5CFF9958 + 27FDA26333FF9A5623FF9B633BFFC7B19FFF9A5725FFA05F2DFF9F5F2FFF9F60 + 30FACA905FFF47260F8C0000000002010114000000007A4A27E0C89161FFA568 + 37FDA46532FFA0673CFFDACFC5FFE3DED9FFD1BCAAFFA1602DFFA86A39FFA86C + 3DFACB9261FF47250F8D0000000002010117000000007A4927E0C99363FFA566 + 35FDA16940FFE0DBD6FFDDD4CDFFCEBBAAFFE4E1DEFFD4C3B4FFA46634FFAB70 + 41FACB9262FF48260F8D000000000201011D000000007A4926E1CA9464FFA96C + 3BFDA1693EFF9E663CFFD0BEAFFFE6E4E2FFC7A88FFFAB7347FFAC7243FFAE74 + 44FACC9362FF47250E8C000000000201012100000000794926E0CB9565FFAD72 + 42FDB37948FFA86733FFCFB59FFFDBCDC2FFC19A78FFAA6A35FFB17849FFB278 + 49FAC69061FF61341592060402000000000007030040814D28E4CB9667FFB178 + 49FEB88152FFB87E4EFFC9A789FFCBAE94FFBE9069FFB47A4AFFB67D4DFFB880 + 50FBBD8A5EFF904C1EA529170B00000000001F0F044D895129EBD8AE87FFCD9C + 70FEC49367FFB57946FFD8C3AFFFDFD6CCFFD5B597FFC38A55FFCE9F72FFD1A2 + 75FBC59A73FF8B4C22B3251409030000000040200C729B6742F7DCBA9AFFD0A1 + 75FEAD7E59FFC7AF9DFFD7CBC0FFDCD4CEFFDACABCFFD5BCA7FFC99A70FFD5A8 + 7DFED2B191FF965F38EF592F1237130C0624693410ACC7A386FFDCB896FED7AE + 88FFC5966FFFD0BCACFFE3DFDAFFD1BEAFFFE2DFDDFFD7BDA5FFD3A77DFFD4AA + 83FFDDB996FCAD7F5DFF874415691B0E05338C5127DCDBBEA6FFDBB895FDD8B2 + 90FFDCB794FFBF8F67FFC6AB97FFE4E1DEFFD4B69BFFD3A77FFFDAB491FFD6AE + 89FFE0BF9EFDBF987BFF8142178F17060045B38765EDE8D1BBFCDDBEA0F9DEBF + A2FADEBFA1FAE2C4A7FAC39B7AFACCAF95FADCBA99FADFC2A3FADDBEA0FADDBC + 9EFAE1C4A6F9DCC3ABFC935D37E21F0A005CC4916DFFE4C3A7FBDEB797FFE0BA + 9AFFE0BA9AFFE0B99AFFE0BB9CFFDBB290FFE1BC9EFFDFB999FFE0BA9AFFE0BA + 9AFFDFB897FFE5C2A5FFA86E45FF130A052D4A250D964421099D45220A914522 + 0A8B45220A8B45220A8B45220A8B46240D8B44210A8B45220A8B45220A8B4522 + 0A8B45220A8A45220A8D48260F73000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000001000001020201000001010000000100 + 0000010000000100010200010202000000000000000000000000000000000000 + 0000000000000000000000000001000103020100000000165531000A6C770000 + 6588001170690011391B01000000020303050302010402020202000000000000 + 000000000000010101020001000100142A000029A96D2833EEF37075FFFF8687 + FCFD545DFFFF1321DBDD002B9C41000408000000000100000001030302030001 + 010000000001010101000000001E000D6C513E48FCFD5551F6FF0000EBFB0304 + E6FA0C08F2FC4245FFFF2332B7E32614065C281B0B4C17221F1E000000000101 + 01040101010002030328696B6AD21E3CE2C94B47FDFF0102DEFD0000E1FF0101 + EBFF0004D4FF67507BFDC5A182FED8B69CFED3B191FFA8845CDF454C3D590D1C + 1D000000001C6F7270E0656565DC3F42D4F95A5BEDFF0000D8FF0504E2FF0000 + DFFF715A77FFE4B47DFFC98A57FEBA7E4EFABE7D4AFCD4986CFFCBA377F82A25 + 185F65686BD0656463FF232624DD3541DBF04B4AEEFF0000D3FF0000E3FF292A + A6FFD2A171FFBE8356FFA3622EFFAE6A33FFAC6932FFB4703AFDB47A4DFE8B81 + 76FD5D6062FF262726D60E0F0E1C0520C4A03531FFFF1517D6FD0000DCFF573D + 76FFDCB88CFFA26230FFAA6B38FFAF6D38FFA96A37FF86674BFF756F66FD5459 + 5EFF242625DE1112121C0000000000375C521F40E8FF3826FAFC1416F6FF6B53 + 7EFFD8B386FF9F6132FFA86A39FF9B6539FF928678FFB4B9BBFF8E9397FF3230 + 28FE17161420000000000101010326BDD8C043B2DBFF0049DFFE2E3CECFF453F + A5FFCA9062FFB97B49FF90623CFF9B968DFFE8EAECFFF2F3F5FCBBB2ABFF7B72 + 57C20A0C0A09000000000000000040B8D4F85DE1EEFF00BBD3FF04A2D6FF00A2 + D9FF728770FFBF8861FF95928CFFE1E5E6FEF9F8F7FCBDC0C1FF7F7663FD2E2A + 1E5900000000010100040000000039BBD6F251D1E7FF00B1D4FF06C6DDFF01C9 + E2FF07AEC6FF4A7573FFB9B8B8FEFBF8F8FECFD1D2FF7B7D77F3292A20820006 + 072A00000019000000050000000013A9CBAE54CDE2FF0CB7D5FA00AFD1FE03B0 + D1FF00AFD0FE289EB3FC768C8DFEA0AEB0ED838684D722252370000000340101 + 01360000001A00000005000000000037442D29D0F3E84FD0E5FF1EBCD7FC1BBD + D9FC23BBD4FE3AC4DCFF188DA6CC47504F7A414342650404042F010100310101 + 011D0000000B000000020000000000191E0000556A3716A7C6C33DD5F1FA44D4 + EEFF2DD0F0F4098AA6A4002C37240002020D00000016010202150000000B0000 + 0005000000010000000000000000000101000100000000212A11002632380021 + 2D430029352E00161C0801000000010202050101010400000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000874A20FF874A + 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A + 20FF874A20FF0000000000000000000000000000000000000000874A20FFCD9D + 70FFCD9D70FFCE9D70FFCE9E71FFCF9F71FFCF9F72FFCF9F72FFCF9F72FFCF9F + 72FF874A20FF00000000A46534FF000000000000000000000000874A20FFC998 + 6BFFB67E4FFFB67D4EFFB57D4EFFB57D4FFFB57D4EFFB57D4EFFB57D4EFFCC9B + 6DFF874A20FF00000000A46534FF000000000000000000000000874A20FFC693 + 65FFB57D4EFFB57D4EFFB57D4EFFB47D4EFFB47D4EFFB47C4EFFB47D4EFFC996 + 68FF874A20FF00000000A4653499000000000000000000000000874A20FFC28E + 60FFB47C4DFFB47C4DFFB47C4DFFB47C4DFFB37C4DFF874A20FF874A20FFC591 + 63FF874A20FF00000000A46534EF000000000000000000000000874A20FFBF89 + 5BFFB37B4DFFB37B4DFFB37B4DFFB37B4DFF874A20FFCF9F72FFCF9F72FF874A + 20FF874A20FF00000000A46534FF000000000000000000000000874A20FFBB84 + 54FFBB8555FFBC8456FFBC8556FF874A20FFCF9F72FFB98152FFB98253FFCF9F + 72FF874A20FF0000000000000000000000000000000000000000874A20FF874A + 20FF874A20FF874A20FF874A20FFCF9F72FFB57C4DFFB67D4EFFB77E4FFFB87F + 50FFCF9F72FF874A20FF00000000000000000000000000000000000000000000 + 000000000000874A20FFCF9F72FFB37848FFB3794AFFB37A4AFFB47A4CFFB57B + 4CFFB67D4CFFCF9F72FF874A20FF000000000000000000000000000000000000 + 0000874A20FFCF9F72FFAF7343FFB07545FFB07545FFB17747FFB17747FFB278 + 48FFB27949FFB37949FFCF9F72FF000000000000000000000000A46534FF0000 + 000000000000874A20FFCF9F72FFAC7141FFAE7241FFAE7242FFAF7443FFAF74 + 44FFB07545FFB17646FFB17747FF0000000000000000A46534FFFFFFFFFFA465 + 34FF0000000000000000874A20FFCF9F72FFAA6E3EFFAB6F3EFFAC7040FFAD71 + 40FFAD7142FFAD7242FFAE7343FF00000000A46534FFFFFFFFFFFFFFFFFFFFFF + FFFFA46534FF0000000000000000874A20FFCF9F72FFA86B3AFFA96C3CFFAA6D + 3DFFAA6E3EFFAB6F3FFFAB7040FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000D69B774DD99D79B8D69C79E7D79D79DED99E7A9DD4997612000000000000 + 0000000000000000000000000000000000000000000000000000D599750CD79C + 78B6DBA07BEFE9AC85FFE3A781FADCA17BDBDDA17BC3DBA07ABCD79B76180000 + 0000000000000000000000000000000000000000000000000000D99B76B3E8B1 + 8AF9F6CAA4FFE3AC87F3D89C7894000000000000000000000000D6906813DA96 + 6E540000000000000000000000000000000000000000D7987252DFA27DF1F4C4 + 9CFFE7AF89F6DCA17B9C00000000000000000000000000000000DB976FB4DB99 + 71F8DA966E1E00000000000000000000000000000000DA9973BAE9AB83FFEDAF + 87FFDA9A76E4D8987303000000000000000000000000DB976F56DF9F77F4F3C2 + 9BFFDB9870CADA966E0100000000DA9972ACDB9973DDDB9A74EDEFB189FFEAAC + 83FBDA9973F0DB9A75ECDB9C759B00000000DA966E15DB986FEDF0BD97FFEDAB + 84FFE09D75F1DB976F6D00000000DA976F22DB9A71F5EAAC83FFEFB289FFECAF + 86FFE4A47CFCDC9A73BA0000000000000000DA976FBAECB28BFEEAA982FFECAB + 83FFE9A67FFFDB976FF5DA966E2200000000DB98706DE19F77F1EFB289FFEDAF + 86FFDB9A72ECDA98701500000000D999737FDB9B74EDD99771F4E5A67EFDEBA8 + 81FFD9966FF7DA9B73F5DA9A73BE00000000DA976F01DC9971CAE8A981FDDF9D + 75F0DB987056000000000000000000000000D6946E03D8956FE4F1B991FFE6A3 + 7BFFD99670BA00000000000000000000000000000000DA966E1EDB976FF4DC98 + 70B400000000000000000000000000000000D7956E97E1A37BF7EEB088FFDB99 + 71F0D5946D520000000000000000000000000000000000000000DA966E54D690 + 6813000000000000000000000000D5956F94DA9B74F3EEB189FFE09D75F8D694 + 6EB300000000000000000000000000000000000000000000000000000000D495 + 6E18D99972BFDA9972C4D99972DCE09F77FAE7A57EFFD89771EFD4946EB6D292 + 6D0C000000000000000000000000000000000000000000000000000000000000 + 00005C403029C68B68A9CE906BE3D2936DE7D4946EB89E6F5266000000000000 + 0000000000000000000000000000858A8899858A88FF858A88FF858A88FF858A + 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A + 88FF858A88FF858A88FF858A8899858A88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA46534FFA465 + 34FFA46534FFECEEEEFFECEEEEFFEEEFEFFFEDEFEFFFA46534FFA46534FFA465 + 34FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA46534FFA567 + 36FFECEEEEFFECEEEEFFECEEEFFFEEF0F0FFEEF0F0FFEEF0F0FFA56736FFA465 + 34FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA56736FFAA70 + 43FFB4845FFFEEEFEFFFEEEFEFFFF0F1F1FFF0F1F1FFAE784EFFA96E40FFA568 + 38FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46635FFEDEFEFFFB382 + 5CFFC39F83FFCFB6A2FFEEF0F0FFF0F2F1FFCCB099FFC0987AFFB27F57FFF1F3 + F3FFA56737FFFFFFFFFF858A88FF858A88FFFFFFFFFFEFF0F0FFEFF0F0FFEFF1 + F1FFCFB4A0FFD8C7B9FFE0D3C9FFE2D7CDFFDCCBBDFFCFB49FFFF2F4F4FFF3F4 + F3FFF2F4F4FFFFFFFFFF858A88FF858A88FFFFFFFFFFEFF1F1FFF0F1F1FFF0F1 + F2FFF0F2F1FFDFD2C7FFF0F2F2FFF2F3F4FFE2D7CEFFF3F4F5FFF3F4F5FFF3F5 + F5FFF4F5F4FFFFFFFFFF858A88FF858A88FFFFFFFFFFF3F5F5FFF3F5F5FFF4F5 + F5FFF4F5F6FFE3D7CCFFF5F5F6FFF6F7F7FFEAE1D9FFF7F8F8FFF8F9F8FFF7F9 + F9FFF8F8F9FFFFFFFFFF858A88FF858A88FFFFFFFFFFF5F6F6FFF4F6F6FFF6F6 + F7FFCAAA90FFDBC7B7FFE6DBD3FFEAE2DBFFE4D6CAFFD4BAA6FFF8F9F9FFF9FA + FAFFF9F9F9FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46635FFF6F7F7FFAE77 + 4CFFB98B67FFC9A68BFFF7F8F8FFF9F9F9FFD1B59EFFBD916FFFAE764BFFF9FA + FAFFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA46636FFA76A + 3BFFAB7246FFF8F9F8FFF8F9F9FFFAFAFAFFFAFAFBFFAA7043FFA56737FFA465 + 34FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA46534FFA465 + 34FFF9FAFAFFF9F9F9FFF9FAF9FFFBFBFBFFFBFBFCFFFBFBFCFFA46534FFA465 + 34FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFA46534FFA46534FFA465 + 34FFA46534FFFAFBFBFFFAFBFBFFFCFCFDFFFDFCFCFFA46534FFA46534FFA465 + 34FFA46534FFFFFFFFFF858A88FF858A88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF858A88FF81868400858A88FF858A88FF858A88FF858A + 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A + 88FF858A88FF858A88FF7F8382A0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007676760074747400B6B6B600A9AAAA00CDCD + CD04999999558181816E8484846A8484846A8181816C9494945DBEBEBE0EA9A9 + A900B4B5B500666767005E5E5E007575750077777700BDBEBE00ADAEAE00B3B3 + B31B505151BD292A2ADF303030DD303030DD2A2B2BDE464746CBA4A4A42CAFB0 + B000BBBCBC00696A6A005D5D5D007A7A7A026667673C979898658D8E8E647273 + 7389141515FA000000FF020303FF020303FF000000FF0D0E0EFF6A6B6B948E90 + 8F6296979768595A5A4161616102828282520D0E0EFF000000FF020303FF0405 + 05FF090A0AFF070808FF000000FF000000FF070808FF090A0BFF040505FF0203 + 03FF000101FF090A0AFF6B6B6B616465659F000102FF0A0B0BFF0A0B0BFF0A0B + 0BFF040505FF212222FF6F6F6FFF727373FF292A2AFF030504FF0A0B0CFF0A0B + 0BFF0A0B0BFF030404FF4E4F4FBD5A5B5BA7040505FF0A0B0BFF0A0B0BFF0203 + 03FF404040FFDBDBDBFFC3C3C3FFBFBFBFFFDFE0E0FF4F4F4FFF010202FF0A0B + 0BFF0A0B0BFF060707FF424343C45B5C5CA5040505FF0A0B0BFF070808FF0D0E + 0EFFC4C4C4FF8C8D8DFF040505FF000101FF7A7B7BFFCECECEFF181818FF0506 + 06FF0A0B0BFF060707FF444545C25B5C5CA5040505FF0A0B0BFF010202FF3132 + 32FFD5D5D5FF212121FF050606FF050606FF171818FFCDCDCDFF434444FF0000 + 00FF0A0B0BFF060707FF444545C25B5C5DA5040505FF0A0B0BFF040505FF1D1E + 1EFFD4D4D4FF4D4D4DFF000000FF000000FF3D3E3EFFD6D6D6FF2C2D2DFF0203 + 03FF0A0B0BFF060707FF444545C25B5C5CA5040505FF0A0A0BFF0A0B0BFF0101 + 01FF747575FFDCDCDCFF6C6D6DFF666666FFD7D7D7FF868686FF010202FF090B + 0BFF0A0B0BFF060707FF444545C25B5C5CA6030404FF0A0B0BFF0A0B0BFF090A + 0AFF070808FF626262FFB4B4B4FFB6B6B6FF6D6D6DFF0B0C0CFF090A0AFF0A0B + 0BFF0A0B0BFF050606FF454646C284848471050606FF010202FF000000FF0000 + 00FF000000FF000000FF010202FF030404FF000000FF000000FF000000FF0000 + 00FF010202FF060707FF696A6991A8A7A7133435359C2C2D2DBA474747BB4344 + 44BB434444BB434444BB404141BB404141BB434444BB434444BB434444BB4747 + 48BB2D2E2EBA2C2D2DA587888718A9A8A800303030178A8A8A20CECECE21C4C4 + C421C4C4C421C4C4C421C4C4C421C4C4C421C4C4C421C4C4C421C4C4C421CECE + CF218A8A8A202728281988898800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00792725D79B5C53FB9A574CFA9A5448FA9A53 + 45FA9A5142FA9A503FFA9A4D3BFA9A4C37FA9A4A34FA9A4830FA9A462DFA9A44 + 2AFA9A4327FA9C4424FB791C0EDEAA6F61F3FFE1A1FFFFC682FFFFC37EFFFFBF + 77FFFFBD72FFFFBA6CFFFFB666FFFFB260FFFFAE59FFFFAA52FFFFA54DFFFFA1 + 47FFFF9D3FFFFFA945FFB05225F2A8614FF1EB9C60FFEF9754FFFBA05AFFF79F + 59FFE68F52FFE48C51FFE48C50FFE48B4FFFE48A4DFFE68A4CFFF6994DFFFB9B + 4EFFF0924EFFEC8A41FFAD471AF1A55540F1F0C9AFFFBABDEBFF728CD6FF838B + D0FFEBE5EDFFF9F2EFFFF7F2EFFFF8F2F0FFF9F2F0FFF0EAF0FF888FE5FF6D86 + E4FFB1BBF1FFF5C8A9FFAC3E10F1A9573CF1F8CDB5FF6391F0FF0971E3FFA0AB + E4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A9ADEDFF0C6D + E7FF5594EDFFFAC9AEFFB0420FF1AC5739F1F3CDB5FF6676ECFF979DEAFFFFFF + FF00FFFFFF00FFFFFF00FEFEFEFFFEFDFDFFFBFAFAFFFCFAF9FFFFFFFAFFA4AC + DFFF5675D6FFF4C7ACFFB2420CF1AC5634F1EFCAB3FFE0E0FBFFFEFAFEFFFFFF + FF00FFFEFEFFFEFEFEFFFDFCFCFFFCFBFBFFFAF8F8FFF8F5F6FFF8F6F4FFFCF4 + F1FFD9D8F1FFEDC5ABFFB3430AF1AE5532F1F0CBB1FFFFFFFF00FFFFFF00FFFF + FF00FEFEFEFFFEFEFEFFFCFBFBFFFBF9F9FFF8F6F6FFF6F3F3FFF4F0F0FFF4EE + EDFFF6FAFBFFF0C6AAFFB34109F1B0562DF1F0CBB0FFFFFFFF00FFFFFF00FFFF + FF00FEFDFEFFFDFBFBFFFBF9F9FFF9F6F6FFF7F3F3FFF5F0F0FFF2ECECFFF1EA + EAFFF5F7F6FFEFC4A6FFB64209F1B4572AF1EEC6ADFFE8E7F8FFFFFCFEFFFEFE + FEFFFCFBFBFFFCFAFAFFFAF6F6FFF6F4F4FFF4F1F1FFF2ECECFFEEE9E9FFF6EC + E7FFDBDAEFFFEABDA4FFB94408F1B75927F1F1C7ACFF6B7CD7FFA6AEE4FFFFFF + FF00FBFAF9FFF9F6F7FFF7F4F4FFF5F1F0FFF2EDEDFFEFE9EAFFFEF3E8FFADA9 + DBFF576CE5FFEBBCA0FFBD4507F1B95924F1F6C6AAFF5F94E9FF0E6DE3FFB4B5 + EEFFFEFEFBFFF8F7F6FFF5F2F3FFF3EFEFFFF1EBEBFFF7EEE8FFB4B0D5FF136F + E0FF4987EFFFEFB99DFFBF4708F1BA5820F1F0C6ADFFB8C7FFFF6C96F3FF8291 + F2FFF0F2FFFFF8FCFFFFF1F4FCFFEFF1F9FFF0F2F7FFE7E6F0FF7F8DD5FF6391 + E0FFA0B4F2FFEBBFA9FFBF4608F1C26229F3EEA46CFFF4B587FFFBB180FFF4B1 + 7FFFE9A87CFFEAA678FFEAA575FFE9A273FFE9A170FFE69D6DFFEFA26BFFF59C + 64FFEE9F6AFFED8C47FFC64B03F3A94611DDC15C1CFBBF530FFAC0540EFAC053 + 0CFABE4F09FABE4E07FABE4C04FABF4C02FABE4900FABF4800FAC14900FAC149 + 00FAC04500FAC14800FBAA3E00E1FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF04C9CBC93ABDBD + BD6DB7B7B7A2B6B6B6B7AFAFAFAE9E9E9E7E8383833D00000000000000000000 + 000000000000000000000000000000000000FFFFFF04B2B3B371C0C1C1CCE1E1 + E2FFF0F0F0FFF5F5F6FFEEEFEFFFE0E0E1F9CCCCCDC45B5B5B3B000000000000 + 000000000000000000000000000000000000ADACAC4FB8B8B8F2E7E7E8FFFFFF + FEFFDAD6CFFFD2CFCAFFD6D3CDFFF2EFEBFFFAFAF9FFCFCFCFBF050505320000 + 000000000000000000000000000098999913A3A3A3ACDDDDDEFFFFFEFBFF3534 + 34FF52504EFFEBE5DBFF938D85FF262625FFB9B6B3FBFBFBFBFEAAABAB9B0000 + 000000000000000000000000000087888833ADAEAEECF5F5F7FFB2ACA6FF5A59 + 56FFC4BDB4FFF1E8DAFFDCD1C4FF625B53FFB4A48BF8F8F7F7FFCBCCCCC50000 + 00000000000000000000000000006C6E6D2FB6B6B7E5FDFDFEFFC7C3B9FFD4C8 + B9FFE9DBC5FFDCC8AAFFD9C29EFFD6BE97FFC1AB88FBF2F2F0FDECECECED0000 + 00000000000000000000000000005B5C5A26AEAEAED2F7F7F8FFC0B9AEFFBAAC + 93FFD4BA91FFD3B488FFD3B68AFFBEA780FFAC9978FAF0EFEEFDE1E0E1E80000 + 00000000000000000000000000003B3C3B1C929292C0E9E9EAFFCDC5BBFF302D + 27FF927E5EFFCEB185FFB19974FF2C271EFF6A6157F1F9F8F7FFAAA9AAC00000 + 0000000000000000000000000000222122116363638EBDBDBDF5F0EEEDFF7C78 + 73FF7A6D59FFA7906BFF958266FF767067FFD7D4D2FCCCCBCCFF5454547B0000 + 0000000000000000000000000000242424051E1E1E21747575D0C2C3C3FFF0ED + EDFFE5E1DCFFDFDAD5FFE2DEDAFFF7F4F2FFCBCBCBFF4C4C4CFF000000000101 + 015C000000000000000000000000000000002C2C2C0C2F2F2F326A6B6BA69999 + 99FECCCBCCFFDCDBDDFFDDDDDEFF9B9A9BF1424242DE000000005A5A5AFF0000 + 00000101015400000000000000000000000000000000353535112D2D2D273A3A + 3A654A4A4A944F4F4FB0535454BD414242672324244700000000010101FE5B5B + 5BFF000000000000000000000000000000000000000000000000313131051A1A + 1A1117171720111111250A0A0A1D0606061B0303031B00000000000000000A0A + 0AFD494949FF050505E600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000171717FE262626FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000101012E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF04C9CBC93ABDBD + BD6DB7B7B7A2B6B6B6B7AFAFAFAE9E9E9E7E8383833D00000000000000000000 + 000000000000000000000000000000000000FFFFFF04B2B3B371C0C1C1CCE1E1 + E2FFF0F0F0FFF5F5F6FFEEEFEFFFE0E0E1F9C7C7C8B95B5B5B3B000000000000 + 000000000000000000000000000000000000ADACAC4FB8B8B8F2E8E8E9FFF5F4 + F3FFCECAC4FFD7D3CCFFDAD6C9FFE4E2DFFFF4F4F4FFCFCFCFBF050505320000 + 000000000000000000000000000098999913A3A3A3ACDDDEDEFFF3F2F0FFCAC5 + BEFFD3CFD4FFBBB7CCFF7370B5FFCDC6B7FFE1DEDBFCFCFBFBFEAAABAB9B0000 + 000000000000000000000000000087888833ADAEAEECF3F3F5FFC3BDB4FFC9C2 + CFFFCBC4D0FFC1BACDFF4946A4FFC6BCB3FAD5CAB2FAF6F6F6FFCBCCCCC50000 + 00000000000000000000000000006C6E6D2FB6B6B7E5FDFDFEFFC9C3BAFFBAB3 + CAFF4745ACFF2D2C9BFF282792FF2E2D9FFF655B8EF8F2F1EFFDECECECED0000 + 00000000000000000000000000005B5C5A26AEAEAED2F7F7F9FFBEB8ADFFD1BC + 9DFFE3C893FFAF9888FF5F558AFFC8AF85F9CFB584F8F0EFEEFDE1E0E1E80000 + 00000000000000000000000000003B3C3B1C929292C0E9E9EAFFC5BEB6FFAD95 + 73FFC8AC7FFFB49C85FF766884FFBBA27FFFA49580F0F8F7F6FFAAA9AAC00000 + 0000000000000000000000000000222122116363638EBDBDBDF5EBEAE9FFBBB2 + A3FFB19C7EFFA9926BFFB09872FFB6A894FFE4E0DCFCCCCBCBFF5454547B0000 + 0000000000000000000000000000242424001E1E1E21747575D0C2C3C3FFF0ED + EDFFE5E1DCFFDFDAD5FFE2DEDAFFF7F4F2FFCBCBCBFF4C4C4CFF000000000101 + 015C000000000000000000000000000000002C2C2C0C2F2F2F326A6B6BA69999 + 99FECCCBCCFFDCDBDDFFDDDDDEFF9B9A9BF1424242DE000000005A5A5AFF0000 + 00000101015400000000000000000000000000000000353535112D2D2D273A3A + 3A654A4A4A944F4F4FB0535454BD414242672324244700000000010101FE5B5B + 5BFF000000000000000000000000000000000000000000000000313131051A1A + 1A1117171720111111250A0A0A1D0606061B0303031B00000000000000000A0A + 0AFD494949FF050505E600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000171717FE262626FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000101012E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF04C9CBC93ABDBD + BD6DB7B7B7A2B6B6B6B7AFAFAFAE9E9E9E7E8383833D00000000000000000000 + 000000000000000000000000000000000000FFFFFF04B2B3B371C0C1C1CCE1E1 + E2FFF0F0F0FFF5F5F6FFEEEFEFFFE0E0E1F9C7C7C8B95B5B5B3B000000000000 + 000000000000000000000000000000000000ADACAC4FB8B8B8F2E8E8E9FFF5F4 + F3FFCECAC4FFD3D0CBFFD1CDC7FFE5E2DFFFF4F4F4FFCFCFCFBF050505320000 + 000000000000000000000000000098999913A3A3A3ACDDDEDEFFF3F2F0FFCAC5 + BEFFE3DFD9FFDFDAD2FFD6D0C7FFC5BFB5FFE1DEDBFCFCFBFBFEAAABAB9B0000 + 000000000000000000000000000087888833ADAEAEECF3F3F5FFC4BEB5FFDFD7 + CAFFE8E0D3FFE5DBCCFFE2D8C9FFDDD3C4FFC0B6A8F7F6F6F6FFCBCCCCC50000 + 00000000000000000000000000006C6E6D2FB6B6B7E5FDFDFEFFCAC4BBFFD9CB + B4FF9D4555FF973A4DFF983E4FFFAC6964FFA29075F0F1F1EFFDECECECED0000 + 00000000000000000000000000005B5C5A26AEAEAED2F7F7F9FFBEB8ADFFCFBB + 9EFFDBC79AFFD7BE8EFFDAC291FFD4BC90FFB6A281F5F0EFEEFDE1E0E1E80000 + 00000000000000000000000000003B3C3B1C929292C0E9E9EAFFC5BEB6FFAD95 + 73FFC8AB7FFFCDB084FFCDB185FFBDA47EFFA19380EEF8F7F6FFAAA9AAC00000 + 0000000000000000000000000000222122116363638EBDBDBDF5EBEAE9FFBBB2 + A3FFB19D7EFFA7906BFFAA9372FFB7A894FFE4E0DCFCCCCBCBFF5454547B0000 + 0000000000000000000000000000242424001E1E1E21747575D0C2C3C3FFF0ED + EDFFE5E1DCFFDFDAD5FFE2DEDAFFF7F4F2FFCBCBCBFF4C4C4CFF000000000101 + 015C000000000000000000000000000000002C2C2C0C2F2F2F326A6B6BA69999 + 99FECCCBCCFFDCDBDDFFDDDDDEFF9B9A9BF1424242DE000000005A5A5AFF0000 + 00000101015400000000000000000000000000000000353535112D2D2D273A3A + 3A654A4A4A944F4F4FB0535454BD414242672324244700000000010101FE5B5B + 5BFF000000000000000000000000000000000000000000000000313131051A1A + 1A1117171720111111250A0A0A1D0606061B0303031B00000000000000000A0A + 0AFD494949FF050505E600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000171717FE262626FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000101012E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000F7F7F7199D9D9DFF8D8D8DFD777777F86E6F + 6EFF1C1C1C510000000003030307010101010000000000000000000000000000 + 0000000000000000000000000000F4F4F419838383FF747475FD5F5F5FF95654 + 55FF100F104D2C2C2CBB1313135A000000000202020300000000000000000000 + 0000000000000000000000000000F2F2F218676768FF5B5B5BF8484747F43D3D + 3CFF0909095E323232C27A7A7AFF131313520000000002020204000000000000 + 0000000000000000000000000000F0F0F019565657FF494949FD343535F9292A + 2AFF00000065545454BAE5E5E5FF858585F71010105700000000020202060000 + 0000000000000000000000000000E9E9E90B1717178219191991101110900D0D + 0DA1000000434E4E4EC4F8F8F8FFF0F0F0FE818181F41212125A000000000202 + 0206000000000000000000000000E6E6E60000000005020202240000002D0202 + 02300000001D505050CAF4F4F4FFFFFFFFFCECECECFE818181F6131313580000 + 0000020202050000000000000000E6E6E6000000000E0303031A0101011F0303 + 032500000004505050C2F7F7F7FFFFFFFFFEFFFFFFFDEDEDEDFD828282F91313 + 1355000000000101010300000000E6E6E6000000000002020200000000000202 + 020500000000505050C0F7F7F7FFFFFFFFFDFCFCFCFFFFFFFFFDE3E3E3FC7676 + 76FF1414144C0000000001010102E6E6E6000000000002020200000000000202 + 0205000000004E4E4EC0F6F6F6FFFFFFFFFCFFFFFFFEE3E3E3FF6C6C6CF63F3F + 3FC5626262C11111112900000000E6E6E6000000000002020200000000000303 + 030500000000595959BDF6F6F6FFDEDEDEFDE0E0E0FCC3C3C3FF1B1B1BA10606 + 0629000000310000000E00000000E6E6E6000000000002020200000000000101 + 0106000000002F2F2FC9A9A9A9FF262626CA838383EFF9F9F9FF868686E21717 + 1757000000160202020B00000000E6E6E6000000000002020200000000000101 + 0105000000001E1E1EBD2D2D2D9C0404043B424242A0C6C6C6FFC2C2C2FF2F2F + 2F980F0F0F060000000201010101E6E6E6000000000002020200000000000101 + 0101000000002B2B2B380909092C0000002E0A0A0A4E8F8F8FF4EEEEEEFA9393 + 93F2101010430000000001010103E6E6E6000000000002020200000000000000 + 000000000000000000000303031B000000180808080F2C2C2C8BA1A1A1FF9C9C + 9CFF0B0B0B770000000001010101E6E6E6000000000002020200000000000000 + 000000000000020202040000000401010104000000001C1C1C3C6D6D6DD23131 + 3190000000430000001700000001E6E6E6000000000002020200000000000000 + 000000000000000000000000000000000000000000000606060B0A0A0A300000 + 003D00000032000000160000000190909100868687FFFFFFFF007D7D7EFFFFFF + FF007D7D7EFFFFFFFF007D7D7EFFFFFFFF00868687FF90909100949494009292 + 92009090900092929200959595008D8D8D00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C8C8D00929292008E8E + 8E00FFFFFF008E8E8E00939393008B8B8CFFFFFFFFFFDEB274FFDEB47AFFDEB5 + 7BFFDEB67BFFDEB57BFFDEB47AFFDEB274FFFFFFFFFF888889FF8D8D8D008989 + 8900FFFFFF008C8C8C009393930000000000FFFFFFFFE1BA84FFE2BE8BFFE2BF + 8DFFE2BF8DFFE2BF8DFFE2BE8BFFE1BA83FFFFFFFFFF00000000FFFFFF008484 + 8400FFFFFF008B8B8B00939393008A8B8CFFFFFFFFFFE5BF8CFFE6C393FFE6C4 + 95FFE6C495FFE6C495FFE6C393FFE5BF8CFFFFFFFFFF7C7D7FFFFFFFFF007D7D + 7EFFFFFFFF00868687FF9090910000000000FFFFFFFFE7C493FFE8C79AFFE8C8 + 9CFFE8C89CFFE8C89CFFE8C79BFFE6C495FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF8D8D8D008A8B8CFFFFFFFFFFEBC89BFFEBCBA1FFEBCC + A3FFEBCCA3FFEBCCA3FFEBCCA3FFEBCAA0FFEAC89CFFE9C79AFFE9C799FFE9C7 + 98FFEAC594FFFFFFFFFF8A8B8CFF00000000FFFFFFFFEDCDA2FFEDCFA8FFEDD0 + A9FFEDD0A9FFEDD0A9FFEDD0AAFFEDD0AAFFEDCFA9FFEDCFA8FFEDCFA8FFECCE + A7FFEDCCA2FFFFFFFFFF000000008B8B8CFFFFFFFFFFF0D0A6FFEFD2AAFFEFD2 + AAFFEFD2ABFFEFD2ABFFEFD3AEFFEFD4B0FFEFD4B0FFEFD4B0FFEFD4B0FFEFD3 + AEFFEFD1AAFFFFFFFFFF8A8A8BFF00000000EEEFF0FFFFFFFFFFE5E8ECFFFFFF + FFFFE5E8EDFFFFFFFFFFF2D6B2FFF2D8B6FFF2D8B7FFF2D8B7FFF2D8B7FFF2D7 + B6FFF2D6B1FFFFFFFFFF3F3F3F5191919100878788FF00000000808081FF0000 + 00007F8081FFFFFFFFFFF4DAB9FFF4DBBDFFF4DCBEFFF4DCBEFFF4DCBEFFF4DB + BDFFF5DAB9FFFFFFFFFF8A8A8BFF9393930000000000FFFFFF00000000008C8C + 8C0000000000FFFFFFFFF7DEBFFFF6DFC2FFF6E0C3FFF6E0C3FFF6E0C3FFF6DF + C2FFF7DEBFFFFFFFFFFF00000000939393008C8C8C00FFFFFF008C8C8C009191 + 91008A8A8AFFFFFFFFFFFBE2C5FFFAE2C6FFF9E2C7FFFAE2C7FFF9E2C7FFFAE2 + C6FFFBE2C5FFFFFFFFFF8A8B8BFF939393008E8E8E00FFFFFF008E8E8E009292 + 920000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF00000000959595009292920090909000929292009494 + 940090909000868686FF000000007C7D7DFF000000007C7D7DFF000000007C7D + 7DFF00000000868686FF90909000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 00009F9F9F01A1A1A115A1A1A15FA0A0A0B3A1A1A194A1A1A12A646464045555 + 5504555555045555550200000000FFFFFF000000000000000000000000009C9C + 9C03A1A1A134A3A3A3B7A1A1A1FF8E8E8EFFADADADFFA7A7A7CF6C6C6C8A5656 + 56855555557F5555553C55555502FFFFFF00000000000000000099999904A1A1 + A139AAAAAAC0A9A9A9FF8B8B8BFF808080FFC6C5C6FFD0D0D0FFABABABB99E9E + 9E3561616115555555A255555506FFFFFF0000000000707BAA059497A33AA9AA + B1C1B6B7BBFF9F9FA0FF898989FFADADADFFE2E2E2FFECECECFFCBCCCBFFA8A9 + A9B87B7B7B455555558555555505FFFFFF003954C804767FAB3D9299B5C4A6AE + CDFFA3A8BDFF9A9CA1FFA8A8A9FFDBDBDBFFEEEEEDFFEAEAE9FFE5E5E6FFACAC + ACFF7B7B7BE47272726471717103FFFFFF004E62BA246474B7C37A8BD1FF7C8C + D4FF8A95C1FFA2A6B9FFD1D1D3FFECEDEDFFE8E8E8FFD0D0D0FFBAB9BAFFA3A3 + A3FFAFAFAFFFA0A0A0BA90909036FFFFFF00465CBE843A56CDFF3B59DBFF4A64 + D6FF929DCFFFB7BBCBFFB3B3B5FFAEAEAEFFBBBBBAFFB4B5B5FFB7B7B7FFD9DA + D9FFECEBECFFCACACAFF919191BDFFFFFF00314ECBE51F42D9FF3050DAFF6F83 + D9FFAEB2C2FFAAAAABFF89898BFF8C8D8DFFACADADFFD6D6D6FFF0F0F0FFF1F2 + F1FFEFEFEFFFEAEAEAFF8E8E8EECFFFFFF002545D5FA596CC1FF929FD5FFA3A7 + BAFF969596FF89898AFF949495FFA9AAAAFFC1C2C2FFD8D7D7FFE9E9EAFFF4F4 + F4FFF3F2F3FFC7C7C7FF888888A0FFFFFF002143D7F2838698B9A9A9A9FFA8A8 + A8FF8C8C8CFF808080FF888888FF9B9B9BFFB0B0B0FFC6C6C7FFDADADBFFEBEB + EBFFE7E6E7FF9F9F9FC38585852EFFFFFF001F42D8EA80808035868686B99797 + 97FFA0A0A0FF898A89FF808080FF888788FF9A9B9BFFB2B2B3FFC9C9CAFFD0D0 + D0FFA4A4A4FF8585855F7D7D7D03FFFFFF001F42D9E97B7B7B037B7B7B358181 + 81B8949494FF9F9F9FFF8A898AFF807F80FF89888AFFA0A0A1FFB5B5B5FF9797 + 97FF8080808C7B7B7B1500000000FFFFFF001F42D9E900000000777777047777 + 77357E7E7EB9949494FFA1A1A1FF8B8B8BFF858585FF919090FF878787FF7B7B + 7B8C7676761C7777770100000000FFFFFF001F42D9E900000000000000007474 + 7403737373357C7B7CBA979697FFA09FA0FF888888FF7B7B7BC37575755D7373 + 7315747474010000000000000000FFFFFF001F42D97800000000000000000000 + 00007171710170707036707070B7717171D57070708070707022717171030000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF00AA85 + FF00AA85FF00AA85FF00AA85FF00AA85FF00AA85FF00AA85FF00AA85FF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF000000 + 0080000000FD000000E9000000430000000000000000AA85FF00AA85FF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF000000 + 00F1231C353A453667C7030204FF9272DCFE956BF591AA85FF00AA85FF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF000806 + 0CD6A885F6E08D81A9FF262528FF181818FFA782FEFE4C11D23CAA85FF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF0CA07F + ECE1948F9DFF8E8E8EFF818181FF020202FF8867D3FF5118D4EA4D12D248FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA85FF00AA85FF00AA85FF90A697 + C9FFA1A1A1FF9E9E9EFF9A9A9AFF201D28FF312252FF602CD7FF531BD4F04A0F + D257FFFFFF00FFFFFF003F00CF00FFFFFF00FFDE2500FFDE2500DFBD77F7FFDF + 25FFFFDF25FFFADC2CFFBDAD9AFF4F495DFF131313FF988BB8FF6532D8FF561F + D4F94C12D170FFFFFF003F00CF00FFFFFF00FCD823001C005D02BB97CEFBEABC + 2AFFD3BE80FFAC90E6FF9D76F6FF9F9DA3FF030303FFBAB9BEFF764ADCFF6838 + D8FF5A25D3FE4D14CF703F00CF00FFFFFF00F6CB1D00F5C81C007C50D7C2D191 + 47FF9974E6FF6F45CEFF3B08AFFF8C869BFFB7B7B7FF9793A0FF906DE0FF7D54 + DBFF7246D7FF612FD2EE3F00CF00FFFFFF00E5A40F00EEB7160060269C26BE74 + 1CFA2A0674FF2A0089FF2E0098FF422586FF524769FF5C4199FF9E81DFFF997B + DEFF8A67D9FF7A53D5DA3F00CF00FFFFFF00D57D0000E0970A00E5A30F08D780 + 02FC310686D6240076FF290087FF2D0093FF3100A0FF3400AAFF6036C1FFA891 + DDFFAD97DFFF9374D98A3F00CF00FFFFFF00D67E0100D67F0100DD8E0705D780 + 02F9622878122A008BD1230074FF270082FF2B008DFF2E0097FF2F009CFF5933 + B0FF8C6ECFC7E2DBF3153F00CF00FFFFFF00D67F0101D67F015BD67F01B5D67F + 01FAD67F01B4CA750F612B008AC2220071FF240077FF26007DFF290089F93000 + 9EA73F00CF051C005D003F00CF00FFFFFF00FFFFFF00D67F01D3D67F01FFD67F + 01FFD67F01FFD67F01D32E009A062A008BA0280083D22A008AB82B008D560600 + 150A00000006000000013F00CF00FFFFFF00FFFFFF00D67F0159D67F01B4D67F + 01F4D67F01B4D67F015900000001000000210000003800000033000000280000 + 001B00000010000000033F00CF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000462BF000462BF000462C0010462C0163858 + DD924F4FE8FF2A51D1C22894C5C640B7C8FF238FBEAD045FBA41035EB80B035C + B400035BB200035BB2003E50D9000462BF000462BF0C0462C05A106AC38B3E3E + D7FF7676F4FF2A2AC2FF33AABBFF75DEEFFF239AABFF317FCAAD055EB676035C + B40C035BB200035BB200035BB2000462BF1E0662BE7C3E8AD3B47FB6E8EE516A + CFFF1F1FB6FF4861C7FF4DA1C3FF1D93A4FF489CBEFFAFAFACFED7A471FF8583 + 819558728D0058728D0001179700045EB87B5FA1DDCB82B6E5FE7DB0E1FF7DB0 + E1FF7DB0E1FF83B6E6FF8ABDEAFF83B6E6FF7DB0E1FFC69360FFF0BD8AFFB27F + 4CFFAF7C4900583E700000008F00034F9BA686BBE8F58EC1EDFF8BBFEBFB86BA + E8FD87BAE8FF4F8ABFE0105191CA4F8ABFE087BAE8FF979694FFA67340FF5960 + 67CE335A82000000960000008F0003478C6E03478CBA03478CBD03478CBD2A6A + A7CE96C9F1FF12589CBC3070AC0012589CBC90C3EEFF88BBE8FF266FB6BC0251 + A09201159A000000955700008DCB03478C0003478C0003488E0003498F1A0248 + 8DB99BCEF4FF87BDE7F17FB6E2EC7BB3E0EA90C3EDFF276DB0BE024C96950113 + 99190000967A03038FCE0000847003478C0003488E00024A9300024A93955693 + C8DA8CBFECFF90C4EEFF95C8F1FF94C8F0FF2668A7C201468B8C0112962A0000 + 96970D0D98D40000838F00007D02034C9700024E9C00024E9C00024E9BA678B1 + DEE693C7EFFB8CC0EAF572A9D7E82C69A4CA00328A8C0112963F000096C51F1F + AADF000083A900007D0B00007D00024D9800024D9800024D9800024B954F0147 + 8D97014487B4004283B1004181990030884900009D48000096CC4E4ED6FF0000 + 83C400007D1A00007D0000007D00024D9800024D9800024D9800024A92000145 + 880000428300004081002848680028287643000096CC4E4ED6FF000083CC0000 + 7A3B000078000000780000007800024D9800024D9800024D9800024A92000145 + 88000D5C9F004F4F4F004E4E4E26333358863A3AC2FF000083CC00007A480000 + 78000000780000007800000078000E61A9000E61A9000E61A9000E60A6001975 + BA001975BA004E4E4E264444446FF2F2F2FF1C1C3C9000007A48000078000000 + 78000000780000007800000078001975BA001975BA001975BA001975BA001975 + BA001975BA432F597B96C7D4E0FF2525257C1818182D00007800000078000000 + 7800000078000000780000007800847F9000847F9000847F9000847F9000847F + 90004D75A0CF5B9FD2FF163657A21818182D1616160000007800000078000119 + 8A0002319C0002319C0002319C00EE886600EE886600EE886600EE886600EE88 + 6600DF7957FF57404FE40D264644161616001616160001198A00034AAE000462 + C0000462C0000462BF000462BF004A7CA5004A7CA5004A7CA5004A7CA5004A7E + A7004A7EA8004A7EA8004A7EA8004A7EA800497DA7004579A400709BBE00B5D2 + EA00C3DAEF58CDE3F5FB3F75A1FF4B7CA6004A7CA5004A7CA6004A7EA8B04A82 + AEFF4A83B0FF4A83B0FF4A83B0FF4A83B0FF4A82AFFF447DA9FF709CBFFFB9D5 + EBFFB3D1EAFFC1DBF2FF4279A5FF4F79AB004C7AA7004A7BA6004A7FACFF4438 + 31FF433B37FF433D38FF433D38FF433D38FF423B36FF3C332CFFB9DAF5FF7FB0 + DAFF5495CCFFC0DAEFFF467CA8FF009242005276AF004E77AB004D7BB0FF4C3D + 3BFF4A4343FF484544FF484644FF484644FF474542FF433C36FF5FA1D8FF5C9A + CCFF5896C9FFB8D3EBFF4980ACFF00904C00009147001A866E0017866DFF0096 + 47FF523F45FF4F4749FF4D494AFF4C4A4AFF4C4848FF4A423DFF60A0D5FF5D98 + C9FF5894C6FFAFCCE6FF4B83B0FF008F4E00008F4C00008E4900008B44FFA0E8 + DAFF009144FF55434AFF524B4DFF4F4D4EFF4F4D4CFF4D4641FF5E9CD2FF5C95 + C5FF5990C1FFA6C4DFFF4E86B5FF008D4CEF008A47FF008844FF00853FFF00C1 + A0FF97E3D1FF008F43FF5A484EFF565051FF53514FFF524B45FF5B9ACDFF5C91 + C1FF20B7F5FF9EBCD7FF5189B8FF008A47FF61E1D0FF60DDCAFF63DCC8FF00C4 + 9BFF00C69CFF82E1C8FF009447FF5C5054FF585353FF574F4AFF5A96CAFF5B8F + BEFF22B9F7FF95B5D3FF548DBCFF008A47FF63EDD0FF00D4A0FF00D29EFF00CC + 9CFF00CD9CFF6FDCBDFF009346FF615457FF5C5756FF5B534DFF5794C5FF588E + BCFF47749BFF88AFCFFF5790C0FF008B4BF2008A47FF008845FF008441FF00DA + A2FF60D9B3FF008D42FF68545AFF625B5CFF605C5AFF605852FF5490C2FF558C + BAFF4E81ADFF7EA6C8FF5A94C4FF000000000000000000000000008C46FF4FDD + B0FF008D43FF6B585EFF655E60FF636160FF62605FFF645D57FF518DBEFF528A + B7FF5187B4FF739FC2FF5D97C9FF66565D0069555C0010866D0013826BFF0093 + 46FF715C62FF6A6263FF676463FF666463FF676462FF68615BFF4F8ABBFF5086 + B4FF4F84B1FF6895B9FF5F9BCDFF5E5B5C005F5A5C00635859003F69A5FF7566 + 67FF706869FF6D6969FF6C6A69FF6C6A69FF6C6A68FF6E6762FF4C89BAFF4E85 + B2FF4D83AEFF5D8CB2FF629ED1FF5C5C5CFF5C5C5CFF5E5B5AFF5E5A59FF5D5A + 5AFF5B5A5BFF5A5B5BFF5A5B5BFF5A5B5BFF5B5A5AFF5C5956FF576876FF4E7E + A4FF4C80ACFF5082ABFF65A2D5FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000365D7B79497BA2FC68A4D9FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000049826B0058967D005A9E83005EA78A0064B2 + 9300467B65005B9880006DB79A0077C6A6596DC5A27D53B18B004BA37F006AA0 + 850085A08D0063BB980052B48D0049826B0058967D005A9E83005EA78A0064B2 + 9300467B65005C9981006EB99B7576C2A4F578C5A7FF58A88864358866007682 + 7400B480850069BA990051B48D004A836C0059977E005B9F84005EA78A0063B1 + 92004578630A58977E8B5DA88BFF5CAD8CFF60B090FF55A486E44F7F650B9179 + 7700AB84850068BA990051B48D0049836C2C5292797E52997DA85DA78AAC6EBC + 9EA5497A66CA3F705BFF54987DFF5D9B85FF579B83FF5F9782FF81706C9DAF70 + 7C30A48A870068BA990051B48D00213F32CB397A5FFF3E8A6AFF479777FF59AD + 8CFF5DA287FF2B3A34FF619C82FF6396BCFF54929CFFA5BBACFFCFA2AFFFB091 + 96C77AC3A40965C09C0051B48D00111C16D3234536FF3C8366FF3E8E6DFF4397 + 75FF51A381FF3E6E5AFF465A52FF4F82C3FF4B85A8FF647168FFC3B6BDFF9BBF + AFFA6AC4A0D05FBD979E53B8903118281FD9192C23FF326851FF3E8B6CFF4190 + 70FF408869FF4FB28AFF3D7F61FF20365FFF24385BFF40604EFF63B293FF50AF + 89FF47A47FFF459D7AFF2C5B47CF14201B851A2E24FF29523FFF3D8769FF3E89 + 69FF3F8869FF419672FF366450FF2B2E2BFF31423AFF4AA07DFF3E9371FF3E8B + 6CFF408D6EFF285442FF131E17D91117140215221B9C224233FF3A7E62FF3D84 + 67FF3D8667FF2E473CFF353B39FF3D7D65FF355447FF315244FF31654FFF3064 + 4EFF346B54FF214132FF1A3125DB0A0407000B0D0B0916251EB1326851FF3A7D + 60FF2D5745FF2F282AFF3B6656FF377B61FF39755EFF3A5C4FFF323D39FF2935 + 2FFF274C3CFF193025D2192D23540A050800070405000A0E0C13203C2FC52B43 + 37FF2B2727FF3A4D47FF468971FF488D73FF479477FF4CB58EFF408B6FFF2B26 + 27ED243B3182172D2319111C1600090508000806070005040400171E1B1D2927 + 28D6344A42FF4C8B75FF3C715CFF295140FF254A3AFF224B39FF2A5F4AA92D31 + 2F311A252000060506000B0B0B000100000000000000000000000F0E0E002A2C + 2B2C203F32E3203F31FF1D3A2CFF1A3226FF15241DCB1A372B50224B3B022E2F + 2F00140F1200040102000C0E0D00000000000000000000000000100F0F002628 + 2700162B233E14251CF0182F24EC172D237717292110080C0900010000002C2C + 2C0015131400040203000C0E0D00000000000000000000000000111010001F1D + 1E00030504001120193D172C22310D1914000709080001000000040504002C2D + 2D0015131400040203000C0E0D00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00C59441EFC4903AFFC48F37FFC48E37FFC48E + 37FFC38E37FFC28E37FFC28E38FFC18E38FFC18E38FFC18E38FFC28E38FFC390 + 3BFFC59441ECFFFFFF00C7964500C4903AFFFFFAEBFFFFF9E3FFFFFAE1FFFFF8 + E1FFFFF5E1FFFFF5E6FFFFF6EAFFFFF6EAFFFFF6EAFFFFF6EAFFFFF6E9FFFFF9 + EDFFC3903BFFFFFFFF00C7964500C48E37FFFFFBE9FF00A09EFF0563DAFF23B5 + A4FF93DBFFFFFCCD64FFD2AA50FFF8CC66FFF7CC67FFCFAB54FFF7CB61FFFFF8 + EEFFC18E38FFFFFFFF00C7964500C58E36FFFFFEEEFF00B196FF2C0FFFFF13BB + 88FF99DEFFFFC1DCDDFFDAAD50FFFDD06AFFFBD06DFFD3AE5BFFFACE65FFFFFB + F4FFC28E37FFFFFFFF00C7964500C58E36FFFFFFF5FF00A76FFF1273A7FF0EAF + 88FF46BCB0FF92C1ECFFAAC1C0FFD9B35FFFDAB359FFDAB359FFD7AF53FFFFFF + FAFFC38F38FFFFFFFF00C7964500C58D36FFFFFFFAFF00C28AFF08D197FF12A3 + 91FF17D6A9FF79E9EEFF95B5D1FF8D94A0FF848792FF828692FF908F89FFE3DD + DDFFC79138FFFFFFFF00C7964500C58D35FFFFFFFFFF00C18BFF08D097FF1F56 + C1FF2647FDFF3CCD9EFF928481FFEBBE7FFFFFDD98FFFFDF9EFFE8C58DFF8686 + 8BFFB29056FFFFFFFF00C7964500C58D35FFFFFFFFFF00A073FF07AE81FF12B3 + 8CFF1C38D9FF7F728CFFEFBF7EFFFFF5DBFFFFF7E4FFFFEECAFFFFE5A5FFE8CB + 97FF838283FFFFFFFF00C8964400C58D35FFFFFFFFFF00C08BFF07CD9AFF0CB8 + 89FF10E9ACFF85797AFFFFDF98FFFFF7E4FFFFEDC8FFFFE7B2FFFFE6A5FFFFEC + A6FF747986FFFFFFFF00C8964400C58D34FFFFFFFFFF00C08AFF00CE9BFF36A6 + 89FFABA1A3FF7C7277FFFFE29FFFFFEFCAFFFFE7B3FFFFE9ABFFFFEFB2FFFFF4 + B0FF6F737FFFFFFFFF00CA974200C58D34FFFFFFFFFF00A171FF549383FF9685 + 88FF33AC90FF6B7675FFEAC087FFFFE6A6FFFFE7A6FFFFEFB3FFFFF9BBFFE8D6 + A3FF77777CFFFFFFFF00D6983600C48D34FFFFFFFFFF27A98BFF849E99FF0DA8 + 82FF00DCA7FF26BB9BFF706769FFE5C48FFFFFEDA7FFFFF5B2FFE8D5A3FF7670 + 6DFF9C8F89FF287FD8FF2B81D900C48E38FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFDEE0E9FF747984FF5C626EFF5E636EFF67676DFF7F73 + 6CFF3AC6FFFF55DBFFFF3780CCFFC3913FF2C48F38FFC48D34FFC48D34FFC48D + 34FFC58C34FFC58E35FFC89138FFCB953DFFCD983FFFCF993FFFD99A37FF2B6B + ABFF29B2FFFF44C8FFFF3A83CCFF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000396EA1FF3B6E9EFF213F5A5D000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CD8B6000CD8B61FFCD8B61FFCD8B61FFCD8B + 61FFCD8B61FFCD8B61FFCD8B61FFCD8B61FFCD8B61FFCD8B61FFCD8B61FFCD8B + 61FFCD8B61FFCD8B61FFCD8B6000CD8C62FFF0FDFEFFF0FDFEFFF0FDFEFFF0FD + FEFFF0FDFEFFF0FDFEFFF0FDFEFFF0FDFEFFF0FDFEFFF0FDFEFFF0FDFEFFF0FD + FEFFF0FDFEFFF0FDFEFFCD8B61FFCD8C62FFF4E6DBFFDF9A67FFCF9B69FFBC8B + 62FF9B7857FF908869FFA8ABAEFFA8A598FFCF9169FFCA9B71FFD89165FFCD8B + 6000C79062FFEFE4DAFFCD8B61FFCD8C62FFEBE9DAFFB1AE72FFA3A36CFF9288 + 58FF797944FFBBA07CFFD3DDDFFFD1BEA2FFFFB277FFC6A674FFC3B195FFDAC6 + ACFFCBCEC7FFF2F6F8FFCD8B61FFCD8C62FFEAE5D8FF65A266FF67B171FF86AC + 72FF809A65FFD5A16EFFF6B078FFF9AF69FFB78E60FF74867AFFAED7E4FFC0F2 + FFFFB8EBFFFFEEF9FFFFCD8B61FFCD8C62FFF5EADBFF60A56EFF5EB16FFF77A5 + 6CFFC5A465FFF2B06BFFFFB172FFF7AE6DFF9A956CFFA19D7FFFC3C8B7FFB0D7 + D6FFADD8E3FFECF8FCFFCD8B61FFCD8C62FFF9EBDDFFA7C8ACFFA6AA75FFE1A9 + 6CFFFFB472FFFFB370FFFDB16CFFE8B58BFFB9E6F0FFCFE3DEFFC9CECEFF83A8 + 87FF85AA84FFF0F8FAFFCD8B61FFCD8C62FFFEECDAFFEABE96FFE0B791FFF2B7 + 8DFFF8B581FFFFB370FFFEAD67FFDFC6ADFFB0ECFFFFBEE3FFFFB5EDFEFFABCA + BDFFDEB682FFFAEEE7FFCD8B61FFCD8C62FFFFECDBFFFFAF69FFF4B076FFA7CE + C1FF99BA95FFD8A970FFFDB26FFFF3B07CFFE1BA93FFC1D5D2FFB5E7FDFFD5DB + D9FFFAAF76FFFEEBDAFFCD8B61FFCD8C62FFFFEBDCFFFEB172FFF5B270FF94A8 + 76FF62B47CFF6DA769FFE7AE75FFFEAD6CFFFFA95EFFD9CCAAFFBCEFFFFFD2C6 + AEFFF9AF6AFFFFEBDBFFCD8B61FFCD8C62FFFFECDCFFFFB072FFFEB16AFFEDBB + 95FFA1D9DAFF99A870FFFAB36EFFFFB075FFF8AF6DFFDCC39CFF99CAC2FFDEBD + 90FFF0A975FFF7E5D9FFCD8B61FFCC8C62FFFCEADAFFFFB379FFFEB471FFEFB9 + 8BFFBDDFDBFFF0AE76FFFFB26FFFFBB46DFFFDB371FFEEAB72FFD5A669FFF3A4 + 69FFE19566FFF5E2D7FFCD8B61FFCC8C62FFF0E2D5FFDA9D63FFD89D5CFFEAAE + 7BFFDEB791FFFFB167FFFCB271FFFDB073FFFBAE73FFFBAC6FFFF0A368FFDD90 + 60FFD1855DFFF5E2D6FFCD8B61FFCC8C62FFF9E8DAFFE4A067FFE19D6AFFF4AC + 6CFFF5AB7AFFE5AF82FFFDAF69FFFCAC6EFFF3AE75FFE2A674FFD2956FFFCB8B + 6AFFCE8E6AFFF6E9E0FFCD8B61FFCC8C62FFFFEBDBFFFBECDEFFF6F3ECFFF2F4 + F1FFF4F5F2FFF5F1EAFFFAEEE3FFF6F1EDFFF1ECE9FFF0E8E4FFEFE5E1FFF0E9 + E6FFF1F0EFFFCBDDE2FFCD8B61FFCD8B6000CC8C62FFCC8C62FFCC8C62FFCC8C + 62FFCC8C62FFCC8C62FFCD8C62FFCD8C62FFCD8C62FFCD8C62FFCD8C62FFCD8C + 62FFCD8C62FFCD8C62FFCC916AFE000000000000000000000000000000000000 + 0000000000000000000000000000000000002C3991042C399011000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000002D3A91243B55A9BA537FC0C22F3E936C2D3A + 9201000000000000000000000000000000000000000000000000000000000000 + 0000000000002D3A92043B52A66D72A0D1D1C1EBF9D2B8E8FAD280BFE4D2496E + B7B73241995C0000000000000000000000000000000000000000000000000000 + 00002F3E96253B57A5A98DC7EAD8BDE9F9D8B1E5F8D89FDFF6D988D6F3D973CD + F0DA5192D0DB364FA0AC394AA5220000000000000000000000002D3A92042D3A + 91663F6AB6D257B4E6DF5DBDEBDE5DBEECDE5DBEECDE5ABCEADF57B8E9DF52B5 + E7DF57B5E5E075ACDFE1394AA79B0000000000000000A3A4A40643559F794B83 + C8E647A5DFE549AAE3E54CAEE4E54DB0E5E44DAFE5E44BADE4E449AAE3E55EB5 + E4E55E8DD5E63A4CAEE73343A5BA00000000A3A4A408A7A9ABB0354298EC4E71 + C6EB5CB6E6EB46A6E0EA45A5E0EA46A7E0EA45A6E0EA49A8E1EA71BEE8EA536D + C6EB3748AAEB3546A8EC29368795A6A7A753BFC0C0CFEEEFEFF2DCDEEBF07C85 + BCF04159AEF07DBDE8EF52AFE3EF44A4E0EF60BAE7EF8CBDE8EF556DC4EF394A + AEF031409CF0273380A7171E4D1DB4B5B5F8F6F7F7F7FBFBFBF6FAFAFAF5F9F9 + F9F5969DC7F44B59AAF480A7DBF486CBEDF493B2E2F4455BBEF43A4CB1F42C3B + 91E326317B860000000000000000C7C9C9FCB8B9B9FBF1F2F2FAF7F8F8FAF6F6 + F7F9F3F4F5F9E6E7EEF94D5AA6F83F52AFF9394BB0F9394AACF8283584E81A22 + 563903050C060000000000000000868888D0AEB0B0FEBABCBCFEE0E1E1FDF8F8 + F9FDF5F5F6FCF7F8F8FCBEC0C7FC5361AEFC32429DFC26337EA91D255D310000 + 0000000000000000000000000000404040216A6B6BCDA2A4A4F7BABBBBFFD4D5 + D5FFEFF0F0FFB8B9B9FFABADADFE283688E6242F758B00000000000000000000 + 0000000000000000000000000000000000000F0F0F0B5D5E5E69878888FFBFC1 + C1FFD7D7D7FFB9BBBBFF747575C80D122C310101030900000000000000000000 + 00000000000000000000000000000000000000000000000000004849493E7B7D + 7DBFA2A4A4F06C6E6EB22D2D2D2C000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000E99E4099E99E40CCE99E + 40CCE99E40CCE99E40CCE89D3F33E89D3F33E99E40CCE99E40CCE99E40CCE99E + 40CCE99E409900000000000000000000000000000000E59A3CCCFFE599FFF8C5 + 74F3FFE599FFEBA84FD9E69B3D33E69B3D33EBA84FD9FFE599FFF8C574F3FFE5 + 99FFE59A3CCC00000000000000000000000000000000DE9337CCF3BC6CF3FCD0 + 84FFC78D49FFDD9237850000000000000000DD923785C78D49FFFCD084FFF3BC + 6CF3DE9337CC00000000000000000000000000000000D78C32CCFEE195FFC68B + 48FFF7C77BFFDF9942D9D68B3170D68B3170DF9942D9F7C77BFFC68B48FFFEE1 + 95FFD78C32CC00000000000000000000000000000000CF842CCCD7903BD9D085 + 2D85D7903BD9F3BE72FFD28933EAD68F39EAF3BE72FFD7903BD9D0852D85D790 + 3BD9CF842CCC00000000000000000000000000000000CB802933CB8029330000 + 0000C77C2670CA802CEAD28E3DFFECB66DFFCE8632EAC77C267000000000CB80 + 2933CB80293300000000000000000000000000000000B96E1B33B96E1B330000 + 0000BC721E70C57E2DEAE5AF68FFCA8637FFC27927EABC721E7000000000B96E + 1B33B96E1B3300000000000000000000000000000000B56A18CCC07926D9B469 + 1785C07926D9E4AC5DFFBD7625EABA7120EAE4AC5DFFC07926D9B4691785C079 + 26D9B56A18CC00000000000000000000000000000000AC6112CCF3C76EFFBC73 + 1BD9E9AE49FFBA711ED9AD621370AD621370BA711ED9E9AE49FFBC731BD9F3C7 + 6EFFAC6112CC00000000000000000000000000000000A55A0CCCDF971CF3F3B2 + 31FFB76D13D9A4590B850000000000000000A4590B85B76D13D9F3B231FFDF97 + 1CF3A55A0CCC000000000000000000000000000000009E5307CCFCC649FFE499 + 0AF3FCC649FFB66B07D99C5105339C510533B66B07D9FCC649FFE4990AF3FCC6 + 49FF9E5307CC00000000000000000000000000000000994E0399984D02CC984D + 02CC984D02CC984D02CC994E0333994E0333984D02CC984D02CC984D02CC984D + 02CC994E03990000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00E297 + 3A00E69B3D00EA9F4048EA9F40CCEA9F4048E69B3D00E2973A00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E297 + 3A00E69B3D48E69B3DCCFFDC90FFE69B3DCCE69B3D48E2973A00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E297 + 3A48E2973ACCFDD88CFFFCCD81FFFDD88CFFE2973ACCE2973A48FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DE93 + 3799DD9236CCDD9236CCFCD488FFDD9236CCDD9236CCDE933799FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DD92 + 3600DA8F3400D88D32CCFACF83FFD88D32CCDA8F3400DD923600FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D78C + 3100D2872E00D2872ECCF7CA7EFFD2872ECCD2872E00D78C3100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CB80 + 2900CB802900CB8029CCF3C579FFCB8029CCCB802900CB802900FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C57A + 2400C57A2400C57A24CCEFBF77FFC57A24CCC57A2400C57A2400FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BE73 + 1F00BE731F00BE731FCCEABA73FFBE731FCCBE731F00BE731F00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B86D + 1A00B86D1A00B86D1ACCE8B76CFFB86D1ACCB86D1A00B86D1A00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AC61 + 1100B1661500B16615CCEAB662FFB16615CCB1661500AC611100FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A55A + 0C00A85D0E00AB6010CCEDB754FFAB6010CCA85D0E00A55A0C00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A55A + 0C99A55A0CCCA55A0CCCF2B844FFA55A0CCCA55A0CCCA55A0C99FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A156 + 0948A05508CCF7B935FFF5AD17FFF7B935FFA05508CCA1560948FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A055 + 08009C5105489B5005CCFCBB27FF9B5005CC9C510548A0550800FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A055 + 08009B500500984D0248974C02CC984D02489B500500A0550800FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0068C7743768C6733765C3713762BF6E375FBB + 6A375CB6663758B0623753AA5D374FA458374A9E533746974E3741914937FFFF + FF00FFFFFF00FFFFFF00FFFFFF0067C6734565C2700862BE6D085EB969085BB4 + 650857AF610852A95C084EA25708499C520845954C08408F47083B884245FFFF + FF00FFFFFF00FFFFFF00FFFFFF0064C16F4561BD6C0968C7748268C6738265C2 + 718262BE6E825FBA6A825CB5658258AF618253A95C824FA3578246974DA04697 + 4E7E4191497EFFFFFF00FFFFFF0060BC6B455DB7670A67C673A263BF6D3560BA + 6A3A5CB5663F59B1634255AB5F4650A65A4A4CA0554C479A50503D89427A408F + 474A3B88429EFFFFFF00FFFFFF005CB6664558B0620B63C06EA35EB9693D67C6 + 73D867C572D964C170DA61BD6CDB5DB968DC5AB464DD56AE60DD50A659E54DA2 + 56DC479A50EB46974ECB419149CB57AF614552A95C0D5FBB6AA35AB3644467C6 + 73FF5CB5667A59B2648A57AE609654AB5DA651A75AB24DA256BC479950D14697 + 4EC6408E47DF408F47B13B8842FF51A75B454DA1560E5BB565A356AC5F4A64C1 + 6FFF5AB4659C57AF61A954AB5EB651A65AC04CA156C7499B51CC43934ADB4090 + 47D03B8741E23A8741B335803BFF4C9F544547994F1056AE60A450A5585260BC + 6BFF58B062B854AB5EC251A659CA4CA055D0489A50D343944BD63D8B45E03A87 + 41D5357F3BE2347F3AB1307835FF46974E45419149454EA358B845954D7D5CB6 + 66FF52A85BD64EA357DA4A9D52DD45974DE0419048E03C8A43E137833EE1357F + 3BD72F7835E12F7734AF2A712FFFFFFFFF00FFFFFF004C9F549E47994F5257AF + 61FF4FA559CF4B9E54D346984ED5429148D63D8A43D838843ED8337D39D62F77 + 34D529702FE0296F2EAB256A2AFFFFFFFF00FFFFFF0046974E9E4191499E51A7 + 5BFF499B51E344944BE43F8E46E23B8741E236813CE1317A37E02D7532E0296F + 2EDF256929DE256929A6216425FFFFFFFF00FFFFFF00FFFFFF00FFFFFF004C9F + 54FF47994FB342924AB23D8C45B139853FAF347F3AAE307835AB2B7230A8276D + 2CA5246828A2206324A11D5F21FFFFFFFF00FFFFFF00FFFFFF00FFFFFF004697 + 4EFF419149FF3C8A43FF38833EFF337D39FF2F7734FF2A712FFF266B2BFF2366 + 27FF206223FF1D5E20FF1A5B1EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006666661F6666 + 666F6666667F6666667F6666662FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006666665F666666EF6666 + 66FF666666FF666666FF666666FF666666BF6666661FFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006666664F666666FF666666FF6666 + 66BF6666667F6666667F666666BF666666FF666666EF6666664FFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF006666660F666666EF6666669F6666661FFFFF + FF00FFFFFF00FFFFFF00FFFFFF006666660F6666667F666666EF6666665FFFFF + FF00FFFFFF00FFFFFF00FFFFFF006666669F6666665FFFFFFF00FFFFFF005555 + 553F5555557F5555557F5555553FFFFFFF00FFFFFF006666661F666666CF6666 + 665FFFFFFF00FFFFFF00FFFFFF006666663FFFFFFF005555552F515151DF4141 + 41FF353535FF313131FF3B3B3BFF4D4D4DDF5555555FFFFFFF006666660F6666 + 66BF6666662FFFFFFF00FFFFFF00FFFFFF005555554F4B4B4BFF332C26FF9679 + 5EFFE7C7A7FFCC731AFF9D5D1DFF52391FFF353535FF505050BF5555550F6666 + 660F666666AF6666660FFFFFFF005555551F4A4A4AEF4D4D4DFFE2B180FFFBD9 + BAFFFFFFFF00DF9C59FFF89D42FFF08A24FFBA7431FF353535FF494949CF5555 + 550F6666660F6666667FFFFFFF005555557F464646FFEBEBEBFFF0C39AFFFDF0 + E4FFD8CBBFFF7F7F7FFF8B6F53FFFDA145FFED8E32FFE8DBCEFF4B4B4BFF4949 + 49CF5555550F6666662F6666664F5555557FBABABAFFF8F8F8FFEFC396FFFDA4 + 4FFF7F6B58FF3F3F3FFF333333FFFDB063FFF19236FFF7DEC4FFE2E2E2FF4B4B + 4BFF494949CF5555550F6666663F5555550F7A7A7ACFEDEDEDFFF7EADDFFF294 + 3BFFBE9164FF333333FF584F46FFFEAF5FFFF29237FFF5EFE9FFEEEEEEFFDCDC + DCFF434343FF505050AFFFFFFF00FFFFFF005555550F7A7A7ACFECECECFFF0BA + 86FFFBA759FFE4A769FFFEB56DFFFE9E3FFFEFA762FFF1F1F1FFECECECFFE6E6 + E6FFBCBCBCFF3D3D3DFF5555556FFFFFFF00FFFFFF00FFFFFF006969697FC4C4 + C4FFF4C496FFF29945FFF29338FFF2AC69FFF8F1EBFFEEEEEEFFE9E9E9FFE3E3 + E3FFDDDDDDFF6B6B6BFF4E4E4E7FFFFFFF00FFFFFF00FFFFFF00FFFFFF005555 + 551F9595959FC3C3C3EFF7F7F7FFF5F5F5FFEEEEEEFFEAEAEAFFDCDCDCFFACAC + ACFF7070709F5555553FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00EFEFEF3FEEEEEE6FC6C6C67F7F7F7F6F5555553F5555 + 550FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00F7F7F7199D9D9DFF8D8D8DFD777777FF6E6F + 6EFF5E5E5EFF0000000079797AFF01010101868687FF00000000000000000000 + 0000000000000000000000000000F4F4F419838383FF757576FF626262FF5654 + 55FFB6B6B6FF646464FFABABABFFFFFFFFFFFCFCFCFF00000000000000000000 + 0000000000000000000000000000949495FF676768FF5E5D5BFF4E4B49FF3D3D + 3CFF8F7650FF5B5143FF7A7A7AFF9C7E54FFFFFFFFFF858586FF000000000000 + 000000000000000000000000000054545447565657FF4A4949FF383837FF292A + 2AFF887355FF7A7063FFE5E5E5FF878684FFADADADFF00000000020202060000 + 00000000000000000000000000008E8F90FF888888FF71604AFF6D5E49FF5C50 + 3FFFA9906DFF71695EFFF8F8F8FFEFEFEFFF868686FF565758FF000000007A7A + 7BFF00000000868687FF0000000000000000FAFAFAFFC6A87EFFBFA37EFFBCA2 + 7FFFCDB18AFF6F685FFFF4F4F4FFFEFEFDFFECECECFF858585FFADADADFFFFFF + FFFFFAFAFAFFFFFFFFFF000000008A8B8CFFF1F1F1FFD3B38BFFCEB28DFFC9AE + 8BFFE7C8A0FF756D63FFF7F7F7FFFEFEFEFFFEFEFEFFECECECFF848382FFA18B + 6BFFEAC594FFFCFCFCFF8A8B8CFF00000000FFFFFFFFEDCDA2FFEDCFA8FFE8CB + A5FFEDD0A9FF766F65FFF7F7F7FFFEFEFEFFFCFCFCFFFEFEFEFFE3E2E2FF7676 + 76FFAC9577FFFFFFFFFF000000008B8B8CFFFFFFFFFFF0D0A6FFEFD2AAFFEACD + A6FFEFD2ABFF756E64FFF6F6F6FFFEFEFEFFFEFEFEFFE3E3E3FF706F6EFF6760 + 58FF847C73FFD8D8D8FF8A8A8BFF00000000EEEFF0FFFFFFFFFFE5E8ECFFFAFA + FAFFE5E8EDFF838383FFF6F6F6FFDEDDDDFFE0DFDFFFC3C3C3FF6A6054FFCCB5 + 99FFC3AC8EFFF1F1F1FF3F3F3F5100000000878788FF00000000808081FF0000 + 00007F8081FF5B5B5BFFA9A9A9FF504B45FF8A8886FFF9F9F9FF928F8CFFA898 + 84FFDFC7A9FFF4F4F4FF8A8A8BFF000000000000000000000000000000000101 + 010500000000585858FF7B7165FFBEAC96FF857C72FFC6C6C6FFC2C2C2FF7F76 + 6AFFF1D9BAFFFDFDFDFF00000000000000000000000000000000000000000101 + 01018A8A8AFFD0D0D0FFD1BCA4FFCCB9A2FFAF9F8DFF939291FFEEEDEDFF9897 + 95FFBDAA95FFFFFFFFFF888989FF000000000000000000000000000000000000 + 000000000000FFFFFFFFE4E4E4FFE7E7E7FFF0F0F0FF8B8B8BFFA1A1A1FF9C9C + 9CFF8D8D8DFFFFFFFFFF00000000000000000000000000000000000000000000 + 000000000000838383FF000000007A7B7BFF00000000656666FF686868DB5152 + 52FF00000000797979FF00000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000101013C0A0A0A300000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000EAB8 + 75ACE9B874FFE9B874FFE9B874FFE9B874FFE9B874FFE9B874FFEAB875AA0000 + 0000000000000000000000000000000000000000000000000000E9B773A7FAC8 + 8FFFFFD4A5FFFFD29EFFFFD29EFFFFD29EFFFFD29EFFFFD4A5FFFAC88FFFE9B7 + 73E40000000000000000000000000000000000000000E9B772A7FACC96FFFFE5 + C2FFFFDBAEFFFFDCAFFFFFDCB0FFFFDCB0FFFFDCAFFFFFDBAEFFFFE5C2FFFACC + 96FFE9B772E2000000000000000000000000E9B772A7FAD19EFFFFF0D9FFDFA8 + 61FFC98832FFCA8934FFCB8A35FFCB8A35FFCA8934FFC98832FFDFA861FFFFF0 + D9FFFAD19EFFE9B772E200000000EBB976AFFBD9ACFFFFFBF0FFEBCBA3FFDDB4 + 80FFDFB785FFE0B886FFE0B887FFE0B887FFE0B886FFDFB785FFDDB480FFEBCB + A3FFFFF7E5FFFBD9ACFFEBB976EBEEBF7DFFEEBD7AFFEDBB76FFECBA76FFECBA + 76FFEEC182FFEDBC79FFEDBC7AFFEDBC7AFFEDBC79FFEEC182FFECBA77FFECBA + 76FFEDBB77FFEEBD7AFFEEBF7DFF000000000000000000000000000000007E4D + 13DEA87638FFB48F5CFFB08144FFB08144FFB48F5CFFA87638FF865113F80000 + 0000000000000000000000000000000000000000000000000000A46419D6D294 + 47FFE2B374FFDCA256FFDCA257FFDCA257FFDCA256FFE2B374FFD29447FFA967 + 18F60000000000000000000000000000000000000000A46419D6D29447FFE2B3 + 74FFDCA256FFDCA257FFDCA257FFDCA257FFDCA257FFDCA256FFE2B374FFD294 + 47FFA96718F6000000000000000000000000A16111A1CE9142FFF2CE9EFFE4A9 + 5BFFE4AA5DFFE4AA5EFFE4AA5EFFE4AA5EFFE4AA5EFFE4AA5DFFE4A95BFFF2CE + 9EFFCE9143FFA36312DB00000000A86819AED4994CFFFCE3C0FFF8DEB9FFF7DD + B9FFF7DDB9FFF7DDBAFFF7DDBAFFF7DDBAFFF7DDBAFFF7DDB9FFF7DDB9FFF8DE + B9FFFCE3C0FFD4994CFFA96819EBAA6A1AFFA86717FFA56312FFA4610FFFA461 + 0FFFA4610FFFA4610FFFA4610FFFA4610FFFA4610FFFA4610FFFA4610FFFA461 + 0FFFA56312FFA86717FFAA6A1AFF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FEC6415ACB9B224A0000 + 000000000000000000000000000000000000000000000014DB320115DAA80113 + DCEA0115DA8C0017D7200000000000000000FEB6240EFAC655E6C8941EC90000 + 00000000000000000000000000000316D2450414D3BB0416D4FF0416D4FF0416 + D4FF0416D4FF0416D1FD0414D2B00317D042FBB3248DFCCA66FFC9901EFFCB90 + 1B4A0000000000000000000000004E5CDEFD3F4DD8FD1F2FD0FF0718CBFF0618 + CBFF0618CBFF0F20CDFF1828C7FD302F93FDF7AA1FFBFBC96EFFC78A1BFFC88B + 1EC90000000000000000000000004351DAFF1D2ED3FF4451D7FD6872DBFD4652 + D2FF4F5AD3FF313DBBFC071498FEBB813CFFF8A61EFFFAC977FFC68518FFCB91 + 2FFFCB8D294A00000000000000003D4BD5FF1B2BCEFF0316C9FF1828CDFF7A85 + DFFD202CA4FD021094FF584269FFF69F1BFFF69F1BFFFAC97FFFC57F15FFCB8C + 2CFFD0953FC900000000000000003744D0FF2130CAFF0516C4FF0516C4FF707A + DDFF031090FF101789FFDD8B23FFF59817FFF59817FFFACA87FFC47A12FFC986 + 27FFD19849FFCB862C4A00000000313ECBFF2634C8FF071DB6FF045863FF078B + 26FF008D19FF0B8026FF688124FFE59015FFF39213FFF8C480FFC2750FFFC881 + 26FFCF9243FFCD8B3AC9000000002837C5F4273ABBFF037739FF12B937FF19E5 + 63FF19EF6EFF19E263FF12AA44FF2B782CFFE48A11FFF7BA71FFC26F0DFFC87D + 25FFCD8A3BFFCD8A3BFFCB82304A2A2AC6120A6951C617AB27FF32E24BFF96F8 + B5FF17E747FF0ED719FF14C82BFF17923EFF677C1DFFF5AF62FFC06A0AFFC77A + 25FFCA8232FFCA8232FFC87F2ECA00000000017D29EC06C00FFF2FE346FF39F3 + 77FF22EB55FF17DB22FF0BC618FF079E2FFF137727FFF3A352FFBF6407FFC677 + 26FFC87A2AFFC67726E6C97B2A5B0000000001792CFF00BD12FF32DC38FF3BE5 + 52FF31E244FF25D829FF13C224FF019C31FF017826FFF19741FFBF6209FFC370 + 1DFAC36E1B8DC86D120E000000000000000001722EEC06A725FF00C40DFF00CD + 05FF00CD05FF00C30FFF01AE22FF078E3CFF067D1BF1EE8C32CABD5D05BFC35E + 0B2B0000000000000000000000000000000001782692188B40FF15B438FF06B6 + 23FF04B521FF07AD2CFF16A646FF188C3BFF00880F9200000000000000000000 + 000000000000000000000000000000000000007F0F10017C1FD3189C49FF25CE + 68FF27DC70FF25CE68FF18A041FF01880ED30088000F00000000000000000000 + 0000000000000000000000000000000000000000000000870F11008611920081 + 15EC008217FF008412EC008B0A920099000F0000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFBA5107FFBD5F28FFC77650FFC97D5EFFC06634FFBC5811FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F1AC + 4C33FDC47183FCCB84AAFBCE8EC5FBCF91CAFCCD8BB5FCC57593F1AE5057DE98 + 3D03FFFFFF00FFFFFF00FFFFFF000101C200E6A44C00E6A44C00E6A44C00E6A4 + 4C6EF3B865D0FCC16BCCFBC67BD3FAC67FD5FDB752CFF0A53DCFD88E2FACCE85 + 2B08CE852B00CE852B00CE852B000101C2003030D600070AEA00DD9B4700DD9B + 476AEDB162CDFBBC61D0FFB743DCFFD48FE3FEAE32D8E59A34CFCE852CA7C47D + 2908C47D2900C47D290019C93F000101C2003030D600070AEA002824E300E09B + 3C6CE7AC60D8F1A73DE1FFB137E6FFD992E6F8AA38E4DC9336DAC57E2BAFC270 + 2408C27024001BE8450019C93F000101C2003030D600070AEA012824E31BB583 + 6F98E19B40E6F4A42DE4FEBA3BE6FFD88DE6FBA838E5DC9032E6C77324C446CD + 61002BE156001BE8450019C93F000101C2043030D66F5150E4AA5E62EBC48672 + A9DBC2894DE5EC9C21E6F8941DE6FDAE78E6F97E1FE6C68E38E69A9547D646CD + 616A2BE1563C1BE8451519C93F010101B0062B2BC9A73434E4CE3636F6D06576 + F8E0113FF9E50202FBE4665280E68CB137E666BC4FE569BD75E48CD394E050D8 + 6DCA35D757C213C739A902B729190101D9062A2ABEA23939D7CF1A17F9DE7D7D + FFE60102FEE60100F9E2022FA3E427D749E64AED58E226EF4BE644EB61E400D4 + 20CF00C023C400AE25B100A5251C0101FD092F2EC1AD2828C6DA0101DAE48180 + FEE61008D7E61701B3E1253373E14FC044E349C546DF01C31DE65DE97BE600C6 + 25DA01B028CA009F25B3008B181C0202FA1D1A1AB7C50505BFE30101E1E38183 + FAE40606EAE20502CEE01E2D7DE136943AE3059919DE01B424E566E483E603B9 + 2BE406A32BDC039325C8008413250101FB260808CCA20505CAD40101C4E28181 + DFE40303C4E30000CCD7062686D0047C1EE0008E1EE0029423E161BD77E40092 + 21E2008D21E100821FD2008213370101FC0F1B1BDE4B1616E76A0101E7870F0F + E0A10403D4910000D46A06358C6110803185067E1EB105701ED43F8D53E10072 + 19D0008019AD0087197E008512270202FA031F1FBE1A0707C9240000E92B0303 + F82C0202EE270000C9200C3877221E8E392905931E3402931A4E08941F620092 + 17510092193B008D1B2A0084130C0101F8000303B9030000CE040000DB040404 + E8040202D9040000D8030E2B93040C7A250400881505008D1609018D160C008B + 150B008A17060084190400821301000000000000000000000000000000005748 + 3F0057473E07877B744FBBB5B185C1BBB887988F8A5447352C0A000000000000 + 0000000000000000000000000000000000000000000000000000C2C2C2006352 + 491F76665DADCCC6C3D8E4E3E2C3E5E4E4BDD8D4D2DC76665EB555433A2A0000 + 0000000000000000000000000000000000000000000000000000675851068071 + 69B09B8E88AD9C94907AAFA8A583ABAAA962AA9E99A9A3948DD57D6C64C85F4E + 450E0000000000000000000000000000000000000000B3B3B3007869614AB4B0 + AE8E9794935790909046A19D9B58B2A7A1A5B4A6A0C5B2A49ECAC4BCB7E17566 + 5E5F0000000000000000000000000000000000000000594B44005C514B48DADA + D992888888499493924FB0A8A48DB7AEA9A8B1A8A3A5B2A8A3B3DFDAD8D6998F + 8A7B0000000000000000000000000000000000000000BEBDBD00584D474AC6C6 + C56C99999940B6B2AF64BDB7B47DB6B1AE69C5BDBA84BDB5B28CDDDBDA9DA29C + 986B0000000000000000000000000000000000000000000000005548413A8684 + 8343A7A7A640C4C0BD7BC5C0BA7FC4C0B980C6C1BF74C1BEBC66BCBBBB5B7F77 + 723E00000000000000000000000000000000000000000000000053453D0E6B63 + 5E53A2A2A23AB7B5B548B7B4AC5DC2BFB867C7C5C361B7B5B5477B7572495F53 + 4D10000000000000000000000000000000000000000000000000000000005A4D + 46358A868541AAA9A8389D91874BABA09754B6B2B0469A98963F645953340000 + 0000000000000000000000000000000000000000000000000000000000005B4C + 4405695E594B9E9E9E3686796D5385796C54A2A2A235726965475C4F48080000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000574C453195939238867E724B867E734A9B9999355E534D34000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000312B27255F58559769635DA96E6862AA69635F963B332F2F000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001D1F201A4C4F50FD6F7072FF7A7A7AFF999999FE26272729000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000191B1B17393C3DFC75787BFFAEAFAFFF818383FE20212125000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000171819073B3D3EC4626467FE7A7A7BFE545555D721222214000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001D1D1D136F7171A48C8C8CAA3131311900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000357661DC357660D20000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000002938 + 35173C836BC2429A7CFF439B7DFF439B7DFF429A7CFF3C836BC2293835170000 + 000000000000000000000000000000000000000000003051471D3D826CC847A2 + 84FF49A486FF4BA588FF4CA688FF4CA689FF4BA588FF4AA486FF47A284FF3E83 + 6CC82F4C4421000000000000000033605212397A65E548A788FF4CAB8BFF4FAC + 8EFF52AF91FF54B092FF56B093FF55B093FF54B092FF52AF91FF4FAD8EFF4DAB + 8CFF48A888FF3B816BE5366A59123A7964FF4EB191FF4FB292FF53B495FF57B6 + 98FF5BB99BFF60A690FF478B74FF40816BFF59A089FF5BB99CFF58B798FF54B5 + 96FF4FB292FF4EB191FF3E826BFF2A6550FF2D6D57FF468C75FF60BEA1FF5DAA + 92FF4D937CFF4B8E78FF447864FF3D705FFF41806BFF40806BFF55A088FF5EBE + A0FF4F9B82FF357A62FF2F6E58FF2D6954FF31725BFF34755EFF4B8C77FF4D94 + 7CFF457865FF66472DFF984F28FFA65C28FF6E4E2DFF3D6B59FF3C7C67FF4E91 + 7BFF3E846CFF377E66FF31715BFF2F6C57FF34765FFF387962FF4F907BFF4D92 + 7CFF693924FFA8693EFFB47F62FFBF8A65FFB57642FF824E25FF407D69FF5294 + 7EFF40876FFF3A8168FF33745DFF306F59FF357861FF397B65FF51937DFF4E94 + 7DFF6A3C2CFF966254FFC3A08FFFD1AE95FFAD7557FF73492EFF43816DFF5194 + 7DFF418870FF3B836AFF34755FFF31715BFF367A62FF397D65FF51947EFF519D + 85FF6F3D22FF9F5C37FFAF7758FFBD855AFFAF6B3CFF754824FF4A9079FF5195 + 7EFF418970FF3B836AFF34765FFF30725BFF357B63FF397D66FF3F826BFF61AF + 97FF59A990FF516651FF874824FF975825FF576C55FF59AA91FF64B39BFF4790 + 77FF3F8870FF398269FF32755EFF30725BFF337B62FF377D65FF3A7E67FF3D80 + 69FF3F816BFF64AE96FF55A38BFF55A38AFF64B099FF4A957CFF469178FF428C + 72FF3C866DFF378168FF31755DFF2038302D2E6854FF347C63FF377D64FF397E + 66FF3B7E67FF3C7E67FF3E7F69FF509A81FF48947AFF459177FF428D74FF3D89 + 6FFF3A856BFF316D59FF182A25380000000000000000192E28542F6452EE357B + 63FF367B63FF367A63FF367962FF48947AFF429076FF408D73FF3D8A70FF336D + 59EB1E352E46000000000000000000000000000000000000000000000000121B + 19552D6652E332775FFF31765EFF429176FF3D8C71FF367761DD22332F310000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000D0D0E262C6450E9397A64E92525270D00000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C6C6 + C600C7C7C708C9C9C93DD3D3D388D0D0D06BC4C4C41AD5D5D500000000000000 + 000000000000000000000000000000000000CCCCCC00C9C9C909CDCDCD4CD9D9 + D99ADCDCDCE1DAD9D9F1DEDEDEF0E3E3E3F0E4E4E4F3DBDBDBB1CDCDCD58C3C3 + C30A000000000000000000000000AEAEAE23D5D5D5AADADADAF1DAD9D9F0CECE + CEAEC1C0C059D4CECB4FDEDAD9C6DAD5D39BD8D4D26DE0DFDFA0E2E2E2EEDDDD + DDEFD3D3D29EC1C1C143B4B4B4069E9E9E33C8C8C8FED9D8D8FED6D6D6B0C5C2 + C058D5CFCCB7D6D2CFE7E1DDDBF5DBD5D3EBD6D0CED9DED8D5B6D6D1CF43D1D1 + D1B5DDDDDDFFC9C9C9FE9494944B99999915C0BFBFF5B1B1B1B0C0C0C0EFD5D5 + D5FEC6C4C4F0CCC8C7FED8D4D1F1D3CFCCFEC3BFBDF0D5D1D0F0D4D3D3F4C5C5 + C5FEB0B0B0ECBBBBBBFD8B8B8B2FA9A9A904B4B4B4DFB0B0B062BFBBB85CBCBA + B9ECC2C2C2FED3D3D3FFD2D0CFFFD2D0CFFED3D3D2FEBEBEBEFEB6B5B5FEA4A3 + A379A9A9A95EB7B6B6F486868613E7E7E700A6A6A6BEB0AFAF82A19D9A70B2AB + A8CFB5B0AEEDB1B0AFF4CACACAFEBCBCBCFFA4A3A3F9B9B4B2F4ABA5A2D98580 + 7E46A5A5A4739D9C9CDF9B9B9B04000000009D9C9C97AAAAA9A1B0ABA84DBEB8 + B5D5B2ADAAEBC4BEBBFDABABAAFEA1A09FFFB8B2AFF7989290D7CCC6C2BEA09C + 9B25A5A4A4918A8A8ABED1D1D100000000008C8C8C709D9D9DC99E9C9B7ACBC6 + C3FDBAB3B0FEADA7A4F69E9E9DFD848383FB8E8886FDADA6A3FA9D9997DC4643 + 432C9B9A9AB27B7B7B98000000000000000073737359A4A4A4FCACABAAF8B4AE + ABF4B8B2AFE9B0A9A6FA949292FD858483FEA39D9AEEA59F9DEEAFAAA8FCB1B0 + B0D2A2A2A2E775757575000000000000000038383828949494D6C7C7C7F05D5C + 5BA195918EDCB7AFABD9949392F9838282F39D9693CE837E7CD4302F2F79A3A3 + A3EA989898FE5B5B5B5F00000000000000000000000023232329828282BAC7C7 + C6F68989889B7A7674C5919090EF7C7C7BF1605C5A9D3B3B3B5AA9A9A9C8A6A6 + A6F5575757921414141400000000000000000000000000000000050505166E6E + 6E9ABCBCBCFAACABABBA878787E0777777CA8180808CB6B6B6F3818181DD3131 + 3153000000000000000000000000000000000000000000000000000000000303 + 030E59595976AFAFAFF4A0A09FFE929191FBB4B3B3FC676666AE1C1C1C2B0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000004C4C4C56848484E7757575EB4D4D4D7300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000045454532373737340000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004745 + 450012100F037877766A989696D28F8E8DB26664642A75747300474544000000 + 0000000000000000000000000000000000000000000000000000000000003F3D + 3D00353433305F5E5DE67A7878FF737171FF504E4E9A00000000201E1E000000 + 0000000000000000000000000000000000000000000027262500141413001818 + 17361D1E1FBE343232FE413D3CFF3D3A3AFF2B2A2BEE1818187F1E1D1C0C1C1C + 1C00000000000000000000000000000000000000000023232200171716043736 + 35AB393F44FF3D5962FF334C53FF48555AFF364C59FF393939F7343332483636 + 3500000000000000000000000000000000000000000014141300000000004948 + 48805D5C5CF94A5E61FF3D646FFF5A686DFF565B5DFF4C4B4ADB2C2B2B2F3130 + 3000000000000000000000000000000000000000000000000000686767006262 + 620B676766535754539D6C6866D7757371CA7C7A7A824948482E000000000909 + 0900000000000000000000000000000000000000000000000000000000000000 + 000012100E0E9994907BB9B4AEE98B8885E0706C676B00000000040303000000 + 0000000000000000000000000000000000001D1D1C00201F1F0B222121621413 + 13A02F2E2CCD928E89F8B9B4AEFF9E9890FF746D64F31A1919790E0E0E0A1212 + 120000000000000000000000000000000000171716001A1A194C2C2B2AF62D2C + 2CFF6A6867FFB3B0B2FFC1BAB2FFB8AC9EFF676159FF262625F7191818AA1C1C + 1B2D0000000046444400000000003B3A3900434140002F2E2E813D3C3BFF4644 + 43FF777683FF8686BAFFD8D2CCFFA29B93FF585654FF383736FF272626FF1B1A + 1AC720201F182221210000000000302F2E0000000000302F2FA5353434FF3A39 + 37FF686791FF5553AAFF928E8BFF615F5EFF52504FFF413F3FFF292827FF1515 + 14F81515154B12111100000000002423230024232304242323B120201FFF1E1E + 1CFF25257DFF242392FF363433FF3A3939FF494847FF474645FF424140FF1C1B + 1CFF1918187A0E0E0E00353434001918180004040400151514590D0D0DE30807 + 06FF030236FF08072DFF1D1C1BFF363535FF403F3EFF3A3838FF424140FF2120 + 21FF2221229EA3A1990029282800000000000C0C0B0000000000030302650101 + 00FA01010EFF040407FF2A2929FF4E4D4CFF2B2A2AFF242423FF292827FF2221 + 21FF212020B71C1C1B061D1D1C000000000000000000050504000706050B0101 + 0188000001EF010101FF151515FF2C2C2BFF141414FF101010FF0E0E0EFF1111 + 10FF121111B11312120712121200000000000000000000000000000000000000 + 0000030303440101018E00000000040404E0060606DF040404BE020202C50707 + 07B10C0C0B3A0E0D0D00070707000000000000000000D569483AD96D54A5D96D + 54FFD56948E8C8583FA5BF50323A000000000000000000000000000000000000 + 000000000000000000000000000000000000CF624472EAB1A3FFF9E8E4FFFCF6 + F4FFFCF5F3FFF6E3DEFFDEA393FFB34928730000000000000000000000000000 + 0000000000000000000000000000C556384BECC2B5FFF9EAE6FFFAEEEAFFFAEE + EAFFF9EAE6FFF8E8E4FFF6E6E1FFDEB6A9FF8C321D5400000000000000000000 + 0000000000000000000000000000BC5033BCF1D2C9FFF4D5CEFFF5D9D3FFF5D9 + D3FFF4D5CEFFF1D2C9FFECCCC5FFE4C7BFFF782F1BDEBF503222000000000000 + 0000000000000000000000000000A33F28F8D3917CFFEAB6A6FFECB9ADFFECB9 + ADFFEAB7A7FFE4AFA3FFDDA99BFFB67969FF552314FDDEA39397B34928440000 + 00000000000000000000000000007C321BF9A1422CFFC36C4FFFD77F6BFFDB8C + 76FFD68572FFCD7A60FFB5563CFF792E1AFF3D150EFDF6E6E197DEB6A9978C32 + 1D320000000000000000000000005D2214D4742E19FF943E27FFAC462FFFBF50 + 32FFB75030FFAB3F26FF90391FFF5A2513FF3D2017F5E9BDB3B2E1B9AEB07E32 + 1E8FBF50320F00000000000000004D1D107241190EFF542112FF6B2816FF8C38 + 1FFF8C301DFF7B2C1AFF5A2013FF31110AFF714F46DBE1B4A8B2C08B7DB26D3F + 32B0DEA39343B349281E000000000000000031110AB11D0C06FF250F08FF411A + 0EFF4A1D0FFF3E160DFF2A1009FF502C24E8D38B74B2BF6D56B28C4A38B25935 + 2FB1F6E6E143DEB6A9438C321D1600000000000000002A1109781D0C05F1180A + 05FF230B07FD37160CF2773827D3C06447B2B65640B29F513AB2713F2FB25337 + 2EA5ECCCC543E4C7BF43712B18350000000000000000000000004D1D10444119 + 0E9754211297732B18B296452DB29A4431B28C4130B270372AB24D2A21B26D4A + 407FDDA99B43B679694354211242000000000000000000000000000000003111 + 0A691D0C069732140AB24F2012B25C2818B255251BB2442219B2562E2491CD7A + 6043B5563C43792E1A433C140D42000000000000000000000000000000000000 + 00002A110947240E07A1250F08B234130CAF441B10A16D2C1A73B7503043AB3F + 264390391F435A2513432E12093B000000000000000000000000000000000000 + 0000000000004D1D101E41190E43542112436B2816438C381F438C301D437B2C + 1A435A20134331110A432A110924000000000000000000000000000000000000 + 0000000000000000000031110A2F1D0C0643250F0843411A0E434A1D0F433E16 + 0D432A100943270E082F00000000000000000000000000000000000000000000 + 00000000000000000000000000002A1109201A0B053C180A0543220B07412910 + 08382E11091D0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000045B6 + 822D60B28CBD75B195F77BB298FF7AB298FF6FB091E459B28A9F41B581170000 + 00000000000000000000000000004FB386A145B6821E0000000052B4877D78B3 + 97F7A1CBB8FFC0E3D2FFBFE3D3FFB9E1CFFFABD8C4FF94C4ADFF75B195F748B5 + 844300000000000000000000000067B08ED776B296F759B28A9F86B9A1FFBDE0 + D0FFCCECDDFFC2E8D7FFB5E3CEFFACE0C8FFA8DEC6FFA6DEC5FF9DCDB7FF74B1 + 94F748B58443000000000000000064AC8AD8A6CEBCFFA8CBBAFFC7E2D5FFCCEA + DDFFBCE4D2FFB3E0CCFFA9DDC5FFA4DBC2FF9BD7BCFF91D3B5FF94D4B7FF8EC4 + ABFF6AAB8CE505050508000000005DA181DAB4D9C9FFD6ECE2FFCDE9DDFFBAE0 + CFFFB0DBC8FFAEDBC7FFA9D8C3FF9ECFB8FF94CAB2FF93CAB1FF8CCCAFFF84C7 + A9FF7AAD95FF52A8808C00000000539275DCB3D5C6FFC5E3D5FFB8DDCCFFAED8 + C5FFACD7C4FFA0C8B6FF73A18CFF5E967DF7569A7BDA63967DFF6F9D88FF7BB1 + 98FF71B094FF589277EF0000000049856ADFAACDBDFFB8DACBFFABD3C1FFA2CE + BAFFA6CFBDFF6B9480FF499E77A400000000000000000404040848A279935386 + 6FF8689780FF5C8974FF43A277583F785FE19FC3B3FFACD0C0FF9EC8B5FF97C5 + B0FF9EC3B3FF557E6BFF3EAD7B310000000000000000000000000000000040AA + 7A47467760F8547D6AFF418D6AB8386D55E37CA995FF8EBBA7FF8CB9A5FF86B6 + A0FF7CB099FF5D8472FF3C7C5ED4000000000000000000000000000000000000 + 00003EA878473D6653FF3C775BDF376C54E2426755FF426755FF426755FF4267 + 55FF426755FF3F6453FF386450FF3EB6804F0000000000000000000000000000 + 0000000000003B8B67AA37604DFF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000041B5 + 811759B28A9F6FB091E47AB298FF7BB298FF75B195F760B28CBD45B6822D0000 + 000000000000000000000000000000000000000000000000000048B5844375B1 + 95F794C4ADFFABD8C4FFB9E1CFFFBFE3D3FFC0E3D2FFA1CBB8FF78B397F752B4 + 877D0000000045B6821E4FB386A1000000000000000048B5844374B194F79DCD + B7FFA6DEC5FFA8DEC6FFACE0C8FFB5E3CEFFC2E8D7FFCCECDDFFBDE0D0FF86B9 + A1FF59B28A9F76B296F767B08ED700000000050505086AAB8CE58EC4ABFF94D4 + B7FF91D3B5FF9BD7BCFFA4DBC2FFA9DDC5FFB3E0CCFFBCE4D2FFCCEADDFFC7E2 + D5FFA8CBBAFFA6CEBCFF64AC8AD80000000052A8808C7AAD95FF84C7A9FF8CCC + AFFF93CAB1FF94CAB2FF9ECFB8FFA9D8C3FFAEDBC7FFB0DBC8FFBAE0CFFFCDE9 + DDFFD6ECE2FFB4D9C9FF5DA181DA00000000589277EF71B094FF7BB198FF6F9D + 88FF63967DFF569A7BDA5E967DF773A18CFFA0C8B6FFACD7C4FFAED8C5FFB8DD + CCFFC5E3D5FFB3D5C6FF539275DC43A277585C8974FF689780FF53866FF848A2 + 7993040404080000000000000000499E77A46B9480FFA6CFBDFFA2CEBAFFABD3 + C1FFB8DACBFFAACDBDFF49856ADF418D6AB8547D6AFF467760F840AA7A470000 + 00000000000000000000000000003EAD7B31557E6BFF9EC3B3FF97C5B0FF9EC8 + B5FFACD0C0FF9FC3B3FF3F785FE13C775BDF3D6653FF3EA87847000000000000 + 00000000000000000000000000003C7C5ED45D8472FF7CB099FF86B6A0FF8CB9 + A5FF8EBBA7FF7CA995FF386D55E337604DFF3B8B67AA00000000000000000000 + 000000000000000000003EB6804F386450FF3F6453FF426755FF426755FF4267 + 55FF426755FF426755FF376C54E2000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B682 + 452DB28C60BDB19575F7B2987BFFB2987AFFB0916FE4B28A599FB58141170000 + 0000000000000000000000000000B3864FA1B682451E00000000B487527DB397 + 78F7CBB8A1FFE3D2C0FFE3D3BFFFE1CFB9FFD8C4ABFFC4AD94FFB19575F7B584 + 4843000000000000000000000000B08E67D7B29676F7B28A599FB9A186FFE0D0 + BDFFECDDCCFFE8D7C2FFE3CEB5FFE0C8ACFFDEC6A8FFDEC5A6FFCDB79DFFB194 + 74F7B58448430000000000000000AC8A64D8CEBCA6FFCBBAA8FFE2D5C7FFEADD + CCFFE4D2BCFFE0CCB3FFDDC5A9FFDBC2A4FFD7BC9BFFD3B591FFD4B794FFC4AB + 8EFFAB8C6AE50505050800000000A1815DDAD9C9B4FFECE2D6FFE9DDCDFFE0CF + BAFFDBC8B0FFDBC7AEFFD8C3A9FFCFB89EFFCAB294FFCAB193FFCCAF8CFFC7A9 + 84FFAD957AFFA880528C00000000927553DCD5C6B3FFE3D5C5FFDDCCB8FFD8C5 + AEFFD7C4ACFFC8B6A0FFA18C73FF967D5EF79A7B56DA967D63FF9D886FFFB198 + 7BFFB09471FF927758EF00000000856A49DFCDBDAAFFDACBB8FFD3C1ABFFCEBA + A2FFCFBDA6FF94806BFF9E7749A4000000000000000004040408A2794893866F + 53F8978068FF89745CFFA2774358785F3FE1C3B39FFFD0C0ACFFC8B59EFFC5B0 + 97FFC3B39EFF7E6B55FFAD7B3E3100000000000000000000000000000000AA7A + 4047776046F87D6A54FF8D6A41B86D5538E3A9957CFFBBA78EFFB9A58CFFB6A0 + 86FFB0997CFF84725DFF7C5E3CD4000000000000000000000000000000000000 + 0000A8783E4766533DFF775B3CDF6C5437E2675542FF675542FF675542FF6755 + 42FF675542FF64533FFF645038FFB6803E4F0000000000000000000000000000 + 0000000000008B673BAA604D37FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B581 + 4117B28A599FB0916FE4B2987AFFB2987BFFB19575F7B28C60BDB682452D0000 + 0000000000000000000000000000000000000000000000000000B5844843B195 + 75F7C4AD94FFD8C4ABFFE1CFB9FFE3D3BFFFE3D2C0FFCBB8A1FFB39778F7B487 + 527D00000000B682451EB3864FA10000000000000000B5844843B19474F7CDB7 + 9DFFDEC5A6FFDEC6A8FFE0C8ACFFE3CEB5FFE8D7C2FFECDDCCFFE0D0BDFFB9A1 + 86FFB28A599FB29676F7B08E67D70000000005050508AB8C6AE5C4AB8EFFD4B7 + 94FFD3B591FFD7BC9BFFDBC2A4FFDDC5A9FFE0CCB3FFE4D2BCFFEADDCCFFE2D5 + C7FFCBBAA8FFCEBCA6FFAC8A64D800000000A880528CAD957AFFC7A984FFCCAF + 8CFFCAB193FFCAB294FFCFB89EFFD8C3A9FFDBC7AEFFDBC8B0FFE0CFBAFFE9DD + CDFFECE2D6FFD9C9B4FFA1815DDA00000000927758EFB09471FFB1987BFF9D88 + 6FFF967D63FF9A7B56DA967D5EF7A18C73FFC8B6A0FFD7C4ACFFD8C5AEFFDDCC + B8FFE3D5C5FFD5C6B3FF927553DCA277435889745CFF978068FF866F53F8A279 + 48930404040800000000000000009E7749A494806BFFCFBDA6FFCEBAA2FFD3C1 + ABFFDACBB8FFCDBDAAFF856A49DF8D6A41B87D6A54FF776046F8AA7A40470000 + 0000000000000000000000000000AD7B3E317E6B55FFC3B39EFFC5B097FFC8B5 + 9EFFD0C0ACFFC3B39FFF785F3FE1775B3CDF66533DFFA8783E47000000000000 + 00000000000000000000000000007C5E3CD484725DFFB0997CFFB6A086FFB9A5 + 8CFFBBA78EFFA9957CFF6D5538E3604D37FF8B673BAA00000000000000000000 + 00000000000000000000B6803E4F645038FF64533FFF675542FF675542FF6755 + 42FF675542FF675542FF6C5437E2000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001041 + E62D385DD5BD5872CCF76078CBFF5F78CBFF4F6BCDE42F55DA9F0A3DE9170000 + 00000000000000000000000000001F4BE0A11041E61E00000000244FDE7D5C75 + CDF78C9EDFFFAFBFF1FFAEBEF3FFA6B7F2FF95A9ECFF7D91D8FF5872CCF71545 + E5430000000000000000000000004363D1D75973CDF72F55DA9F6D83CFFFACBC + EFFFBCCAFAFFB1C1F9FF9FB3F7FF93AAF6FF8EA6F6FF8CA5F6FF869BE3FF5771 + CCF71545E54300000000000000004160CBD894A5DFFF97A6DAFFB9C5EEFFBDCB + F8FFAABBF5FF9DB1F4FF90A7F3FF8AA2F3FF7F99F2FF728FF0FF7692F0FF748B + DCFF4B67C7E505050508000000003C59BEDAA3B3EAFFCBD5F6FFC0CCF5FFA9B9 + F1FF9BAEEFFF99ADEFFF93A8ECFF879DE4FF7A92E2FF7991E2FF6E8AE8FF6482 + E5FF6177C3FF294FCE8C00000000344FAFDCA2B2E4FFB6C4F0FFA7B7EDFF9AAC + EAFF98ABEAFF8D9EDAFF5E72B4FF435CB0F73552B8DA4A60ABFF596DB2FF6078 + CAFF536FCCFF3B55ACEF000000002D46A0DF99A9DCFFA8B7E8FF98A9E4FF8DA0 + E2FF93A5E1FF5768A6FF2146C3A40000000000000000040404081E45C9933A50 + 9DF85165ABFF465A9CFF153FCD58243E92E18E9ED3FF9BABE0FF8A9CDBFF8296 + D8FF8D9DD4FF415290FF0A3ADE31000000000000000000000000000000000D3C + D9472E438DF840518FFF1D3EAEB81F3684E3667ABDFF798DCFFF768ACDFF6F84 + CBFF637AC7FF4B5C95FF1E3A97D4000000000000000000000000000000000000 + 00000B3AD647293A79FF1F3A90DF1D3484E2314176FF314176FF314176FF3141 + 76FF314176FF2E3D75FF233678FF053AEB4F0000000000000000000000000000 + 0000000000001538AEAA243572FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000A3D + E9172F55DA9F4F6BCDE45F78CBFF6078CBFF5872CCF7385DD5BD1041E62D0000 + 00000000000000000000000000000000000000000000000000001545E5435872 + CCF77D91D8FF95A9ECFFA6B7F2FFAEBEF3FFAFBFF1FF8C9EDFFF5C75CDF7244F + DE7D000000001041E61E1F4BE0A100000000000000001545E5435771CCF7869B + E3FF8CA5F6FF8EA6F6FF93AAF6FF9FB3F7FFB1C1F9FFBCCAFAFFACBCEFFF6D83 + CFFF2F55DA9F5973CDF74363D1D700000000050505084B67C7E5748BDCFF7692 + F0FF728FF0FF7F99F2FF8AA2F3FF90A7F3FF9DB1F4FFAABBF5FFBDCBF8FFB9C5 + EEFF97A6DAFF94A5DFFF4160CBD800000000294FCE8C6177C3FF6482E5FF6E8A + E8FF7991E2FF7A92E2FF879DE4FF93A8ECFF99ADEFFF9BAEEFFFA9B9F1FFC0CC + F5FFCBD5F6FFA3B3EAFF3C59BEDA000000003B55ACEF536FCCFF6078CAFF596D + B2FF4A60ABFF3552B8DA435CB0F75E72B4FF8D9EDAFF98ABEAFF9AACEAFFA7B7 + EDFFB6C4F0FFA2B2E4FF344FAFDC153FCD58465A9CFF5165ABFF3A509DF81E45 + C9930404040800000000000000002146C3A45768A6FF93A5E1FF8DA0E2FF98A9 + E4FFA8B7E8FF99A9DCFF2D46A0DF1D3EAEB840518FFF2E438DF80D3CD9470000 + 00000000000000000000000000000A3ADE31415290FF8D9DD4FF8296D8FF8A9C + DBFF9BABE0FF8E9ED3FF243E92E11F3A90DF293A79FF0B3AD647000000000000 + 00000000000000000000000000001E3A97D44B5C95FF637AC7FF6F84CBFF768A + CDFF798DCFFF667ABDFF1F3684E3243572FF1538AEAA00000000000000000000 + 00000000000000000000053AEB4F233678FF2E3D75FF314176FF314176FF3141 + 76FF314176FF314176FF1D3484E2000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000048EDFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000057F1FF0056F0FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000063F2FF76AEF9FF0057F1FF0000 + 000000000000000000000000000000000000000000000000000000000000215E + E166135EEAB00761EEE10065F3FF006AF3FF006FF4FF6FAFF9FF6DAAF8FF0057 + F1FF00000000000000000000000000000000000000002D5ECE221B62E7A71981 + F5FE3296F8FF4BA4F9FF5FAEF9FF63AFF9FF66AFF9FF67ADF9FF66AAF8FF63A4 + F8FF0057F1FF000000000000000000000000000000002066E5AE218FF7FF44A9 + FAFF4CAEF9FF52AEFAFF57AFFAFF5BAFF9FF5EAEF9FF5FACF9FF5EA9F9FF5BA4 + F8FF579DF7FF0053F0FF00000000000000003067D7790381F6FE0C97F9FF149C + F9FF1F9FF9FF2DA3F9FF3DA8F9FF4FADF9FF55ADF9FF56AAF9FF55A7F8FF53A3 + F8FF4F9BF7FF0055F0FF0000000000000000216DE6C90094F9FF009CF9FF009B + F9FF0099F9FF0096F9FF0092F8FF0D94F8FF2098F8FF349DF9FF48A3F9FF4A9E + F8FF0060F2FF000000000000000000000000107DF3F1009FFAFF00A4FAFF009D + FAFF0095F9FF008AF8FF0082F7FF0084F7FF0089F7FF0089F7FF1287F7FF0067 + F4FF00000000000000000000000000000000028BF9FE00AAFBFF00A6FBFF088A + F4F91C58C8CE182F668C00000000000000000084F7FF0088F7FF006FF5FF0000 + 0000000000000000000000000000000000001184F4F500ADFCFF00A5FCFF2361 + D0CE00000000000000000000000000000000007CF7FF0077F6FF000000000000 + 0000000000000000000000000000000000002573E5DD00AEFDFF00A4FCFF2B47 + 887800000000000000000000000000000000006DF7FF00000000000000000000 + 0000000000000000000000000000000000003664C4A402A5FDFF00A6FDFF3A5A + A56A000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000002A6EE0DC00A0FEFF3C7E + E7C5000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000273A64622D71E2DB1286 + FAFB000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000048EDFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000056F0FF0057F1FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000057 + F1FF76AEF9FF0063F2FF00000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000057F1FF6DAA + F8FF6FAFF9FF006FF4FF006AF3FF0065F3FF0761EEE1135EEAB0215EE1660000 + 000000000000000000000000000000000000000000000057F1FF63A4F8FF66AA + F8FF67ADF9FF66AFF9FF63AFF9FF5FAEF9FF4BA4F9FF3296F8FF1981F5FE1B62 + E7A72D5ECE220000000000000000000000000053F0FF579DF7FF5BA4F8FF5EA9 + F9FF5FACF9FF5EAEF9FF5BAFF9FF57AFFAFF52AEFAFF4CAEF9FF44A9FAFF218F + F7FF2066E5AE0000000000000000000000000055F0FF4F9BF7FF53A3F8FF55A7 + F8FF56AAF9FF55ADF9FF4FADF9FF3DA8F9FF2DA3F9FF1F9FF9FF149CF9FF0C97 + F9FF0381F6FE3067D7790000000000000000000000000060F2FF4A9EF8FF48A3 + F9FF349DF9FF2098F8FF0D94F8FF0092F8FF0096F9FF0099F9FF009BF9FF009C + F9FF0094F9FF216DE6C9000000000000000000000000000000000067F4FF1287 + F7FF0089F7FF0089F7FF0084F7FF0082F7FF008AF8FF0095F9FF009DFAFF00A4 + FAFF009FFAFF107DF3F10000000000000000000000000000000000000000006F + F5FF0088F7FF0084F7FF0000000000000000182F668C1C58C8CE088AF4F900A6 + FBFF00AAFBFF028BF9FE00000000000000000000000000000000000000000000 + 00000077F6FF007CF7FF000000000000000000000000000000002361D0CE00A5 + FCFF00ADFCFF1184F4F500000000000000000000000000000000000000000000 + 000000000000006DF7FF000000000000000000000000000000002B47887800A4 + FCFF00AEFDFF2573E5DD00000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003A5AA56A00A6 + FDFF02A5FDFF3664C4A400000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003C7EE7C500A0 + FEFF2A6EE0DC0000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001286FAFB2D71 + E2DB273A64620000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000067C673C965C2 + 70C400000000000000000000000000000000885638259E77639A875435260000 + 0000000000000000000000000000000000000000000066C572D17ECA88FF7BC8 + 85FF5DB868CF000000000000000000000000B59788B3FAF8F7FFAB8874A90000 + 000000000000000000000000000068C7740666C472DB7CCA87FF9ED6A7FF9CD4 + A5FF73C07DFF55AC5ED950A6590691675358F8F8FBFFFFFFFFFFF1EAE7FF8A5A + 3C3800000000000000000000000065C371BB62BF6EF779C683FF9AD4A3FF98D3 + A1FF7DC386FF4FA458F74A9E53B8BBA7A6CEFAFFFFFFF1F4FFFFFFFFFFFFAD8A + 769500000000000000000000000000000000000000005BB465FF96D29FFF94D0 + 9CFF5DAC65FF499C52388A5B4129B8A9B9FFDEDEF1FFD7D1DDFFE8E8F3FFB49F + A3E3855131040000000000000000000000000000000056AD5FFF93CF9AFF90CE + 98FF489A50FF000000008F644F6C9C6B53FFCBCAE5FFBBABB9FFC3BBCDFFA17C + 72FF895A3F370000000000000000000000000000000050A659FF8ECC95FF8BCB + 93FF42924AFF00000000966444ABA3683AFFBDAFBDFFB49C9CFFA8857DFFB182 + 62FF8E5C3E750000000000000000000000000000000050A659FF8ACA91FF87C9 + 8EFF42924AFF9367504AA8734AC8A87248FFA16F50FF9D6A4CFFA1693FFFB782 + 55FF9C6B49AF85543A0600000000000000000000000050A659FF8ECC95FF8BCB + 93FF42924AFFF3EEECF8AE7F5BF7A56E45FFA56E45FFA36D44FFA67048FFAD78 + 4DFFA2714DD486553C1E0000000000000000000000004A9E53FF8ACA91FF87C9 + 8EFF3C8A43FFC2B2BAFFC3B6BDFF9F673DFFA77048FFA67048FFA67048FFA972 + 49FFA7754FEB89583C3700000000000000000000000045954CFF85C78CFF82C6 + 89FF36823DFF996649FFAF7F5CFFB27E53FFA56F47FFA67048FFA67048FFA771 + 48FFAE7B52FB8C5B3E5300000000000000005E7F46594E9A55FF81C587FF7EC3 + 85FF317A36FF9C684BFFA66F45FFBA8557FFA67048FFA67048FFA67048FFA66F + 47FFB58156FF9261436E0000000042924AB83E8B45FA65AD6CFF7DC282FF7AC1 + 80FF4B9250FF2A6C2CFF466A30FFAE794EFFAA754BFFA67048FFA67048FFA56F + 47FFBE8A5CFF9A6A4986000000003C8A43063F813EEB519957FF79C07EFF76BF + 7CFF468D4BFF35672BFFA26F47FFA87249FFA87249FFA77148FFA67048FFA26C + 46FFB27E55FF93644585000000000000000000000000327333DC488F4DFF458C + 4AFF39662BFFA46F47FFA36E47FF9A6644E4825438458D5C3F5A8C5B3F698959 + 3E5086553A170000000000000000000000000000000000000000296829CE2C63 + 27E2905E4198915F419B8F5D40868A593D3C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000885638259E77639A875435260000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B59788B3FAF8F7FFAB8874A90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000091675358F8F8FBFFFFFFFFFFF1EAE7FF8A5A + 3C38000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BBA7A6CEFAFFFFFFF1F4FFFFFFFFFFFFAD8A + 7695000000000000000000000000000000000000000000000000000000000000 + 000000000000000000008A5B4129B8A9B9FFDEDEF1FFD7D1DDFFE8E8F3FFB49F + A3E3855131040000000000000000000000000000000000000000000000000000 + 000000000000000000008F644F6C9C6B53FFCBCAE5FFBBABB9FFC3BBCDFFA17C + 72FF895A3F37000000000000000000000000000000000000000000000000824F + 330B814D300800000000966444ABA3683AFFBDAFBDFFB49C9CFFA8857DFFB182 + 62FF8E5C3E75000000000000000000000000000000000000000087543439C4AC + 9EEFD8C8BEEA9367504AA8734AC8A87248FFA16F50FF9D6A4CFFA1693FFFB782 + 55FF9C6B49AF85543A0600000000000000000000000068C774067CC07DF2FFFF + FFFFF4F6FFFFF3EEECF8AE7F5BF7A56E45FFA56E45FFA36D44FFA67048FF6290 + 4EFF9F714CD586553C1E00000000000000000000000069C372E369C475FFCEC2 + C6FFD5CACCFFC2B2BAFFC3B6BDFF9F673DFFA77048FFA67048FFA67048FF4490 + 49FF498543FC89583C37000000000000000068C774D180CD8BFF7CC987FF5DB8 + 68FF58B162FF53A95CFF53A95CFF53A95CFF4DA156FF47994FFF419149FF5AA3 + 62FF559D5CFF357635E00000000068C774C97FCC8AFFA2D8ABFF9ED6A7FF9AD4 + A3FF96D29FFF93CF9AFF8ECC95FF93CF9AFF8ECC95FF89CA90FF85C78BFF81C5 + 87FF7DC282FF4A9150FF256929C965C371C47BC886FF9CD5A5FF98D3A1FF94D0 + 9DFF90CE98FF8BCB93FF87C98EFF8BCB93FF87C98EFF82C689FF7EC384FF7AC1 + 80FF76BE7CFF458C4AFF216324C40000000063B064E671BE7BFF7AC183FF5BAA + 64FF47994FFF419149FF419149FF419149FF3B8842FF35803BFF3F8845FF59A1 + 5EFF448B49FF2D6327E800000000000000000000000055A55AE34F9F55FE8C75 + 47FFA46F47FFA46F47FFA36E47FF9A6644E4825438458D5C3F5A6463388A2668 + 29FA226224DC000000000000000000000000000000004DA156064A944DC48C5B + 3F78905E4198915F419B8F5D40868A593D3C0000000000000000000000002163 + 24B81D5E20060000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000885638259E77639A875435260000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B59788B3FAF8F7FFAB8874A90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000091675358F8F8FBFFFFFFFFFFF1EAE7FF8A5A + 3C38000000000000000000000000000000000102020201020103000000000000 + 0000010101010001000100000000BBA7A6CEFAFFFFFFF1F4FFFFFFFFFFFFAD8A + 76950000000000000000000000000102010200000000030B07123E6B547E446A + 56BC0003011E0000000080543C2CB8A9B9FFDEDEF1FFD7D1DDFFE8E8F3FFB49F + A3E3855131040000000000000000000000001B33272856866DD58CBEA3FF9BCA + B1FF3F6953D7000000008F644F6C9A6952FFCBCAE5FFBBABB9FFC3BBCDFFA17C + 72FF895A3F3700000000000000000207040E57886ED395C8ACFF7CB396FA79B2 + 94FA89BEA2FF3D6551DB795137B6A3683AFFBAACBAFFB49C9CFFA8857DFFB182 + 62FF8E5C3E7500000000000000003D6852798ABDA2FF7DB396F978B293FF7CB4 + 96FF7FB598FF89BCA1FF49664FF792633EFFA16F50FF9B684BFFA1693FFFB782 + 55FF9C6B49AF85543A06000000004B7760CA90C4A8FF77B192FD7DB598FF7EB6 + 99FF7DB698FF83B99DFF8CBFA4FF4D664FFF8F5F3BFFA36D44FFA46F47FFAD78 + 4DFFA2714DD486553C1E00000000446F58D18EC4A8FF79B294FD7FB79AFF7FB8 + 9AFF81B99CFF81B89CFF84BB9FFF8EC0A6FF4E674FFF8F603EFFA67048FFA771 + 48FFA7754FEB89583C370000000048735DD191C6AAFF7AB293FE80B89BFF80B8 + 9BFF82BA9DFF83BB9EFF83BA9EFF87BCA0FF8FC0A7FF4D6852FF8E613EFFA771 + 48FFAE7B52FB8C5B3E53000000004C7961A891C4A9FF7EB598FF81B99CFF82BA + 9DFF84BB9FFF85BCA0FF86BDA1FF87BEA2FF89BCA1FF64977CFF775638FFA66F + 47FFB58156FF9261436E00000000182D213C75A88DFE8BBFA4FF81B79AFF82BA + 9EFF84BCA0FF86BCA1FF87BDA1FF8BBDA3FF78AF94FF525A41FF956540FFA16C + 45FFBE8A5CFF9A6A49860000000000000000555842B87FB79BFF8CC0A5FF8BBF + A4FF8CC1A5FF8CC1A5FF86B89FFF7AAF95FF547258FF825939FF9E6B44FFA26C + 46FFB27E55FF936445850000000001020202000000003C3D2C8C628F73FC79B2 + 95FF6DA587FF6DA789FF61967AFF4B5841F7402B1C6E754C34658A5A3E6A8959 + 3E5086553A1700000000000000000000000000000000000000004D3727474738 + 26A64A3826BF4B3A27C1543E2CAB5E3D2A500000000000000000000000000000 + 000000000000000000000000000000000000000000000000000067C673C965C2 + 70C400000000000000000000000000000000000000003D2F32A334292D510000 + 0000000000000000000000000000000000000000000066C572D17ECA88FF7BC8 + 85FF5DB868CF00000000000000000C020201241E2273ABBEC1FF645F5DE92A27 + 2A150000000000000000A937340968C7740666C472DB7CCA87FF9ED6A7FF9CD4 + A5FF73C07DFF55AC5ED950A6590603030304253B41F0EFF0EFFFB5BEC1FF2B2C + 30AB1D0E0A01000000000000000065C371BB62BF6EF779C683FF9AD4A3FF98D3 + A1FF7DC386FF4FA458F74A9E53B8312528B5A3B7B6FFE6E0DEFFD7D0D0FF4F67 + 6DFD372A2E55000000000000000000000000000000005BB465FF96D29FFF94D0 + 9CFF5DAC65FF4289484037171704757C7FF5D7DCDBFFC8CBC9FFC2C1BEFF9DAB + ABFF312F33730000000015040501000000000000000056AD5FFF93CF9AFF90CE + 98FF489A50FF00000000616A6DFDBABDBEFFCFD0CCFFCFCCCFFFB1AFB0FFB7B7 + B6FF616A6DFD0000000000000000000000000000000050A659FF8ECC95FF8BCB + 93FF42924AFF646C6FE99C9A99FFD1D0D1FFC4C6C4FFD1D1D1FFADB0AEFF9E9F + 9EFF9C9A99FF646C6FE900000000000000000000000050A659FF8ACA91FF87C9 + 8EFF42924AFF8F9295FF939495FFC8C5C5FFCFD2CEFFD4D2D4FFB1B1B0FF9C9D + 9EFF939495FF8F9295FF02030307000000000000000050A659FF8ECC95FF8BCB + 93FF42924AFFA3A7A6FF8E8B8CFFC2C1C2FFD7D7D5FFCFD0D0FFACADADFF9B9B + 9DFF8E8B8CFFA3A7A6FF2E2C309A00000000000000004A9E53FF8ACA91FF87C9 + 8EFF3C8A43FF898886FF696B68FFB9B6B8FFD1CFCFFFC2C2C2FFA0A09FFF8A8B + 8BFF696B68FF898886FF888789FF000000000000000045954CFF85C78CFF82C6 + 89FF36823DFF62635FFF79777BFFD7CFD1FFDFE2DEFFD1CDCEFFABAFAEFF9694 + 94FF79777BFF62635FFF777579FF0000000043944B384E9A55FF81C587FF7EC3 + 85FF317A36FF646363FE8D8E8DFFC7BEC0FFD0CFCFFFBFC4BFFFA4A5A2FF999A + 98FF8D8E8DFF646363FE3B3D3FDF42924AB83D8C45F765AD6CFF7DC282FF7AC1 + 80FF4B9250FF276C2CF929602EEA4E4A50AA58595CCD55545BD25D6061C8504E + 54C2414248B03B41434A404144023C8A430638833ED9519957FF79C07EFF76BF + 7CFF468D4BFF236627DB20622306000000000000000000000000000000000000 + 000000000000000000000000000000000000000000002D7533CF488F4DFF458C + 4AFF226526D10000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000256929C42063 + 24CA000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003D2F32A334292D510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000C020201241E2273ABBEC1FF645F5DE92A27 + 2A150000000000000000A9373409000000000000000000000000000000000000 + 000000000000000000000000000003030304253B41F0EFF0EFFFB5BEC1FF2B2C + 30AB1D0E0A010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000312528B5A3B7B6FFE6E0DEFFD7D0D0FF4F67 + 6DFD372A2E550000000000000000000000000000000000000000000000000000 + 0000000000001806060A37171704757C7FF5D7DCDBFFC8CBC9FFC2C1BEFF9DAB + ABFF312F33730000000015040501000000000000000000000000000000000000 + 00000000000000000000616A6DFDBABDBEFFCFD0CCFFCFCCCFFFB1AFB0FFB7B7 + B6FF616A6DFD0000000000000000000000000000000000000000000000000000 + 000000000000646C6FE99C9A99FFD1D0D1FFC4C6C4FFD1D1D1FFADB0AEFF9E9F + 9EFF9C9A99FF646C6FE900000000000000000000000000000000000000000000 + 0000020303078F9295FF939495FFC8C5C5FFCFD2CEFFD4D2D4FFB1B1B0FF9C9D + 9EFF939495FF8F9295FF02030307000000000000000068C7740668C774BB0000 + 00002E2C309AA3A7A6FF8E8B8CFFC2C1C2FFD7D7D5FFCFD0D0FFACADADFF5D99 + 63FF8C8B8AFFA3A7A6FF2E2C309A000000000000000068C774DB65C371F70000 + 0000888789FF898886FF696B68FFB9B6B8FFD1CFCFFFC2C2C2FFA0A09FFF4390 + 4BFF418347FF898886FF888789FF0000000068C774D180CD8BFF7CC987FF5DB8 + 68FF58B162FF53A95CFF53A95CFF53A95CFF4DA156FF47994FFF419149FF5AA3 + 62FF559D5CFF38743CFF777579FF68C774C97FCC8AFFA2D8ABFF9ED6A7FF9AD4 + A3FF96D29FFF93CF9AFF8ECC95FF93CF9AFF8ECC95FF89CA90FF85C78BFF81C5 + 87FF7DC282FF4A9150FF29602DF865C371C47BC886FF9CD5A5FF98D3A1FF94D0 + 9DFF90CE98FF8BCB93FF87C98EFF8BCB93FF87C98EFF82C689FF7EC384FF7AC1 + 80FF76BE7CFF458C4AFF216324C4000000005DB868CF71BE7BFF7AC183FF5BAA + 64FF47994FFF419149FF419149FF419149FF3B8842FF35803BFF3F8845FF59A1 + 5EFF448B49FF216324CF00000000000000000000000053A95CD94DA156F74799 + 4F380000000000000000000000000000000000000000000000002A702F382569 + 29F7216324D900000000000000000000000000000000336B390947994FB80202 + 0103000000000000000000000000000000000000000000000000000000002163 + 24B81D5E20060000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003D2F32A334292D510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000C020201241E2273ABBEC1FF645F5DE92A27 + 2A150000000000000000A9373409000000000000000000000000000000000000 + 000000000000000000000000000003030304253B41F0EFF0EFFFB5BEC1FF2B2C + 30AB1D0E0A010000000000000000000000000102020201020103000000000000 + 0000010101010001000100000000312528B5A3B7B6FFE6E0DEFFD7D0D0FF4F67 + 6DFD372A2E5500000000000000000102010200000000030B07123E6B547E446A + 56BC0003011E1806060A1F0D0D07757C7FF5D7DCDBFFC8CBC9FFC2C1BEFF9DAB + ABFF312F33730000000015040501000000001B33272856866DD58CBEA3FF9BCA + B1FF3F6953D700000000616A6DFDB7BABBFFCFD0CCFFCFCCCFFFB1AFB0FFB7B7 + B6FF616A6DFD00000000000000000207040E57886ED395C8ACFF7CB396FA79B2 + 94FA89BEA2FF426554FC878584FFD1D0D1FFC1C3C1FFD1D1D1FFADB0AEFF9E9F + 9EFF9C9A99FF646C6FE9000000003D6852798ABDA2FF7DB396F978B293FF7CB4 + 96FF7EB598FC89BCA1FF496B5AFFAEACACFFCFD2CEFFD1CFD1FFB1B1B0FF9C9D + 9EFF939495FF8F9295FF020303074B7760CA90C4A8FF77B192FD7DB598FF7EB6 + 99FF7DB698FF82B89DFF8CBFA4FF517362FFBABAB8FFCFD0D0FFAAABABFF9B9B + 9DFF8E8B8CFFA3A7A6FF2E2C309A446F58D18EC4A8FF79B294FD7FB79AFF7FB8 + 9AFF81B99CFF81B89CFF83BA9EFF8EC0A6FF547664FFA7A7A7FFA0A09FFF8889 + 89FF696B68FF898886FF888789FF48735DD191C6AAFF7AB394FD80B89BFF80B8 + 9BFF82BA9DFF83BB9EFF83BA9EFF88BEA2FF8FC0A7FF537464FF939795FF9694 + 94FF79777BFF62635FFF777579FF4C7961A891C4A9FF7EB699FC81B99CFF82BA + 9DFF84BB9FFF85BCA0FF86BDA1FF87BEA2FF89BDA3FF64987DFF767B77FF999A + 98FF8D8E8DFF646363FE3B3D3FDF182D213C75A98EFD8BC0A5FE81B89CFC82BA + 9EFF84BCA0FF86BCA1FF86BDA1FF8ABDA3FE78AF94FF375146F1515455CD4D4C + 51C3414248B03B41434A40414402000000002F4F3F777FB79BFF8CC1A6FD8BC0 + A5FD8CC2A7FC8CC2A7FC86B9A0FD7AAF95FF45735BD703060438000000000000 + 000000000000000000000000000001020202000000001A2F25635D9478E579B2 + 95FF6DA688FE6DA789FF60977CF92E5341B30104023801010111000000000000 + 00000000000000000000000000000000000000000000000000000A1410210918 + 105905140D6008170F620E1A144D0305041A0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003D2F32A334292D510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000C020201241E2273ABBEC1FF645F5DE92A27 + 2A150000000000000000A9373409000000000000000000000000000000000000 + 000000000000000000000000000003030304253B41F0EFF0EFFFB5BEC1FF2B2C + 30AB1D0E0A010000000000000000000000000000000000000000000000000000 + 0000E3E3E31395959562A4A4A450382C2FB7A3B7B6FFE6E0DEFFD7D0D0FF4F67 + 6DFD372A2E55000000000000000000000000000000000000000000000000E4E4 + E4156D6D6DA59F9F9FFD9F9F9FF5828687FAD7DCDBFFC8CBC9FFC2C1BEFF9DAB + ABFF312F33730000000015040501000000000000000000000000E6E6E6157979 + 79A5939393FEDFDFDFFFF4F4F4FFBFBFBFFFBBBCBAFFCFCCCFFFB1AFB0FFB7B7 + B6FF616A6DFD00000000000000000000000000000000E5E5E5156A6A6AA56464 + 64FD858585FF999999FFBBBBBBFFAEAEAEFF8C8C8CFFB9B9B9FFAEB1AFFF9E9F + 9EFF9C9A99FF646C6FE90000000000000000E4E4E4155E5E5EA5222222FD3D3D + 3DFF353535FF3F3F3FFF3B3B3BFF383838FF525252FF666666FFA3A3A3FF9E9F + A0FF939495FF8F9295FF02030307E4E4E414595959A5131313FD161616FF1818 + 18FF191919FF1B1B1BFF1D1D1DFF1F1F1FFF303030FF585858FF636363FF9696 + 97FF908D8EFFA3A7A6FF2E2C309A6565657B191919FE1A1A1AFF111111FF1111 + 11FF131313FF151515FF171717FF181818FF1C1C1CFF343434FF606060FF5D5D + 5DFF7E7F7DFF898886FF888789FF2B2B2B3E0B0B0B99191919D2151515F90D0D + 0DFF0C0C0CFF0E0E0EFF101010FF111111FF131313FF191919FF373737FF5454 + 54FF888789FF62635FFF777579FF000000007D7D7D0C404040680F0F0FEA0707 + 07FB060606FE050505FF080808FF0A0A0AFF131313FF333333FF696968FF9D9D + 9CFF8E8F8EFF646363FE3B3D3FDFF7F7F702B8B8B81F4F4F4F96242424E61616 + 16FB0F0F0FFC080808FE040404FF030303FF131313FA515154E8636565D86463 + 67D34C4D52B43B41434A4041440200000000ECECEC05C7C7C71D8080807F4343 + 43BB424242F7383838FF282828FF1A1A1AFF0F0F0FF6515151977C7C7C6A7171 + 717CDADADA1800000000000000000000000000000000E4E4E412888888886868 + 68A26B6B6BF0717171FE666666FF4B4B4BD6535353818282824F92929253F8F8 + F80200000000000000000000000000000000000000003E3E3E04D8D8D813A0A0 + A03A8383836C8C8C8CD98F8F8FF4818181979D9D9D30CFCFCF17F2F2F2040000 + 0000000000000000000000000000EAEAEA19F2E8E8A2F0E5E5E0EBDCDC420000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000E4D5D5A4E3D3D3FFDFCECFFFE4D0D09B0000 + 00000000000000000000000000000000000000000000000000000B0808730000 + 0000000000000000000000000000DAC6C663D3BCBCDACDB4B4C49281814B0000 + 000000000000000000000000000000000000000000002B211BFF685142FF1310 + 0C8D00000000000000000000000000000000B4A69937938477511815129A0000 + 000000000000000000000000000000000000020201FF5A4638FF31261EFF4B3A + 2FFF0E0909670000000000000000A094822BC1BCB2DFD2D1CDFF8B857AFF140F + 0AFF100D09FF0F0B09FF0B0907FF010100FF382C23FF6E5A4BFF393C3DFF211A + 14FF49392DF300000000000000008F846F60BFBDBAFFC4C6C9FF8B877FFF342A + 20FF2A211AFF29201AFF241C17FF221B16FF7A604CFF706762FF9A9B9CFF2828 + 28FF443529FF43362DD6000000001F1A14317B7366F8BBBBB8FF7E766BFF4D3C + 30FF45352BFF43342AFF392C23FF644F40FF7A6758FF989A9BFFB2B2B3FF8B8B + 8CFF2F2823FF78604EFF342B23AB1E1714AD765D4BFF806D59FF6D5948FF614C + 3DFF5F4B3CFF5A4739FF5A4739FF977B65FF918C88FFDDDFE0FFDBDBDBFFC5C5 + C6FF6F6E6CFF392D23F3372B25CB120F0D706C5849FB957761FF92745EFF7E62 + 4FFF785D4AFF705645FF9C7F68FF968576FFC8C9CBFFC0C1C1FF878888FFBBBB + BDFFBCB7B0F8504638360000000000000000544B465E786E65FF947F6CFFB497 + 7FFFAE8D75FFB19077FFB1957DFFA2A09EFF8B8C8DFF020100FF040200FFABAD + AFFFC7BDB3DB71555509000000000000000093938613B1AEA8E96C6663FF493A + 2EFF8D7A69FFAA947FFF989088FFFDFEFFFF777778FF23170EFF332821FFC1BF + C2FFAFBCA5BD0000000000000000000000002ECD6A4890B594F2B8A6A8FF6753 + 47FF6F645CFFA0A1A2FFE9EAEAFFFFFFFFFF7C7C7BFF2A1D13FF342A24FFD3C8 + CBFF8ACB9EF84AF199744CE5990A00BF3F0424D76CC853DA8EFF83B68DFFC1B7 + B2FFCAC1C0FFD8D9D9FFFBFBFBFFFFFFFFFF83817FFF3B261CFF49342EFFB7B5 + AAFF6DD194FF5DF5ABE073F7B9210000000009C44AA735DF7DFF4FEB99FF6CC8 + 8EFFB5BBABFFEBE1E5FFFEFEFFFFFFFFFFFF908382FF675E46FF70AA7DFF61DD + 99FF67F5B1F476FCC163000000000000000000AA000308C2469833DB78FF42E9 + 8EFF62D897FF9EBFA2FFE2DAD6FFC0CFBEFF7BC294FF5BDD95FE58F6A6FF59F2 + A5CB6AF6B41F0000000000000000000000000000000000B2330A00BA3A3403C0 + 428321D668DA1CC95BBD32B75AD937D274F235E27FB634DE7C4E40DE853F4CE5 + 8C14000000000000000000000000FFFFFF00030B2000020A2000060F21001026 + 2F00152D35000D192C142B4972A6243F627D162B4F010F1E360019315B000C19 + 36000000000000000500FFFFFF00FFFFFF00030B2000020A2000050E20000E24 + 2C001B354145385A79D23E698FFF4C7FAEFF3F6692B11020381E172F58000C19 + 36000000000000000500FFFFFF00FFFFFF00030C2200020A2100060F2010213D + 4E91365774FC3D6184FF41668BFF4D7BA8FF4E7FAAFF3C6287DD223E6B4B0914 + 31000000000000000500FFFFFF00FFFFFF0001040D0000020F03192F4AB0304D + 67FF37597AFF3C6083FF3F6589FF4E7CA8FF4D7AA7FF457098FF3B6185FC1528 + 466B0000000000000500FFFFFF00FFFFFF0001060F0002081420213952F6324E + 6AFF3B5E7FFF3A5C7CFF395C80FF46719BFF4A77A1FF4A749FFF3F6487FF2640 + 5CD3081122070B162800FFFFFF00FFFFFF00030816000C182D5A2A425BFF314E + 6BFF345371FF2B4969FF193858FF264B71FF395F86FF42698EFF3E6387FF314E + 6BEE0C16261E09111F00FFFFFF00FFFFFF0001051000152438A32A445BFF2B45 + 61FF1B3450FF0F2941FF46647CFF3B5A72FF13314DFF28486BFF365779FF3352 + 70FF0C18295101061000FFFFFF00FFFFFF000102070B1C3045DD203852FF0D25 + 3EFF1B3952FF6387A4FF98BEDDFF94B8D7FF597C97FF183850FF183553FF2D4C + 6DFF16273A9300010200FFFFFF00FFFFFF00121A2442152B44FF0E2841FF4062 + 7EFF7AA1C3FF86B0D4FF84ABCDFF84ABCDFF86ADD0FF7199B9FF345570FF1331 + 4CFF1C344FD208101A12FFFFFF00FFFFFF00070B11591F3951F96188A8FF7FA6 + C9FF7DA3C4FF6086A5FF517897FF537897FF6D92B3FF7BA2C3FF7DA4C7FF5175 + 93FF0D1F31D902040926FFFFFF00FFFFFF000000000A384C5EB06F97BCFF678B + AEFF6C91B3FF2D5373FF14385AFF193E5EFF557A9BFF698DB0FF698EB2FF678A + ACF90D10134D00000004FFFFFF00FFFFFF00020202003448599A5F87AAFF597F + A1FF5980A3FF355C7CFF2B5072FF2D5172FF4F7494FF5A80A1FF597FA2FF5579 + 9BF70E11152700000000FFFFFF00FFFFFF00080707003749569D6589A4FF5D81 + 99FF5F829BFF446880FF41637DFF41637CFF547890FF5D8099FF5E829CFF5B7C + 95F81012152B00000000FFFFFF00FFFFFF000908090030404F9B547592FF4E6E + 89FF4E6E89FF4A6B84FF52728CFF51728CFF4B6C86FF4C6C88FF4E6E8BFF4E6C + 87F91012152A00000000FFFFFF00FFFFFF000101020007090B2F0B0F135B0B0E + 12570B0F12580C1114580F1316580E1316580B0F12580A0E12570B0F13590B0F + 13530303030D00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002E4264042A38 + 4E04000000000000000000000000000000000000000000000000000000000000 + 00001C34500D22477749284F8286355A8FA75074A8C47296BBE17CA0BA993646 + 5C0400000000000000000000000000000000000000000000000018375F2B244F + 824944637EE0516E86FF5D7A91FF628094FF769AB0FF85AABEFFA0C6D0AD96B6 + C028000000000000000000000000000000000000000020355209364B5CE0466F + AAFF4E78BAFF5178B4FF41679AFF325A8EFF45678FFF647D8BFF6C889FFFA5C7 + D590000000000000000000000000182B44073B6198723A5D8FE54B6B94FF506E + 98FF5F82B9FF486EA4FF40669DFF6384A4FF6F8CA0FF6B859AFF8EA9B1FF5974 + 8FDF47638D35000000000000000000000000536B79C260748BFF466591FF476D + A8FF5178B4FF597BAFFF84A2B9FF98B3B9FF416084FF3D587CFFA3C0C6FFA3C0 + C7FF5F788E420000000000000000080A0B0255676DC0A3A194FFA8A696FF738C + 95FF7490A9FF9DBACAFFA7C4CBFF879A9EFF3A5575FF354C6BFFA6C2C9FFABC7 + CEFF6E7F841D000000000000000000000000191E20845B686CEF848B85FF94AB + B1FFABC6CCFFAECAD1FFAAC6CEFFB0CCD3FF364E6CFF2B4161FFAAC6CDFFA7C3 + C9FF547B7826000000000000000000000000000000000101013F31393CA78C9F + A5F5B0CAD1FFAFCAD1FFA2BFC5FF87ABACFF3B5259FF3D4148FF354C48FF1956 + 45FF185F4EF81A6453C11A66546C000000000000000000000000000000000D10 + 102748726C812A665AEA1E6256FF1F6659FF206A5CFF255A50FF344040FF3C3D + 41FF385351FF2B685EFE1A675547000000000000000000000000000000000000 + 00000000000009302405115541431A715B7D207765A1237D6BAE227867A83359 + 52984C4D53804144493500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000040404004666666050000000050575723545757645256 + 547C53575569525B521C00000000000000000000000000000000000000005959 + 5917555D5521505757235357557851545285535656504E5050893C3B35E23836 + 30FC42423CD67375756D00000000000000000000000000000000535959284D51 + 4F8B4B4B48995458567F3A3933DF37362FF76F73718143423DDD464743FD4E51 + 4EFF3B3A34F6B0B0B07700000000000000005D5D5D0B5559553F6065636A4240 + 3BD43A3833F087898780383630FB3B3933F5ADADAD80383731FC4E524FFF3D3D + 37F9888885ADECECEC500000000000000000868986615B5956B784868491605E + 5ABD3C3934F4C3C5C380585853D06F6D69BFE9E9E9805F5F5CD33C3A34F98887 + 84B6FDFDFD72FFFFFF0D0000000000000000C2C4C2793E3C37F2615F5ACBE2E2 + E282B3B3B09AE5E5E575EDEDED7EE3E3E37F8A8C8A7AE4E4E47BFBFBFB7AFCFC + FC55FFFFFF11000000000000000000000000FBFBFB47A5A5A2A47F7D79BBD3D3 + D3796768639F3D3D3AD4383631F436342EFD373630FC3D3B36E75E605C957278 + 723100000000000000000000000000000000FFFFFF02E8E8E84CC4C4C2814342 + 3DDA393732F943443FFF484B47FF4A4C49FF484A46FF3E3E39FF43423DD98487 + 845300000000000000000000000000000000000000006A6D6A59454540CB3F3E + 39FB505452FF515553FF4E524FFF4C4F4CFF454643FF393832FA60635FAC9898 + 983900000000000000000000000000000000000000007B807D76383630FC4A4D + 4AFF4D4F4DFF4C4E4BFF494B48FF3F3F3AFC3A3832F7686B67ABA1A4A45FBFBF + BF0400000000000000000000000000000000000000008C918F76383631FA4647 + 43FF464844FF424440FF3A3833FA4D4B47D5999B9B8AAFB1B179B5B8B548BFBF + BF1400000000000000000000000000000000000000009FA2A2554E4D49D13B3B + 35FD40403CFF3A3832F972706DAFB9BBBB7F838382A35B5A56CA484541E4CBCD + CB700000000000000000000000000000000000000000B8B8B8199D9E9B8C3A38 + 32F8393731FF383631FCA4A2A192C9CBC97B393832F937342FFF36342EFFDCDC + DC74000000000000000000000000000000000000000000000000CACACA3A9697 + 969B3B3933F736342FFE36342EFF413F3AEF36342EFF393732FA989795A6EFEF + EF3F00000000000000000000000000000000000000000000000000000000DBE0 + E039C7C7C78863625ECB373530FD36342EFF45433DEDA5A5A2A2FCFFFF53FFFF + FF02000000000000000000000000000000000000000000000000000000000000 + 0000F3F3F315F8F8F84DFDFDFD71FFFFFF7AFFFFFF65FFFFFF31FFFFFF010000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F2F2F2FF676769FF2C2B2FFF6766 + 69FFE7E7E7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00808081FF222125FF222125FF2221 + 25FF626063FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003E3D41FF222125FF232226FF201F + 23FF201F23FFDFDEDFFFFFFFFF00FFFFFF00B2B2B3FF99989AFFD1D2D3FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00262529FF222125FF201F23FF201F + 23FF201F23FFB9B9B9FFFFFFFF008C8B8DFF201F23FF232226FF2C2C30FFAEAD + AFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF002D2C30FF201F23FF201F23FF201F + 23FF201F23FFB2B2B3FFFFFFFF00303034FF232226FF232326FF232226FF2B2A + 2EFFE4E4E4FFFFFFFF00FFFFFF00FFFFFF00606062FF201F23FF201F23FF201F + 23FF201F23FFB9B9BBFFFFFFFF0027262AFF232326FF232226FF201F23FF201F + 23FF7D7C7DFFFFFFFF00FFFFFF00FFFFFF00C0C0C2FF201F23FF201F23FF201F + 23FF201F23FFBBBABBFFFFFFFF004F4F52FF232226FF201F23FF201F23FF201F + 23FF3D3C40FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00525256FF201F23FF201F + 23FF27262AFFA9A8AAFFFFFFFF00A6A7A8FF201F23FF201F23FF201F23FF201F + 23FF28272BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00D1D0D1FF8B8B8DFF8F8E + 90FF818083FF707072FFFFFFFF00FFFFFF005C5C5FFF201F23FF201F23FF201F + 23FF201F23FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00454548FF2322 + 26FF232326FF232226FFDDDCDDFFFFFFFF00E2E2E3FF27262AFF201F23FF201F + 23FF353438FFEFEFEFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0089898BFF2323 + 26FF232226FF37363AFFF6F6F6FFFFFFFF00FFFFFF00939396FF8B898CFF8E8E + 90FF747376FFD0D0D0FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A6A6 + A7FF9C9C9DFFEAEAEAFFFFFFFF00FFFFFF00FFFFFF00B2B2B3FF252428FF2322 + 26FF232326FF9D9D9EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B5B5B6FF232226FF2323 + 26FF232226FFA09FA0FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ECECECFF5B595CFF2726 + 2AFF6A6A6CFFF5F3F5FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF005A5A5A3F6E6E6E6581818103FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004747 + 47585A5A5AFE6E6E6EFF81818193FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434340E4747 + 47F75A5A5AFF6E6E6EFF818181D2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF005B5B5B0F6B6B6B557C7C7C14FFFFFF00FFFFFF00FFFFFF00343434574747 + 47FF5A5A5AFF6E6E6EFF818181CCFFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A + 4A635B5B5BF86B6B6BFF7C7C7CF28888880CFFFFFF00FFFFFF00343434A64747 + 47FF5A5A5AFF6E6E6EFF81818191FFFFFF00FFFFFF00FFFFFF00393939554A4A + 4AFF5B5B5BFF6B6B6BFF7C7C7CFF88888828FFFFFF0021212105343434F04747 + 47FF5A5A5AFF6E6E6EED81818114FFFFFF00FFFFFF0029292905393939DD4A4A + 4AFF5B5B5BFF6B6B6BFF7C7C7CDAFFFFFF00FFFFFF00212121033434345D4747 + 47D65A5A5AFF6E6E6E64FFFFFF00FFFFFF00FFFFFF002929296E393939FF4A4A + 4AFF5B5B5BFF6B6B6BFA7C7C7C4AFFFFFF000D0D0D0921212141FFFFFF004747 + 47065A5A5A6A6E6E6E01FFFFFF00FFFFFF00FFFFFF002929298F393939FA4A4A + 4AFF5B5B5BFD6B6B6B59FFFFFF00FFFFFF000D0D0D88212121FE3434349A4747 + 471FFFFFFF00FFFFFF00FFFFFF00FFFFFF0018181804FFFFFF00393939254A4A + 4ACA5B5B5B67FFFFFF00FFFFFF00000000100D0D0DF6212121FF343434FF4747 + 4787FFFFFF00FFFFFF00FFFFFF0007070711181818D92929294EFFFFFF004A4A + 4A01FFFFFF00FFFFFF00FFFFFF00000000190D0D0DFB212121FF343434DA4747 + 4708FFFFFF00FFFFFF00FFFFFF0007070789181818FF292929FF393939C1FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000D0D0D522121219A34343428FFFF + FF00FFFFFF00FFFFFF00FFFFFF00070707DE181818FF292929FF3939397AFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000707078C181818FF292929BD39393905FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0018181809080808050000000C0000 + 00140000001C00000023000000270000002800000026000000210000001B0000 + 00130000000B00000002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FEFEFE00FFFFFF00EBEBEC047E8A963F76889773798B9A7F768897787E8C + 974DEBECEF06FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FAFBFB00838E9937153755D100143EFC000022FF000024FF010128FD000F + 38FF1C354C97F3F4F500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFEFE01FFFF + FF00EBEAEB030C1C3ECE004C98FF02549FFD041943FD040E32FC051F4EFB0027 + 5DFF0B233FE3EBEDEE09FFFFFF00FFFFFF00FFFFFF00FFFFFF00FAFBFB01FFFF + FF00838D9810072D52ED2068A8FF386089FE193861FF00265DFF012B5FFE0439 + 73FF00163EF088919A12FFFFFF00FFFFFF00FFFFFF00FFFFFF00FAFBFB02FFFF + FF0077828D2712355AF85686B6FF123B6CFE032D62FF003D7DFF004182FE0553 + 9DFF001B4AFD81878E31FFFFFF00FFFFFF00FFFFFF00FFFFFF00F9F9FA04FFFF + FF00818A924F002855FF3D75ADFE0E3262FF003370FF004D95FF00478CFF054C + 96FE001A4BFF82888F53FFFFFF00FFFFFF00FEFEFE00FAFBFB02FFFFFF00FCFC + FD0045526189285583FF4174A8FB3E506BFF013674FF00448CFF004084FF0547 + 91FC001C51FF7B82886BFFFFFF00FEFEFE00FCFDFD02FEFFFF01F5F5F500434E + 5B59112F50F94276AFFF406995FE032759FF003B7EFF003F85FF003C80FF013F + 85FB002E6AFF18263387F0F1F200FFFFFF00F4F5F6007D848B2E192C3FB5294C + 70FF4F7EB0FE305F96FF3C5371FF0F3668FF003980FF01397DFF013A7EFF013C + 86FC002966FF101924BAEAEAEA00F9FAFB004F59645A000732FA073B7BFF2459 + 96FC4874A1FE294870FF001E56FF013578FF00377BFF01367DFF002C6CFF0227 + 58FE1D2B3CFF080E12E3414142197E81851B000B2FEA08458FFF01377CFB002F + 76FF0E3770FF213E64FF002F6EFF023579FF003279FF032354FF242A33FD3835 + 33FA3F3D3AFF090C12F4000000343E464D89001A44FF01367FFD01357BFF0235 + 79FF013277FF002E74FF00327BFF00296EFF062049FE2D3033FE232525FF2023 + 26FE0D0F10FF0B0C0F8CB2B2B201111416DA32383EFF0A2244FD002358FF0025 + 63FF002768FF00245FFF031E49FE1B2534FC353433FE0E1213FE05080BC90306 + 0AA3494A4C49F5F5F500FEFEFE0107080AA0252626FF454340FD363739FE2C2F + 36FD272B32FC2A2D30FD383633FE2C2A29FF080A0BF80505067FB4B3B308FBFB + FB00F6F6F601FFFFFF00FCFCFC01B1B1B31107090B8E000000EE141617FF2425 + 24FF252524FF161718FF060709F9040709B74D4E4E38F6F6F600FEFEFE01FFFF + FF00FDFDFD03FDFDFD00FFFFFF00FFFFFF00B4B4B4007576761D3C3C3D550000 + 007D000000853838396A8586862FE7E7E601FAFAFA00FFFFFF00FCFCFC01FEFE + FE00FEFEFE00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000B08E008FBFA22CFFC4A83AFFC4A83AFFC3A73AFFC19B2AFFC19B + 2AFFC19B2AFFBC9520FFAE840080000000000000000000000000000000000000 + 0000FFFFFF00BFA22CFFFEF6E8FFFEF6E8FFFEF6E8FFFEF6E8FFFAE3B8FFF9DD + A8FFF9DDA8FFF9DDA8FFBC9520FF000000000000000000000000000000000000 + 0000FFFFFF00C19C36FFFEF6E8FFFEF6E8FFFEF6E8FFFEF6E8FFFAE3B8FFF9DD + A8FFF9DDA8FFF9DDA8FFC19B2AFF000000000000000000000000000000000000 + 0000FFFFFF00C19C36FFFDF3E0FFFEF6E8FFFEF6E8FFFEF4E4FFFAE2B4FFF9DD + A8FFF9DDA8FFF9DDA8FFBC9520FF000000000000000000000000000000000000 + 0000FFFFFF00AD81009FCAA33FFFD3AF54FFD3AF54FFD3AF54FFD3AF54FFD3AF + 54FFD3AF54FFC59D35FFAD81009F000000000000000000000000000000000000 + 000000000000000000004D3E10FF534414FF534414FF534414FF534414FF5344 + 14FF534414FF433510FF00000000000000000000000000000000000000000000 + 000000000000000000003F3522FF473D29FF473D29FF473D29FF3D3422FF342B + 1BFF342B1BFF2A2114FF00000000000000000000000000000000000000000000 + 00000000000000000000473D28FF594E37FF594E37FF594E37FF473D29FF342B + 1BFF342B1BFF2A2114FF00000000000000000000000000000000000000000000 + 00000000000000000000473D28FF594E37FF594E37FF594E37FF473D29FF342B + 1BFF342B1BFF2A2114FF0000000000000000413723104137239F433924EF473D + 28FF433924EF413723AF473D28FF594E37FF594E37FF594E37FF473D29FF342B + 1BFF342B1BFF2A2114FF261E111041372310413723CF504530FF726751FF7267 + 51FF594E37FF564B35FF504530FF594E37FF594E37FF594E37FF544A34FF342B + 1BFF342B1BFF2E2517FF261E118F413723804F442EFF685C46FF938772FF9387 + 72FF594E37FF594E37FF594E37FF594E37FF594E37FF594E37FF594E37FF3B32 + 20FF342B1BFF342B1BFF261E11DF433924EF594E37FF594E37FF7D725CFF7A6E + 58FF594E37FF594E37FF594E37FF594E37FF594E37FF594E37FF594E37FF473D + 29FF342B1BFF342B1BFF2A2114FF322915FF564B34FF594E37FF594E37FF594E + 37FF594E37FF594E37FF594E37FF4B412BFF362D19FF251C0AFF211907002119 + 070021190700211907002119070021190700251C0AFF362D19FF3D341FFF3D34 + 1FFF3D341FFF3D341FFF28200DFF211907002119070028200EFF3D3423FF362D + 1CFF211907002119070021190700211907002119070021190700211907002119 + 070021190700211907002119070021190700211907002A2210BF3D3423FF362D + 1CFF211907002119070021190700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000CCFF000066FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0066FF66FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF000000CCFF000066FF6666FFFF6666FFFF0000CCFF000066FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF0066FF66FF009900FFCCFFCCFFCCFFCCFF0000CCFF0000 + 66FF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF0000CCFF0000 + 66FFCCFFCCFFCCFFCCFF009900FFFFFFFF000000CCFF000066FF6666FFFF6666 + FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666 + FFFF0000CCFF000066FFFFFFFF00FFFFFF00000066FF0000CCFFCCCCFFFFCCCC + FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF6666FFFF0000CCFF0000 + CCFF000066FF000000FFFFFFFF00FFFFFF00000066FF0000CCFF0000CCFF0000 + CCFFCCCCFFFFCCCCFFFF6666FFFF6666FFFF0000CCFF0000CCFF000066FF0000 + 66FF000066FF000000FFFFFFFF00FFFFFF00000066FF0000CCFF0000CCFF0000 + CCFF0000CCFF0000CCFFCCCCFFFF0000CCFF000066FF000066FF000066FF0000 + 66FF000066FF000000FFFFFFFF00FFFFFF00000066FF0000CCFF0000CCFF0000 + 66FF000066FF0000CCFF0000CCFF000066FF000066FF000000FF000000FF0000 + 66FF000066FF000000FFFFFFFF00FFFFFF00000066FF0000CCFFCCFFCCFFCCFF + CCFF000000FF0000CCFF0000CCFF000066FF000066FF000000FFCCFFCCFFCCFF + CCFF000066FF000000FFFFFFFF00FFFFFF00CCFFCCFFCCFFCCFF009900FF0099 + 00FF000000FF0000CCFF0000CCFF000066FF000066FF000000FF009900FF0099 + 00FFCCFFCCFFCCFFCCFFFFFFFF0066FF66FF009900FF009900FF0000CCFF0000 + 00FF000066FF0000CCFF0000CCFF000066FF000066FF000000FF000000FF0000 + 66FF009900FF009900FF66FF66FF009900FF330099FF000066FF0000CCFF0000 + CCFF0000CCFF0000CCFF0000CCFF000066FF000066FF000066FF000066FF0000 + 66FF000000FF000000FF009900FFFFFFFF00FFFFFF00FFFFFF00330099FF0000 + 66FF0000CCFF0000CCFF0000CCFF000066FF000066FF000066FF000000FF0000 + 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00330099FF000066FF0000CCFF000066FF000000FF000000FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00330099FF000000FFFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000004A0000004A00000075000000750000004A0000004AFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000FF01FFFFFF05FFDD880FEB93271AD67A0A1900000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C969 + 0355D46F05B9D1720DD0D2730DE2D46C04EEC07401EB976900889966000A0000 + 000000000000000000000000000000000000000000000000000000000000BF6D + 0080CD7400FFBF6A00FFBC6600FFBF6A00FFAE7103FF895800FA875700200000 + 000000000000000000000000000000000000000000000000000000000000A270 + 0674AC7506FFA76F04FFAA7105FFB37B0AFFA37711FF6E4000EE7544001A0000 + 000000000000000000000000000000000000000000000000000000000000745D + 176D7F6317FF826416FF8D6F19FF98781BFF886717FF522B00EA512E00160000 + 0000000000000000000000000000000000000000000000000000000000004A3A + 0F6054441DFF5B4A20FF645120FF6E5A21FF5C420EFF381C00E6000000000000 + 0000000000000000000000000000000000003F33F2147672E93A8E8BDE5F3F39 + 79B0292138FF2B242FFF342B35FF3A313DFF43533BFF44705CF850D9D4BE7CF4 + F3B27AF6F6922AD4D4060000000000000000220BF3862912FDFF2F21FAFF2014 + F0FF0D01D9FF0A00B3FF0B0496FF161692FF3462A7FF4A6CB7FF5AA4D1FF81FF + FFFF4EF7F6DA00CCCC0500000000000000002C1CF27F230CFEFF1100F1FF0C00 + F0FF0C00EEFF0A00CFFF0E0791FF261F8EFF31279FFF3A30A3FF1A1069FF2C72 + 9CFF39E5E5C9000000000000000000000000423BE8703022EDFF1601E0FF0E00 + DCFF0C00D4FF1409C4FF0D0579FF37329EFF716ECEFF534FC4FF251F96FF1810 + 56FF196480BF00FF7F0400000000000000004E48CA623830CCFF1C0CBDFF1000 + BCFF0C00B5FF2419ADFF0C064DFF231F65FF4945B2FF3931C7FF231C9DFF1E18 + 76FF18206EAF00FF00010000000000000000413EA9563630A8FF241D96FF190E + 90FF14098AFF1C1573FF0F0D36FF221D73FF1D1874FF251E9BFF1D1881FF201A + 87FF231B8D9F0000000000000000000000002925813D2A2584E02A2684F72723 + 80FF231F7AFF16134CFF0A0924FE19146AFF1E1973FF1A1663FF1C195BFA1F1A + 71EE201B865D00000000000000000000000013139C0D201C8F3E211C805B231F + 7580232070AE151444BA0505148B0D0B2BAF120F3BB416134DA11C18667F221C + 8858281AAE13000000000000000000000000000000000000FF010000FF032424 + DA071F0F9F102211880F00003F080B0B391614145119211679171E1EA5112713 + B00D000099050000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F5F089A881B1CAA84 + 1F30986D1C487B5514635A3E0E7F5D410F856C48106A774D0C4F97670E36AA64 + 0F2175623A0D000000000000000000000000000000003B30AD5E6B619FF0889A + 8AFCA1D0A5FFB8CC93FFCDCE98FFD6D3A3FFC9CD98FFADCA99FF89B993FE519C + 7BF324906E940000000000000000000000000000000010038A4F3025BAFF8888 + E5FFCCDCF6FFE7F6EEFFF2FAEDFFF6FCF4FFEFFCF4FFC6F6EFFF6BDECFFF1FB0 + 91FF0C7B568A00000000000000000000000000000000090056350D0077FD3126 + B5FF938DE4FFE0DEFAFFFDFCFFFFFEFFFFFFDAF9F5FF85E4D6FF2BB79BFF0F7D + 56FF07552C6C0000000000000000000000000000000010005A1F090058F20D00 + 7DFF3A2FBBFF9B98E7FFECE9FBFFF1FEFBFF9DEADFFF41C6AFFF138A66FF0858 + 2FFF06461F500000000000000000000000000000000024126D0E0C0455E20800 + 5AFF100285FF453CC3FFC4BEF2FFDBFFF3FF5DD8C2FF1C9B7BFF095F38FF084A + 26FE0E553336000000000000000000000000000000000000FF01150D63CD0801 + 4DFF0C0262FF1F158CFF5049ACFF5C6CABFF29878CFF0C6D43FF064824FF0F54 + 33F416523422000000000000000000000000000000000000000018125DCF0F08 + 4DFF150F61FF282295FF3631A7FF2E2693FF171561FF0A2F30FF0B482CFF1556 + 37F0051A0F31000000000000000000000000000000000000000008062C9A110B + 4EF5150E64FF4C47B4FF716ED0FF413BBBFF1D167DFF15174AFF134E3BF80A33 + 22AC000000000000000000000000000000000000000000000000000037330100 + 27950E0A41E92F2C7AFF4944C3FF2F28BEFF1F1989FF1E1871FF0B1F3AB40033 + 1B4A00000000000000000000000000000000000000000000000000007F0A0000 + 45301C195FB21E1975FF221D80FF231B99FF1C1778FF221B8FFF152F64770070 + 3319000000000000000000000000000000000000000000000000000055030000 + 0935110E45C31C1772FF1F1A75FF1C1868FF1F1C69F91F1D7ED214427032009F + 5F08000000000000000000000000000000000000000000000000000000000000 + 05300909208D0E0D2EAF12103EB714164CAB1B1D698021288C45134E890D007F + 7F02000000000000000000000000000000000000000000000000000000000000 + 00001700450B0C0C3F141212511C11225D1E1A2886131933990A00007F020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000AA030000FF020000 + FF01000000000000000000000000000000000000000000000000000000000000 + 00000909311A15154A30201C613F1C16855018108B3E0000BB0F0000E50A0000 + D40600007F020000000000000000000000000000000000000000000000000F0F + 3F40221D80D5262184F625208DFD3D38A0FF1F1A7BF81C158EA30B05A22C0000 + DD0F0000D4060000FF0100000000000000000000000000000000000000001A16 + 64AD221C8EFF251F95FF322CA2FF3F3AAEFF26227BFF191563FF17126ACA0A05 + 87330000E70B0000FF0200000000000000000000000000000000000000001D18 + 70C93630ACFF3C37ACFF5E5AC3FF4D49BCFF3631AEFF1D1874FF17144EFF120F + 4AC009097F1C0000FF03000000000000000000000000000000000000055E0F0A + 55D82F2994FF7471D0FF8380D5FF5B57C8FF352EB5FF1F198DFF1A1568FF1614 + 4AFF0F0F44650000FF010000000000000000000000000000121C00001C6D0D0A + 53E01E1B61FF44409DFF4F4ACCFF3A33C4FF2D26B9FF20198EFF1E1973FF211C + 74FF14105E7F00000000000000000000000000000000000033230000307A100D + 54E5272373FF181462FF3A34A9FF2E25C2FF261EB2FF20198EFF1C1774FF1E18 + 83FF1B157D800000000000000000000000000000660500004E2A00002F811A17 + 67E62F2992FF181276FF1C176CFF221B89FF201991FF191569FF1C177DFF2821 + A0FF1E187187000000000000000000000000000091070000562C0000247E1814 + 6CE521199BFF211A92FF231E83FF1D186CFF1B1760FF221F64FF1E196DFF211B + 88FB13104C5D00000000000000000000000000007F060000572600001F70100B + 5BD61A137EF51D1873F51A166FF3141161EE100E4AE612103BD913123BC20D0B + 3B81000000000000000000000000000000000000AA03000058170000324C0000 + 20850000209B00002E9E00003A9900002F8B0000157600000000000000000000 + 00000000000000000000000000000000000000000000000055090000511C0000 + 46330000474000004B40000043390000282C0000072100000000000000000000 + 000000000000000000000000000000000000000000000000FF01000066050000 + 730B00007F0E0000750D00007109000033050000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00874A + 2028874A2085874A20C5874A20F2874A20F2874A20C5874A2085874A2028FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00874A2002874A20798D54 + 2CF5C1A18CFDDBC9BDFFF4EFEBFFF4EFEBFFDBC9BDFFC1A28CFD8D542CF6874A + 2078874A2002FFFFFF00FFFFFF00FFFFFF00874A2002874A20C4A77A5BF6F0E8 + E3FFD0B9A9FFAC8265FF96603BFF96603BFFAC8265FFD1BAAAFFF0E9E4FFA77B + 5CF6874A20C4874A2002FFFFFF00FFFFFF00874A2079AA7E61F6F2EBE7FFA678 + 59FF9C6947FFDECEC2FFF7F3F0FFF1EAE6FFD0B8A7FFA06F4DFFAD8264FFF3ED + E8FFA87C5DF7874A2079FFFFFF00874A20288E552DF5F1EAE5FFA57858FF874A + 20FFB0886CFFFEFDFDFFE9DED6FFF6F2EFFFFFFFFF00DCCABDFF986038FFB389 + 6BFFF2EBE6FF8D552DF6874A2028874A2085C3A590FED0B9A9FF874A20FF874A + 20FF9F6E4BFFA06F4DFF945B32FFA87A59FFFFFFFF00FDFCFBFFA16D46FF9F6A + 43FFDAC6B7FFC6A994FD874A2085874A20C5DDCCC0FFAC8265FF874A20FF8B50 + 27FF90562DFF955C34FF99623AFFC2A189FFFFFFFF00F3ECE8FFA5724BFFA673 + 4DFFC3A186FFE1D2C6FF894C23C5874A20F2F5F0EDFF935C36FF8A4F25FF9056 + 2DFF955D34FF9A633BFFB58B6DFFFCFBF9FFFEFEFEFFC19D82FFAC7A54FFAD7C + 56FFB78D6CFFF7F3EFFF884B21F2874A20F2F5F0EDFF945E38FF8E532AFF945B + 33FF99623AFF9F6942FFF3EDE8FFFFFFFF00D0B5A0FFB07F5AFFB2835EFFB485 + 60FFBD9475FFF8F3F0FF884B22F2874A20C5DDCCC0FFAF866AFF91582FFF9760 + 38FF9D6740FFA77651FFE4D4C8FFE5D6CAFFB48662FFB68763FFB98B67FFBA8E + 6AFFD1B29BFFE6D7CCFF8A4E24C5874A2085C3A590FDD3BCADFF945C33FF9A64 + 3CFFA16C45FFA97852FFC8A88FFFCCAD94FFB78965FFBB8F6BFFBF9370FFC196 + 73FFE7D7C9FFCFB4A0FD884B2185874A20288E552DF6F2EBE6FFB18769FF9D67 + 40FFA36F49FFB28462FFFFFFFF00FFFFFF00BD926FFFC19672FFC59B78FFD6B7 + 9DFFF7F1EDFF8F572FF6874A2028FFFFFF00874A2078AB8163F6F3EEE9FFB78F + 72FFA5724CFFB38765FFFFFFFF00FFFFFF00C19774FFC59B78FFD7B9A0FFF9F5 + F1FFB2886BF7884C2278FFFFFF00FFFFFF00874A2002874A20C4AC8264F7F3ED + E9FFDDC9BAFFC7A58BFFBB9171FFC19979FFD5B79FFFE9DACDFFF8F3EFFFB58D + 71F78B4F26C4874A2002FFFFFF00FFFFFF00FFFFFF00874A2002874A20798F55 + 2EF6CBAF9BFEE5D6CBFFF8F4F1FFF9F5F2FFE8DBD1FFD3B9A6FD915831F6894C + 2378874A2002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00874A + 2028874A2085894D23C5884C22F2884C22F28B4F25C5884B2185874A2028FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000935023029451 + 233B9C5D3493A56C46CEAB7653E8AA7451E8A36842CE9B5B31939351233B9450 + 23020000000000000000000000000000000000000000945124159D5F3794B07F + 5DF7BB9075FFBD9478FFBC9175FFBA8E71FFB78B6DFFB38363FFA8724EF79A5B + 319494512515000000000000000000000000914E1F17A1663FB3B98D70FFBD95 + 79FFBB9073FFC1AEA1FFCDCDCDFFCDCDCDFFBFAB9DFFB38464FFB48364FFAD7A + 59FF9C5F36B3934F211700000000904B1D039B5D3392B78A6CFFBB9075FFB88C + 6EFFB88B6DFFDCDCDCFFEBEBEBFFEBEBEBFFDCDCDCFFB18160FFAF7E5CFFAF7D + 5BFFAB7553FF98582D92924D20039350233BAB7754F8B88D6FFFB7896AFFB789 + 6AFFB6896AFFD2BDB0FFFBFBFBFFFBFBFBFFD0BBADFFB07F5DFFAE7B59FFAC79 + 55FFAC7855FFA26841F89350243B9A5A3092B28363FFB48666FFB48666FFB486 + 66FFB48566FFB28564FFB28262FFB28160FFB1805EFFAF7E5CFFAE7C59FFAC78 + 56FFAA7552FFA7714CFF98582C92A0643DCEB38363FFB28161FFB28161FFB281 + 62FFCDCDCDFFD8D8D8FFDDDDDDFFDDDDDDFFD4D4D4FFA97550FFA66E49FFA369 + 42FFA0653DFF9E633AFF97572BCEA56B45E8B0805EFFB07E5DFFB1805FFFB180 + 5FFFAF7C5AFFEBEBEBFFEFEFEFFFEFEFEFFFE3E3E3FF965428FF945225FF9451 + 24FF935023FF935023FF945124E8A36942E8B07E5CFFAE7A57FFA7704DFF9F63 + 3BFF98572BFFF3F3F3FFFFFFFFFFFFFFFFFFEFEFEFFF935023FF935023FF9450 + 23FF945023FF945124FF945124E89D5F37CEA66E49FF9B5C32FF945024FF924E + 20FF934F22FFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFF945124FF945124FF9451 + 24FF945124FF945124FF945124CE95532792955225FF924E20FF945023FF9451 + 24FF945124FFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFF945124FF945124FF9451 + 24FF945124FF945124FF945124929450233B935022F8945124FF945124FF9451 + 24FF945124FFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFF945124FF945124FF9451 + 24FF945124FF945124F89451243B9451240394512492945124FF945124FF9451 + 24FFD7D7D7FFF3F3F3FFFFFFFFFFFFFFFFFFF3F3F3FFD7D7D7FF945124FF9451 + 24FF945124FF94512492945124030000000094512417945124B3945124FF9451 + 24FF945124FF945124FF945124FF945124FF945124FF945124FF945124FF9451 + 24FF945124B39451241700000000000000000000000094512415945124949451 + 24F7945124FF945124FF945124FF945124FF945124FF945124FF945124F79451 + 2494945124150000000000000000000000000000000000000000945124029451 + 243B94512493945124CE945124E8945124E8945124CE945124939451243B9451 + 2402000000000000000000000000000000000000000000000000000000002222 + 23003F3F65005C5C914FC2C2BE78BCBCBC7AAFAFAF557D7D7D072F2F2F000000 + 00000000000000000000000000000000000000000000000000004C4C6D002D2D + 998400008FFF000092FFFFFFF2FFEBEBEBFFECECECFFE6E6E6FFD1D1D1979191 + 9000010100000000000000000000000000000000000052527400161692C90000 + 95FF0000A4FF0000A8FFCCCCE0FFEAEAE7FFE6E6E6FFE9E9E9FFEFEFEDFFE0E0 + DADD5F5F8B02000000000000000000000000292935002121959E000096FF0000 + AAFF0505B7FF0303B8FF9292CFD4E3E3DED1E3E3E3FFEAEAE7FFF2F2EAFF1717 + A1FF13138EBE3C3C550000000000000000008E8E97202020A0FF0000A0FF0000 + B6FF1F1FB6D75A5A9F15282834002929280090908F09D1D1D6C41919BBFF0000 + A3FF00008EFF4B4B973C0000000000000000D0D0CE88FFFFF1FFD1D1E2FF6262 + C5FB585896040000000000000000000000000000000052527B001D1DBCEB0808 + B0FF00009AFF1C1C91A52323210013131300DBDBDBBEEAEAEAFFE8E8E5FFDFDF + D69B1F1F1B0000000000000000000000000000000000080800004949BF7E0C0C + B6FF00009FFF101091DA20202E0017171700DDDDDDC9E9E9E9FFE5E5E5FFD0D0 + D0820000000000000000000000000000000000000000000000004A4AB3650B0B + B8FF0000A0FF0B0B91E81A1A2C000C0C0C00D7D7D7AEEAEAEAFFE6E6E5FFE2E2 + D9BE4B4B4E0000000000000000000000000000000000303029007878C8A10303 + B2FF000097FF0E0E8ECB24242C0000000000BFBFBF64F0F0EDFFFDFDEDFF6464 + C8FF4A4AB6432E2E3200000000000000000017171700B6B6B62AEBEBE3FFF9F9 + EBFFAAAAD4FF5C5CA68210100C000000000073737100D3D3DAFA1A1AA9FF0000 + AFFF0D0DB8FF3B3BBA864F4F9A296F6F9125D1D1CD77E0E0E0FFE6E6E6FFEAEA + E9FFEDEDE8FFA3A39C0F00000000000000000E0E07004646994900008BFF0000 + A1FF0202AFFF0808B8FF0303BAFF5C5CCEFFF2F2E8FFE5E5E5FFE9E9E9FFEBEB + EBFFCACACA671F1F1F00000000000000000000000000262629004242995A0000 + 8CFF000098FF0000A2FF0000A4FF4545BAFFF7F7EDFFEAEAEAFFE7E7E7FFCACA + CA74444444000000000000000000000000000000000000000000232320005656 + 89151C1C889F000088F7000087FF2B2BA0FFECECE2FCC8C8C8ABAAAAAA233434 + 340000000000000000000000000036363600B7B7B716B3B3B335AFAFAE46ABAB + A54FACACA555A1A1A1569C9C9F7199999E73A1A1A157A0A0A057A1A1A14EACAC + AC49B3B3B339B8B8B81E5E5E5E003E3E3E00ADADAD2CA4A4A45DA4A4A470A4A4 + A47FA4A4A483A5A5A490A5A5A490A5A5A48FA3A3A391A4A4A485A4A4A480A4A4 + A472A4A4A462AAAAAA3B64646400FFFFFF00FFFFFF00AEDBE7109ACFDD2F83C1 + CF3870B3C22760A3B40D46819300508EA0000000000000000000000000000000 + 000000000000000000000000000098CAD7009ACBD814A0D1DD778EC5D4C275B2 + C1CD5E9BADB7487E90652F57660CDF7C58006969690560606004696A6A007171 + 71000000000000000000000000002F7F930173ADBE4E7CB3C4DD75ABBEFF6A9D + B5FF54839CEE3B61757A676E6F2C79777656696867765959596D4C4C4C333E3F + 3F054243430000000000000000005898AB0C5B97AB8772A4BBF89BC3D9FF97BC + DAFF7296B9D75970885580878E8D797F85E8686D71F6545658F3444444B03738 + 3829494A4A002D2D2D00000000004F8DA114518AA09F73A0BBFDA7CBE8FF9FC3 + E5FF799CC1DA6483A16A8AA5C1BC85A0BBFF6C86A0FE4E5B68FF3B3C3DE13534 + 344F00000000303030000000000049819610447A90905785A0F985ACCFFE89AF + D5FE668BADEC527490A288ABCED489ADD2FF6E93B8FE4C6680FF384048E43334 + 3553060000002F2E2E00000000003E6E87033A6C7C50427083D86289AAFE6B91 + B5F64C718CD441627C9A6E92B7D47096BBFF5F85ABFE476A8DFD344B61BE2E34 + 3B30355272002B282400000000007BC49F0D65AC8C61528E7FD9568298FE557C + 98F53F6D68C642736F8A557D9ECB557BA1FE4C7198FF3C6085F02D4C6B6F1B2A + 39081F32440000000000000000007CC1A06875BE9AD569B18FFC699D9DFD6D92 + 9EFD538973F74D9072E3467880E23F6487F7375C82FE2F5377F2445A6E808F79 + 62199C6E4401FFFFFF000000000077BD9CCA73BC99FA6BB791FE78B699FE99BC + A8FE6FA98AFE579C78FC6C9079ED627480F033577AFD415D78FD8B8277E0BA97 + 7598A683633A4332230A0000000067AF8DEA65B08BFE62AF88FF69AF8AFF91B9 + 9DFF71AB8BFF6EA07AFEB6AD88FAA59D93FA748494FD98938DFECBAC8CFECEAA + 86F7B7926FBB906F5140170E0903529A77AD519A76E4509B76F3529975F5699D + 80F55C9676F2859972F5CCAE8BFDCAB7A6FED5C1B2FEDDBC9AFEE2BF9CFED7B6 + 95FFC09C78F7A27E5C8B5E4632133F80602A3F815F5A3D7F5E783D7D5D7F477E + 627D49795B7A9C8F6ABEC8A582FCCDB5A2FEDDBEA4FEE0BA94FFE1BD99FFD6B4 + 91FFC19D78FE9E7B5BBA4D3A2A351C4C3400143625021D4732051F4C35070E45 + 2F064F50380BA4836267B99775DAC8AB94FBD3B091FFD8B28BFFD8B38DFFCEAA + 85FFBE9973FF9D7B5BC74F3D2C4100000000000000000000000000000000523C + 2E00FFFFFF007B624814987C6057B2947EA4BE9C7CCFC4A07CE1C4A07DE5BB97 + 74E1AD8A68CF937356815743311B000000000000000000000000000000000000 + 000000000000816B5D0041372F04816A581E91765B419A7D605B9B7E60649577 + 5A5B8A6D5140765C451746362701FFFFFF00FFFFFF0052525200545454125555 + 554855555560555555672B2B2B66555555675555556055555548545454125252 + 5200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005151511260606067B2B2 + B2BDD7D7D7F1E6E6E6FFABABABFFE6E6E6FFD7D7D7F1B2B2B2BD606060675151 + 5112FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E4E4E4AAEAEAEBEE3E3 + E3FFF7F7F7FFFEFEFEFFB0B0B0FFFEFEFEFFF7F7F7FFE3E3E3FFAEAEAEBE4E4E + 4E4AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4A64D2D2D2F2F5F5 + F5FFFDFDFDFFD9D9D9FFB4B4B4FFD9D9D9FFFDFDFDFFF5F5F5FFD2D2D2F24A4A + 4A64FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646466DD8D8D8FFF8F8 + F8FFFBFBFBFFB6B6B6FFFBFBFBFFB6B6B6FFFBFBFBFFF8F8F8FFD8D8D8FF4646 + 466DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004141416FD6D6D6FFF5F5 + F5FFF9F9F9FFB9B9B9FFF9F9F9FFB9B9B9FFF9F9F9FFF5F5F5FFD6D6D6FF4141 + 416FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002020207E9B9B9BFFA3A3 + A3FFAEAEAEFFB7B7B7FFBBBBBBFFB7B7B7FFAFAFAFFFA4A4A4FF9C9C9CFF2020 + 207EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0037373774DEDEDEFFF0F0 + F0FFF5F5F5FFF6F6F6FFF6F6F6FFF6F6F6FFF5F5F5FFF0F0F0FFDEDEDEFF3737 + 3774FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0031313177D1D1D1FFE3E3 + E3FFECECECFFEFEFEFFFEFEFEFFFEFEFEFFFECECECFFE3E3E3FFD1D1D1FF3131 + 3177FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B2B2B74C9C9C9F9D7D7 + D7FFE3E3E3FFE8E8E8FFE8E8E8FFE8E8E8FFE3E3E3FFD7D7D7FFC9C9C9F92B2B + 2B74FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0022222266B4B4B4E4CCCC + CCFFD5D5D5FFDBDBDBFFDDDDDDFFDBDBDBFFD5D5D5FFCCCCCCFFB4B4B4E42222 + 2266FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001A1A1A45777777B9C5C5 + C5FFC8C8C8FFCCCCCCFFCDCDCDFFCCCCCCFFC8C8C8FFC5C5C5FF777777B91A1A + 1A45FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001414141124242481ABAB + ABE4C2C2C2FFC2C2C2FFC2C2C2FFC2C2C2FFC2C2C2FFABABABE4242424811414 + 1411FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00111111000E0E0E2D2525 + 258A909090D0BDBDBDF5C5C5C5FFBDBDBDF5909090D02525258A0E0E0E2D1111 + 1100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00111111000D0D0D000808 + 081D07070762070707800707078907070780070707620808081D0D0D0D001111 + 1100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0052525200545454125555 + 554855555560555555672B2B2B66555555675555556055555548545454125252 + 5200525252005252520052525200FFFFFF00FFFFFF005151511260606067B2B2 + B2BDD7D7D7F1E6E6E6FFABABABFFE6E6E6FFD7D7D7F1B2B2B2BD606060675151 + 5112515151005151510051515100FFFFFF00FFFFFF004E4E4E4AAEAEAEBEE3E3 + E3FFF7F7F7FFFEFEFEFFB0B0B0FFFEFEFEFFF7F7F7FFE3E3E3FFAEAEAEBE4E4E + 4E4A4E4E4E004E4E4E004E4E4E00FFFFFF00FFFFFF004A4A4A64D2D2D2F2F5F5 + F5FFFDFDFDFFD9D9D9FFB4B4B4FFD9D9D9FFFDFDFDFFF5F5F5FFD2D2D2F24A4A + 4A644A4A4A004A4A4A004A4A4A00FFFFFF00FFFFFF004646466DD8D8D8FFF8F8 + F8FFFBFBFBFFB6B6B6FFFBFBFBFFB6B6B6FFFBFBFBFFF8F8F8FFD8D8D8FF4646 + 466D464646004646460046464600FFFFFF00FFFFFF004141416FD6D6D6FFF5F5 + F5FFF9F9F9FFB9B9B9FFF9F9F9FFB9B9B9FFF9F9F9FFF5F5F5FFD6D6D6FF4141 + 416F414141004141410041414100FFFFFF00FFFFFF002020207E9B9B9BFFA3A3 + A3FFAEAEAEFFB7B7B7FFBBBBBBFFB7B7B7FFAFAFAFFFA4A4A4FF9C9C9CFF2020 + 207E3C3C3C003C3C3C003C3C3C00FFFFFF00FFFFFF0037373774DEDEDEFFF0F0 + F0FFF5F5F5FFF6F6F6FFF6F6F6FFF6F6F6FFF5F5F5FFF0F0F0FFDEDEDEFF3737 + 3774373737003737370037373700FFFFFF00FFFFFF0031313177D1D1D1FFE3E3 + E3FFECECECFFEFEFEFFFEFEFEFFFEFEFEFFFECECECFFE3E3E3FFD1D1D1FF3131 + 31778D68390089633500825D3000FFFFFF00FFFFFF002B2B2B74C9C9C9F9D7D7 + D7FFE3E3E3FFE8E8E8FFE8E8E8FFE8E8E8FFE3E3E3FFD7D7D7FFC9C9C9F9AB78 + 39C9E79C3E5CDF943800D2872E00FFFFFF00FFFFFF0022222266B4B4B4E4CCCC + CCFFD5D5D5FFDBDBDBFFDDDDDDFFDBDBDBFFD5D5D5FFCCCCCCFFB4B4B4E4CE8A + 36E1DF9438CCDE93375CD2872E00FFFFFF00FFFFFF001A1A1A45777777B9C5C5 + C5FFC8C8C8FFCCCCCCFFCDCDCDFFD0A36EFFD0944DFFCF934DFFC6863CF2C780 + 2DDAFFE597FFD2872ECCD0852D5CFFFFFF00FFFFFF001414141124242481ABAB + ABE4C2C2C2FFC2C2C2FFC2C2C2FFC38743FFFFE392FFFFD56AFFFFD15DFFFFD1 + 5DFFFFD15DFFFFD873FFC37923CCFFFFFF00FFFFFF00111111000E0E0E2D2525 + 258A909090D0BDBDBDF5C5C5C5FFBA8D5CFCB0722DF6A4621AE8AE6618D5B56A + 18CCFFC538FFB56A18CCB76C195CFFFFFF00FFFFFF00111111000D0D0D000808 + 081D07070762070707800707078907070780070707620808081DAB611300A75C + 0DCCA75C0DCCA95E0E5CB56A1800FFFFFF00FFFFFF00111111000D0D0D000808 + 08000606060006060600060606000606060006060600080808009D5206009C51 + 06999C51065CA75C0D00B56A1800FFFFFF00FFFFFF000000000000000000B1A7 + 9A82AFA599FFAFA79EFFB17643FFC1926BFFB07C4EFFB27B4B82000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000AEA297E7C2BA + B1FFFBFBFDFFFDFFFFFFAD703CFFECDAC8FFE7D2BDFFCDA885FFB27745E70000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ACA2966EBFB7AEFFFBFB + FBFFFFFFFF00FFFFFF00AC6F3BFFE8D1B7FFE5CEB3FFE7D0B6FFC69970FFB37A + 486FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A89D90E5D4D1CDFFF9F9 + FAFFF9FAFBFFB6A28FFFAE713DFFB88455FFE1C4A0FFE4C7A5FFE1C19DFFAE78 + 4AD3FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A69A8EFFE7E7E7FFF7F7 + F7FFF9F9FBFFACA69EFFEEEBE4FFAF7442FFD7B084FFE3C198FFE5C59CFFB079 + 4BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5998EFFE6E6E6FFF6F7 + F7FFF7F9F9FF9C938CFFD8D1C6FFB07543FFD7AD7CFFE4BE8CFFE6C08EFFBE8C + 5DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A19488FF8D8073FF978A + 7DFFA69A8DFFAFA497FFAD9882FFAE713CFFAD723FFFAD713EFFAF7441FFB379 + 47FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A29489FFDFDFDFFFEDED + EEFFEBEBECFFEAEBECFFEAECEFFFEAEEF2FFEAEFF4FFECF0F5FFDDE1E6FF9F97 + 8FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9186FFD8D9D8FFE1E0 + E0FFE3E2E1FFE2E1E0FFE2E1E1FFE2E2E1FFE3E2E2FFE1E1E1FFD8D9D9FF9E92 + 87FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00988C80E7C6C1BDFFD9D7 + D7FFDEDDDCFFDDDCDBFFDDDCDBFFDDDCDBFFDEDDDCFFD9D7D7FFC6C1BDFF988C + 80E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00897E75A7B9B2ADFFCFCD + CDFFDAD8D7FFDAD7D6FFD9D7D6FFDAD7D6FFDAD8D7FFCFCDCDFFB5AEA8FF897F + 75A7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006A615A4C9E9287FFCCCC + CBFFCECDCBFFD6D4D3FFD7D5D4FFD6D4D3FFCDCBCBFFCCCDCBFF9E9288FF544D + 4739FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000A908379D9B3AC + A7FFC8C7C6FFC5C4C2FFC5C3C1FFC5C4C2FFC8C7C6FFB3ACA7FF908379DA0000 + 0006FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000023201E349486 + 7BFFB0A9A5FFC6C5C4FFC5C4C3FFC6C5C4FFB0A9A5FF94867BFF23201E340000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000021F1D + 1A3D8A7D73CA918379FF9A8F86FF918379FF8A7D73CA1F1D1A3D000000020000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0003000000260000003300000033000000330000002600000003000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000B1A7 + 9A82AFA497FFAFA497FFB2A79AFFAFA497FFAFA497FFB1A79A82000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000AEA297E7C2B9 + B1FFFBFAFBFFFFFFFF00A4978BFFFFFFFF00FBFAFBFFC2B9B1FFAEA297E70000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ACA2966FBFB8AEFFFBFB + FBFFFFFFFF00FFFFFF008B8077FFFFFFFF00FFFFFF00FBFBFBFFBFB7AEFFACA2 + 966EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A79B8ED3D4D1CEFFF7F7 + F8FFFBFDFFFFCAA483FFBC885CFFCAA383FFFBFDFFFFF9F9FAFFD4D1CDFFA89D + 90E5FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A69A8EFFDDDDDAFFF7F7 + F9FFF8FCFFFFAA6D38FFEBD8C2FFAA6D38FFF8FCFFFFF7F7F9FFE7E7E7FFA69A + 8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A4998DFFE6E5E6FFF5F7 + F8FFF6FCFFFFAD703DFFE9C89CFFAD703DFFF6FCFFFFF5F7F8FFE6E5E6FFA599 + 8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ACA297FF8E8074FFA196 + 88FFAAA196FFAD6F39FFAD713DFFAD6F39FFA9A094FF9A8E81FF908275FFA499 + 8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A19488FFDFDEDFFFEDED + EEFFEAECEEFFEAEDF1FFEAEEF3FFEAEDF1FFEBECEEFFEDEDEFFFDFDEDFFFA194 + 89FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9186FFD8D8D8FFE1E0 + E0FFE3E2E1FFE2E2E1FFE2E2E1FFE2E2E1FFE3E2E1FFE1E0E0FFD8D9D8FF9E91 + 86FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00988C80E7C6C1BDFFD9D7 + D7FFDEDDDCFFDDDCDBFFDDDCDBFFDDDCDBFFDEDDDCFFD9D7D7FFC6C1BDFF988C + 80E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00897F75A7B5AEA8FFCFCD + CDFFDAD8D7FFDAD7D6FFD9D7D6FFDAD7D6FFDAD8D7FFCFCDCDFFB9B2ADFF897E + 75A7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00544D47399E9288FFCCCD + CBFFCECDCBFFD6D4D3FFD7D5D4FFD6D4D3FFCDCBCBFFCCCCCBFF9E9288FF544D + 4739FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006908379DAB3AC + A7FFC8C7C6FFC5C4C2FFC5C3C1FFC5C4C2FFC8C7C6FFB3ACA7FF908379DA0000 + 0006FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000023201E349486 + 7BFFB0A9A5FFC6C5C4FFC5C4C3FFC6C5C4FFB0A9A5FF94867BFF23201E340000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000021F1D + 1A3D8A7D73CA918379FF9A8F86FF918379FF8A7D73CA1F1D1A3D000000020000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0003000000260000003300000033000000330000002600000003000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000B27B + 4B82B07C4EFFC1926BFFB17642FFAEA89FFFAFA598FFB1A79A82000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000B27745E7CDA7 + 85FFE7D2BDFFECDAC8FFAC703BFFFFFFFF00FBFBFCFFC2B9B1FFAEA297E70000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B37A486FC99E78FFE7D0 + B6FFE5CDB2FFE8D1B7FFAB6F3AFFFFFFFF00FFFFFF00FBFBFBFFBFB7AEFFACA2 + 966EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AE784AD3E1C09DFFE3C6 + A4FFE4C8A5FFC39368FFAE713CFFC6C2BDFFFCFCFDFFF9F9F9FFD4D1CDFFA89D + 90E5FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B0794BFFE5C49CFFE2C0 + 97FFE4C299FFAE7342FFE0D7CFFF998F84FFFAFAFCFFF7F7F7FFE7E7E7FFA69A + 8EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BE8C5DFFE6C08EFFE4BD + 8BFFE5BF8DFFB07543FFCAC0B5FF8D8176FFF8FAFAFFF6F7F7FFE6E5E6FFA599 + 8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B37947FFAF7441FFAD71 + 3EFFAD713DFFAF703BFFAEA295FFAFA598FFA99E8FFF9A8E81FF908275FFA499 + 8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F978FFFDDE1E6FFECF0 + F5FFEAEFF3FFEAEDF2FFEBECEEFFEBEBECFFEBEBECFFEDEDEEFFDFDEDFFFA194 + 89FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9287FFD8D9D9FFE1E1 + E1FFE3E2E2FFE2E2E1FFE2E1E1FFE2E1E0FFE3E2E1FFE1E0E0FFD8D9D8FF9E91 + 86FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00988C80E7C6C1BDFFD9D7 + D7FFDEDDDCFFDDDCDBFFDDDCDBFFDDDCDBFFDEDDDCFFD9D7D7FFC6C1BDFF988C + 80E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00897F75A7B5AEA8FFCFCD + CDFFDAD8D7FFDAD7D6FFD9D7D6FFDAD7D6FFDAD8D7FFCFCDCDFFB9B2ADFF897E + 75A7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00544D47399E9288FFCCCD + CBFFCECDCBFFD6D4D3FFD7D5D4FFD6D4D3FFCDCBCBFFCCCCCBFF9E9288FF544D + 4739FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000006908379DAB3AC + A7FFC8C7C6FFC5C4C2FFC5C3C1FFC5C4C2FFC8C7C6FFB3ACA7FF908379DA0000 + 0006FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000023201E349486 + 7BFFB0A9A5FFC6C5C4FFC5C4C3FFC6C5C4FFB0A9A5FF94867BFF23201E340000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000021F1D + 1A3D8A7D73CA918379FF9A8F86FF918379FF8A7D73CA1F1D1A3D000000020000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0003000000260000003300000033000000330000002600000003000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BDFFDC003FD0 + 6E08367D395C76411CB1A0300EEB9F3912F899280BD28D0C0280CD8C9027FFFD + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B99182418071 + 30BD62AF52FC9BB556FFD4A148FFD0A64BFFC8983DFFBC7725FF688337E0798C + 5F83EEDADB0CFFFFFF00FFFFFF00FFFFFF00FFFDFF009DAB8E6132A443FC65C4 + 5CFF60ED8AFFC1CC79FFE7C87DFFE4C97EFFD1C270FF9FC867FF57DA6BFF24C8 + 57FF43A35CBCECDADB10FFFFFF00FFFFFF00B7968B3B1CAF4AF92DE872FF59E1 + 7AFFBBC975FFE4D994FFF4EBAFFFF5EAAFFFE1DB96FF99DD87FF6ED26EFF31E3 + 72FF2FC64FFF795D34A8F4E0E400EFCCD3054C8749B904F175FF5EC65AFFCDA0 + 42FFE4BD6EFFF1E4A5FFFCFCCAFFFFFBC7FFDFEEAFFF9BE896FF96C160FF9DA1 + 38FF73B23FFF1FB146FFB1938642955044587C8123FB969C2BFFBD8D25FFD19B + 3DFFDBBC6CFFEDDE9DFFF9F4BDFFF8F6BEFFC6F5B2FF7DF49FFF45EE89FF2EE2 + 73FF28D865FF1FDD60FF5C7442AE762C09BA65A93BFF9C9324FFCB8017FFCE92 + 30FFD9AA53FFE1C77BFFEDD692FFD4E5A0FF8DF9A9FF5EF395FF35ED84FF18EA + 79FF08EA75FF2DD85EFF508334E39C2B02F1AA8415FF8E9929FF51C353FF58CB + 5FFFADAB49FFDBA54CFFDDB25DFFC9BD68FF75E184FF58DE78FF2DE476FF11E9 + 75FF09E671FF00F074FF3E9A45F99B3005FCC57607FF8F9726FF03EC76FF0AEE + 7BFF2AE576FF88B750FFBBA03EFFCC9635FFC09632FFC48A22FF67B748FF03EC + 77FF0BE46EFF1AE065FF7B7724FE962301DABE7208FF9B901EFF0FE26CFF08E9 + 74FF10E875FF0AF07DFF63BE50FFC7821AFFC18319FFC67D10FF999324FF0BE5 + 6FFF01E973FF2ED55AFFAC4B04EF8D0E048AB16709FFC37B09FF819C2BFF0AE4 + 6EFF06E872FF05EA74FF8B9C2DFFC47B0EFFBC7F11FFC2790BFF949223FF06E6 + 6FFF00ED75FF54C045FF9A3406CECA8D9322A03E05E1C1800AFFB57E0FFF18DB + 64FF00F078FF62B03EFFBF7A0BFFBB7C0DFFBA7C0DFFBD7A0CFFB57E0EFF1FD7 + 61FF17E167FFA16E09FFAE4E4376FEFCFD00A7453B76AE5A00FFB78610FF1CD8 + 62FF31CD58FFB57E0FFFBE790AFFBA7B0CFFBA7B0CFFBA7B0CFFBE790AFF9295 + 22FF9C941CFF9A2000E4DCB4B911FFFFFF00ECD5DA0C9F331FB7B36200FF43CB + 50FF859B29FFC47506FFBA7B0CFFBA7B0CFFBA7B0CFFBA7B0CFFBB7F0DFFC27B + 07FFA23300F7C380814DFFFFFF00FFFFFF00FFFFFF00EBD5D90E9F2D24A58C5E + 14FEA98616FFBF800BFFBC800DFFBC800DFFBC810DFFBD810CFFB16500FF9422 + 00E0C27E804CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DAB68F009F30 + 00439A2802AAA14106DEAA5508F7AC5909FDA74C07ED9B3005C9AB4F447ADBB3 + B714FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B67 + D92E5772DBAF5D76DCE3627ADBFF5D76D9FF506BD6E34460D2AF3655D02EFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005873DCAF5E77 + DDFF2748D1FF062DCAFF0028C9FF0028C9FF052CCAFF1E40CDFF415DCFFF3856 + CDAFFFFFFF00FFFFFF00FFFFFF00FFFFFF00D9DFF708637BDEE33C5BD6FF0028 + C9FF0028C9FF0028C9FF1035CCFF1035CCFF0028C9FF0028C9FF0028C9FF2445 + CBFF3653C9E36C7EC608FFFFFF00FFFFFF005873DCAF3C5BD6FF0028C9FF0028 + C9FF506BDAFF0028C9FFDFE4F8FFDFE4F8FF0027C6FF506BDAFF0028C9FF0028 + C9FF1E40C8FF2848C6AFFFFFFF00627BDE355E77DDFF0028C9FF0028C9FF9FAE + EBFFFFFFFF000025B9FFFFFFFF00FFFFFF00001F9CFFFFFFFF009FADE5FF0028 + C9FF0028C9FF2746C4FF2443C235526EDABA2748D1FF0028C9FF506BDAFFFFFF + FF00FFFFFF00001E95FFFFFFFF00FFFFFF00001E95FFFFFFFF00FFFFFF005067 + C4FF0028C9FF0F33C6FF1B3CC1BA647CDDE4062DCAFF0028C9FFAFBCEEFFFFFF + FF006F80C3FF001E95FFDFE4F8FFDFE3F2FF001E95FF6F86E1FFFFFFFF00AFB8 + DEFF0025B9FF022AC8FF1D3EBDE4627ADBFF0028C9FF0028C9FFFFFFFF00FFFF + FF000F2B9BFF0024B2FF0F35CCFF0F2CA2FF001F9CFF0F35CCFFFFFFFF00FFFF + FF000021A5FF0028C9FF193ABAFF5D76D9FF0028C9FF0028C9FFFFFFFF00FFFF + FF00102C9CFF0027C6FF0028C9FF0027C6FF0027C6FF1035CCFFFFFFFF00FFFF + FF00001E95FF0028C9FF1535B8FF5670D7E4052CCAFF0028C9FFBFC9F1FFFFFF + FF006F80C3FF0027C6FF0028C9FF0028C9FF0028C9FF6F86E1FFFFFFFF00BFC7 + E4FF001E95FF0129C8FF0F31B6E4405DD2BA1E40CDFF0028C9FF3F5DD6FFFFFF + FF00FFFFFF007084D4FF1035CCFF1035CCFF7086E1FFFFFFFF00FFFFFF003F56 + AFFF0021A2FF062BC2FF082BB9BA4863D234415DCFFF0028C9FF0028C9FF7F92 + DDFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F8ECAFF001E + 95FF0026BCFF092CB7FF0628B334FFFFFF003856CDAF2445CBFF0028C9FF0028 + C9FF3F59C3FFBFC7E4FFFFFFFF00FFFFFF00BFC7E4FF3F56AFFF001E95FF0023 + AFFF062BBDFF0528B6AFFFFFFF00FFFFFF008090CF083653C9E31E40C8FF0028 + C9FF0028C9FF0026BCFF0021A2FF001E95FF001E95FF0021A2FF0026BCFF062B + BDFF0528B4E303209608FFFFFF00FFFFFF00FFFFFF00FFFFFF002848C6AF2746 + C4FF0F33C6FF022AC8FF0028C9FF0028C9FF0129C8FF062BC2FF092CB7FF0528 + B6AFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001C3D + C32D1D3DC1AF1B3CBEE3193ABAFF1535B8FF0E30B8E3092CB8AF0428B82DFFFF + FF00FFFFFF00FFFFFF00FFFFFF00195CA5EC195CA5B1FFFFFF00CB8F6B68CD94 + 71F5D29C7AFAD7A384F7D29976F9CB8F6CFCD297725DFFFFFF00C98D6A0DC98D + 6A09FFFFFF00FFFFFF00FFFFFF00195CA5CE195CA5FEB28773A8D19571F3EFC2 + A0FFF7E2BFFFF4C8A2FFEDAF88FFFAC299FFD09470F9CA8D6ADECA8E6BFBCB8F + 6C8BFFFFFF00FFFFFF00FFFFFF001A5DA5507D7681FEBF886AFED89E79EDF2B7 + 8EFFF6D3ADFFF7D6B1FFEEB38CFFF4B88FFFF2B991FFCC8D69FFE0A17AFFCC90 + 6CF2C98D6A29FFFFFF00FFFFFF00FFFFFF00847A81D4C18565FFBE8A6EEFEAAF + 87FFF3BD95FFF6D4AEFFF2C49FFFE9A982FFFBC399FFEFB58CFFC68460FFE4A7 + 7FFECC906CCDC98D6A01FFFFFF00FFFFFF00195CA506AA8373F2C58664F8CE93 + 70F3F2B78EFFF4C7A1FFF7D5AFFFEEB48DFFF1B58CFFFBC399FFD3936EFFE0A1 + 7AFFD29671F2CA8E6B5FFFFFFF00FFFFFF00FFFFFF00BC8A6E57C48766F0C78C + 6AF1DBA683FEF2B990FFF6CCA7FFF2C19BFFE9A981FFFAC298FFF4BA91FFD595 + 6FFFEAAD85FFCB8F6CEEC98D6A11FFFFFF00FFFFFF00FFFFFF00C28A6BBFC586 + 63FFBF8A6DFFEFB58DFFF3BD95FFEFBE98FFE2A680FFEAAE85FFFCC39AFFE5A8 + 80FFE5A77FFFDDA07AF8CC906CA4FFFFFF00FFFFFF00FFFFFF00C18C6D23BC87 + 6AF0C08A6CFFA4877FFED59974F2CB906CEECD916ED3CE916DFCEBB088FFEFB4 + 8BFFE2A47CFFDFA27BFCC98D6AFCFFFFFF00FFFFFF00FFFFFF00FFFFFF00C28B + 6CA5C58663FFC68C6BFFBC8A708EC98D6A04FFFFFF00CA8E6B7FCB8F6CCECB8F + 6CE9CB8F6CDACA8E6B96C98D6A37FFFFFF00FFFFFF00FFFFFF00FFFFFF00C18C + 6E08A78274A1416798FF195CA5C6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00195CA5CD195CA5FF195CA53FFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00195CA514195CA5FC195CA5E5FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00195CA5A8195CA5FF195CA574FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001A5DA500195CA5F3195CA5F7195CA508FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001A5DA500195CA57C195CA5FF195CA5AAFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000029000000380000004818589DE9195CA4FE0104082BFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 0018000000180000001200000006000000158D7FDFFFC8C9FFFFD1ABA2FF914A + 49FF884141FFE8E5F8FF5A4ADDFF5647DDFFE8E5F8FF904849FF954A44FF9571 + A5FF948DF2FFEAE6F6FF0000001500000020A06162FFAC9DDDFFDFDDFCFFE7D3 + CDFFB48381FFEDECFAFF8378E6FF8175E6FFEDECFAFFB78581FFB39CC9FFBAB8 + FEFFF3EEF3FFAF7771FF0000002000000023863838FFB17976FF9E88C8FFB2AF + FBFFEDE4E7FFEAE7F8FF6657E0FF6253E0FFEAE7F8FFA490D0FFB2B0FBFFF0E5 + E4FFB3817EFF823838FF0000002300000023E3E1F4FFEAE8F9FFE8E5F8FFE8E5 + F8FFE8E5F8FFE8E5F8FF5749DDFF5545DDFFE8E5F8FFE8E5F8FFE8E5F8FFE8E5 + F8FFEAE8F9FFE3E1F4FF00000023000000234636D2FF5544DCFF4635D9FF4634 + D9FF4634D9FF4533D9FF4736D9FF4635D9FF4634D9FF4736D9FF4634D9FF4634 + D9FF5545DDFF4738D3FF00000023000000233D2DC9FF3320D5FF2511D2FF2511 + D3FF2510D2FF230FD2FF2713D3FF2713D3FF230FD2FF2410D2FF2511D3FF2511 + D2FF3320D5FF3C2CC9FF0000002300000023CDCADEFFE2DFF5FFE1DEF5FFE1DE + F5FFE1DEF5FFE1DEF5FF2814D4FF230FD3FFE1DEF5FFE1DEF5FFE1DEF5FFE1DE + F5FFE2DFF5FFCDCADEFF00000023000000235D0F0FFF822F2BFFE6CFC7FFA2A0 + FDFF765EC8FFE1DEF5FF2712D3FF210DD2FFE1DEF5FFE7D6D4FFA2A1FDFF7257 + C1FF8A3C3AFF610F0FFF0000002300000023773530FFEADDDFFF9090FFFF7755 + B0FF7F2825FFE1DEF5FF2813D4FF220DD3FFE1DEF5FF782120FFDABBB2FFB7B9 + FFFF715DD4FF71353CFF0000002300000023B5AFC3FF7D75F1FF79498CFF7519 + 13FF630E0EFFE1DEF5FF2C19D4FF2714D3FFE1DEF5FF681415FF640E0EFFC694 + 88FFC9C6FBFF574BB8FF000000230000001D5F58C0FF5C418BFF490101FF4901 + 01FF490101FFB3B1C4FF5349ABFF5046AAFFB3B1C4FF490101FF490101FF4901 + 01FF9B7269FF9E9BC9FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 001800000018000000120000000600000015FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000001500000020FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000002000000023FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000002300000023FCFCFCFFFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FCFCFCFF0000002300000023AD6A2FFFBC7D45FFB67236FFB672 + 35FFB67235FFB67235FFB67236FFB67235FFB67235FFB67235FFB67235FFB672 + 35FFBC7D45FFAD6A2FFF0000002300000023A56326FFAE6422FFA95A13FFA95A + 13FFA95A13FFA95A13FFA95A13FFA95A13FFA95A13FFA95A13FFA95A13FFA95A + 13FFAE6422FFA56326FF00000023000000239D591DFFAD601DFFA85811FFA858 + 11FFA85811FFA85811FFA85811FFA85811FFA85811FFA85811FFA85811FFA858 + 11FFAD601DFF9D591DFF0000002300000023221BC4FF2720E1FF1E16DFFF1E16 + DFFF1E16DFFF1E16DFFF1E16DFFF1E16DFFF1E16DFFF1E16DFFF1E16DFFF1E16 + DFFF2720E1FF221BC4FF00000023000000231B15BCFF261EE0FF1F17DFFF1F17 + DFFF1F17DFFF1F17DFFF1F17DFFF1F17DFFF1F17DFFF1F17DFFF1F17DFFF1F17 + DFFF261EE0FF1B15BCFF0000002300000023150FB5FF241DDFFF241DDFFF241D + DFFF241DDFFF241DDFFF241DDFFF241DDFFF241DDFFF241DDFFF241DDFFF241D + DFFF241DDFFF150FB5FF000000230000001D140EB2FF140EB2FF140EB2FF140E + B2FF140EB2FF140EB2FF140EB2FF140EB2FF140EB2FF140EB2FF140EB2FF140E + B2FF140EB2FF140EB2FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 001800000018000000120000000600000015414141FF414141FF414141FF4141 + 41FF414141FF414141FF414141FF414141FF414141FF414141FF414141FF4141 + 41FF414141FF414141FF00000015000000203E3E3EFF717171FF717171FF7171 + 71FF717171FF717171FF717171FF717171FF717171FF717171FF717171FF7272 + 72FF717171FF3E3E3EFF0000002000000023383838FF636363FF505050FF5050 + 50FF505050FF505050FF4F4F4FFF4F4F4FFF505050FF505050FF505050FF5050 + 50FF636363FF383838FF0000002300000023313131FF525252FF3F3F3FFF3F3F + 3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F + 3FFF525252FF313131FF00000023000000233328D9FF493EE4FF3A2FE2FF392E + E2FF392EE2FF392EE2FF3A2FE2FF392EE2FF392EE2FF392EE2FF392EE2FF392E + E2FF493EE4FF3328D9FF00000023000000232A1FD1FF261ADFFF180BDDFF180B + DDFF180BDDFF180BDDFF180BDDFF180BDDFF180BDDFF180BDDFF180BDDFF180B + DDFF261ADFFF2A1FD1FF00000023000000232217C9FF2216DEFF1609DCFF1609 + DCFF1609DCFF1609DCFF1609DCFF1609DCFF1609DCFF1609DCFF1609DCFF1609 + DCFF2216DEFF2217C9FF00000023000000231AC0DAFF1FDCF9FF15DAF9FF15DA + F9FF15DAF9FF15DAF9FF15DAF9FF15DAF9FF15DAF9FF15DAF9FF15DAF9FF15DA + F9FF1FDCF9FF1AC0DAFF000000230000002314B8D2FF1DDBF9FF16DAF9FF16DA + F9FF16DAF9FF16DAF9FF16DAF9FF16DAF9FF16DAF9FF16DAF9FF16DAF9FF16DA + F9FF1DDBF9FF14B8D2FF00000023000000230FB1CBFF1CDBF9FF1CDBF9FF1CDB + F9FF1CDBF9FF1CDBF9FF1CDBF9FF1CDBF9FF1CDBF9FF1CDBF9FF1CDBF9FF1CDB + F9FF1CDBF9FF0FB1CBFF000000230000001D0DAEC7FF0DAEC7FF0DAEC7FF0DAE + C7FF0DAEC7FF0DAEC7FF0DAEC7FF0DAEC7FF0DAEC7FF0DAEC7FF0DAEC7FF0DAE + C7FF0DAEC7FF0DAEC7FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 0018000000180000001200000006000000158D4141FF8D4141FF8D4141FF8D41 + 41FF8D4141FFFFFFFF00FFFFFF00FFFFFF00FFFFFF005747DDFF5747DDFF5747 + DDFF5747DDFF5747DDFF00000015000000208B3E3EFFAA7171FFAA7171FFAA71 + 71FFAA7171FFFFFFFF00FFFFFF00FFFFFF00FFFFFF008175E6FF8175E6FF8276 + E6FF8175E6FF5443DCFF0000002000000023883838FFA26363FF965050FF9650 + 50FF965050FFFFFFFF00FFFFFF00FFFFFF00FFFFFF006355DFFF6355DFFF6355 + DFFF7468E3FF4F3EDBFF0000002300000023823131FF975252FF8C3F3FFF8C3F + 3FFF8C3F3FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF005545DDFF5545DDFF5545 + DDFF6657E0FF4738D7FF00000023000000237B2828FF8C3E3EFF822F2FFF822E + 2EFF822E2EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF004635D9FF4635D9FF4635 + D9FF5545DCFF402FD1FF0000002300000023721F1FFF761A1AFF6D0B0BFF6D0B + 0BFF6D0B0BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF002713D3FF2713D3FF2713 + D3FF3522D6FF3726C9FF0000002300000023691717FF721616FF6B0909FF6B09 + 09FF6B0909FFFFFFFF00FFFFFF00FFFFFF00FFFFFF002511D3FF2511D3FF2511 + D3FF301DD5FF2E1DC1FF0000002300000023620F0FFF701212FF6A0707FF6A07 + 07FF6A0707FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00230FD2FF230FD2FF230E + D2FF2C1AD4FF2616BAFF00000023000000235B0808FF701010FF6B0808FF6B08 + 08FF6B0808FFFFFFFF00FFFFFF00FFFFFF00FFFFFF002410D3FF2410D3FF2410 + D3FF2B18D4FF200FB1FF0000002300000023550202FF6F0E0EFF6F0E0EFF6F0E + 0EFF6F0E0EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF002916D3FF2916D3FF2916 + D3FF2916D3FF1909AAFF000000230000001D520101FF520101FF520101FF5201 + 01FF520101FFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFF1807A7FF1807A7FF1807 + A7FF1807A7FF1807A7FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 0018000000180000001200000006000000154741E6FF4441E5FF4741E6FF4741 + E6FF4741E6FF4741E6FF4741E6FF4741E6FF4741E6FF4741E6FF4741E6FF4741 + E6FF4741E6FF4741E6FF0000001500000020433EE6FF7571EDFF7571EDFF7571 + EDFF7571EDFF7571EDFF7571EDFF7571EDFF7571EDFF7571EDFF7571EDFF7672 + EDFF7571EDFF433EE6FF00000020000000233E38E5FF6863EBFF5550E8FF5550 + E8FF5550E8FF5550E8FF544FE8FF544FE8FF5550E8FF5550E8FF5550E8FF5550 + E8FF6863EBFF3E38E5FF000000230000002338EFFCFF57F4FFFF45F3FFFF4AEC + F8FF4BDCEEFF47F2FBFF45F3FFFF45F3FFFF45F3FFFF45F3FFFF45F3FFFF45F3 + FFFF57F4FFFF38EFFCFF00000023000000232FEAF6FF45F3FFFF36E5F5FF39A4 + E4FF4A83D9FF42C6E7FF34EBF6FF35F2FFFF35F3FFFF35F3FFFF35F3FFFF35F3 + FFFF45F4FFFF2FEBF6FF000000230000002326E2EFFF22F1FFFF38C7F1FF1A60 + CAFF8B75C9FF89B7E7FF21D6F3FF13F0FFFF13F0FFFF13F0FFFF13F0FFFF13F0 + FFFF22F1FFFF26E2EFFF00000023000000231DDAE7FF1DF1FFFF46C4F3FF1E84 + D8FF323DA8FF4B84DEFF31D3F5FF11F0FFFF11F1FFFF11F0FFFF11F0FFFF11F0 + FFFF1DF2FFFF1DDAE7FF000000230000002316D2DFFF19EFFFFF38E6E1FF24D1 + ECFF2BA3E3FF26BEDFFF2DEEEBFF0FEFFFFF0EEFFFFF0EEFFFFF0EEFFFFF0EEF + FFFF1AEFFFFF16D2DFFF00000023000000230E08BCFF1810E0FF1008DFFF0F08 + DFFF1008DFFF1008DFFF1008DFFF1008DFFF0F08DFFF0F08DFFF1008DFFF1008 + DFFF1810E0FF0F08BCFF00000023000000230902B5FF160EDFFF160EDFFF160E + DFFF160EDFFF160EDFFF160EDFFF160EDFFF160EDFFF160EDFFF160EDFFF160E + DFFF160EDFFF0902B5FF000000230000001D0701B2FF0301B1FF0701B2FF0701 + B2FF0701B2FF0701B2FF0701B2FF0701B2FF0701B2FF0701B2FF0701B2FF0701 + B2FF0701B2FF0701B2FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 00180000001800000012000000060000001580AF52FF80AF52FF80AF52FF80AF + 52FF80AF52FFFFFFFF00FFFFFF00FFFFFF00FFFFFF005752E5FF5752E5FF5752 + E5FF5752E5FF5752E5FF00000015000000207DAD4FFFA0C37EFFA0C37EFFA0C3 + 7EFFA0C37EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00817EEBFF817EEBFF827E + ECFF817EEBFF544FE4FF000000200000002379AB4AFF96BD71FF89B55FFF89B5 + 5FFF89B55FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00635FE7FF635FE7FF635F + E7FF7471EAFF4F4AE3FF000000230000002374A643FF8BB562FF7EAD51FF7EAD + 51FF7EAD51FFFFFFFF00FFFFFF00FFFFFF00FFFFFF005551E5FF5551E5FF5551 + E5FF6662E8FF4743E0FF00000023000000236C9F3BFF7EAE50FF74A742FF73A7 + 41FF73A741FFFFFFFF00FFFFFF00FFFFFF00FFFFFF004641E3FF4641E3FF4641 + E3FF5550E5FF403BDAFF0000002300000023659732FF669E2FFF5C9821FF5C98 + 21FF5C9821FFFFFFFF00FFFFFF00FFFFFF00FFFFFF002721DEFF2721DEFF2721 + DEFF352FE0FF3732D2FF00000023000000235B8F29FF629C2BFF5A971FFF5A97 + 1FFF5A971FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00251FDDFF251FDDFF251F + DDFF302BDEFF2E29C9FF0000002300000023538721FF609A26FF59961DFF5996 + 1DFF59961DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00231DDDFF231DDDFF231D + DDFF2C26DFFF2621C2FF00000023000000234C7F1BFF5E9925FF59961EFF5996 + 1EFF59961EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00241EDDFF241EDDFF241E + DDFF2B25DEFF201BBAFF0000002300000023467914FF5D9923FF5D9923FF5D99 + 23FF5D9923FFFFFFFF00FFFFFF00FFFFFF00FFFFFF002923DEFF2923DEFF2923 + DEFF2923DEFF1914B3FF000000230000001D447613FF447613FF447613FF4476 + 13FF447613FFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFF1813B0FF1813B0FF1813 + B0FF1813B0FF1813B0FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 0018000000180000001200000006000000155652E5FF5652E5FF564FE5FF5651 + E5FF5654E5FF5289EDFF5651E5FF5651E5FF5652E5FF5652E5FF5652E5FF5652 + E5FF5652E5FF5652E5FF0000001500000020534FE4FF808DEDFF7EA7F2FF808D + EDFF8180EBFF817EEBFF7EA7F2FF8180EBFF817DEBFF817EEBFF817EEBFF817E + ECFF817EEBFF534FE4FF00000020000000234E46E3FF719EF1FF5BECFBFF5F92 + EFFF635FE7FF635FE7FF625EE7FF625EE7FF635EE7FF635FE7FF635FE7FF635F + E7FF7471EAFF4E4AE3FF0000002300000023473FDFFF6473EAFF5188EDFF5364 + E8FF5549E4FF5551E5FF5188EDFF5555E5FF5550E5FF5551E5FF5551E5FF5551 + E5FF6662E8FF4743E0FF00000023000000233F3BDAFF5553E5FF473CE2FF4641 + E3FF4645E3FF417EEBFF4642E3FF4644E3FF4640E3FF4641E3FF4641E3FF4641 + E3FF5550E5FF3F3BDAFF00000023000000233632D2FF342EE0FF2620DEFF2620 + DEFF2624DEFF2621DEFF2621DEFF2620DEFF2621DEFF2621DEFF2621DEFF2621 + DEFF342FE0FF3632D2FF00000023000000232D29C9FF2F2BDEFF241FDDFF241F + DDFF241FDDFF241ADDFF241FDDFF241FDDFF241FDDFF241FDDFF241FDDFF241F + DDFF2F2BDEFF2D29C9FF00000023000000232621C2FF2B26DFFF221DDDFF221D + DDFF221DDDFF221DDDFF221DDDFF221DDDFF221DDDFF221DDDFF221DDDFF221D + DDFF2B26DFFF2621C2FF00000023000000231F1BBAFF2A25DEFF231EDDFF231E + DDFF231EDDFF231EDDFF231EDDFF231EDDFF231EDDFF231EDDFF231EDDFF231E + DDFF2A25DEFF1F1BBAFF00000023000000231814B3FF2823DEFF2823DEFF2823 + DEFF2823DEFF2823DEFF2823DEFF2823DEFF2823DEFF2823DEFF2823DEFF2823 + DEFF2823DEFF1814B3FF000000230000001D1713B0FF1713B0FF1713B0FF1713 + B0FF1713B0FF1713B0FF1713B0FF1713B0FF1713B0FF1713B0FF1713B0FF1713 + B0FF1713B0FF1713B0FF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000060000001200000018000000180000 + 0018000000180000001800000018000000180000001800000018000000180000 + 001800000018000000120000000600000015FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000001500000020FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000002000000023FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FCFCFEFFBAB7F5FF817AECFF7F78ECFFB3B0F4FFF9F9FEFFFFFFFF00FFFF + FF00FFFFFF00FFFFFF000000002300000023FCFCFCFFFFFFFF00FFFFFF00FFFF + FF009591EFFF3F3FE1FF403FE2FF413FE2FF3F3FE1FF8984EDFFFFFFFF00FFFF + FF00FFFFFF00FCFCFCFF0000002300000023F6F6F6FFFFFFFF00FFFFFF00DEDC + FAFF3833E2FF372EE2FF3A2FE2FF392EE2FF382EE2FF322EE1FFD2D0F8FFFFFF + FF00FFFFFF00F6F6F6FF0000002300000023EFEFEFFFFFFFFF00FFFFFF00BBBA + F4FF0D0BDBFF180BDDFF180BDDFF180BDDFF180BDDFF0B0BDBFFA9A8F3FFFFFF + FF00FFFFFF00EFEFEFFF0000002300000023E7E7E7FFFFFFFF00FFFFFF00D6D5 + F9FF130DDCFF1309DCFF1609DCFF1609DCFF1409DCFF0D09DBFFC8C6F7FFFFFF + FF00FFFFFF00E7E7E7FF0000002300000023DFDFDFFFFFFFFF00FFFFFF00FFFF + FF007169EAFF0707D9FF0907DAFF0A07DAFF0707D9FF6059E8FFFFFFFF00FFFF + FF00FFFFFF00DFDFDFFF0000002300000023D7D7D7FFFFFFFF00FFFFFF00FFFF + FF00F9F9FEFF9690EFFF463DE3FF443AE3FF8C86EEFFF5F4FDFFFFFFFF00FFFF + FF00FFFFFF00D7D7D7FF0000002300000023D0D0D0FFFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00D0D0D0FF000000230000001DCCCCCCFFCCCCCCFFCCCCCCFFCCCC + CCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCC + CCFFCCCCCCFFCCCCCCFF0000001D0000000F0000002A00000037000000370000 + 0037000000370000003700000037000000370000003700000037000000370000 + 0037000000370000002A0000000F00000003000000090000000C0000000C0000 + 000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 + 000C0000000C0000000900000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0DFFA00A0DFFA00A0DFFA00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001184D0BD2F97D9C8A0DFFA00FFFF + FF00FFFFFF00FFFFFF000000D8240000D87E0000D8A20000D8CC0000D8F90000 + D8FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000000C4FF0000C4FF0000D2BA0000 + D2ED0000D2DE0000D2FF0000D6FF0000DDFF0101D3FF0101C6FF0202B7FF0000 + D2FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00107DCAFF4CA6DEFF0000CA5A0101 + C0FF0202C1FF0101D7FF0000EDFF0000E8FF0101D4FF0101C3FF0202B6FF0000 + CAFFFFFFFF00FFFFFF00FFFFFF00FFFFFF000F79C6FF4BA3DCFF0000C1210000 + BFFF0202C0FF0101D7FF0000EDFF0000E8FF0101D4FF0101C3FF0202B6FF0000 + C1FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000E74C2FF4BA0D9FF0000B7060000 + B7FF0202C0FF0101D7FF0000EDFF0000E8FF0101D4FF0101C3FF0202B6FF0000 + B7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000C6FBEFF4A9ED7FF0000AE1B0000 + AEFF0202C0FF0101D7FF0000EDFF0000E8FF0101D4FF0101C3FF0202B5FF0000 + AEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF000B69BAFF499AD5FF0000A4450101 + A7FF0202C0FF0101D7FF0000EDFF0000D5FF0000B3FF0000A4FF0000A4EA0000 + A4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000A64B5FF4897D2FF00009B840101 + A5FF0101B1FF0000B1FF0000A5FF00009BB700009B4EFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000C4FF0000C4FF000093C30000 + 93CC000093990000935D0000931EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000759ADFF3884C6FFA0DFFA00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000654A9FF2671BAFFA0DFFA00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000550A5FF145DADFF000000030000 + 0003000000030000000200000002000000020000000100000001000000010000 + 000000000000FFFFFF00FFFFFF00FFFFFF00044CA1B8064B9CC00000002C0000 + 002B0000002800000025000000200000001B00000016000000110000000C0000 + 000400000000FFFFFF00FFFFFF00FFFFFF0000000003000000180000002B0000 + 002C0000002A00000027000000230000001E00000019000000130000000E0000 + 000500000000FFFFFF00FFFFFF00FFFFFF000000000000000001000000030000 + 0003000000030000000300000003000000020000000200000002000000010000 + 000000000000FFFFFF00FFFFFF000000000000000000B1212000B9262517B524 + 2346A41D1D30961818129A1A1908952C4C035742C2015E58DE00322BEB000000 + 00000000000000000000000000000000000000000000AA222005B2282655AD27 + 26C3A02423B79C222081A224225E9A4165417162D0307771EA20665EF612433C + F10A231CDF0200000000000000008E2221008E1B1A009C22211D9F2625A5982A + 28F4942928FA992B29F1A83431E69F628FDC8C83E0D48882F0C9756EF7AB5E58 + EE7A433ED63D2521B6100F0B9D0164589D008E424B0691353757862827E37823 + 21FD7F2624FE942E2CFFA83C3FFF997CBEFF9D98EBFF9E99F6FE8E89F7FD7672 + E9F56360D1D24845B47E3331A025625FAF006B58931A7A5272A2602F35FA3512 + 12FE4A1716FF742625FF904553FF9185C6FF9994E2FF948FEEFF8A86EFFF7F7C + E1FE6D6AC8FC6360B5D85451A3588481C5087F7CBB55625E98DD2A243CFE0704 + 07FF0A0303FF1C0B0BFF34232BFF524F67FF656484FF6C6A93FF706E9DFF7877 + AEFF6E6CB4FE6462ADD75D5B9D4B7976CF2A6F6CC3A94B49A3F715145DFF0404 + 2BFF020215FF070711FF17171EFF34343AFF44444AFF3F3F45FF2D2D33FF2828 + 2FFF3F3F4FFD525174C445446F344540CC515956C8D83A38AAFD11108EFF0D0C + 7CFF0E0D6CFF191968FF2D2D71FF484781FF515185FF41416CFF202031FF0A0A + 0BFF080808FD121214D20E0E114612267C2417389F92152AA4F1111797FF1114 + 98FF1A1AA3FF3130BAFF4948CEFF6260E2FF6664ECFF5453EAFF3332CCFF1615 + 83FF050531FE01010CD10000034221ACDA241CA0DEA3157AD2F61252BDFF1541 + B5FF2340BBFF3E51CEFF5563DFFF6873EFFF656EF8FF4F56F5FF2F32E1FF1A1A + C2FF0F0F91FC090956B705052E2A26C4E9541FBAEBD6179FE6FC158EE1FE1D93 + DFFF31A4E4FE4DBAECFE63CBF2FF6FD5F8FF65CBFAFE49A2F4FE295FE0FF172B + C1FF1214A6F8111090940E0E71171FA3BE451AA3CAA1169DDAD3189AE0EA25A9 + E4F23DC2EAF758DAF0F86BE9F5F86FF6FAFA60F5FAFC42E3F6FE25B7ECFE167B + D6FE123FB6F1111F976B0F11780A1056640E0F647C2B1276A34F1683B8782494 + BF9739A6C2AE4EB8C8B85DC8D0BA62DCDFC152DEE6D437D4EBEC1FBCECFB159F + E6FD1481D7E51358B0460E26730301090B0003151B01072E3F050E49640E1651 + 661C1D4E5A2D214B513C254E51442A60614E266D73681E8297971695C6D21397 + DEF21490DCC6137EC2290C446F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000104042203161B40083B536D0E6A + A0A1127FC284137BBA150D507700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000010A101C0733 + 4E310E5783291164950500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000524A4A6D504B4AEB473A + 36E1493F3CE64B47444300000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004A4441FF403230FF5059 + 5EFF413B39FF3B2F2AC4000000000000000000000000524B4C2C524C4B4D504A + 48424D484629000000000000000000000000000000002F1D15FF3E3732FFB1FF + FFFFA1E2EAFF352413D4000000000000000055432F074F4B48FF483C39FF3F32 + 30FF3F312CFF433D3B3D00000000000000000000000093CCE3FF97FAFFFF81E2 + FFFF87F9FFFF458AC5A400000000000000003B4760683A1D03FF44474CFF93D1 + D8FF536268FF2F201C9E0000000000000000000000007ACBFFFD3CC8FFFF32C3 + FFFF3DCCFFFF2562C9E61438A9DD1A43AECC1A40A6F3405B81FFA3EDF1FFB3FF + FFFFAAFDFFFF352A1C7E000000000000000039A544255BA8D0E54BAAFFFF2991 + FFFF257BE0FF0E2993FF3666B6FF2656A8FF0A258CFF2558B8FF63DBFFFF47CA + FFFF51DFFFFF024CD0470000000029892C1F84D69AFF57E4A2FF29BB96FF33C2 + A0FF1C8583FF2D4CAAFFCDFFFFFF9BE4F6FF1A3B8EFF0E2E8CFF1CA5FFFF1BBA + FFFF1591FDFF000000000000000062A366B66BEAB0FF26D170FF3AD873FF40EF + 6FFF22A373FF5172BBFFB0FFFFFF7DE2FFFF7DF3FFFF204292FF65A5DFFF3E8B + E6FFBEA88DFFFFCF45EAEDA9350871C582FF43E77EFF3EDA70FF42D874FF47EB + 74FF1B656AFF21388DFF52D7FFFF31C7FFFF3DCAFFFF001754FFB39061FFFFE1 + 62FFFFD66DFFEFCA75FFD8973D96398439B931AA46FF3DB557FF40C654FF41D2 + 30FF041965FB213793FF47A6F3FF208AEBFF1B69D6FF000080FF7F684FFFFFCC + 4AFFE5B455FFEFC45CFFD8993EF9000000002254172823500936286B1C2F0613 + 9F4B5E5AE3FE6A90FFFF50C1FDFF5ACBEAFF4AB0FAFF2B4CFFFF5139CCFFFFB8 + 11FFE6AA33FFE7AB34FFD1892CFF000000000000000000000000000000001700 + FF656A86FFFF2644F9FF3E6EFAFF7DD7FFFF365FFAFF3457FAFF0320FFFF8E4A + 3FD4CA6F03B7AE5E1BB4AC591C4600000000000000000000000000000000322F + D7BD475DFFFF192FFDFF1D2CFBFF121AFAFF2030FDFF243AFEFF1232FFFF2A11 + A682000000000000000000000000000000000000000000000000000000001410 + C0802020E5FF1113E8FF1617EBFF1717EEFF1617EAFF1517E8FF1214DEFC0000 + CD6A000000000000000000000000000000000000000000000000000000000902 + B52F0B06B9CB0B08C4D00D0AD4CF0E0AD9CF0C09CBD00B08C6CB0B06B6920402 + C315000000000000000000000000000000000000000000000000000000000000 + 000000000000A4A4A4FF434343FF505050FFBEBEBEFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000828282FF2B2B2BFF535353FF4C4C4CFF2F2F2FFFABABABFF000000000000 + 0000000000000000000000000000000000000000000000000000000000008484 + 84FF2A2A2AFF969696FFFCFCFCFFF5F5F5FF797979FF2E2E2EFFACACACFF0000 + 0000000000000000000000000000000000000000000000000000898989FF2A2A + 2AFF9E9E9EFFFFFFFFFF919191FFACACACFFFAFAFAFF6B6B6BFF333333FFB5B5 + B5FF0000000000000000000000000000000000000000848484FF2A2A2AFFA6A6 + A6FFFEFEFEFF858585FF303030FF313131FFDEDEDEFFABABABFF2D2D2DFF3737 + 37FFACACACFF000000000000000000000000848484FF292929FF9E9E9EFFFFFF + FFFF828282FF323232FF343434FF888888FFFDFDFDFF777777FF424242FF4848 + 48FF2F2F2FFFACACACFF00000000A0A0A0FF2C2C2CFF989898FFFFFFFFFF8585 + 85FF323232FF333333FF828282FFFFFFFFFF919191FF797979FFEFEFEFFFF1F1 + F1FF767676FF303030FFBBBBBBFF434343FF545454FFFFFFFFFF969696FF3030 + 30FF333333FF818181FFFFFFFFFF969696FF797979FFFFFFFFFFACACACFFB5B5 + B5FFFFFFFFFF555555FF4F4F4FFF626262FF444444FFF4F4F4FFB4B4B4FF3030 + 30FF878787FFFFFFFFFF989898FF474747FFFAFAFAFF9E9E9EFF313131FF3535 + 35FFA5A5A5FF737373FF363636FFCBCBCBFF303030FF727272FFFFFFFFFFC9C9 + C9FFF8F8F8FF9E9E9EFF303030FF505050FFFDFDFDFF939393FF343434FF3E3E + 3EFF3C3C3CFF3B3B3BFF5D5D5DFF00000000B0B0B0FF2D2D2DFF747474FFFFFF + FFFFD6D6D6FF323232FF3C3C3CFF383838FF939393FFFAFAFAFF6C6C6CFF3939 + 39FF383838FF464646FFD6D6D6FF0000000000000000AFAFAFFF2F2F2FFF7D7D + 7DFFF9F9F9FFA5A5A5FF383838FF343434FF4F4F4FFFFEFEFEFF8B8B8BFF2F2F + 2FFF4A4A4AFFD1D1D1FF00000000000000000000000000000000B9B9B9FF2E2E + 2EFF767676FFFFFFFFFFAEAEAEFF4D4D4DFFDBDBDBFFE1E1E1FF454545FF4848 + 48FFD9D9D9FF000000000000000000000000000000000000000000000000AFAF + AFFF2C2C2CFF777777FFF7F7F7FFF9F9F9FFE0E0E0FF4C4C4CFF424242FFD9D9 + D9FF000000000000000000000000000000000000000000000000000000000000 + 0000AFAFAFFF303030FF545454FF727272FF424242FF3F3F3FFFD0D0D0FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000B8B8B8FF4A4A4AFF363636FF5F5F5FFFD6D6D6FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D6A663FFCE9642FFCE96 + 42FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE96 + 42FFD6A663FF00000000000000000000000000000000E7C79CFFCE9A4AFFCE96 + 42FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9A + 4AFFE7C79CFF0000000000000000000000000000000000000000DEAE73FFCE96 + 42FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFDEAE + 73FF00000000000000000000000000000000000000000000000000000000D6A2 + 5AFFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFCE9642FFD6A25AFF0000 + 000000000000000000000000000000000000000000000000000000000000E7C7 + 9CFFCE964AFFCE9642FFCE9642FFCE9642FFCE9642FFCE964AFFE7C79CFF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000D6AA6BFFCE9642FFCE9642FFCE9642FFCE9642FFD6AA6BFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000CE9A52FFCE9642FFCE9642FFCE9A4AFF00000000000000000000 + 00000000000000000000000000000000000000000000E7CBA5FF000000000000 + 000000000000E7C394FFCE9642FFCE9642FFE7C394FF00000000000000000000 + 0000E7CBA5FF00000000000000000000000000000000D69E52FF000000000000 + 00000000000000000000D6AE73FFDEAE73FF0000000000000000000000000000 + 0000CE9A52FF00000000000000000000000000000000CE9642FFD6AA6BFF0000 + 000000000000000000000000000000000000000000000000000000000000D6AA + 6BFFCE9642FF00000000000000000000000000000000CE964AFFCE9642FFE7BE + 8CFF000000000000000000000000000000000000000000000000E7BE8CFFCE96 + 42FFCE964AFF00000000000000000000000000000000DEBA84FFD6AA6BFFDEAE + 73FF000000000000000000000000000000000000000000000000DEAE73FFD6AA + 6BFFDEBA84FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B37306FFB3781AFFB378 + 18FFB37818FFB37818FFB37818FFB37818FFB57919FFAF7819FFAC7317FFA76D + 0DFFA86A00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009A6919FFFFC96FFFFDC0 + 66FFFFC268FFFFC268FFFFC168FFFFC369FFFABD66FFE5B061FFE4AC63FFD598 + 39FF6D4500FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009C6A17FFFFC266FFF9B9 + 5FFFFBBB60FFFABA60FFFCBC61FFF5B75FFFDDA455FFDBA052FFDFA75DFFD195 + 36FF734900FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009C6A18FFFFC368FFFABA + 61FFFBBC62FFFEBE63FFF7B860FFDEA657FFDDA456FFDEA557FFDFA658FFD295 + 33FF714800FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009C6A18FFFFC368FFFABA + 60FFFEBD63FFF7B961FFDEA557FFDDA456FFDEA659FFDCA14EFFDB9D42FFCF90 + 2AFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009C6918FFFFC268FFFCBC + 62FFF7B861FFDEA557FFDDA456FFDFA759FFDCA24EFFD89A3EFFDB9E45FFCF90 + 2BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF009C6A18FFFFC66AFFF5B6 + 5EFFDEA657FFDDA456FFDFA659FFDCA24FFFD99B40FFD89B41FFDB9E45FFCF90 + 2BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00986717FFF5B863FFDEA5 + 56FFDDA456FFDEA659FFDCA24FFFD99B3FFFD99C41FFD89B40FFDB9E45FFCF90 + 2BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00946314FFE0A759FFDCA2 + 54FFDEA558FFDBA14DFFD89A3EFFD89B40FFD89B40FFD79A3FFFD99D44FFCF90 + 2BFF714902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00966517FFE7AE63FFDFA7 + 5CFFDDA453FFDA9D44FFDB9E46FFDB9E45FFDB9E45FFDA9D44FFDDA049FFCF91 + 2DFF724902FFFFFFFF00FFFFFF00FFFFFF00FFFFFF008F5E0DFFD89A3AFFD194 + 35FFCF902BFFCF912CFFCF902BFFCF902BFFCF902BFFCF902AFFCF902DFFCE8D + 21FF704804FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00A36700FF6D4500FF7249 + 00FF714902FF714902FF714902FF714902FF714902FF714902FF724902FF6F48 + 04FF9E6502FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00 } end object pmTileList: TPopupMenu - left = 184 - top = 128 + Images = ImageList1 + left = 232 + top = 168 object mnuAddToRandom: TMenuItem - Caption = 'Add to random pool' + Caption = 'Добавить Тайл в набор' OnClick = btnAddRandomClick end end object ApplicationProperties1: TApplicationProperties OnIdle = ApplicationProperties1Idle OnShowHint = ApplicationProperties1ShowHint - left = 295 + left = 232 top = 33 end object pmTools: TPopupMenu Images = ImageList1 - left = 328 - top = 33 + left = 544 + top = 88 object mnuSelect: TMenuItem Action = acSelect + Caption = 'Выбор тайлов' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000007C7C - 7CFF787878FF757575FF000000000000FF00FF00000000000000000000000000 + 7CFF787878FF757575FF00000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000AAAA - AAFFDBDBDBFF797979FF000000000000FF00FF00000000000000000000000000 + AAFFDBDBDBFF797979FF00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000888888FFDBDB - DBFFB7B7B7FF7D7D7DFF000000000000FF00FF00000000000000000000000000 + DBFFB7B7B7FF7D7D7DFF00000000000000000000000000000000000000000000 000000000000000000009C9C9CFF000000000000000000000000ADADADFFF2F2 - F2FF848484FF00000000000000000000FF00FF00000000000000000000000000 + F2FF848484FF0000000000000000000000000000000000000000000000000000 00000000000000000000A0A0A0FF9C9C9CFF00000000949494FFD9D9D9FFC1C1 - C1FF898989FF00000000000000000000FF00FF00000000000000000000000000 + C1FF898989FF0000000000000000000000000000000000000000000000000000 00000000000000000000A4A4A4FFD7D7D7FF9D9D9DFFD0D0D0FFEEEEEEFF9191 - 91FF0000000000000000000000000000FF00FF00000000000000000000000000 + 91FF000000000000000000000000000000000000000000000000000000000000 00000000000000000000A9A9A9FFF2F2F2FFE5E5E5FFE2E2E2FFE3E3E3FF9595 - 95FF919191FF8D8D8DFF898989FF868686FFFF00000000000000000000000000 + 95FF919191FF8D8D8DFF898989FF868686FF0000000000000000000000000000 00000000000000000000ADADADFFEEEEEEFFE1E1E1FFDFDFDFFFE0E0E0FFE7E7 - E7FFE4E4E4FFBBBBBBFF8E8E8EFF0000FF00FF00000000000000000000000000 + E7FFE4E4E4FFBBBBBBFF8E8E8EFF000000000000000000000000000000000000 00000000000000000000B1B1B1FFF0F0F0FFE4E4E4FFE2E2E2FFE2E2E2FFE7E7 - E7FFC1C1C1FF969696FF000000000000FF00FF00000000000000000000000000 + E7FFC1C1C1FF969696FF00000000000000000000000000000000000000000000 00000000000000000000B5B5B5FFF2F2F2FFE8E8E8FFE7E7E7FFEAEAEAFFC6C6 - C6FF9E9E9EFF00000000000000000000FF00FF00000000000000000000000000 + C6FF9E9E9EFF0000000000000000000000000000000000000000000000000000 00000000000000000000B9B9B9FFF4F4F4FFECECECFFEDEDEDFFCBCBCBFFA7A7 - A7FF0000000000000000000000000000FF00FF00000000000000000000000000 + A7FF000000000000000000000000000000000000000000000000000000000000 00000000000000000000BDBDBDFFF7F7F7FFEFEFEFFFD0D0D0FFAFAFAFFF0000 - 00000000000000000000000000000000FF00FF00000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000C1C1C1FFF7F7F7FFD5D5D5FFB6B6B6FF000000000000 - 00000000000000000000000000000000FF00FF00000000000000FFFFFF00FFFF - FF00FFFFFF00FFFFFF00C4C4C4FFD9D9D9FFBEBEBEFFFFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000000000000008000000DB87 - 4100DB874100DB874100C8C8C8FFC5C5C5FF0000000000000000000000000000 - 000000000000000000000000000000000000EFFFFF00FFFFFF00F0A3E30008E9 - 120000000000000000000851A500F52E74000000000040000000F8040600AC04 - 0600000000000000000000000000C00406000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000C4C4C4FFD9D9D9FFBEBEBEFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000C8C8C8FFC5C5C5FF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 } GroupIndex = 1 RadioItem = True OnClick = acSelectExecute end - object mnuDraw: TMenuItem - Action = acDraw + object mnuSelection: TMenuItem + Action = acSelection + Caption = 'Выделение' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000FF00FF00000000000000000000001340 - 58FF15425EFF25699CFF2C76B4FF3B8BBAFF0000000000000000000000000000 - 00000000000000000000000000000000FF00FF00000000000000000000001242 - 59FF5D9CD4FFA6CFF5FFA9CFECFF488BC1FF2C76B4FF00000000000000000000 - 00000000000000000000000000000000FF00FF00000000000000000000001E6D - 93FFCBE3F9FF61AAECFF4098E8FF1567C2FF1660AAFF2C76B4FF000000000000 - 00000000000000000000000000000000FF00FF00000000000000000000001E6D - 93FFC8E1F2FFD1E7FAFF347DB5FF3199C3FF6DC4DCFF4A9CCFFF3483C7FF0000 - 00000000000000000000000000000000FF00FF00000000000000000000000000 - 00002689B9FFB0CBE1FF67A9C8FF60DCF5FF44D6F4FF8EEEFAFF5DB4E6FF3B8F - D9FF0000000000000000000000000000FF00FF00000000000000000000000000 - 0000000000002689B9FFBEE6F2FFB3F4FCFF60DCF5FF44D6F4FF8EEEFAFF5DB4 - E6FF3B8FD9FF00000000000000000000FF00FF00000000000000000000000000 - 000000000000000000002790BFFFC3EDF8FFB3F4FCFF60DCF5FF44D6F4FF8EEE - FAFF5DB4E6FF3B8FD9FF000000000000FF00FF00000000000000000000000000 - 00000000000000000000000000002FBAE4FFC3EDF8FFB3F4FCFF60DCF5FF44D6 - F4FF8EEEFAFF5DB4E6FF3B8FD9FF0000FF00FF00000000000000000000000000 - 0000000000000000000000000000000000002FBAE4FFC3EDF8FFB3F4FCFF60DC - F5FF44D6F4FF8EEEFAFF5DB4E6FF3B8FD9FFFF00000000000000000000000000 - 000000000000000000000000000000000000000000002FBAE4FFC3EDF8FFB3F4 - FCFF68D9F5FF6FCFF3FF599DD0FF73ABDDFF4F91C9FF00000000000000000000 - 00000000000000000000000000000000000000000000000000002FBAE4FFC3ED - F8FFA8E2F8FF6CAEDDFFA5CFF4FFA5CFF4FFBDDBF7FF5393CBFF000000000000 - 0000000000000000000000000000000000000000000000000000000000002FBA - E4FFA7D4F4FFC5E1F8FFCCE3F9FFCCE3F9FFBDDBF7FF4F90C9FFFFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF0050A8D9FF6AA5D8FFC9E1F7FFCBE3F8FF4295CAFF3182C2FF08000000FF33 - 3300FF333300FF333300FF333300FFFFFF000000000000000000000000000000 - 0000000000004FAADBFF5093CAFF4E90C8FF2F9DD2FFFFFFFF00F0A3E3007804 - 060000000000000000000851A5001E9B7000000000004000000028E62400DCE5 - 2400000000000000000000000000F0E524000000000000000000 + 00000101013C0A0A0A3000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000838383FF000000007A7B7BFF0000 + 0000656666FF686868DB515252FF00000000797979FF00000000000000000000 + 000000000000000000000000000000000000FFFFFFFFE4E4E4FFE7E7E7FFF0F0 + F0FF8B8B8BFFA1A1A1FF9C9C9CFF8D8D8DFFFFFFFFFF00000000000000000000 + 00000000000000000000010101018A8A8AFFD0D0D0FFD1BCA4FFCCB9A2FFAF9F + 8DFF939291FFEEEDEDFF989795FFBDAA95FFFFFFFFFF888989FF000000000000 + 000000000000000000000101010500000000585858FF7B7165FFBEAC96FF857C + 72FFC6C6C6FFC2C2C2FF7F766AFFF1D9BAFFFDFDFDFF00000000000000008787 + 88FF00000000808081FF000000007F8081FF5B5B5BFFA9A9A9FF504B45FF8A88 + 86FFF9F9F9FF928F8CFFA89884FFDFC7A9FFF4F4F4FF8A8A8BFF00000000EEEF + F0FFFFFFFFFFE5E8ECFFFAFAFAFFE5E8EDFF838383FFF6F6F6FFDEDDDDFFE0DF + DFFFC3C3C3FF6A6054FFCCB599FFC3AC8EFFF1F1F1FF3F3F3F518B8B8CFFFFFF + FFFFF0D0A6FFEFD2AAFFEACDA6FFEFD2ABFF756E64FFF6F6F6FFFEFEFEFFFEFE + FEFFE3E3E3FF706F6EFF676058FF847C73FFD8D8D8FF8A8A8BFF00000000FFFF + FFFFEDCDA2FFEDCFA8FFE8CBA5FFEDD0A9FF766F65FFF7F7F7FFFEFEFEFFFCFC + FCFFFEFEFEFFE3E2E2FF767676FFAC9577FFFFFFFFFF000000008A8B8CFFF1F1 + F1FFD3B38BFFCEB28DFFC9AE8BFFE7C8A0FF756D63FFF7F7F7FFFEFEFEFFFEFE + FEFFECECECFF848382FFA18B6BFFEAC594FFFCFCFCFF8A8B8CFF00000000FAFA + FAFFC6A87EFFBFA37EFFBCA27FFFCDB18AFF6F685FFFF4F4F4FFFEFEFDFFECEC + ECFF858585FFADADADFFFFFFFFFFFAFAFAFFFFFFFFFF000000008E8F90FF8888 + 88FF71604AFF6D5E49FF5C503FFFA9906DFF71695EFFF8F8F8FFEFEFEFFF8686 + 86FF565758FF000000007A7A7BFF00000000868687FF00000000545454475656 + 57FF4A4949FF383837FF292A2AFF887355FF7A7063FFE5E5E5FF878684FFADAD + ADFF000000000202020600000000000000000000000000000000949495FF6767 + 68FF5E5D5BFF4E4B49FF3D3D3CFF8F7650FF5B5143FF7A7A7AFF9C7E54FFFFFF + FFFF858586FF0000000000000000000000000000000000000000F4F4F4198383 + 83FF757576FF626262FF565455FFB6B6B6FF646464FFABABABFFFFFFFFFFFCFC + FCFF000000000000000000000000000000000000000000000000F7F7F7199D9D + 9DFF8D8D8DFD777777FF6E6F6EFF5E5E5EFF0000000079797AFF010101018686 + 87FF000000000000000000000000000000000000000000000000 + } + GroupIndex = 1 + RadioItem = True + OnClick = acSelectionExecute + end + object mnuDraw: TMenuItem + Action = acDraw + Caption = 'Рисование тайлов' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00DAE2 + E700EAEEEF00D4CDCB02C8C5C807CAC8C808CAC9C80CCACBC90DCCCCCB0ACCCD + C906C6C6C603DBDBDB01FFFFFF00FEFEFE00FFFFFF00FFFFFF00FFFFFF00718C + 9C23426A8055253134142D24190A2B261E1E26221B311B1C16381F1E1530211F + 162515150F1736363608E2E2E200FFFFFF00FDFDFD00FFFFFF00FFFFFF0089A3 + B012003250DE426F82E40D4055932D546731CED2D309E4E3E206DFDFDD09DFDE + DE06E2E3E005D5D5D502ECECEC00FFFFFF00FEFEFE00FFFFFF00FDFDFE02FFFF + FF00467085A27FAEC2FF69ACC8FC3B7591FF044060A58BA6B30CFFFFFF00FEFE + FE01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCFDFD01FFFF + FF002B59703F3C7C97FEBDEEF6FC6CB4D2FD0F5379FF003250B0859EAB07FFFF + FF00F7F8F902FDFDFD00FEFEFE00FFFFFF00FFFFFF00FFFFFF00FEFEFE01FFFF + FF00CDD5DA111C5371E37CC1DFFF3A9CD0FD197BB0FB195A7DFF003251AF86A0 + AE0AFFFFFF00FAFCFC02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFFFF00FFFF + FF00FDFEFE00476D82641D5D82FB74BCE3FF399ED4FD1A7CB1FA18597CFF0033 + 52AF839DAB07FFFFFF00FCFDFD02FEFFFF00FFFFFF00FFFFFF00FFFFFF00FEFE + FE00FFFFFF00FAFBFC00456D816E1E6082FD76BDE3FE399ED4FE197CB1FD175A + 7CFF003150AB87A1AE06FFFFFF00F8FAFA01FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FEFEFE00FBFCFC03FFFFFF00446C81701E5F82FA75BCE3FF389ED4FE1A7D + B2FB18597CFF003250AB86A0AD09FFFFFF00FBFCFC02FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FDFDFD01FFFFFF00FAFBFC00446B816F1F6083FB76BDE3FF389E + D4FC1B7DB2FB16597CFF003150AA849DAB03FFFFFF00FDFDFE01FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FEFEFE00FDFDFD03FCFDFE00446D826E1E6083FC77BE + E3FE309BD5FE2E88B7FD607DA0FF013655A786A1AC06FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FDFEFE01FDFDFE03FFFFFF00446B81702160 + 83FA79BADFFF8CB2BBFD958DCEFA1C3AC3FF00325094BECCD300FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFDFE01FFFFFF00FAFBFC00406B + 816E47708CFDE1D9E0FE9E9EF1FC3F3CFFFD0E30A7FC426F773AFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFEFE00FCFCFD03FFFF + FF00456F857046709CFCE1E0FFFFA9A4FFFA2F4AB9FF194D5D47FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFDFE01FFFF + FF00FCFDFD0044708365366489EA6E8EB3FF00325590B9C8CE08FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFE + FE01FFFFFF00EAEEF100A7BBC326325C703FBCCBD109EBEFF100 } GroupIndex = 1 RadioItem = True @@ -2314,41 +6649,42 @@ object frmMain: TfrmMain end object mnuMove: TMenuItem Action = acMove + Caption = 'Перемещение' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 200000000000000400006400000064000000000000000000000053A85AFF51A6 - 58FF4FA356FF4EA154FF4C9F52FFA8AAAC00A5A7AA00A3A6A800A7A9AC00AEAF - B100ABADB000429046FF418E45FF408D43FF3F8B42FF3E8A41FF54AB5CFF83BF - 89FF7DBB83FF54A65BFFB2B4B500B0B2B300B7B8BA00B1B3B500ACAFB100AAAC - AF00A8AAAC00A5A7AA00429046FF6DAD71FF6EAE73FF3F8C42FF56AD5FFF83C0 - 8AFF73B77AFF6CB473FF50A457FFA9ACAE00A7AAAB00ACAFB100B3B5B600B2B4 - B500B0B2B300459449FF5AA05EFF5EA664FF6CAD70FF408D44FF58B061FF57AE - 5FFF6CB673FF84C08AFF6EB574FF50A457FFBEBFC100B2B5B600AFB2B300ADAF - B10048994DFF5DA561FF75B379FF5FA463FF47944CFF418F45FF5AB363FFB9BC - BD0057AE5FFF6CB673FF6AB471FF52A759FFB3B5B700BABDBE00B8BABC00B6B8 - B9004A9B4FFF5FA764FF62A867FF45954AFFB2B4B600439147FFB8BABC00C2C4 - C500BFC1C20057AE5FFF55AC5DFFC9CBCC00B9BCBD00B5B8BA00B2B4B600AFB1 - B300ABAEB0004A9C50FF48994EFFB8BABC00B6B8B900BEC0C200C0C1C300BABC - BE00B7B9BB00B3B5B700AFB2B400B8BABC00C2C4C500BFC1C200BDBEBF00C4C5 - C600CED0D100C0C1C300BABCBE00B7B9BB00B3B5B700AFB2B400CACBCC00C7C9 - CB00C4C6C700CBCCCD00CED0D100C0C1C300BABCBE00B7B9BB00B3B5B700AFB2 - B400B8BABC00C2C4C500BFC1C200BDBEBF00C4C5C600CED0D100C1C3C500BEC0 - C200B9BBBD00B4B7B900BFC1C300CACBCC00C7C9CB00C4C6C700CBCCCD00D5D5 - D600C7C8CA00C1C3C500BEC0C200B9BBBD00B4B7B900BFC1C300CCCFD000CBCD - CD00D0D1D200D5D5D600C7C8CA00C1C3C500BEC0C200B9BBBD00B4B7B900BFC1 - C300CACBCC00C7C9CB00C4C6C700CBCCCD00D5D5D600C7C8CA00C2C4C500BEC0 - C100B9BBBC0060BB6AFF5EB968FFCCCFD000CBCDCD00D0D1D200DADBDC00CCCF - D000C7CACB0053A95BFF52A759FFB9BBBC00C5C7C900D0D1D10065C370FFD5D6 - D70063BF6DFF80C989FF79C482FF5FB969FFBEC0C100B9BBBC00C5C7C900D0D1 - D10057AE5FFF6EB875FF6CB573FF52A759FFCCCFD0004EA255FF66C472FF6BC5 - 75FF83CC8CFF9BD3A4FF7BC784FF60BC6BFFD5D6D700E1E1E200D4D5D600CDCF - D10059B161FF75BD7DFF8CC793FF6DB673FF52A759FF50A557FF67C673FF9DD6 - A5FF92D19BFF7ECA87FF63C06EFFC2C5C700BEC0C100CBCCCE00D8D9D900D4D7 - D800D1D4D40059B162FF76BD7EFF7EC086FF8AC590FF52A85AFF68C774FFA1D8 - A9FF9ED6A7FF65C371FFD8DADA00D9DBDC00E5E6E700D9DBDC00D4D5D700CDD0 - D100C7C9CB00C2C5C6005FB467FF8DC894FF8EC995FF54AA5CFF68C774FF68C7 - 74FF67C673FF66C572FF65C371FFC2C5C600D0D2D300DEE0E000DADCDD00D8DA - DA00D9DBDC005CB666FF5BB464FF59B262FF58AF60FF56AD5EFF + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000000000000000000000000000000000000A060301020100040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000100001E0100001B542C1181140B03340000 + 0000010000170000000000000000000000000000000000000000000000000000 + 00000000000000000000010101330000000049260E9FC08656FF714322C90500 + 0044000001350100002500000000000000000000000000000000000000000000 + 00000101001302020025000000004F2D149CC28A5BFFBF8A5BF8CA9262FF7648 + 27C9040100420001002B02010019000000000000000000000000000000000201 + 01030101000900000000000000008A5128EAA2673AFFA96F40FD9E6539FBA464 + 35FF170B0344000000000101000E020101090000000000000000010000000000 + 0000130A0404160903320D08041B000000003B1B0985C0804CFF66391BC20100 + 00110A06031214090333160A0411040302000000000000000000000000001A0D + 0400844A2173B3713FFF3118085E00000000391C0974CA8C59FF673C1EB80000 + 00000D05001B9E6033FF9D5E31B03519070300000000010100011E1007008348 + 207BBB8456FFB27A4CFF6E3C1AD0643B1FAC76421ED8C28C5EFF8A542DEB643A + 1DB166381ABF9F663AFBC18D60FF99592CB0381E0C0D000000006D39163AAD71 + 43EDC49163FCAA7142FCB97B49FFCC8B57FFC58B5CFFC59569FFC38C5FFFCD8D + 59FFC0804DFFA96F40FEBF895AF8B88255FF84471D6E140B0500090503006533 + 123EB37749F1BB8051FF4E250AA32F190A5C55280BB3C48B5CFF75421ED83117 + 07663B1B0681A2673AFFC0885AFF81441B761C0F060000000000000000000804 + 02006637163F92572CFF2C180A56000000003A1E0B73C98A56FF693E1FB80000 + 00000D060218824D26F97E47207A1B0E05000000000001010100010100000201 + 0003000101010000000003020106251408484F250AA6B97B49FF6F3D19D02914 + 06560D0804170000000000010101010100030201010000000000000000000101 + 000000000000010101000000000093572CE6BB8051FFAB7142FCB27A4DF9B471 + 3FFF170A012C0000000002010103010100000000000000000000000000000000 + 00000000000001000002000000006737173DB27849F1C49164FDBA8456FF864B + 22730F0803000000000001010000000000000000000000000000000000000000 + 0000000000000100000000000000060402006634123DAE7043F882482078190D + 0400000000000101000000000000000000000000000000000000000000000000 + 0000000000000000000001000000000000000A0603006B37153D231308080000 + 0000010100000000000000000000000000000000000000000000 } GroupIndex = 1 RadioItem = True @@ -2356,41 +6692,42 @@ object frmMain: TfrmMain end object mnuElevate: TMenuItem Action = acElevate + Caption = 'Изменение высоты' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 20000000000000040000640000006400000000000000000000000000BD0000A5 - 9C00001A420000B5A00013C0F80028FC0000B3A50A00C9800000FC000000F800 - 0000EC5506003A9F0000B3A50A00C9800000FC000000F80016004BDB0000FC00 - 0000F80027000000280000000000FE1E0000286E2DFF256929FF216425FF1E60 - 22FF0028FC000028FC000000280000002800000028000028FC00000028000000 - 28000028FC000027F3000EFC0E00000000002D7533FF74BD7AFF72BD78FF2265 - 26FF4BDB0000FC000000F80000006500000000000000FE1E0000130000000000 - 0000FE0000002CF30000FC000000F8002800337D39FF79C07EFF76BF7CFF266B - 2BFFFC0000000FFE1F0000004C000028FC000028FC00000028000028FC000028 - FC000000280000002800000028000028FC0039853FFF7DC282FF7AC180FF2B72 - 30FF002CF80028FC0000FE0000002CF30000FC000000F80011004CDB0000FF10 - 0000F20023000000000000000000FE1E00003F8D46FF81C587FF7EC385FF317A - 36FF15000000FE1E00004CDB0000FC00000026FD000000002B00FC00000028FC - 0000000028000028FC000028FF000000280045954CFF85C78CFF82C689FF3682 - 3DFF0BFB1D000039DF000EFE1C000049F80028FC0000FE1E000014C2F80028FC - 0000B2A80A00CB7F0000FF810300C60010004A9E53FF8ACA91FF87C98EFF3C8A - 43FFFF810300C60028000000280095060800B2A80A00CB7F000065E2BA0013AC - F10090040000FC00000028FC00000000280050A659FF8ECC95FF8BCB93FF4292 - 4AFF830380000028FC000487C10000A2AC000CB3890000B4A300000B9A00F09D - 08000016B600D86AF80028FC000013ACF10056AD5FFF93CF9AFF90CE98FF489A - 50FF0000000013ACF10090040000FC6AEA003C00E600F4F45900000000000000 - 2800000000000000060000000000000000005BB465FF96D29FFF94D09CFF5DAC - 65FFB728FC00E2BA280068E9E1006EE9E4000028FC000031F100000000000028 - FC000283CF000000000065C371FF62BF6EFF79C683FF9AD4A3FF98D3A1FF7DC3 - 86FF4FA458FF4A9E53FFED5706003E9F00000000000000000000CA5A00000000 - 000000000000000000000000280066C472FF7CCA87FF9ED6A7FF9CD4A5FF73C0 - 7DFF55AC5EFF000028000026FC00000000000006000000000000000000000000 - 000000000000000000000028FF00F5CE350066C572FF7ECA88FF7BC885FF5DB8 - 68FF00000000000000000000000000000000000000003CBBF000000000000000 - 0000000000000000000000000000000000000000000067C673FF65C270FF0000 - 00000000000000000000FC00000028FC000000002800000EFC00E8A3E300802E - 6400000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000026F000000000000000000000 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000130A052D4A25 + 0D964421099D45220A9145220A8B45220A8B45220A8B45220A8B46240D8B4421 + 0A8B45220A8B45220A8B45220A8B45220A8A45220A8D48260F731F0A005CC491 + 6DFFE4C3A7FBDEB797FFE0BA9AFFE0BA9AFFE0B99AFFE0BB9CFFDBB290FFE1BC + 9EFFDFB999FFE0BA9AFFE0BA9AFFDFB897FFE5C2A5FFA86E45FF17060045B387 + 65EDE8D1BBFCDDBEA0F9DEBFA2FADEBFA1FAE2C4A7FAC39B7AFACCAF95FADCBA + 99FADFC2A3FADDBEA0FADDBC9EFAE1C4A6F9DCC3ABFC935D37E21B0E05338C51 + 27DCDBBEA6FFDBB895FDD8B290FFDCB794FFBF8F67FFC6AB97FFE4E1DEFFD4B6 + 9BFFD3A77FFFDAB491FFD6AE89FFE0BF9EFDBF987BFF8142178F130C06246934 + 10ACC7A386FFDCB896FED7AE88FFC5966FFFD0BCACFFE3DFDAFFD1BEAFFFE2DF + DDFFD7BDA5FFD3A77DFFD4AA83FFDDB996FCAD7F5DFF87441569000000004020 + 0C729B6742F7DCBA9AFFD0A175FEAD7E59FFC7AF9DFFD7CBC0FFDCD4CEFFDACA + BCFFD5BCA7FFC99A70FFD5A87DFED2B191FF965F38EF592F1237000000001F0F + 044D895129EBD8AE87FFCD9C70FEC49367FFB57946FFD8C3AFFFDFD6CCFFD5B5 + 97FFC38A55FFCE9F72FFD1A275FBC59A73FF8B4C22B325140903000000000703 + 0040814D28E4CB9667FFB17849FEB88152FFB87E4EFFC9A789FFCBAE94FFBE90 + 69FFB47A4AFFB67D4DFFB88050FBBD8A5EFF904C1EA529170B00020101210000 + 0000794926E0CB9565FFAD7242FDB37948FFA86733FFCFB59FFFDBCDC2FFC19A + 78FFAA6A35FFB17849FFB27849FAC69061FF61341592060402000201011D0000 + 00007A4926E1CA9464FFA96C3BFDA1693EFF9E663CFFD0BEAFFFE6E4E2FFC7A8 + 8FFFAB7347FFAC7243FFAE7444FACC9362FF47250E8C00000000020101170000 + 00007A4927E0C99363FFA56635FDA16940FFE0DBD6FFDDD4CDFFCEBBAAFFE4E1 + DEFFD4C3B4FFA46634FFAB7041FACB9262FF48260F8D00000000020101140000 + 00007A4A27E0C89161FFA56837FDA46532FFA0673CFFDACFC5FFE3DED9FFD1BC + AAFFA1602DFFA86A39FFA86C3DFACB9261FF47250F8D00000000020101120000 + 00007A4A28E0C58C5CFF995827FDA26333FF9A5623FF9B633BFFC7B19FFF9A57 + 25FFA05F2DFF9F5F2FFF9F6030FACA905FFF47260F8C000000000201010A0000 + 0000794926DED39E6EFFB98153FDBC8556FFBE8758FFB88051FFB37949FFBD86 + 56FFBD8656FFBB8455FFBC8759FAD19968FF46240E8C00000000020100030000 + 0000713F1CD8A2673AFF9E673CFD9F673CFF9E663CFF9F683DFFA0693FFF9F67 + 3CFF9F673CFF9F673CFF9D673CFAA46436FF4827108B00000000 } GroupIndex = 1 RadioItem = True @@ -2398,41 +6735,42 @@ object frmMain: TfrmMain end object mnuDelete: TMenuItem Action = acDelete + Caption = 'Удаление' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 20000000000000040000640000006400000000000000000000000FFE1F000000 - 4C000028FC000028FC000000280000002800000028000009F100A06131FFB676 - 3FFFA46534FF0DFD1E0000000000FE1E00004BDB0000FF0600002CF30000FC00 - 0000F8002800000028000028FC000011FF00000000009F5E2FFFE7B263FFBF92 - 4FFFDDAB62FFA26232FF0028FC000000240000000000F30028001E000000DB00 - 280026FD0000C79751FFD8A65AFFA66C36FF00002800A86835FFD1A057FF0000 - 9D008E6A36FFB4753FFF0000000024FE000000000000FE00000000000000FE1E - 0000B58244FFD6A45AFFAE8241FFECB666FFA76E36FFAC6C37FFC49551FF0000 - 0E001E000000B77840FF100031000028FC000028FF0000000E000028FF000608 - 0000BE8A4AFFA87E41FF28FC0000966E32FFE7B066FFCAA274FFE5B167FF945E - 2DFFB88D4DFFAF703BFF0C00D500000EFD00000000000EFD1F000F04380000AD - AD009C6A32FFD6A55EFFCB7F0000FC000000E4AD60FFDCBD9BFFEFCDA5FFEFB7 - 67FFD8A65DFF00000000A80A16007F002800810384000028FC006AEAE30000E6 - FF00F459FC00B17E42FFDCAA60FFD09E54FFEAB365FFD8BA99FFF8EBE1FFAE89 - 57FF06082800850380008303800000000100592AFA000000AD00AF80B0000000 - 1000EFF09F000010A4009D6932FFB17E42FF9E682CFFBC9767FFF0E0D0FFB691 - 5FFF00E6FF00F431CD000000000000000000ACF1EC0004002800000000000000 - 0000000000000028FC00000000000006000000000000B68F59FFF5E9DDFFE2CD - B4FFB99461FFB728FC00E2BA280068E9E1006EE9E40000000000000000000000 - 0000F6DC510000000000000000000000000000000000B28A54FFF1E2D3FFCFB3 - 8EFFF5E9DCFF000000000028FC0000004200570602009F000000BBF0F4005A00 - 00000000000000000000000000000028FC0000000000AF8750FFEDDECEFF0000 - 2800CEB38FFFE7D6C3FF0026FC00000000000006000000000000000000000000 - 00000000000000000000C3EC0600000000000000000000000000E6D4C0FF0000 - 000000000000D3B999FFD3B897FF000000000028FC0000000000000000000000 - 0000000000000000000000000000000000000000000000000000DEC8AEFF0000 - 00000000000000002800D1B693FFBB9767FF000EFC000000000000007800F407 - 0000000000000000000000000000000000000000000000000000D5BC9DFF0000 - 0000000000000000000000000000AE854CFF0000000000000000080000000000 - 0000000000000000000000000000FFFFFF000000000000000000CBAE87FF0000 - 0000000000000000000000000000000000000000000000000000E8A3E3000022 - 780000000000000000000851A500E3AF75000000000078000000A77B3EFFA4F0 - 9D00000000000000000000000000B8F09D000000000000000000 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000004849493E7B7D7DBFA2A4A4F06C6E6EB22D2D2D2C000000000000 + 0000000000000000000000000000000000000000000000000000000000000F0F + 0F0B5D5E5E69878888FFBFC1C1FFD7D7D7FFB9BBBBFF747575C80D122C310101 + 0309000000000000000000000000000000000000000000000000404040216A6B + 6BCDA2A4A4F7BABBBBFFD4D5D5FFEFF0F0FFB8B9B9FFABADADFE283688E6242F + 758B000000000000000000000000000000000000000000000000868888D0AEB0 + B0FEBABCBCFEE0E1E1FDF8F8F9FDF5F5F6FCF7F8F8FCBEC0C7FC5361AEFC3242 + 9DFC26337EA91D255D3100000000000000000000000000000000C7C9C9FCB8B9 + B9FBF1F2F2FAF7F8F8FAF6F6F7F9F3F4F5F9E6E7EEF94D5AA6F83F52AFF9394B + B0F9394AACF8283584E81A22563903050C060000000000000000B4B5B5F8F6F7 + F7F7FBFBFBF6FAFAFAF5F9F9F9F5969DC7F44B59AAF480A7DBF486CBEDF493B2 + E2F4455BBEF43A4CB1F42C3B91E326317B860000000000000000A6A7A753BFC0 + C0CFEEEFEFF2DCDEEBF07C85BCF04159AEF07DBDE8EF52AFE3EF44A4E0EF60BA + E7EF8CBDE8EF556DC4EF394AAEF031409CF0273380A7171E4D1D00000000A3A4 + A408A7A9ABB0354298EC4E71C6EB5CB6E6EB46A6E0EA45A5E0EA46A7E0EA45A6 + E0EA49A8E1EA71BEE8EA536DC6EB3748AAEB3546A8EC29368795000000000000 + 0000A3A4A40643559F794B83C8E647A5DFE549AAE3E54CAEE4E54DB0E5E44DAF + E5E44BADE4E449AAE3E55EB5E4E55E8DD5E63A4CAEE73343A5BA000000000000 + 0000000000002D3A92042D3A91663F6AB6D257B4E6DF5DBDEBDE5DBEECDE5DBE + ECDE5ABCEADF57B8E9DF52B5E7DF57B5E5E075ACDFE1394AA79B000000000000 + 00000000000000000000000000002F3E96253B57A5A98DC7EAD8BDE9F9D8B1E5 + F8D89FDFF6D988D6F3D973CDF0DA5192D0DB364FA0AC394AA522000000000000 + 0000000000000000000000000000000000002D3A92043B52A66D72A0D1D1C1EB + F9D2B8E8FAD280BFE4D2496EB7B73241995C0000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002D3A91243B55 + A9BA537FC0C22F3E936C2D3A9201000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000002C39 + 91042C3990110000000000000000000000000000000000000000 } GroupIndex = 1 RadioItem = True @@ -2440,135 +6778,314 @@ object frmMain: TfrmMain end object mnuSetHue: TMenuItem Action = acHue + Caption = 'Цвет статики' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 000000000000000000000000000000000000FF00000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001D65A0FF1A639EFF1761 - 9BFF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000256BA6FF87AEE1FF7FA9DCFF6093 - C9FF3173ACFF15609AFF0000000000000000FF00000000000000000000000000 - 00000000000000000000000000002D70ADFF6E9ED1FF9ABDEBFF72A1E3FF97BA - EAFF95B9EAFF6194CAFF16609AFF000000000000000000000000000000000000 - 00000000000000000000000000003274B1FF9EC0ECFF6A9DE2FF5C94DFFF5992 - DFFF6095E0FF96B9EAFF87AEE1FF4A84BCFF145F99FF00000000000000000000 - 0000427FBDFF3F7DBAFF3B7AB8FF77A5D7FFA2C3EDFFA0C1EDFF9EC0EDFF75A4 - E4FF5B93DFFF5991DEFF7CA8E6FF93B7E8FF4480B8FF000000004F88C7FF6598 - CFFF7CA9D9FF8EB5E2FFA4C5EDFFA8C7EEFF6598CDFF3576B3FF6094C9FFA0C1 - EDFF7997A4FF9F9749FF7D9592FF8EB4E9FF7AA6D8FF19629DFF538BCBFFAFCD - F0FFB1CFF0FF99C0ECFF7FAFE7FFABCAEFFF3E7CB9FF000000003677B4FFA3C4 - EDFFA99832FFC5B65BFFAD9827FF5C94DFFF99BCEBFF1D65A0FF588ECEFFA9C9 - EDFF85A8EDFF596BEDFF6B8FE9FFAECDF0FF6E9ED2FF3F7DBAFF689ACEFFA6C6 - EEFF969B6AFFAE9827FF9E984EFF679CE2FF99BCEAFF2268A3FF5C91D1FF93BA - E5FF6F75F6FF8285F5FF4141F0FF91BCEBFFAFCDF0FFADCCF0FFABCAF0FF86B3 - E9FF5FAAC2FF45B48EFF57A9B7FF71A2E4FF98BBE8FF266BA7FF000000005D92 - D2FF93A5F5FF5A5BF6FF5287F4FF3CA7FBFF5DACF2FF7FB0E7FF7CAEE7FF79AB - E6FF40B781FF61C898FF3CB87BFF7EADE7FF90B6E3FF2B6FABFF000000006194 - D5FF87B0E1FFBAD7F3FF33A7FEFF6DC0FFFF2CA4FFFF67BFF0FF3BCEFBFF5BBF - F1FF53B4A1FF3CB87AFF48B491FFA8C8EEFF78A6D6FF3072AFFFFFFFFF00FFFF - FF006295D6FF86AFE1FF5BB3F9FF2CA4FFFF41AAFBFF31D3FEFF6DE2FFFF2CD5 - FFFF80B1E8FF7DAEE7FFAACAEFFFA6C6EDFF3878B6FF00000000FFFFFF00FFFF - FF00FFFFFF00FFFFFF006094D5FF8FB7E3FFBAD7F3FF5ED5FBFF2BD5FFFF42D1 - FBFFB4D2F2FFB2D0F1FF93B9E2FF6396CCFF3E7CB9FFFFFFFF0008000000888A - 8C00888A8C00888A8C00888A8C006194D5FF77A4DCFF92B9E4FFA9CAECFFA6C7 - ECFF8EB6E2FF699BD2FF4A84C3FF00000000EFFFFF00FFFFFF00E8A3E30070F0 - 9D0000000000000000000851A500D7AD7500000000005F93D4FF5C91D1FF598F - CFFF558DCCFF000000000000000020B45F000000000000000000 + 2000000000000004000064000000640000000000000000000000EE886600EE88 + 6600EE886600EE886600EE886600DF7957FF57404FE40D264644161616001616 + 160001198A00034AAE000462C0000462C0000462BF000462BF00847F9000847F + 9000847F9000847F9000847F90004D75A0CF5B9FD2FF163657A21818182D1616 + 1600000078000000780001198A0002319C0002319C0002319C001975BA001975 + BA001975BA001975BA001975BA001975BA432F597B96C7D4E0FF2525257C1818 + 182D0000780000007800000078000000780000007800000078000E61A9000E61 + A9000E61A9000E60A6001975BA001975BA004E4E4E264444446FF2F2F2FF1C1C + 3C9000007A480000780000007800000078000000780000007800024D9800024D + 9800024D9800024A9200014588000D5C9F004F4F4F004E4E4E26333358863A3A + C2FF000083CC00007A4800007800000078000000780000007800024D9800024D + 9800024D9800024A920001458800004283000040810028486800282876430000 + 96CC4E4ED6FF000083CC00007A3B000078000000780000007800024D9800024D + 9800024D9800024B954F01478D97014487B4004283B100418199003088490000 + 9D48000096CC4E4ED6FF000083C400007D1A00007D0000007D00034C9700024E + 9C00024E9C00024E9BA678B1DEE693C7EFFB8CC0EAF572A9D7E82C69A4CA0032 + 8A8C0112963F000096C51F1FAADF000083A900007D0B00007D0003478C000348 + 8E00024A9300024A93955693C8DA8CBFECFF90C4EEFF95C8F1FF94C8F0FF2668 + A7C201468B8C0112962A000096970D0D98D40000838F00007D0203478C000347 + 8C0003488E0003498F1A02488DB99BCEF4FF87BDE7F17FB6E2EC7BB3E0EA90C3 + EDFF276DB0BE024C9695011399190000967A03038FCE0000847003478C6E0347 + 8CBA03478CBD03478CBD2A6AA7CE96C9F1FF12589CBC3070AC0012589CBC90C3 + EEFF88BBE8FF266FB6BC0251A09201159A000000955700008DCB034F9BA686BB + E8F58EC1EDFF8BBFEBFB86BAE8FD87BAE8FF4F8ABFE0105191CA4F8ABFE087BA + E8FF979694FFA67340FF596067CE335A82000000960000008F00045EB87B5FA1 + DDCB82B6E5FE7DB0E1FF7DB0E1FF7DB0E1FF83B6E6FF8ABDEAFF83B6E6FF7DB0 + E1FFC69360FFF0BD8AFFB27F4CFFAF7C4900583E700000008F000462BF1E0662 + BE7C3E8AD3B47FB6E8EE516ACFFF1F1FB6FF4861C7FF4DA1C3FF1D93A4FF489C + BEFFAFAFACFED7A471FF8583819558728D0058728D00011797000462BF000462 + BF0C0462C05A106AC38B3E3ED7FF7676F4FF2A2AC2FF33AABBFF75DEEFFF239A + ABFF317FCAAD055EB676035CB40C035BB200035BB200035BB2000462BF000462 + BF000462C0010462C0163858DD924F4FE8FF2A51D1C22894C5C640B7C8FF238F + BEAD045FBA41035EB80B035CB400035BB200035BB2003E50D900 } GroupIndex = 1 RadioItem = True OnClick = acHueExecute end + object mnuFill: TMenuItem + Action = acFill + Caption = 'Заливка' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F42 + D9780000000000000000000000007171710170707036707070B7717171D57070 + 7080707070227171710300000000000000000000000000000000FFFFFF001F42 + D9E9000000000000000074747403737373357C7B7CBA979697FFA09FA0FF8888 + 88FF7B7B7BC37575755D73737315747474010000000000000000FFFFFF001F42 + D9E90000000077777704777777357E7E7EB9949494FFA1A1A1FF8B8B8BFF8585 + 85FF919090FF878787FF7B7B7B8C7676761C7777770100000000FFFFFF001F42 + D9E97B7B7B037B7B7B35818181B8949494FF9F9F9FFF8A898AFF807F80FF8988 + 8AFFA0A0A1FFB5B5B5FF979797FF8080808C7B7B7B1500000000FFFFFF001F42 + D8EA80808035868686B9979797FFA0A0A0FF898A89FF808080FF888788FF9A9B + 9BFFB2B2B3FFC9C9CAFFD0D0D0FFA4A4A4FF8585855F7D7D7D03FFFFFF002143 + D7F2838698B9A9A9A9FFA8A8A8FF8C8C8CFF808080FF888888FF9B9B9BFFB0B0 + B0FFC6C6C7FFDADADBFFEBEBEBFFE7E6E7FF9F9F9FC38585852EFFFFFF002545 + D5FA596CC1FF929FD5FFA3A7BAFF969596FF89898AFF949495FFA9AAAAFFC1C2 + C2FFD8D7D7FFE9E9EAFFF4F4F4FFF3F2F3FFC7C7C7FF888888A0FFFFFF00314E + CBE51F42D9FF3050DAFF6F83D9FFAEB2C2FFAAAAABFF89898BFF8C8D8DFFACAD + ADFFD6D6D6FFF0F0F0FFF1F2F1FFEFEFEFFFEAEAEAFF8E8E8EECFFFFFF00465C + BE843A56CDFF3B59DBFF4A64D6FF929DCFFFB7BBCBFFB3B3B5FFAEAEAEFFBBBB + BAFFB4B5B5FFB7B7B7FFD9DAD9FFECEBECFFCACACAFF919191BDFFFFFF004E62 + BA246474B7C37A8BD1FF7C8CD4FF8A95C1FFA2A6B9FFD1D1D3FFECEDEDFFE8E8 + E8FFD0D0D0FFBAB9BAFFA3A3A3FFAFAFAFFFA0A0A0BA90909036FFFFFF003954 + C804767FAB3D9299B5C4A6AECDFFA3A8BDFF9A9CA1FFA8A8A9FFDBDBDBFFEEEE + EDFFEAEAE9FFE5E5E6FFACACACFF7B7B7BE47272726471717103FFFFFF000000 + 0000707BAA059497A33AA9AAB1C1B6B7BBFF9F9FA0FF898989FFADADADFFE2E2 + E2FFECECECFFCBCCCBFFA8A9A9B87B7B7B455555558555555505FFFFFF000000 + 00000000000099999904A1A1A139AAAAAAC0A9A9A9FF8B8B8BFF808080FFC6C5 + C6FFD0D0D0FFABABABB99E9E9E3561616115555555A255555506FFFFFF000000 + 000000000000000000009C9C9C03A1A1A134A3A3A3B7A1A1A1FF8E8E8EFFADAD + ADFFA7A7A7CF6C6C6C8A565656855555557F5555553C55555502FFFFFF000000 + 00000000000000000000000000009F9F9F01A1A1A115A1A1A15FA0A0A0B3A1A1 + A194A1A1A12A6464640455555504555555045555550200000000 + } + GroupIndex = 1 + RadioItem = True + OnClick = acFillExecute + end + object mnuSurfElevate: TMenuItem + Action = acSurfElevate + Caption = 'Редактирование меша' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 000000000000256929C4206324CA000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002D7533CF488F4DFF458C4AFF226526D10000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003C8A43063883 + 3ED9519957FF79C07EFF76BF7CFF468D4BFF236627DB20622306000000000000 + 000000000000000000000000000000000000000000000000000042924AB83D8C + 45F765AD6CFF7DC282FF7AC180FF4B9250FF276C2CF929602EEA4E4A50AA5859 + 5CCD55545BD25D6061C8504E54C2414248B03B41434A40414402000000004394 + 4B384E9A55FF81C587FF7EC385FF317A36FF646363FE8D8E8DFFC7BEC0FFD0CF + CFFFBFC4BFFFA4A5A2FF999A98FF8D8E8DFF646363FE3B3D3FDF000000000000 + 000045954CFF85C78CFF82C689FF36823DFF62635FFF79777BFFD7CFD1FFDFE2 + DEFFD1CDCEFFABAFAEFF969494FF79777BFF62635FFF777579FF000000000000 + 00004A9E53FF8ACA91FF87C98EFF3C8A43FF898886FF696B68FFB9B6B8FFD1CF + CFFFC2C2C2FFA0A09FFF8A8B8BFF696B68FF898886FF888789FF000000000000 + 000050A659FF8ECC95FF8BCB93FF42924AFFA3A7A6FF8E8B8CFFC2C1C2FFD7D7 + D5FFCFD0D0FFACADADFF9B9B9DFF8E8B8CFFA3A7A6FF2E2C309A000000000000 + 000050A659FF8ACA91FF87C98EFF42924AFF8F9295FF939495FFC8C5C5FFCFD2 + CEFFD4D2D4FFB1B1B0FF9C9D9EFF939495FF8F9295FF02030307000000000000 + 000050A659FF8ECC95FF8BCB93FF42924AFF646C6FE99C9A99FFD1D0D1FFC4C6 + C4FFD1D1D1FFADB0AEFF9E9F9EFF9C9A99FF646C6FE900000000000000000000 + 000056AD5FFF93CF9AFF90CE98FF489A50FF00000000616A6DFDBABDBEFFCFD0 + CCFFCFCCCFFFB1AFB0FFB7B7B6FF616A6DFD0000000000000000000000000000 + 00005BB465FF96D29FFF94D09CFF5DAC65FF4289484037171704757C7FF5D7DC + DBFFC8CBC9FFC2C1BEFF9DABABFF312F3373000000001504050165C371BB62BF + 6EF779C683FF9AD4A3FF98D3A1FF7DC386FF4FA458F74A9E53B8312528B5A3B7 + B6FFE6E0DEFFD7D0D0FF4F676DFD372A2E55000000000000000068C7740666C4 + 72DB7CCA87FF9ED6A7FF9CD4A5FF73C07DFF55AC5ED950A6590603030304253B + 41F0EFF0EFFFB5BEC1FF2B2C30AB1D0E0A010000000000000000000000000000 + 000066C572D17ECA88FF7BC885FF5DB868CF00000000000000000C020201241E + 2273ABBEC1FF645F5DE92A272A150000000000000000A9373409000000000000 + 00000000000067C673C965C270C4000000000000000000000000000000000000 + 00003D2F32A334292D5100000000000000000000000000000000 + } + GroupIndex = 1 + RadioItem = True + Visible = False + OnClick = acSurfElevateExecute + end + object mnuSurfStretch: TMenuItem + Action = acSurfStretch + Caption = 'Растягивание меша' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000336B390947994FB802020103000000000000000000000000000000000000 + 00000000000000000000216324B81D5E20060000000000000000000000000000 + 000053A95CD94DA156F747994F38000000000000000000000000000000000000 + 0000000000002A702F38256929F7216324D90000000000000000000000005DB8 + 68CF71BE7BFF7AC183FF5BAA64FF47994FFF419149FF419149FF419149FF3B88 + 42FF35803BFF3F8845FF59A15EFF448B49FF216324CF0000000065C371C47BC8 + 86FF9CD5A5FF98D3A1FF94D09DFF90CE98FF8BCB93FF87C98EFF8BCB93FF87C9 + 8EFF82C689FF7EC384FF7AC180FF76BE7CFF458C4AFF216324C468C774C97FCC + 8AFFA2D8ABFF9ED6A7FF9AD4A3FF96D29FFF93CF9AFF8ECC95FF93CF9AFF8ECC + 95FF89CA90FF85C78BFF81C587FF7DC282FF4A9150FF29602DF80000000068C7 + 74D180CD8BFF7CC987FF5DB868FF58B162FF53A95CFF53A95CFF53A95CFF4DA1 + 56FF47994FFF419149FF5AA362FF559D5CFF38743CFF777579FF000000000000 + 000068C774DB65C371F700000000888789FF898886FF696B68FFB9B6B8FFD1CF + CFFFC2C2C2FFA0A09FFF43904BFF418347FF898886FF888789FF000000000000 + 000068C7740668C774BB000000002E2C309AA3A7A6FF8E8B8CFFC2C1C2FFD7D7 + D5FFCFD0D0FFACADADFF5D9963FF8C8B8AFFA3A7A6FF2E2C309A000000000000 + 0000000000000000000000000000020303078F9295FF939495FFC8C5C5FFCFD2 + CEFFD4D2D4FFB1B1B0FF9C9D9EFF939495FF8F9295FF02030307000000000000 + 000000000000000000000000000000000000646C6FE99C9A99FFD1D0D1FFC4C6 + C4FFD1D1D1FFADB0AEFF9E9F9EFF9C9A99FF646C6FE900000000000000000000 + 00000000000000000000000000000000000000000000616A6DFDBABDBEFFCFD0 + CCFFCFCCCFFFB1AFB0FFB7B7B6FF616A6DFD0000000000000000000000000000 + 0000000000000000000000000000000000001806060A37171704757C7FF5D7DC + DBFFC8CBC9FFC2C1BEFF9DABABFF312F33730000000015040501000000000000 + 0000000000000000000000000000000000000000000000000000312528B5A3B7 + B6FFE6E0DEFFD7D0D0FF4F676DFD372A2E550000000000000000000000000000 + 000000000000000000000000000000000000000000000000000003030304253B + 41F0EFF0EFFFB5BEC1FF2B2C30AB1D0E0A010000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000C020201241E + 2273ABBEC1FF645F5DE92A272A150000000000000000A9373409000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00003D2F32A334292D5100000000000000000000000000000000 + } + GroupIndex = 1 + RadioItem = True + Visible = False + OnClick = acSurfStretchExecute + end + object mnuSurfSmooth: TMenuItem + Action = acSurfSmooth + Caption = 'Сглаживание меша' + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000000000000A1410210918105905140D6008170F620E1A144D0305041A0000 + 0000000000000000000000000000000000000000000000000000010202020000 + 00001A2F25635D9478E579B295FF6DA688FE6DA789FF60977CF92E5341B30104 + 0238010101110000000000000000000000000000000000000000000000002F4F + 3F777FB79BFF8CC1A6FD8BC0A5FD8CC2A7FC8CC2A7FC86B9A0FD7AAF95FF4573 + 5BD7030604380000000000000000000000000000000000000000182D213C75A9 + 8EFD8BC0A5FE81B89CFC82BA9EFF84BCA0FF86BCA1FF86BDA1FF8ABDA3FE78AF + 94FF375146F1515455CD4D4C51C3414248B03B41434A404144024C7961A891C4 + A9FF7EB699FC81B99CFF82BA9DFF84BB9FFF85BCA0FF86BDA1FF87BEA2FF89BD + A3FF64987DFF767B77FF999A98FF8D8E8DFF646363FE3B3D3FDF48735DD191C6 + AAFF7AB394FD80B89BFF80B89BFF82BA9DFF83BB9EFF83BA9EFF88BEA2FF8FC0 + A7FF537464FF939795FF969494FF79777BFF62635FFF777579FF446F58D18EC4 + A8FF79B294FD7FB79AFF7FB89AFF81B99CFF81B89CFF83BA9EFF8EC0A6FF5476 + 64FFA7A7A7FFA0A09FFF888989FF696B68FF898886FF888789FF4B7760CA90C4 + A8FF77B192FD7DB598FF7EB699FF7DB698FF82B89DFF8CBFA4FF517362FFBABA + B8FFCFD0D0FFAAABABFF9B9B9DFF8E8B8CFFA3A7A6FF2E2C309A3D6852798ABD + A2FF7DB396F978B293FF7CB496FF7EB598FC89BCA1FF496B5AFFAEACACFFCFD2 + CEFFD1CFD1FFB1B1B0FF9C9D9EFF939495FF8F9295FF020303070207040E5788 + 6ED395C8ACFF7CB396FA79B294FA89BEA2FF426554FC878584FFD1D0D1FFC1C3 + C1FFD1D1D1FFADB0AEFF9E9F9EFF9C9A99FF646C6FE900000000000000001B33 + 272856866DD58CBEA3FF9BCAB1FF3F6953D700000000616A6DFDB7BABBFFCFD0 + CCFFCFCCCFFFB1AFB0FFB7B7B6FF616A6DFD0000000000000000010201020000 + 0000030B07123E6B547E446A56BC0003011E1806060A1F0D0D07757C7FF5D7DC + DBFFC8CBC9FFC2C1BEFF9DABABFF312F33730000000015040501000000000102 + 0202010201030000000000000000010101010001000100000000312528B5A3B7 + B6FFE6E0DEFFD7D0D0FF4F676DFD372A2E550000000000000000000000000000 + 000000000000000000000000000000000000000000000000000003030304253B + 41F0EFF0EFFFB5BEC1FF2B2C30AB1D0E0A010000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000C020201241E + 2273ABBEC1FF645F5DE92A272A150000000000000000A9373409000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00003D2F32A334292D5100000000000000000000000000000000 + } + GroupIndex = 1 + RadioItem = True + Visible = False + OnClick = acSurfSmoothExecute + end object mnuSeparator3: TMenuItem Caption = '-' end object mnuBoundaries: TMenuItem Action = acBoundaries + Caption = 'Границы видимости' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 200000000000000400006400000064000000000000000000000000B2AD000022 - CC000028FC000028FC00000028000000280000002800005AEE00181818008900 - AC000E04380000ACAA0004380000B3A50A00C9800000F25807004BDB00003232 - 32FF2D2D2DFF282828FF0027FC000000CD000000000000000E001E000000DB00 - 2800000028000027FC00040404FF010101FF000000FFDB002800000000003A3A - 3AFFB7B7B7FF313030FFD89066FFD88E64FFD68C62FFD58961FFD5895FFFD586 - 5DFFD4855BFFD4855AFF090909FFA6A6A6FF030303FFFE1E0000000000004242 - 42FF3D3D3DFF534B46FFE3AD8DFFE2AB8BFFE1AA8AFFE1A888FFE0A787FFDFA5 - 85FFDFA484FFDEA383FF42332BFF0A0A0AFF070707FF000024000028FF000000 - 0E00DD9B73FFE4B192FFE4AF91FFE3AE8FFFE3AC8DFFE1AB8BFFE1A989FFE1A8 - 88FFE0A786FFDFA585FFDFA384FFD4865DFF0000000024FE0000000000000EFD - 1F00DE9F77FFE5B495FFE4B393FFE4B192FFE3AF90FFE3AE8EFFE2AC8DFFE1AA - 8BFFE1A989FFE0A787FFDFA686FFD5895FFF100031000028FC00810384000028 - FC00E1A27BFFE6B798FFE6B596FFE5B494FFE4B292FFE4B191FFE3AF8FFFE3AD - 8DFFE2AC8CFFE1AA8AFFE1A989FFD68C62FF0C00D500000EFD00592AFA000000 - AD00E1A67FFFE8BA9BFFE7B899FFE6B697FFE6B596FFE5B394FFE4B192FFE4AF - 91FFE3AE8FFFE3AD8DFFE2AB8BFFD88E66FFA80A16007F002800ACF1EC000400 - 2800E3AA81FFE9BC9EFFE8BB9CFFE8B99AFFE7B899FFE6B697FFE6B495FFE4B3 - 94FFE4B192FFE3AF90FFE3AE8FFFD9926AFF83038000000001006EE9E4000000 - 0000E3AC85FFEABFA0FFEABE9FFFE8BC9DFFE8BA9CFFE8B99AFFE6B798FFE6B6 - 96FFE5B494FFE4B393FFE4B191FFDA966CFF0000000000000000570602009F00 - 0000E5AF86FFEBC1A2FFEAC0A2FFEABEA0FFE9BD9EFFE8BC9DFFE8BA9BFFE7B8 - 99FFE6B698FFE6B596FFE5B394FFDC9A70FFE2BA280068E9E100000600000000 - 0000E5B289FFEBC3A5FFEBC2A3FFEBC0A2FFEABFA1FFEABEA0FFE9BD9EFFE8BB - 9DFFE8BA9BFFE7B899FFE6B697FFDE9D75FF0028FC00000042000028FC008686 - 86FF838383FF968D87FFEBC4A5FFEBC2A4FFEBC2A3FFEAC0A2FFEABFA0FFEABE - 9FFFE8BC9EFFE8BB9CFF7E726AFF535353FF4F4F4FFF00000000000EFC008989 - 89FFD3D3D3FF848484FFE6B38CFFE5B28AFFE5B289FFE5AF86FFE5AE86FFE3AC - 85FFE3AB83FFE3A980FF626262FFC4C4C4FF585858FF00000000000000008989 - 89FF888888FF878787FF00000000000000000000000000000000000000000000 - 000000000000000000006B6B6BFF666666FF626262FF00002800C8A3E300C8A3 - E300A8182F00A8182F0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EFEFEF3FEEEEEE6FC6C6 + C67F7F7F7F6F5555553F5555550FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF005555551F9595959FC3C3C3EFF7F7F7FFF5F5F5FFEEEE + EEFFEAEAEAFFDCDCDCFFACACACFF7070709F5555553FFFFFFF00FFFFFF00FFFF + FF00FFFFFF006969697FC4C4C4FFF4C496FFF29945FFF29338FFF2AC69FFF8F1 + EBFFEEEEEEFFE9E9E9FFE3E3E3FFDDDDDDFF6B6B6BFF4E4E4E7FFFFFFF005555 + 550F7A7A7ACFECECECFFF0BA86FFFBA759FFE4A769FFFEB56DFFFE9E3FFFEFA7 + 62FFF1F1F1FFECECECFFE6E6E6FFBCBCBCFF3D3D3DFF5555556F5555550F7A7A + 7ACFEDEDEDFFF7EADDFFF2943BFFBE9164FF333333FF584F46FFFEAF5FFFF292 + 37FFF5EFE9FFEEEEEEFFDCDCDCFF434343FF505050AFFFFFFF005555557FBABA + BAFFF8F8F8FFEFC396FFFDA44FFF7F6B58FF3F3F3FFF333333FFFDB063FFF192 + 36FFF7DEC4FFE2E2E2FF4B4B4BFF494949CF5555550F6666663F5555557F4646 + 46FFEBEBEBFFF0C39AFFFDF0E4FFD8CBBFFF7F7F7FFF8B6F53FFFDA145FFED8E + 32FFE8DBCEFF4B4B4BFF494949CF5555550F6666662F6666664F5555551F4A4A + 4AEF4D4D4DFFE2B180FFFBD9BAFFFFFFFF00DF9C59FFF89D42FFF08A24FFBA74 + 31FF353535FF494949CF5555550F6666660F6666667FFFFFFF00FFFFFF005555 + 554F4B4B4BFF332C26FF96795EFFE7C7A7FFCC731AFF9D5D1DFF52391FFF3535 + 35FF505050BF5555550F6666660F666666AF6666660FFFFFFF006666663FFFFF + FF005555552F515151DF414141FF353535FF313131FF3B3B3BFF4D4D4DDF5555 + 555FFFFFFF006666660F666666BF6666662FFFFFFF00FFFFFF006666669F6666 + 665FFFFFFF00FFFFFF005555553F5555557F5555557F5555553FFFFFFF00FFFF + FF006666661F666666CF6666665FFFFFFF00FFFFFF00FFFFFF006666660F6666 + 66EF6666669F6666661FFFFFFF00FFFFFF00FFFFFF00FFFFFF006666660F6666 + 667F666666EF6666665FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006666 + 664F666666FF666666FF666666BF6666667F6666667F666666BF666666FF6666 + 66EF6666664FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF006666665F666666EF666666FF666666FF666666FF666666FF666666BF6666 + 661FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF006666661F6666666F6666667F6666667F6666662FFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } OnClick = acBoundariesExecute end object mnuVirtualLayer: TMenuItem Action = acVirtualLayer + Caption = 'Виртуальный слой' Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 200000000000000400006400000064000000000000000000000010A6F1009E00 - 0000A6F1EF0000001500F1ED920000006200DF6FF80028FC000028F8000093F1 - F000000000002900000070A1E30070A1E30020E55C0088A1E300FF1C00000011 - 9C00F4E181000028FC000028FC000000280000002800000028000028FF00F4F4 - F4000016B700D869F80028FC000093F1F0008D000000005AE500000000000000 - 0000000000000000000046974EFF419149FF3C8A43FF38833EFF337D39FF2F77 - 34FF2A712FFF266B2BFF236627FF206223FF1D5E20FF1A5B1EFF000000000000 - 000000000000000000004C9F54FF47994FFF42924AFF3D8C45FF39853FFF347F - 3AFF307835FF2B7230FF276D2CFF246828FF206324FF1D5F21FF000000000000 - 000046974EFF419149FF51A75BFF499B51FF44944BFF3F8E46FF3B8741FF3681 - 3CFF317A37FF2D7532FF296F2EFF256929FF256929FF216425FF58FC00000028 - FF004C9F54FF28FFF40057AF61FF4FA559FF4B9E54FF46984EFF429148FF3D8A - 43FF38843EFF337D39FF2F7734FF29702FFF296F2EFF256A2AFF0028FC000000 - 00004EA358FF1171F1005CB666FF52A85BFF4EA357FF4A9D52FF45974DFF4190 - 48FF3C8A43FF37833EFF357F3BFF2F7835FF2F7734FF2A712FFF000000000000 - 000056AE60FF0000000060BC6BFF58B062FF54AB5EFF51A659FF4CA055FF489A - 50FF43944BFF3D8B45FF3A8741FF357F3BFF347F3AFF307835FFE81ADD00E81A - DD005BB565FF0000000064C16FFF5AB465FF57AF61FF54AB5EFF51A65AFF4CA1 - 56FF499B51FF43934AFF409047FF3B8741FF3A8741FF35803BFF3FDE47000000 - 00005FBB6AFF0000000067C673FFDE3F6A0059B264FF57AE60FF54AB5DFF51A7 - 5AFF4DA256FF479950FF46974EFF408E47FF408F47FF3B8842FF000000000000 - 000063C06EFF00FFFF0067C673FF67C572FF64C170FF61BD6CFF5DB968FF5AB4 - 64FF56AE60FF50A659FF4DA256FF479A50FF46974EFF419149FF0000000000FF - FF0067C673FF0000000000000000000000000000000000FFFF00FF0000000000 - 00000000000000000000000000003B8842FFFF00000000000000F90600000000 - 000068C774FF68C673FF65C271FF62BE6EFF5FBA6AFF5CB565FF58AF61FF53A9 - 5CFF4FA357FF46974DFFFF000000000000000000000000000000FFFFFF00FFFF - FF00FFFFF9004E0009003FDE460000000000000000000000000000000600DE3F - 7B00C63E0000000000000000000000000000000000003EC6D900080000000000 - 3C00F0F4CA000000000000000000FFFFFF000000000000000000000000000000 - 000000000000000000000000000000000000004ECB00FFFFFF00A8A3E300A8A3 - E3003019DD003019DD000851A50092B075000000000018000000B019DD006419 - DD000000000000000000000000007819DD000000000000000000 + 2000000000000004000064000000640000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AA6A1AFFA867 + 17FFA56312FFA4610FFFA4610FFFA4610FFFA4610FFFA4610FFFA4610FFFA461 + 0FFFA4610FFFA4610FFFA4610FFFA56312FFA86717FFAA6A1AFFA86819AED499 + 4CFFFCE3C0FFF8DEB9FFF7DDB9FFF7DDB9FFF7DDBAFFF7DDBAFFF7DDBAFFF7DD + BAFFF7DDB9FFF7DDB9FFF8DEB9FFFCE3C0FFD4994CFFA96819EB00000000A161 + 11A1CE9142FFF2CE9EFFE4A95BFFE4AA5DFFE4AA5EFFE4AA5EFFE4AA5EFFE4AA + 5EFFE4AA5DFFE4A95BFFF2CE9EFFCE9143FFA36312DB00000000000000000000 + 0000A46419D6D29447FFE2B374FFDCA256FFDCA257FFDCA257FFDCA257FFDCA2 + 57FFDCA256FFE2B374FFD29447FFA96718F60000000000000000000000000000 + 000000000000A46419D6D29447FFE2B374FFDCA256FFDCA257FFDCA257FFDCA2 + 56FFE2B374FFD29447FFA96718F6000000000000000000000000000000000000 + 000000000000000000007E4D13DEA87638FFB48F5CFFB08144FFB08144FFB48F + 5CFFA87638FF865113F800000000000000000000000000000000EEBF7DFFEEBD + 7AFFEDBB76FFECBA76FFECBA76FFEEC182FFEDBC79FFEDBC7AFFEDBC7AFFEDBC + 79FFEEC182FFECBA77FFECBA76FFEDBB77FFEEBD7AFFEEBF7DFFEBB976AFFBD9 + ACFFFFFBF0FFEBCBA3FFDDB480FFDFB785FFE0B886FFE0B887FFE0B887FFE0B8 + 86FFDFB785FFDDB480FFEBCBA3FFFFF7E5FFFBD9ACFFEBB976EB00000000E9B7 + 72A7FAD19EFFFFF0D9FFDFA861FFC98832FFCA8934FFCB8A35FFCB8A35FFCA89 + 34FFC98832FFDFA861FFFFF0D9FFFAD19EFFE9B772E200000000000000000000 + 0000E9B772A7FACC96FFFFE5C2FFFFDBAEFFFFDCAFFFFFDCB0FFFFDCB0FFFFDC + AFFFFFDBAEFFFFE5C2FFFACC96FFE9B772E20000000000000000000000000000 + 000000000000E9B773A7FAC88FFFFFD4A5FFFFD29EFFFFD29EFFFFD29EFFFFD2 + 9EFFFFD4A5FFFAC88FFFE9B773E4000000000000000000000000000000000000 + 00000000000000000000EAB875ACE9B874FFE9B874FFE9B874FFE9B874FFE9B8 + 74FFE9B874FFEAB875AA00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000 } OnClick = acVirtualLayerExecute end end object pmClients: TPopupMenu - left = 184 - top = 176 + Images = ImageList1 + left = 232 + top = 200 object mnuGoToClient: TMenuItem - Caption = 'GoTo' + Caption = 'Перейти' Default = True OnClick = mnuGoToClientClick end @@ -2578,13 +7095,13 @@ object frmMain: TfrmMain Interval = 500 OnTimer = tmMovementTimer OnStartTimer = tmMovementTimer - left = 232 - top = 80 + left = 504 + top = 88 end object ActionList1: TActionList Images = ImageList1 - left = 264 - top = 80 + left = 504 + top = 33 object acSelect: TAction Category = 'Tools' Caption = 'Select' @@ -2595,56 +7112,19 @@ object frmMain: TfrmMain OnExecute = acSelectExecute ShortCut = 112 end - object acDraw: TAction - Category = 'Tools' - Caption = 'Draw tiles' - GroupIndex = 1 - Hint = 'Draw tiles' - ImageIndex = 5 - OnExecute = acDrawExecute - ShortCut = 113 - end - object acMove: TAction - Category = 'Tools' - Caption = 'Move tiles' - GroupIndex = 1 - Hint = 'Move tiles' - ImageIndex = 6 - OnExecute = acMoveExecute - ShortCut = 114 - end - object acElevate: TAction - Category = 'Tools' - Caption = 'Elevate tiles' - GroupIndex = 1 - Hint = 'Elevate tiles' - ImageIndex = 7 - OnExecute = acElevateExecute - ShortCut = 115 - end - object acDelete: TAction - Category = 'Tools' - Caption = 'Delete tiles' - GroupIndex = 1 - Hint = 'Delete tiles' - ImageIndex = 8 - OnExecute = acDeleteExecute - ShortCut = 116 - end - object acHue: TAction - Category = 'Tools' - Caption = 'Hue tiles' - GroupIndex = 1 - Hint = 'Hue tiles' - ImageIndex = 12 - OnExecute = acHueExecute - ShortCut = 117 + object acVirtualLayer: TAction + Category = 'Settings' + Caption = 'Virtual Layer' + Hint = 'Virtual Layer' + ImageIndex = 53 + OnExecute = acVirtualLayerExecute + ShortCut = 119 end object acBoundaries: TAction Category = 'Settings' Caption = 'Boundaries' Hint = 'Boundaries' - ImageIndex = 9 + ImageIndex = 51 OnExecute = acBoundariesExecute ShortCut = 118 end @@ -2653,16 +7133,42 @@ object frmMain: TfrmMain AutoCheck = True Caption = 'Filter' Hint = 'Filter' - ImageIndex = 16 + ImageIndex = 54 OnExecute = acFilterExecute end - object acVirtualLayer: TAction + object acTerrain: TAction Category = 'Settings' - Caption = 'Virtual Layer' - Hint = 'Virtual Layer' - ImageIndex = 15 - OnExecute = acVirtualLayerExecute - ShortCut = 119 + Caption = 'Show Terrain' + Checked = True + Hint = 'Отображать рельеф' + ImageIndex = 44 + OnExecute = acTerrainExecute + end + object acStatics: TAction + Category = 'Settings' + Caption = 'Show Statics' + Checked = True + Hint = 'Отображать статику' + ImageIndex = 77 + OnExecute = acStaticsExecute + end + object acNoDraw: TAction + Category = 'Settings' + Caption = 'NoDraw' + Checked = True + Hint = 'Display "No Draw" tiles' + ImageIndex = 58 + OnExecute = acNoDrawExecute + ShortCut = 16462 + end + object acWalkable: TAction + Category = 'Settings' + AutoCheck = True + Caption = 'Grid' + Hint = 'Highlight (un)walkable surfaces' + ImageIndex = 80 + OnExecute = acWalkableExecute + ShortCut = 16471 end object acFlat: TAction Category = 'Settings' @@ -2670,67 +7176,182 @@ object frmMain: TfrmMain Hint = 'Flat view' ImageIndex = 17 OnExecute = acFlatExecute + ShortCut = 16454 end - object acNoDraw: TAction + object acLightlevel: TAction Category = 'Settings' - Caption = 'NoDraw' - Checked = True - Hint = 'Display "No Draw" tiles' - ImageIndex = 18 - OnExecute = acNoDrawExecute + Caption = 'Lightlevel' + Hint = 'Set Lightlevel' + ImageIndex = 56 + OnExecute = acLightlevelExecute + end + object acSelection: TAction + Category = 'Tools' + Caption = 'acSelection' + GroupIndex = 1 + ImageIndex = 52 + OnExecute = acSelectionExecute + end + object acMove: TAction + Category = 'Tools' + Caption = 'Move tiles' + GroupIndex = 1 + Hint = 'Move tiles' + ImageIndex = 27 + OnExecute = acMoveExecute + ShortCut = 114 + end + object acElevate: TAction + Category = 'Tools' + Caption = 'Elevate tiles' + GroupIndex = 1 + Hint = 'Elevate tiles' + ImageIndex = 28 + OnExecute = acElevateExecute + ShortCut = 115 + end + object acSurfElevate: TAction + Category = 'Tools' + Caption = 'acSurfElevate' + GroupIndex = 1 + ImageIndex = 72 + OnExecute = acSurfElevateExecute + end + object acSurfStretch: TAction + Category = 'Tools' + Caption = 'acSurfStretch' + GroupIndex = 1 + ImageIndex = 73 + OnExecute = acSurfStretchExecute + end + object acSurfSmooth: TAction + Category = 'Tools' + Caption = 'acSurfSmooth' + GroupIndex = 1 + ImageIndex = 74 + OnExecute = acSurfSmoothExecute + end + object acDraw: TAction + Category = 'Tools' + Caption = 'Draw tiles' + GroupIndex = 1 + Hint = 'Draw tiles' + ImageIndex = 23 + OnExecute = acDrawExecute + ShortCut = 113 + end + object acHue: TAction + Category = 'Tools' + Caption = 'Hue tiles' + GroupIndex = 1 + Hint = 'Hue tiles' + ImageIndex = 42 + OnExecute = acHueExecute + ShortCut = 117 + end + object acFill: TAction + Category = 'Tools' + Caption = 'Fill textures and objects' + GroupIndex = 1 + Hint = 'Fill textures and objects' + ImageIndex = 40 + OnExecute = acFillExecute + ShortCut = 122 + end + object acDelete: TAction + Category = 'Tools' + Caption = 'Delete tiles' + GroupIndex = 1 + Hint = 'Delete tiles' + ImageIndex = 47 + OnExecute = acDeleteExecute + ShortCut = 116 end object acUndo: TAction Category = 'Tools' Caption = 'Undo' Enabled = False Hint = 'Undo last set of changes' - ImageIndex = 20 + ImageIndex = 61 OnExecute = acUndoExecute ShortCut = 16474 end - object acLightlevel: TAction - Category = 'Settings' - Caption = 'Lightlevel' - Hint = 'Set Lightlevel' - ImageIndex = 21 - OnExecute = acLightlevelExecute - end - object acWalkable: TAction - Category = 'Settings' - AutoCheck = True - Caption = 'Walkable' - Hint = 'Highlight (un)walkable surfaces' - ImageIndex = 22 - OnExecute = acWalkableExecute - ShortCut = 16471 + object acRedo: TAction + Category = 'Tools' + Caption = 'acRedo' + Enabled = False + ImageIndex = 62 end end object tmGrabTileInfo: TTimer Enabled = False Interval = 250 OnTimer = tmGrabTileInfoTimer - left = 368 - top = 80 + left = 624 + top = 88 end object pmGrabTileInfo: TPopupMenu + Images = ImageList1 OnPopup = pmGrabTileInfoPopup - left = 368 - top = 33 + left = 592 + top = 88 object mnuGrabTileID: TMenuItem - Caption = 'Grab TileID' + Caption = 'Выбрать Тайл' OnClick = mnuGrabTileIDClick end object mnuGrabHue: TMenuItem - Caption = 'Grab Hue' + Caption = 'Выбрать Цвет' OnClick = mnuGrabHueClick end + object mnuGrabFilterTileID: TMenuItem + Caption = 'Добавить Тайл в фильтр' + OnClick = mnuGrabFilterTileIDClick + end + object mnuGrabFilterHue: TMenuItem + Caption = 'Добавить Цвет в фильтр' + OnClick = mnuGrabFilterHueClick + end + object mnuGrabVirtualLayerZ: TMenuItem + Caption = 'Задать виртуальный слой' + OnClick = mnuGrabVirtualLayerZClick + end + object mnuGrabBoundaries: TMenuItem + Caption = 'Задать границы видимости' + object mnuGrabBoundMinZ: TMenuItem + Caption = 'Нижняя граница по Z' + OnClick = GrabBoundaries + end + object mnuGrabBoundMaxZ: TMenuItem + Caption = 'Верхняя граница по Z' + OnClick = GrabBoundaries + end + object mnuGrabBoundMinX: TMenuItem + Caption = 'Нижняя граница по X' + OnClick = GrabBoundaries + end + object mnuGrabBoundMaxX: TMenuItem + Caption = 'Верхняя граница по X' + OnClick = GrabBoundaries + end + object mnuGrabBoundMinY: TMenuItem + Caption = 'Нижняя граница по Y' + OnClick = GrabBoundaries + end + object mnuGrabBoundMaxY: TMenuItem + Caption = 'Верхняя граница по Y' + OnClick = GrabBoundaries + end + end end object pmFlatViewSettings: TPopupMenu - left = 368 - top = 136 + Images = ImageList1 + OnClose = DropedownMenusClose + left = 680 + top = 33 object mnuFlatShowHeight: TMenuItem AutoCheck = True - Caption = 'Show Height' + Caption = 'Выводить высоту' + ShortCut = 16456 OnClick = mnuFlatShowHeightClick end end @@ -2738,8 +7359,152 @@ object frmMain: TfrmMain StoredValues = <> RootNodePath = 'Forms/frmMain' Active = False + OnSavingProperties = XMLPropStorage1SavingProperties OnRestoreProperties = XMLPropStorage1RestoreProperties - left = 368 - top = 208 + left = 264 + top = 32 + end + object pmViewTerrainSettings: TPopupMenu + Images = ImageList1 + OnClose = DropedownMenusClose + left = 576 + top = 33 + object mnuShowGrid: TMenuItem + AutoCheck = True + Caption = 'Рисовать сетку' + Hint = 'Отображать сетку рельефа' + ShortCut = 16455 + OnClick = mnuShowGridClick + end + object mnuShowBlocks: TMenuItem + AutoCheck = True + Caption = 'Границы блоков' + Hint = 'Отображать границы блоков' + ShortCut = 16450 + OnClick = mnuShowBlocksClick + end + end + object pmNoDrawSettings: TPopupMenu + Images = ImageList1 + OnClose = DropedownMenusClose + left = 640 + top = 33 + object mnuShowNoDrawTiles: TMenuItem + AutoCheck = True + Caption = 'Невидимые тайлы' + Checked = True + OnClick = mnuShowNoDrawTilesClick + end + object mnuShowLightSource: TMenuItem + AutoCheck = True + Caption = 'Источники света' + Checked = True + OnClick = mnuShowLightSourceClick + end + end + object pmViewStaticSettings: TPopupMenu + Images = ImageList1 + OnClose = DropedownMenusClose + left = 608 + top = 33 + object mnuShowWalls: TMenuItem + AutoCheck = True + Caption = 'Стены и окна' + Checked = True + Hint = 'Отображать стены и окна' + OnClick = mnuShowStaticsOptionClick + end + object mnuShowBridges: TMenuItem + AutoCheck = True + Caption = 'Лестницы' + Checked = True + Hint = 'Отображать лестницы, мосты и другие объекты по которым можно подниматься/спускаться' + OnClick = mnuShowStaticsOptionClick + end + object mnuShowSurfaces: TMenuItem + AutoCheck = True + Caption = 'Поверхности' + Checked = True + Hint = 'Отображать полы и другие поверхности по которым можно ходить' + OnClick = mnuShowStaticsOptionClick + end + object mnuShowRoofs: TMenuItem + AutoCheck = True + Caption = 'Крыши' + Checked = True + Hint = 'Отображать крыши домов' + OnClick = mnuShowStaticsOptionClick + end + object mnuShowFoliage: TMenuItem + AutoCheck = True + Caption = 'Листва' + Checked = True + Hint = 'Отображать листву на деревьев' + OnClick = mnuShowStaticsOptionClick + end + object mnuShowWater: TMenuItem + AutoCheck = True + Caption = 'Вода' + Checked = True + Hint = 'Отображать воду' + OnClick = mnuShowStaticsOptionClick + end + end + object tmSettingsClose: TTimer + Enabled = False + Interval = 25 + OnTimer = tmSettingsCloseTimer + left = 536 + top = 33 + end + object tmSelectNode: TTimer + Enabled = False + Interval = 250 + OnTimer = tmSelectNodeTimer + left = 232 + top = 136 + end + object pmZoomSettings: TPopupMenu + Images = ImageList1 + OnClose = DropedownMenusClose + left = 712 + top = 33 + object mnuZoom025: TMenuItem + Caption = 'Масштаб 25%' + OnClick = mnuZoomClick + end + object mnuZoom033: TMenuItem + Caption = 'Масштаб 33%' + OnClick = mnuZoomClick + end + object mnuZoom050: TMenuItem + Caption = 'Масштаб 50%' + OnClick = mnuZoomClick + end + object mnuZoom075: TMenuItem + Caption = 'Масштаб 75%' + OnClick = mnuZoomClick + end + object mnuZoom100: TMenuItem + Caption = 'Масштаб 100%' + Checked = True + OnClick = mnuZoomClick + end + object mnuZoom150: TMenuItem + Caption = 'Масштаб 150%' + OnClick = mnuZoomClick + end + object mnuZoom200: TMenuItem + Caption = 'Масштаб 200%' + OnClick = mnuZoomClick + end + object mnuZoom300: TMenuItem + Caption = 'Масштаб 300%' + OnClick = mnuZoomClick + end + object mnuZoom400: TMenuItem + Caption = 'Масштаб 400%' + OnClick = mnuZoomClick + end end end diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas index a58dfd3..9f1a7de 100644 --- a/Client/UfrmMain.pas +++ b/Client/UfrmMain.pas @@ -32,10 +32,16 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus, ComCtrls, OpenGLContext, GL, GLu, UGameResources, ULandscape, ExtCtrls, - StdCtrls, Spin, UEnums, VirtualTrees, Buttons, UMulBlock, UWorldItem, math, - LCLIntf, UOverlayUI, UStatics, UEnhancedMemoryStream, ActnList, - XMLPropStorage, fgl, ImagingClasses, dateutils, UPlatformTypes, UMap, UPacket, - UGLFont, DOM, XMLRead, XMLWrite, strutils, ULightManager; + StdCtrls, Spin, UEnums, VirtualTrees, VirtualList, Buttons, math, UMulBlock, + UWorldItem, LCLIntf, UOverlayUI, UStatics, UEnhancedMemoryStream, ActnList, + XMLPropStorage, LazHelpHTML, fgl, ImagingClasses, dateutils, UPlatformTypes, + UMap, UPacket, UGLFont, DOM, XMLRead, XMLWrite, strutils, ULightManager, + UndoRedoCmd, ShellAPI, ImagingTypes, ImagingCanvases, types, Registry, + IniFiles, LMessages; + +const + FVLightSrcImageCount = 15; // Количество иконок виртуальных источников + FUndoListLength = 64; // Количество элементов в списке отмены type TAccessChangedListener = procedure(AAccessLevel: TAccessLevel) of object; @@ -43,18 +49,166 @@ type TScreenBufferState = (sbsValid, sbsIndexed, sbsFiltered); TScreenBufferStates = set of TScreenBufferState; - TGhostTile = class(TStaticItem); + TBlockInfoList = specialize TFPGList<PBlockInfo>; + + TGhostTile = class(TStaticItem) + public + CenterX, CenterY: Word; // Точки привязки к курсору (центральный тайл для объектов размером больше 1 тайла) + end; TPacketList = specialize TFPGObjectList<TPacket>; + PPacketList = ^TPacketList; TAccessChangedListeners = specialize TFPGList<TAccessChangedListener>; TSelectionListeners = specialize TFPGList<TSelectionListener>; TTileHintInfo = record + Column: Byte; + Obj: String; Name: String; Flags: String; + ObjRect: TRect; NameRect: TRect; FlagsRect: TRect; end; + TGroupTile = record + ID: LongWord; + end; + + TEntryTile = record + ID: LongWord; + Hue: Word; + X,Y: Smallint; + Z: ShortInt; + end; + + TBrushTile = record + ID: Word; + Chance: Float; + Mask: Byte; + Brush1: ^TGroupBrush; + Brush2: ^TGroupBrush; + end; + PBrushTile = ^TBrushTile; + + TGroupEntry = record + ID: Word; + Name: string; + Image: TSingleImage; + Count: Word; // Число тайлов в объекте + ETile: ^TEntryTile; + end; + PGroupEntry = ^TGroupEntry; + + TGroupBrushEdge = record + ID: Word; + CountDR: Word; + BTileDR: ^PBrushTile; + CountDL: Word; + BTileDL: ^PBrushTile; + CountUR: Word; + BTileUR: ^PBrushTile; + CountUL: Word; + BTileUL: ^PBrushTile; + CountLL: Word; + BTileLL: ^PBrushTile; + CountUU: Word; + BTileUU: ^PBrushTile; + end; + PGroupBrushEdge = ^TGroupBrushEdge; + + TGroupBrush = record + ID: Word; + Name: string; + Image: TSingleImage; + Count: Word; // Число тайлов в объекте + BTile: ^PBrushTile; + + ECount: Word; // Число тайлов перехода (в <Edge />) + EdgeId: ^PWord; // �ндификаторы кистей переходов (ссылка на кисть в <Edge />) + BEdges: ^PGroupBrushEdge; // Тайлы переходов + end; + PGroupBrush = ^TGroupBrush; + + TEntryList = record + Entry: ^PGroupEntry; + Count: Word; + end; + + TBrushList = record + Brush: ^PGroupBrush; + Count: Word; + Tiles: array[0..$3FFF] of TBrushTile; + end; + + TGroupNode = record + Name : string; + Color: TColor; + Bold : Boolean; + Ital : Boolean; + Items: LongWord; // число элементов (тайлы, объекты, кисти и тд) в группе (включая подгруппы) + Nodes: Word; + ID : LongWord; + Links: Word; // число элементов в GLink + lids : ^LongWord; + GLink: ^PVirtualNode; // сылки на группы + Count: LongWord; // число элементов в GTile + GTile: ^TGroupTile; + Entries: LongWord; // число элементов в Entry + Entry: ^PGroupEntry; // сылки на объекты из TilesEntry.xml + Brushes: LongWord; // число элементов в Brush + Brush: ^PGroupBrush; // сылки на объекты из TilesBrush.xml + end; + PGroupNode = ^TGroupNode; + + // SurfaceInf.xml types start + TSurfTile = record + Tile: ^LongWord; // ID тайлов лендов и итемов + Hash: ^LongWord; // Surface's тэги для них + Count: Word; + end; + PSurfTile = ^TSurfTile; + + TSurfGrad = record + Grad: ^TSurfTile; // списки тайлов в Surface'ах, рассортированные по Category+Type + Hash: ^LongWord; // SurfaceCategory + ItemType + Count: Word; + end; + PSurfGrad = ^TSurfGrad; + + TSurfInfo = record + Name : string; + TileID: LongWord; + TileHash: LongWord; // Кеш Имени (Name) + GradHash: ^LongWord; // Кэши типов тайлов в объекте + GradCount: Word; // Чмсло GradHash + end; + PSurfInfo = ^TSurfInfo; + + TSurfGroup = record + Name : string; // Имя категории + Info : ^TSurfInfo; // Список поверхностей в категории + Count: Word; // Длинна списка поверхностей + end; + PSurfGroup = ^TSurfGroup; + + TSurfsList = record + Group: ^TSurfGroup; + GroupCount: Word; + + Grads: ^TSurfGrad; // Контейнер для хранения памяти + GradsCount: Word; + + Tiles: ^PSurfGrad; + TilesCount: Word; + end; + // SurfaceInf.xml types end + + TLightTile = record + image: Byte; + color: Byte; + end; + PLightTile = ^TLightTile; + { TfrmMain } TfrmMain = class(TForm) @@ -69,6 +223,14 @@ type acFlat: TAction; acNoDraw: TAction; acLightlevel: TAction; + acTerrain: TAction; + acStatics: TAction; + acSelection: TAction; + acSurfElevate: TAction; + acSurfStretch: TAction; + acSurfSmooth: TAction; + acFill: TAction; + acRedo: TAction; acWalkable: TAction; acUndo: TAction; acVirtualLayer: TAction; @@ -89,17 +251,104 @@ type edChat: TEdit; edFilter: TEdit; edSearchID: TEdit; + edX: TSpinEdit; + edY: TSpinEdit; gbRandom: TGroupBox; + gbGoTo: TGroupBox; ImageList1: TImageList; + lblTileInfoOLabel: TLabel; + lblTileInfoIDLabel: TLabel; + lblTileInfoHLabel: TLabel; + lblTileInfoIDValue: TLabel; + lblTileInfoCLabel: TLabel; + lblTileInfoWLabel: TLabel; + lblTileInfoYLabel: TLabel; + lblTileInfoXValue: TLabel; + lblTileInfoXLabel: TLabel; + lblTileInfoZValue: TLabel; + lblTileInfoHueValue: TLabel; + lblTileInfoHueLabel: TLabel; lblChatHeaderCaption: TLabel; lblFilter: TLabel; - lblTipC: TLabel; - lblTip: TLabel; - lblTileInfo: TLabel; + lblTileInfoZLabel: TLabel; + lblTileInfoYValue: TLabel; + lblTileInfoHValue: TLabel; + lblTileInfoWValue: TLabel; lblX: TLabel; lblY: TLabel; - lbClients: TListBox; MainMenu1: TMainMenu; + MenuItem1: TMenuItem; + mnuMiscTileListLarge: TMenuItem; + mnuSeparator9: TMenuItem; + mnuSeparator8: TMenuItem; + mnuTileListDrawInfo: TMenuItem; + mnuMiscTileListTable: TMenuItem; + mnuMiscTileListSmall: TMenuItem; + mnuSeparator10: TMenuItem; + mnuMiscTileListCentre: TMenuItem; + mnuMiscTileListDrawInfo: TMenuItem; + mnuMiscTileListMidle: TMenuItem; + mnuMiscTileListClip: TMenuItem; + mnuMiscTileListStretch: TMenuItem; + mnuMiscTileList: TMenuItem; + mnuEng2Com: TMenuItem; + mnuTileListMidle: TMenuItem; + mnuTileListTable: TMenuItem; + mnuTileListSmall: TMenuItem; + mnuTileListLarge: TMenuItem; + mnuTileListStretch: TMenuItem; + mnuTileListClip: TMenuItem; + mnuTileListCentre: TMenuItem; + mnuSeparator7: TMenuItem; + mnuTileList: TMenuItem; + mnuSeparator6: TMenuItem; + mnuSetLanguage: TMenuItem; + mnuAutoShowFilterWindow: TMenuItem; + mnuSelection: TMenuItem; + mnuSurfElevate: TMenuItem; + mnuSurfStretch: TMenuItem; + mnuSurfSmooth: TMenuItem; + mnuFill: TMenuItem; + mnuShowNoDrawTiles: TMenuItem; + mnuEngCom: TMenuItem; + mnuRusCom: TMenuItem; + mnuSupport: TMenuItem; + mnuSeparator5: TMenuItem; + mnuDocs: TMenuItem; + mnuShowBlocks: TMenuItem; + mnuGrabBoundaries: TMenuItem; + mnuGrabBoundMinZ: TMenuItem; + mnuGrabBoundMaxZ: TMenuItem; + mnuGrabBoundMinX: TMenuItem; + mnuGrabBoundMaxX: TMenuItem; + mnuGrabBoundMinY: TMenuItem; + mnuGrabBoundMaxY: TMenuItem; + mnuZoom300: TMenuItem; + mnuZoom400: TMenuItem; + mnuZoom033: TMenuItem; + mnuZoom025: TMenuItem; + mnuZoom150: TMenuItem; + mnuZoom200: TMenuItem; + mnuZoom075: TMenuItem; + mnuZoom050: TMenuItem; + mnuZoom100: TMenuItem; + mnuShowBridges: TMenuItem; + mnuWindowedMode: TMenuItem; + mnuMakeScreenShot: TMenuItem; + mnuShowWater: TMenuItem; + mnuShowSurfaces: TMenuItem; + mnuShowRoofs: TMenuItem; + mnuShowFoliage: TMenuItem; + mnuAutoHideRandomList: TMenuItem; + mnuAutoHideGroupList: TMenuItem; + mnuSeparator4: TMenuItem; + mnuReloadGroups: TMenuItem; + mnuGrabFilterTileID: TMenuItem; + mnuGrabFilterHue: TMenuItem; + mnuGrabVirtualLayerZ: TMenuItem; + mnuShowGrid: TMenuItem; + mnuShowWalls: TMenuItem; + mnuShowLightSource: TMenuItem; mnuWhiteBackground: TMenuItem; mnuSecurityQuestion: TMenuItem; mnuShowAnimations: TMenuItem; @@ -132,11 +381,13 @@ type mnuDisconnect: TMenuItem; mnuCentrED: TMenuItem; oglGameWindow: TOpenGLControl; + pbRadar: TPaintBox; pcLeft: TPageControl; + pmZoomSettings: TPopupMenu; + pmViewTerrainSettings: TPopupMenu; pmGrabTileInfo: TPopupMenu; - pnlBottom: TPanel; - edX: TSpinEdit; - edY: TSpinEdit; + pmNoDrawSettings: TPopupMenu; + pmViewStaticSettings: TPopupMenu; pmTileList: TPopupMenu; pmTools: TPopupMenu; pmClients: TPopupMenu; @@ -144,22 +395,37 @@ type pnlChatHeader: TPanel; pmFlatViewSettings: TPopupMenu; spChat: TSplitter; + spGroupList1: TSplitter; spTileList: TSplitter; + spGroupList: TSplitter; + tbFill: TToolButton; + tbSurfSmooth: TToolButton; + tbSurfStretch: TToolButton; + tbSurfElevate: TToolButton; + tbSelection: TToolButton; tbFilter: TToolButton; tbFlat: TToolButton; + tbSeparator6: TToolButton; + tbSeparator7: TToolButton; + tbSeparator8: TToolButton; + tbSeparator9: TToolButton; + tbRedo: TToolButton; + tbZoom: TToolButton; tbNoDraw: TToolButton; tbSeparator2: TToolButton; tbUndo: TToolButton; tbLightlevel: TToolButton; tbWalkable: TToolButton; - tsLocations: TTabSheet; + tmSelectNode: TTimer; + tmSettingsClose: TTimer; + tsNavigation: TTabSheet; tbSetHue: TToolButton; tmGrabTileInfo: TTimer; tmMovement: TTimer; tbSeparator5: TToolButton; tbRadarMap: TToolButton; tbVirtualLayer: TToolButton; - tsClients: TTabSheet; + tsObjects: TTabSheet; tbMain: TToolBar; tbDisconnect: TToolButton; tbSeparator1: TToolButton; @@ -174,15 +440,19 @@ type tbTerrain: TToolButton; tbStatics: TToolButton; tsTiles: TTabSheet; - vdtTiles: TVirtualDrawTree; + tvGroups: TVirtualStringTree; + vdtTiles: TVirtualList; vdtRandom: TVirtualDrawTree; + vdlRandom: TVirtualList; vstChat: TVirtualStringTree; vstLocations: TVirtualStringTree; + vstClients: TVirtualStringTree; XMLPropStorage1: TXMLPropStorage; procedure acBoundariesExecute(Sender: TObject); procedure acDeleteExecute(Sender: TObject); procedure acDrawExecute(Sender: TObject); procedure acElevateExecute(Sender: TObject); + procedure acFillExecute(Sender: TObject); procedure acFilterExecute(Sender: TObject); procedure acFlatExecute(Sender: TObject); procedure acHueExecute(Sender: TObject); @@ -190,9 +460,16 @@ type procedure acMoveExecute(Sender: TObject); procedure acNoDrawExecute(Sender: TObject); procedure acSelectExecute(Sender: TObject); + procedure acSelectionExecute(Sender: TObject); + procedure acStaticsExecute(Sender: TObject); + procedure acSurfElevateExecute(Sender: TObject); + procedure acSurfSmoothExecute(Sender: TObject); + procedure acSurfStretchExecute(Sender: TObject); + procedure acTerrainExecute(Sender: TObject); procedure acUndoExecute(Sender: TObject); procedure acVirtualLayerExecute(Sender: TObject); procedure acWalkableExecute(Sender: TObject); + procedure acGridExecute(Sender: TObject); procedure ApplicationProperties1Idle(Sender: TObject; var Done: Boolean); procedure ApplicationProperties1ShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo); @@ -216,23 +493,53 @@ type procedure FormDestroy(Sender: TObject); procedure edSearchIDExit(Sender: TObject); procedure edSearchIDKeyPress(Sender: TObject; var Key: char); + procedure FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure FormShow(Sender: TObject); + procedure FormWindowStateChange(Sender: TObject); procedure lblChatHeaderCaptionClick(Sender: TObject); procedure lblChatHeaderCaptionMouseEnter(Sender: TObject); procedure lblChatHeaderCaptionMouseLeave(Sender: TObject); procedure mnuAboutClick(Sender: TObject); procedure mnuAccountControlClick(Sender: TObject); + procedure mnuAutoHideGroupListClick(Sender: TObject); + procedure mnuAutoHideRandomListClick(Sender: TObject); + procedure mnuAutoShowFilterWindowClick(Sender: TObject); + procedure mnuCompactHueSettingsClick(Sender: TObject); procedure mnuDisconnectClick(Sender: TObject); + procedure mnuDocsClick(Sender: TObject); + procedure mnuEng2ComClick(Sender: TObject); + procedure mnuEngComClick(Sender: TObject); procedure mnuExitClick(Sender: TObject); procedure mnuFlatShowHeightClick(Sender: TObject); procedure mnuFlushClick(Sender: TObject); procedure mnuGoToClientClick(Sender: TObject); + procedure GrabBoundaries(Sender: TObject); + procedure mnuGrabFilterHueClick(Sender: TObject); + procedure mnuGrabFilterTileIDClick(Sender: TObject); procedure mnuGrabHueClick(Sender: TObject); procedure mnuGrabTileIDClick(Sender: TObject); + procedure mnuGrabVirtualLayerZClick(Sender: TObject); procedure mnuLargeScaleCommandsClick(Sender: TObject); + procedure mnuMakeScreenShotClick(Sender: TObject); procedure mnuRegionControlClick(Sender: TObject); + procedure mnuReloadGroupsClick(Sender: TObject); + procedure mnuRusComClick(Sender: TObject); + procedure mnuSetLanguageClick(Sender: TObject); procedure mnuShowAnimationsClick(Sender: TObject); + procedure mnuShowBlocksClick(Sender: TObject); + procedure mnuShowBridgesClick(Sender: TObject); + procedure mnuShowGridClick(Sender: TObject); + procedure mnuShowLightSourceClick(Sender: TObject); + procedure mnuShowNoDrawTilesClick(Sender: TObject); + procedure mnuShowStaticsOptionClick(Sender: TObject); procedure mnuShutdownClick(Sender: TObject); + procedure mnuTileListDrawClick(Sender: TObject); + procedure mnuTileListViewClick(Sender: TObject); procedure mnuWhiteBackgroundClick(Sender: TObject); + procedure mnuWindowedModeClick(Sender: TObject); + procedure mnuZoomClick(Sender: TObject); + procedure oglGameWindowClick(Sender: TObject); procedure oglGameWindowDblClick(Sender: TObject); procedure oglGameWindowKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); @@ -248,14 +555,38 @@ type WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); procedure oglGameWindowPaint(Sender: TObject); procedure oglGameWindowResize(Sender: TObject); + procedure pbRadarMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure pbRadarPaint(Sender: TObject); + procedure pcLeftChange(Sender: TObject); + procedure pcLeftResize(Sender: TObject); procedure pmGrabTileInfoPopup(Sender: TObject); - procedure tbFilterMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + procedure DropedownMenusClose(Sender: TObject); + procedure spGroupListMoved(Sender: TObject); + procedure spTileListMoved(Sender: TObject); + procedure tbFilterMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure tbFilterMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); procedure tbRadarMapClick(Sender: TObject); - procedure tbStaticsClick(Sender: TObject); - procedure tbTerrainClick(Sender: TObject); procedure tmGrabTileInfoTimer(Sender: TObject); procedure tmMovementTimer(Sender: TObject); + procedure tmSelectNodeTimer(Sender: TObject); + procedure tmSettingsCloseTimer(Sender: TObject); + procedure tsNavigationContextPopup(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); + procedure tvGroupFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure tvGroupsChange(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure tvGroupsDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; + Node: PVirtualNode; Column: TColumnIndex; const CellText: String; + const CellRect: TRect; var DefaultDraw: Boolean); + procedure tvGroupsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState + ); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure tvSelectGroupsChanged(Sender: TObject); procedure vdtRandomClick(Sender: TObject); procedure vdtRandomDragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; @@ -268,7 +599,10 @@ type procedure vdtRandomSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); procedure vdtRandomUpdating(Sender: TBaseVirtualTree; State: TVTUpdateState); + procedure vdtTilesChange(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vdtTilesClick(Sender: TObject); + procedure vdtTilesDragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; var Allowed: Boolean); procedure vdtTilesDrawHint(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; const R: TRect; Column: TColumnIndex); procedure vdtTilesDrawNode(Sender: TBaseVirtualTree; @@ -285,6 +619,11 @@ type procedure vstChatPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); + procedure vstClientsGetImageIndex(Sender: TBaseVirtualTree; + Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; + var Ghosted: Boolean; var ImageIndex: Integer); + procedure vstClientsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); procedure vstLocationsDblClick(Sender: TObject); procedure vstLocationsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode ); @@ -297,10 +636,13 @@ type procedure vstLocationsSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); procedure XMLPropStorage1RestoreProperties(Sender: TObject); + procedure XMLPropStorage1SavingProperties(Sender: TObject); protected { Members } - FAppDir: String; - FConfigDir: String; + FAppDir: String; // .\ + FLocalDir: String; // .\..\LocalData\ + FConfigDir: String; // {$User}\AppData\Local\CentrED-plus\ - зависит от реестра + FProfileDir: String; // {$User}\AppData\Local\CentrED-plus\Profiles\{$Profile}\ - зависит от реестра FX: Integer; FY: Integer; FDrawDistance: Integer; @@ -319,6 +661,8 @@ type FVirtualTiles: TWorldItemList; FVLayerImage: TSingleImage; FVLayerMaterial: TMaterial; + FVLightSrcImage: array[1..FVLightSrcImageCount] of TSingleImage; + FVLightSrcMaterial: ^TMaterial; FOverlayUI: TOverlayUI; FLocationsFile: string; FRandomPresetsFile: string; @@ -327,18 +671,41 @@ type FAccessChangedListeners: TAccessChangedListeners; FRepaintNeeded: Boolean; FSelection: TRect; - FUndoList: TPacketList; + FUndoList: PPacketList; + FUndoListArray: array[1..FUndoListLength] of TPacketList; + FUndoListFirstIndex: Word; + FundoListLastIndex: Word; + FEntryList: TEntryList; + FBrushList: TBrushList; + FSurfsList: TSurfsList; + + FGroupsSelectionUndoRedoCommandGroup: TUndoRedoCommandGroup; + FGroupsSelectionUndoRedoManager: TUndoRedoManager; + FTilesSelectionUndoRedoCommandGroup: TUndoRedoCommandGroup; + FTilesSelectionUndoRedoManager: TUndoRedoManager; + FGLFont: TGLFont; FSelectionListeners: TSelectionListeners; FTileHint: TTileHintInfo; FLightManager: TLightManager; + FVisibleTiles: TBits; + FLightSourceTiles: PLightTile; { Methods } + function GetNextUndoList: PPacketList; + function LoadListError(condition: Boolean; filename, message : string): Boolean; + procedure LoadVisibleTiles(AFileName: String); + procedure LoadLightSourceTiles(AFileName: String); + procedure LoadEntryTilesList; + procedure LoadBrushTilesList; + procedure LoadSurfsTilesList; + procedure BuildGroupList; procedure BuildTileList; + procedure FreeGroupLists; function ConfirmAction: Boolean; function FindRandomPreset(AName: String): TDOMElement; procedure ForceUpdateCurrentTile; procedure GetDrawOffset(AX, AY: Integer; out DrawX, DrawY: Integer); inline; - function GetInternalTileID(ATile: TWorldItem): Word; + function GetInternalTileID(ATile: TWorldItem): LongWord; function GetSelectedRect: TRect; procedure InitRender; procedure InitSize; @@ -382,6 +749,11 @@ type property CurrentTile: TWorldItem read FCurrentTile write SetCurrentTile; property SelectedTile: TWorldItem read FSelectedTile write SetSelectedTile; property LightManager: TLightManager read FLightManager; + property AppDir: string read FAppDir; + property LocalDir: string read FLocalDir; + property ConfigDir: string read FConfigDir; + property ProfileDir: string read FProfileDir; + { Methods } procedure InvalidateFilter; procedure InvalidateScreenBuffer; @@ -391,6 +763,46 @@ type procedure SwitchToSelection; procedure UnregisterAccessChangedListener(AListener: TAccessChangedListener); procedure UnregisterSelectionListener(AListener: TSelectionListener); + public + {Localization} + lbFormTitleAccount: string; + lbFormTitleProfile: string; + lbBottomCursorVLayer1: string; + lbBottomCursorVLayer2: string; + lbBottomCursorItemID: string; + lbBottomCursorLandID: string; + lbBottomCursorPosX: string; + lbBottomCursorPosY: string; + lbBottomCursorPosZ: string; + lbBottomCursorItemHue: string; + lbToolbarUndo: string; + + lbDlgWindowedModeSwitchCaption: string; + lbDlgWindowedModeSwitch: string; + lbScreenShotMsg: string; + lbUserLoginedMsg: string; + lbUserLogoutedMsg: string; + lbDlgGetDcErrCaption: string; + lbDlgGetDcErr: string; + lbDlgFreeDcErrCaption: string; + lbDlgFreeDcErr: string; + lbDlgCnangedAccessCaption: string; + lbDlgCnangedAccess: string; + lbDlgBlockedAccessCaption: string; + lbDlgBlockedAccess: string; + + lbDlgSaveRandPrsCaption: string; + lbDlgSaveRandPrs: string; + lbDlgSearchIdErrCaption: string; + lbDlgSearchIdErr: string; + lbDlgNotFoundErrCaption: string; + lbDlgNotFoundErr: string; + + lbDlgDelConfCaption: string; + lbDlgDelConf: string; + lbDlgNewQuerryCaption: string; + lbDlgNewQuerry: string; + end; var @@ -399,18 +811,23 @@ var implementation uses - UdmNetwork, UArt, UTiledata, UAdminHandling, UPackets, + UdmNetwork, UArt, UTexture, UHue, UTiledata, UAdminHandling, UPackets, UfrmAccountControl, UGraphicHelper, ImagingComponents, UfrmDrawSettings, UfrmBoundaries, UfrmElevateSettings, UfrmConfirmation, UfrmMoveSettings, UfrmAbout, UPacketHandlers, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand, UfrmLogin, UResourceManager, UfrmVirtualLayer, UfrmFilter, UfrmRegionControl, - Logging, LConvEncoding, LCLType, UfrmLightlevel; + Logging, LConvEncoding, LCLType, UfrmLightlevel, vinfo, Imaging, Language, + UfrmEditAccount, UfrmFillSettings, UfrmSelectionSettings, UfrmInitialize, + UfrmSurfElevateSettings, UfrmSurfStretchSettings, UfrmSurfSmoothSettings, Crc32Hash; + +{$I version.inc} type TGLArrayf4 = array[0..3] of GLfloat; PTileInfo = ^TTileInfo; TTileInfo = record - ID: Word; + ID: LongWord; + ptr: Pointer; end; PChatInfo = ^TChatInfo; TChatInfo = record @@ -424,6 +841,16 @@ type Y: Word; Name: string; end; + PClientInfo = ^TClientInfo; + TClientInfo = record + Name: string; + AccessLevel: TAccessLevel; + LogonDateTime : TDateTime; + //Time: string; + //Map: Byte; + //X: Word; + //Y: Word; + end; const CScreenBufferValid = [sbsValid, sbsIndexed, sbsFiltered]; @@ -445,6 +872,43 @@ end; procedure TfrmMain.mnuFlatShowHeightClick(Sender: TObject); begin + tbFlat.Down := acFlat.Checked; + RebuildScreenBuffer; +end; + +procedure TfrmMain.mnuShowNoDrawTilesClick(Sender: TObject); +begin + tbNoDraw.Down := acNoDraw.Checked; + RebuildScreenBuffer; + FRepaintNeeded := True; +end; + +procedure TfrmMain.mnuShowLightSourceClick(Sender: TObject); +begin + tbNoDraw.Down := acNoDraw.Checked; + RebuildScreenBuffer; + FRepaintNeeded := True; +end; + +procedure TfrmMain.mnuShowGridClick(Sender: TObject); +begin + tbTerrain.Down := acTerrain.Checked; + mnuShowBlocks.Checked := False; + RebuildScreenBuffer; + FRepaintNeeded := True; +end; + +procedure TfrmMain.mnuShowBlocksClick(Sender: TObject); +begin + tbTerrain.Down := acTerrain.Checked; + mnuShowGrid.Checked := False; + RebuildScreenBuffer; + FRepaintNeeded := True; +end; + +procedure TfrmMain.mnuShowStaticsOptionClick(Sender: TObject); +begin + tbStatics.Down := acStatics.Checked; RebuildScreenBuffer; end; @@ -454,9 +918,85 @@ begin end; procedure TfrmMain.mnuGoToClientClick(Sender: TObject); +var + mpos: TPoint; + node: PVirtualNode; + clientInfo: PClientInfo; begin - if lbClients.ItemIndex > -1 then - dmNetwork.Send(TGotoClientPosPacket.Create(lbClients.Items.Strings[lbClients.ItemIndex])); + mpos := vstClients.ScreenToClient(Mouse.CursorPos); + node := vstClients.GetNodeAt(mpos.X, mpos.Y);// .GetFirstSelected; + if node <> nil then + begin + clientInfo := vstClients.GetNodeData(node); + dmNetwork.Send(TGotoClientPosPacket.Create(clientInfo^.Name)); + end; + +end; + +procedure TfrmMain.mnuGrabTileIDClick(Sender: TObject); +var + internalTileID: LongWord; + item: PVirtualItem; + tileInfo: PTileInfo; + treeNode: PVirtualNode; + + function TileInNode(Node: PVirtualNode; TileID: LongWord) : Boolean; + var + nodeData: ^TGroupNode; + i: Integer; + begin + Result := False; + nodeData := tvGroups.GetNodeData(Node); + for i := 0 to nodeData^.Count - 1 do + begin + if nodeData^.GTile[i].ID = TileID then + begin + Result := True; + break; + end; + end; + end; + +begin + Logger.Send([lcClient, lcDebug], 'TfrmMain.mnuGrabTileIDClick', TRUE); + if CurrentTile <> nil then + begin + internalTileID := GetInternalTileID(CurrentTile); + + // Выбираем группы + if (not cbStatics.Checked) and (not cbTerrain.Checked) then + begin + treeNode := tvGroups.GetFirst(); + while treeNode <> nil do + begin + if TileInNode(treeNode, internalTileID) then + begin + tvGroups.Selected[treeNode] := True; + tvGroups.FocusedNode := treeNode; + if toMultiSelect in tvGroups.TreeOptions.SelectionOptions + then break; + end; + treeNode := tvGroups.GetNext(treeNode); + end; + end; + + Logger.Send([lcClient, lcDebug], 'TfrmMain.mnuGrabTileIDClick', internalTileID); + // Выбираем тайл + item := vdtTiles.GetFirst; + while item <> nil do + begin + tileInfo := vdtTiles.GetNodeData(item); + if tileInfo^.ID = internalTileID then + begin + vdtTiles.ClearSelection; + vdtTiles.Selected[item] := True; + vdtTiles.FocusedNode := item; + Break; + end; + item := vdtTiles.GetNext(item); + end; + end; + Logger.Send([lcClient, lcDebug], 'TfrmMain.mnuGrabTileIDClick', FALSE); end; procedure TfrmMain.mnuGrabHueClick(Sender: TObject); @@ -468,31 +1008,55 @@ begin end; end; -procedure TfrmMain.mnuGrabTileIDClick(Sender: TObject); -var - internalTileID: Integer; - node: PVirtualNode; - tileInfo: PTileInfo; +procedure TfrmMain.mnuGrabFilterTileIDClick(Sender: TObject); begin - if CurrentTile <> nil then + if CurrentTile is TStaticItem then begin - internalTileID := GetInternalTileID(CurrentTile); - node := vdtTiles.GetFirst; - while node <> nil do - begin - tileInfo := vdtTiles.GetNodeData(node); - if tileInfo^.ID = internalTileID then - begin - vdtTiles.ClearSelection; - vdtTiles.Selected[node] := True; - vdtTiles.FocusedNode := node; - Break; - end; - node := vdtTiles.GetNext(node); - end; + frmFilter.AddTile(GetInternalTileID(CurrentTile)); + frmFilter.cbTileFilter.Checked := True; + frmMain.InvalidateFilter; end; end; +procedure TfrmMain.mnuGrabFilterHueClick(Sender: TObject); +begin + if CurrentTile is TStaticItem then + begin + frmFilter.AddHue(TStaticItem(CurrentTile).Hue); + frmFilter.cbHueFilter.Checked := True; + frmMain.InvalidateFilter; + end; +end; + +procedure TfrmMain.mnuGrabVirtualLayerZClick(Sender: TObject); +begin + frmVirtualLayer.seZ.Value := CurrentTile.Z; + frmVirtualLayer.seZChange(frmVirtualLayer.seZ); + if not frmVirtualLayer.cbShowLayer.Checked then + begin + frmVirtualLayer.cbShowLayer.Checked := True; + frmMain.InvalidateScreenBuffer; + end; + //cursorNeedsUpdate := True; + //Handled := True; +end; + +procedure TfrmMain.GrabBoundaries(Sender: TObject); +begin + if Sender = mnuGrabBoundMinZ then begin + frmBoundaries.seMinZ.Value := CurrentTile.Z; frmBoundaries.seMinZChange(nil); end + else if Sender = mnuGrabBoundMaxZ then begin + frmBoundaries.seMaxZ.Value := CurrentTile.Z; frmBoundaries.seMaxZChange(nil); end + else if Sender = mnuGrabBoundMinX then begin + frmBoundaries.seMinX.Value := CurrentTile.X; frmBoundaries.seMinXChange(nil); end + else if Sender = mnuGrabBoundMaxX then begin + frmBoundaries.seMaxX.Value := CurrentTile.X; frmBoundaries.seMaxXChange(nil); end + else if Sender = mnuGrabBoundMinY then begin + frmBoundaries.seMinY.Value := CurrentTile.Y; frmBoundaries.seMinYChange(nil); end + else if Sender = mnuGrabBoundMaxY then begin + frmBoundaries.seMaxY.Value := CurrentTile.Y; frmBoundaries.seMaxYChange(nil); end; +end; + procedure TfrmMain.mnuLargeScaleCommandsClick(Sender: TObject); begin frmLargeScaleCommand.Show; @@ -509,16 +1073,102 @@ begin RebuildScreenBuffer; end; +procedure TfrmMain.mnuShowBridgesClick(Sender: TObject); +begin + +end; + procedure TfrmMain.mnuShutdownClick(Sender: TObject); begin dmNetwork.Send(TQuitServerPacket.Create('')); end; + + procedure TfrmMain.mnuWhiteBackgroundClick(Sender: TObject); begin FRepaintNeeded := True; end; +procedure TfrmMain.mnuWindowedModeClick(Sender: TObject); +var btn: Integer; +begin + btn := MessageDlg(lbDlgWindowedModeSwitchCaption, lbDlgWindowedModeSwitch, + mtConfirmation, mbYesNoCancel, 0); + // btn=2=mbCancel; btn=6=mbYes; btn=7=mbNo; + // Почему так хз, по идее btn=ord(mbCancel) или TMsgDlgBtn(btn)=mbCancel, + // но этой чертовой среде ничего нравитсо ("Pascale must die") + if btn = 2 then mnuWindowedMode.Checked := not mnuWindowedMode.Checked else begin + XMLPropStorage1.Save; + if btn = 6 then begin + XMLPropStorage1.Restore; + dmNetwork.Disconnect; + end; + end; +end; + +procedure TfrmMain.mnuZoomClick(Sender: TObject); +var + zoom : Single; + cache: Integer; +begin + + if Sender = tbZoom then begin + if tbZoom.Down then mnuZoomClick(mnuZoom100) + else case tbZoom.Tag of + 250: mnuZoomClick(mnuZoom025); + 333: mnuZoomClick(mnuZoom033); + 500: mnuZoomClick(mnuZoom050); + 750: mnuZoomClick(mnuZoom075); + 1000: mnuZoomClick(mnuZoom100); + 1500: mnuZoomClick(mnuZoom150); + 2000: mnuZoomClick(mnuZoom200); + 3000: mnuZoomClick(mnuZoom300); + 4000: mnuZoomClick(mnuZoom400); + end; + exit; + end; + + if (Sender as TMenuItem).Checked then begin + if mnuZoom100 <> Sender then + mnuZoomClick(mnuZoom100); + exit; + end; + + (Sender as TMenuItem).Checked := True; + if mnuZoom025 <> Sender then mnuZoom025.Checked:= False else begin zoom:=0.250; cache:=4096; end; + if mnuZoom033 <> Sender then mnuZoom033.Checked:= False else begin zoom:=0.333; cache:=2048; end; + if mnuZoom050 <> Sender then mnuZoom050.Checked:= False else begin zoom:=0.500; cache:=1024; end; + if mnuZoom075 <> Sender then mnuZoom075.Checked:= False else begin zoom:=0.750; cache:= 512; end; + if mnuZoom100 <> Sender then mnuZoom100.Checked:= False else begin zoom:=1.000; cache:= 256; end; + if mnuZoom150 <> Sender then mnuZoom150.Checked:= False else begin zoom:=1.500; cache:= 128; end; + if mnuZoom200 <> Sender then mnuZoom200.Checked:= False else begin zoom:=2.000; cache:= 64; end; + if mnuZoom300 <> Sender then mnuZoom300.Checked:= False else begin zoom:=3.000; cache:= 32; end; + if mnuZoom400 <> Sender then mnuZoom400.Checked:= False else begin zoom:=4.000; cache:= 16; end; + + cache := 2 * Trunc(Sqrt(oglGameWindow.Width * oglGameWindow.Width + + oglGamewindow.Height * oglGamewindow.Height) / (44 * zoom)); + cache := cache*cache; + + //cache := 4096; + FLandscape.ResizeBlockCache(cache); + + if zoom < 1.0 then tbZoom.ImageIndex:= 37 else + if zoom > 1.0 then tbZoom.ImageIndex:= 36 else + tbZoom.ImageIndex:= 35; + tbZoom.Down := zoom <> 1.0; + if zoom <> 1.0 then + tbZoom.Tag := Trunc(zoom * 1000.0); + + FRepaintNeeded := True; + RebuildScreenBuffer; +end; + +procedure TfrmMain.oglGameWindowClick(Sender: TObject); +begin + +end; + procedure TfrmMain.oglGameWindowDblClick(Sender: TObject); begin if (acSelect.Checked) and (CurrentTile <> nil) then @@ -527,27 +1177,29 @@ end; procedure TfrmMain.oglGameWindowKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +var step, zoomfactor: Integer; begin - if Shift <> [] then - Exit; + if tbZoom.Down then zoomfactor := tbZoom.Tag else zoomfactor := 1000; + if Shift = [ssShift] + then step := 1 + else if Shift = [] + then step := 8000 div zoomfactor + else exit; case Key of - VK_W, VK_NUMPAD8, VK_UP: - MoveBy(-8, -8); - VK_S, VK_NUMPAD2, VK_DOWN: - MoveBy(8, 8); - VK_A, VK_NUMPAD4, VK_LEFT: - MoveBy(-8, 8); - VK_D, VK_NUMPAD6, VK_RIGHT: - MoveBy(8, -8); - VK_Q, VK_NUMPAD7: - MoveBy(-8, 0); - VK_E, VK_NUMPAD9: - MoveBy(0, -8); - VK_Y, VK_NUMPAD1: - MoveBy(0, 8); - VK_C, VK_NUMPAD3: - MoveBy(8, 0); + VK_W, VK_NUMPAD8, VK_UP: MoveBy(-step, -step); + VK_S, VK_NUMPAD2, VK_DOWN: MoveBy(+step, +step); + VK_A, VK_NUMPAD4, VK_LEFT: MoveBy(-step, +step); + VK_D, VK_NUMPAD6, VK_RIGHT: MoveBy(+step, -step); + VK_Q, VK_NUMPAD7: MoveBy(-step, 0); + VK_E, VK_NUMPAD9: MoveBy(0, -step); + VK_Y, VK_NUMPAD1: MoveBy(0, +step); + VK_G, VK_NUMPAD3: MoveBy(+step, 0); + VK_SPACE: if frmFilter.Visible then begin + frmFilter.Locked := True; + frmFilter.Hide; + frmFilter.Locked := False; + end else frmFilter.Show; end; end; @@ -559,6 +1211,9 @@ begin if Button = mbRight then pmTools.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y); + if Button = mbMiddle then + tmGrabTileInfoTimer(Sender); + if Button <> mbLeft then Exit; @@ -585,7 +1240,7 @@ begin FOverlayUI.Visible := True; - if frmFilter.Visible then + if (frmFilter.Visible and mnuAutoShowFilterWindow.Checked) then begin frmFilter.Locked := True; frmFilter.Hide; @@ -646,7 +1301,7 @@ var offsetX, offsetY: Integer; tile: TWorldItem; tileX, tileY, newX, newY: Word; - targetTiles: TWorldItemList; + targetBlocks: TBlockInfoList; //а в чем разница с targetTiles: TWorldItemList; ? targetTile: TWorldItem; begin Logger.EnterMethod([lcClient, lcDebug], 'MouseUp'); @@ -682,22 +1337,20 @@ begin if (not acSelect.Checked) and (targetTile <> nil) and (SelectedTile <> nil) then begin targetRect := GetSelectedRect; - FUndoList.Clear; + FUndoList := GetNextUndoList; if (SelectedTile = targetTile) or ConfirmAction then begin if acDraw.Checked then //***** Drawing Mode *****// begin - for tileX := FSelection.Left to FSelection.Right do - for tileY := FSelection.Top to FSelection.Bottom do + for tileX := FSelection.Left-1 to FSelection.Right do + for tileY := FSelection.Top-1 to FSelection.Bottom do begin map := FLandscape.MapCell[tileX, tileY]; if map.IsGhost then begin - FUndoList.Add(TDrawMapPacket.Create(tileX, tileY, map.RawZ, - map.RawTileID)); - dmNetwork.Send(TDrawMapPacket.Create(tileX, tileY, map.Z, - map.TileID)); + FUndoList^.Add(TDrawMapPacket.Create(tileX, tileY, map.RawZ, map.RawTileID)); + dmNetwork.Send(TDrawMapPacket.Create(tileX, tileY, map.Z, map.TileID)); end; end; @@ -707,9 +1360,8 @@ begin tile := FVirtualTiles[i]; if tile is TGhostTile then begin - dmNetwork.Send(TInsertStaticPacket.Create(tile.X, tile.Y, tile.Z, - tile.TileID, TGhostTile(tile).Hue)); - FUndoList.Add(TDeleteStaticPacket.Create(TGhostTile(tile))); + dmNetwork.Send(TInsertStaticPacket.Create(tile.X, tile.Y, tile.Z, tile.TileID, TGhostTile(tile).Hue)); + FUndoList^.Add(TDeleteStaticPacket.Create(TGhostTile(tile))); end; end; end else if (SelectedTile <> targetTile) or targetTile.CanBeEdited then @@ -717,10 +1369,18 @@ begin if (not acMove.Checked) or (SelectedTile <> targetTile) or (not frmMoveSettings.cbAsk.Checked) or ConfirmAction then begin - targetTiles := TWorldItemList.Create(False); + targetBlocks := TBlockInfoList.Create; if SelectedTile = targetTile then begin - targetTiles.Add(targetTile) + blockInfo := nil; + while FScreenBuffer.Iterate(blockInfo) do + begin + if blockInfo^.Item = targetTile then + begin + targetBlocks.Add(blockInfo); + Break; + end; + end; end else begin blockInfo := nil; @@ -730,7 +1390,7 @@ begin blockInfo^.Item.CanBeEdited and IsInRect(blockInfo^.Item.X, blockInfo^.Item.Y, targetRect) then begin - targetTiles.Add(blockInfo^.Item); + targetBlocks.Add(blockInfo); end; end; end; @@ -739,25 +1399,56 @@ begin begin offsetX := frmMoveSettings.GetOffsetX; offsetY := frmMoveSettings.GetOffsetY; - for i := 0 to targetTiles.Count - 1 do - begin - tile := targetTiles.Items[i]; - if tile is TStaticItem then - begin + if (frmMoveSettings.cbLand.Checked) then begin + if offsetX >= 0 then newX := $7FFF else newX := 0; + if offsetY >= 0 then newY := $7FFF else newY := 0; + for i := 0 to targetBlocks.Count - 1 do if (targetBlocks.Items[i]^.Item is TMapCell) then begin + if offsetX >= 0 then newX := min(newX, targetBlocks.Items[i]^.Item.X) else newX := max(newX, targetBlocks.Items[i]^.Item.X - 1); + if offsetY >= 0 then newY := min(newY, targetBlocks.Items[i]^.Item.Y) else newY := max(newY, targetBlocks.Items[i]^.Item.Y - 1); + end; + + tileX := 0; + if offsetY > 0 then for i := newY to newY + offsetY do inc(tileX, FLandscape.MapCell[newX,i].RawZ+128) else + if offsetY < 0 then for i := newY + offsetY to newY do inc(tileX, FLandscape.MapCell[newX,i].RawZ+128); + if offsetX > 0 then for i := newX to newX + offsetX do inc(tileX, FLandscape.MapCell[i,newY].RawZ+128) else + if offsetX < 0 then for i := newX + offsetX to newX do inc(tileX, FLandscape.MapCell[i,newY].RawZ+128); + if (offsetX <> 0) and (offsetY <> 0) + then tileY := tileX div (abs(offsetX) + abs(offsetY) + 2) + else tileY := tileX div (abs(offsetX) + abs(offsetY) + 1); + z := max(-128, min(tileY - 128, +127)); + end; + + for i := 0 to targetBlocks.Count - 1 do + begin + if frmMoveSettings.cbLand.Checked and (((offsetY > 0) or (offsetX > 0)) and not ((offsetY > 0) and (offsetX < 0))) + then tileY := abs(i - targetBlocks.Count + 1) else tileY := i; + tile := targetBlocks.Items[tileY]^.Item; + + if (frmMoveSettings.cbItem.Checked) and (tile is TStaticItem) then begin newX := EnsureRange(tile.X + offsetX, 0, FLandscape.CellWidth - 1); newY := EnsureRange(tile.Y + offsetY, 0, FLandscape.CellHeight - 1); - FUndoList.Add(TMoveStaticPacket.Create(newX, newY, tile.Z, - tile.TileID, TStaticItem(tile).Hue, tile.X, tile.Y)); - dmNetwork.Send(TMoveStaticPacket.Create(TStaticItem(tile), - newX, newY)); + FUndoList^.Add(TMoveStaticPacket.Create(newX, newY, tile.Z, tile.TileID, TStaticItem(tile).Hue, tile.X, tile.Y)); + dmNetwork.Send(TMoveStaticPacket.Create(TStaticItem(tile), newX, newY)); + end; + if (frmMoveSettings.cbLand.Checked) and (tile is TMapCell) then begin + newX := EnsureRange(tile.X + offsetX, 0, FLandscape.CellWidth - 1); + newY := EnsureRange(tile.Y + offsetY, 0, FLandscape.CellHeight - 1); + map := FLandscape.MapCell[newX, newY]; + + // Это не очень хорошо, для оптимизации следует ввести специальный пакет TMoveMapPacket + FUndoList^.Add(TDrawMapPacket.Create(tile.X, tile.Y, tile.Z, tile.TileID)); + FUndoList^.Add(TDrawMapPacket.Create(newX, newY, map.RawZ, map.TileID)); + dmNetwork.Send(TDrawMapPacket.Create(tile.X, tile.Y, z, $0001)); + dmNetwork.Send(TDrawMapPacket.Create(newX, newY, tile.Z, tile.TileID)); + end; end; end else if acElevate.Checked then //***** Elevate tile *****// begin - for i := 0 to targetTiles.Count - 1 do + for i := 0 to targetBlocks.Count - 1 do begin - tile := targetTiles.Items[i]; + tile := targetBlocks.Items[i]^.Item; z := frmElevateSettings.seZ.Value; if frmElevateSettings.rbRaise.Checked then @@ -769,54 +1460,57 @@ begin begin if frmElevateSettings.cbRandomHeight.Checked then Inc(z, Random(frmElevateSettings.seRandomHeight.Value)); - FUndoList.Add(TDrawMapPacket.Create(tile.X, tile.Y, tile.Z, + FUndoList^.Add(TDrawMapPacket.Create(tile.X, tile.Y, tile.Z, tile.TileID)); dmNetwork.Send(TDrawMapPacket.Create(tile.X, tile.Y, z, tile.TileID)); end else begin - FUndoList.Add(TElevateStaticPacket.Create(tile.X, tile.Y, + FUndoList^.Add(TElevateStaticPacket.Create(tile.X, tile.Y, z, tile.TileID, TStaticItem(tile).Hue, tile.Z)); dmNetwork.Send(TElevateStaticPacket.Create(TStaticItem(tile), z)); end; end; end else if acDelete.Checked then //***** Delete tile *****// begin - for i := 0 to targetTiles.Count - 1 do + Logger.Send([lcClient, lcDebug], 'targetBlocks.Count', targetBlocks.Count); + for i := 0 to targetBlocks.Count - 1 do begin - tile := targetTiles.Items[i]; - + tile := targetBlocks.Items[i]^.Item; if tile is TStaticItem then begin - FUndoList.Add(TInsertStaticPacket.Create(tile.X, tile.Y, + FUndoList^.Add(TInsertStaticPacket.Create(tile.X, tile.Y, tile.Z, tile.TileID, TStaticItem(tile).Hue)); dmNetwork.Send(TDeleteStaticPacket.Create(TStaticItem(tile))); end; end; end else if acHue.Checked then //***** Hue tile *****// begin - for i := 0 to targetTiles.Count - 1 do + for i := 0 to targetBlocks.Count - 1 do begin - tile := targetTiles.Items[i]; + blockInfo := targetBlocks.Items[i]; + tile := blockInfo^.Item; - if (tile is TStaticItem) and - (TStaticItem(tile).Hue <> frmHueSettings.lbHue.ItemIndex) then + if blockInfo^.HueOverride and (tile is TStaticItem) then begin - FUndoList.Add(THueStaticPacket.Create(tile.X, tile.Y, tile.Z, - tile.TileID, frmHueSettings.lbHue.ItemIndex, - TStaticItem(tile).Hue)); + if TStaticItem(tile).Hue <> blockInfo^.Hue then + begin + FUndoList^.Add(THueStaticPacket.Create(tile.X, tile.Y, tile.Z, + tile.TileID, blockInfo^.Hue, TStaticItem(tile).Hue)); dmNetwork.Send(THueStaticPacket.Create(TStaticItem(tile), - frmHueSettings.lbHue.ItemIndex)); + blockInfo^.Hue)); + end; end; end; + blockInfo := nil; end; - targetTiles.Free; + targetBlocks.Free; end; end; end; end; - acUndo.Enabled := FUndoList.Count > 0; + acUndo.Enabled := FUndoList^.Count > 0; SelectedTile := nil; FRepaintNeeded := True; Logger.ExitMethod([lcClient, lcDebug], 'MouseUp'); @@ -828,12 +1522,48 @@ var cursorNeedsUpdate: Boolean; newZ: ShortInt; begin - if CurrentTile = nil then - Exit; - //We want single steps ... WheelDelta := WheelDelta div WHEEL_DELTA; + if ((Word(GetKeyState(VK_X)) and $8000)<>0) then begin + if (Shift = [ssCtrl]) then begin + frmBoundaries.seMinX.Value := frmBoundaries.seMinX.Value + min(max(WheelDelta, + frmBoundaries.seMinX.MinValue-frmBoundaries.seMinX.Value), + frmBoundaries.seMinX.MaxValue-frmBoundaries.seMinX.Value); + frmBoundaries.seMinXChange(nil); exit; end + else if (Shift = [ssShift]) then begin + frmBoundaries.seMaxX.Value := frmBoundaries.seMaxX.Value + min(max(WheelDelta, + frmBoundaries.seMaxX.MinValue-frmBoundaries.seMaxX.Value), + frmBoundaries.seMaxX.MaxValue-frmBoundaries.seMaxX.Value); + frmBoundaries.seMaxXChange(nil); exit; end; + end else if ((Word(GetKeyState(VK_C)) and $8000)<>0) then begin + if (Shift = [ssCtrl]) then begin + frmBoundaries.seMinY.Value := frmBoundaries.seMinY.Value + min(max(WheelDelta, + frmBoundaries.seMinY.MinValue-frmBoundaries.seMinY.Value), + frmBoundaries.seMinY.MaxValue-frmBoundaries.seMinY.Value); + frmBoundaries.seMinYChange(nil); exit; end + else if (Shift = [ssShift]) then begin + frmBoundaries.seMaxY.Value := frmBoundaries.seMaxY.Value + min(max(WheelDelta, + frmBoundaries.seMaxY.MinValue-frmBoundaries.seMaxY.Value), + frmBoundaries.seMaxY.MaxValue-frmBoundaries.seMaxY.Value); + frmBoundaries.seMaxYChange(nil); exit; end; + end else begin + if (Shift = [ssCtrl]) then begin + frmBoundaries.seMinZ.Value := frmBoundaries.seMinZ.Value + min(max(WheelDelta, + frmBoundaries.seMinZ.MinValue-frmBoundaries.seMinZ.Value), + frmBoundaries.seMinZ.MaxValue-frmBoundaries.seMinZ.Value); + frmBoundaries.seMinZChange(nil); exit; end + else if (Shift = [ssShift]) then begin + frmBoundaries.seMaxZ.Value := frmBoundaries.seMaxZ.Value + min(max(WheelDelta, + frmBoundaries.seMaxZ.MinValue-frmBoundaries.seMaxZ.Value), + frmBoundaries.seMaxZ.MaxValue-frmBoundaries.seMaxZ.Value); + frmBoundaries.seMaxZChange(nil); exit; end; + end; + + + if CurrentTile = nil then + Exit; + cursorNeedsUpdate := False; if (CurrentTile is TVirtualTile) or ((ssCtrl in Shift) and (frmVirtualLayer.cbShowLayer.Checked)) then @@ -845,11 +1575,11 @@ begin Handled := True; end else if not (ssCtrl in Shift) then begin - FUndoList.Clear; + FUndoList := GetNextUndoList; newZ := EnsureRange(CurrentTile.Z + WheelDelta, -128, 127); if CurrentTile is TStaticItem then begin - FUndoList.Add(TElevateStaticPacket.Create(CurrentTile.X, CurrentTile.Y, + FUndoList^.Add(TElevateStaticPacket.Create(CurrentTile.X, CurrentTile.Y, newZ, CurrentTile.TileID, TStaticItem(CurrentTile).Hue, CurrentTile.Z)); dmNetwork.Send(TElevateStaticPacket.Create(TStaticItem(CurrentTile), @@ -858,13 +1588,13 @@ begin Handled := True; end else if CurrentTile is TMapCell then begin - FUndoList.Add(TDrawMapPacket.Create(CurrentTile.X, CurrentTile.Y, + FUndoList^.Add(TDrawMapPacket.Create(CurrentTile.X, CurrentTile.Y, CurrentTile.Z, CurrentTile.TileID)); dmNetwork.Send(TDrawMapPacket.Create(CurrentTile.X, CurrentTile.Y, newZ, CurrentTile.TileID)); Handled := True; end; - acUndo.Enabled := FUndoList.Count > 0; + acUndo.Enabled := FUndoList^.Count > 0; end; if cursorNeedsUpdate then @@ -877,12 +1607,52 @@ begin end; procedure TfrmMain.FormCreate(Sender: TObject); +var + i : Integer; + ARegistry: TRegistry; begin + Logger.EnterMethod([lcLandscape, lcDebug], 'TfrmMain.FormCreate(Sender: TObject)'); + + // Подменяем TVirtualDrawTree на его перегруженный аналог TVirtualList + vdtTiles := TVirtualList.Create(vdtTiles); + vdtRandom := TVirtualList.Create(vdtRandom); + vdlRandom := TVirtualList(vdtRandom); // Лазареусу пчмуто не нравиться если поменять тип у vdtRandom + + oglGameWindow.Cursor := +01; + pcLeft.ActivePageIndex := tsNavigation.PageIndex; + + LanguageTranslate(Self); + Application.TaskBarBehavior := tbSingleButton; + + { + BorderStyle := bsNone; + FormStyle := fsStayOnTop; + WindowState := wsMaximized; + Left:=0; Top:=0; + Width:=1920; + Height:=1200; } + //oglGameWindow.Visible:= false; + //oglGameWindowResize(Sender); + + ARegistry := TRegistry.Create(); + ARegistry.RootKey := HKEY_LOCAL_MACHINE; + ARegistry.OpenKey('\SOFTWARE\Quintessence\UO CentrED+', False); + FAppDir := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); - FConfigDir := GetAppConfigDir(False); + FLocalDir := FAppDir + '..' + PathDelim + 'LocalData' + PathDelim; + if ARegistry.ReadBool('UseConfigDir') + then FConfigDir := GetAppConfigDir(False) + else FConfigDir := FLocalDir + 'UsersData' + PathDelim; + ARegistry.Free; + + if (sprofile <> '') + then FProfileDir := FConfigDir + 'Profiles' + PathDelim + UTF8ToCP1251(sprofile) + PathDelim + else FProfileDir := ''; ForceDirectories(FConfigDir); - XMLPropStorage1.FileName := FConfigDir + 'CentrED.xml'; + if (FProfileDir <> '') + then XMLPropStorage1.FileName := FProfileDir + 'Config.xml' + else XMLPropStorage1.FileName := FConfigDir + 'Config.xml'; XMLPropStorage1.Active := True; FLandscape := ResMan.Landscape; @@ -894,12 +1664,17 @@ begin FLandscape.OnStaticHued := @OnStaticHued; FLandscape.OnStaticInserted := @OnStaticInserted; - if FileExists(FAppDir + 'nodraw.txt') then - FLandscape.LoadNoDrawMap(FAppDir + 'nodraw.txt'); - if FileExists(FConfigDir + 'nodraw.txt') then - FLandscape.LoadNoDrawMap(FConfigDir + 'nodraw.txt'); - if FileExists(ResMan.GetFile('nodraw.txt')) then - FLandscape.LoadNoDrawMap(ResMan.GetFile('nodraw.txt')); + Logger.Send([lcClient, lcInfo], 'LoadNoDrawMap()...'); + if FileExists(FProfileDir + 'VirtualTiles.xml') then + FLandscape.LoadNoDrawMap(FProfileDir + 'VirtualTiles.xml') + else begin + if FileExists(FLocalDir + 'VirtualTiles.xml') then + FLandscape.LoadNoDrawMap(FLocalDir + 'VirtualTiles.xml'); + if FileExists(FConfigDir + 'VirtualTiles.xml') then + FLandscape.LoadNoDrawMap(FConfigDir + 'VirtualTiles.xml'); + if FileExists(ResMan.GetFile('VirtualTiles.xml')) then + FLandscape.LoadNoDrawMap(ResMan.GetFile('VirtualTiles.xml')); + end; FTextureManager := TLandTextureManager.Create; FScreenBuffer := TScreenBuffer.Create; @@ -912,40 +1687,118 @@ begin FLightManager := TLightManager.Create(@GetDrawOffset); ProcessAccessLevel; - + + Logger.Send([lcClient, lcInfo], 'LoadLightSourceTiles()...'); + if FileExists(FProfileDir + 'VirtualTiles.xml') then + LoadLightSourceTiles (FProfileDir + 'VirtualTiles.xml') + else begin + if FileExists(FLocalDir + 'VirtualTiles.xml') then + LoadLightSourceTiles (FLocalDir + 'VirtualTiles.xml'); + if FileExists(FConfigDir + 'VirtualTiles.xml') then + LoadLightSourceTiles (FConfigDir + 'VirtualTiles.xml'); + if FileExists(ResMan.GetFile('VirtualTiles.xml')) then + LoadLightSourceTiles (ResMan.GetFile('VirtualTiles.xml')); + end; + + Logger.Send([lcClient, lcInfo], 'LoadVisibleTiles()...'); + if FileExists(FProfileDir + 'VirtualTiles.xml') then + LoadVisibleTiles(FProfileDir + 'VirtualTiles.xml') + else begin + if FileExists(FLocalDir + 'VirtualTiles.xml') then + LoadVisibleTiles(FLocalDir + 'VirtualTiles.xml'); + if FileExists(FConfigDir + 'VirtualTiles.xml') then + LoadVisibleTiles(FConfigDir + 'VirtualTiles.xml'); + if FileExists(ResMan.GetFile('VirtualTiles.xml')) then + LoadVisibleTiles(ResMan.GetFile('VirtualTiles.xml')); + end; + + Logger.Send([lcClient, lcInfo], 'LoadColorLight()...'); + if FileExists(FProfileDir + 'ColorLight.xml') then + FLightManager.LoadConfig(FProfileDir + 'ColorLight.xml') + else begin + if FileExists(FLocalDir + 'ColorLight.xml') then + FLightManager.LoadConfig(FLocalDir + 'ColorLight.xml'); + if FileExists(FConfigDir + 'ColorLight.xml') then + FLightManager.LoadConfig(FConfigDir + 'ColorLight.xml'); + if FileExists(ResMan.GetFile('ColorLight.xml')) then + FLightManager.LoadConfig(ResMan.GetFile('ColorLight.xml')); + end; + + FTilesSelectionUndoRedoCommandGroup := TUndoRedoCommandGroup.Create; + FGroupsSelectionUndoRedoCommandGroup := TUndoRedoCommandGroup.Create; + FTilesSelectionUndoRedoManager := TUndoRedoManager.Create; + FGroupsSelectionUndoRedoManager := TUndoRedoManager.Create; + tvGroups.NodeDataSize := SizeOf(TGroupNode); vdtTiles.NodeDataSize := SizeOf(TTileInfo); - vdtRandom.NodeDataSize := SizeOf(TTileInfo); + vdlRandom.NodeDataSize := SizeOf(TTileInfo); + //mnuTileListViewClick(nil); + LoadEntryTilesList; + LoadBrushTilesList; + LoadSurfsTilesList; + BuildGroupList; BuildTileList; Randomize; vstChat.NodeDataSize := SizeOf(TChatInfo); - pnlChatHeader.AnchorSide[akBottom].Control := pnlBottom; - - FLocationsFile := FConfigDir + 'Locations.xml'; + pnlChatHeader.AnchorSide[akBottom].Control := pcLeft; + pnlChatHeader.AnchorSide[akBottom].Side := asrBottom; + + if FProfileDir <> '' + then FLocationsFile := FProfileDir + 'Locations.xml' + else FLocationsFile := FConfigDir + 'Locations.xml'; vstLocations.NodeDataSize := SizeOf(TLocationInfo); LoadLocations; + vstClients.NodeDataSize := SizeOf(TClientInfo); + + Logger.Send([lcClient, lcInfo], 'RegisterPacketHandler()...'); RegisterPacketHandler($0C, TPacketHandler.Create(0, @OnClientHandlingPacket)); - FVLayerImage := TSingleImage.CreateFromStream(ResourceManager.GetResource(2)); + FVLayerImage := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/VirtualLayer.tga')); + FVLightSrcImage[ 1] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24nn.tga')); + FVLightSrcImage[ 2] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bw.tga')); + FVLightSrcImage[ 3] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24tw.tga')); + FVLightSrcImage[ 4] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bo.tga')); + FVLightSrcImage[ 5] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24to.tga')); + FVLightSrcImage[ 6] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24by.tga')); + FVLightSrcImage[ 7] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24ty.tga')); + FVLightSrcImage[ 8] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24ny.tga')); + FVLightSrcImage[ 9] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bl.tga')); + FVLightSrcImage[10] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bb.tga')); + FVLightSrcImage[11] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24tb.tga')); + FVLightSrcImage[12] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bg.tga')); + FVLightSrcImage[13] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24tg.tga')); + FVLightSrcImage[14] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24br.tga')); + FVLightSrcImage[15] := TSingleImage.CreateFromStream(ResourceManager.GetResource('Overlay/LightBulb_24bp.tga')); FGLFont := TGLFont.Create; - FGLFont.LoadImage(ResourceManager.GetResource(3)); - FGLFont.LoadFontInfo(ResourceManager.GetResource(4)); + FGLFont.LoadImage(ResourceManager.GetResource('GLFont/DejaVu.png')); + FGLFont.LoadFontInfo(ResourceManager.GetResource('GLFont/DejaVu.fnt')); + Logger.Send([lcClient, lcInfo], 'TWorldItemList.Create(True)...'); FVirtualTiles := TWorldItemList.Create(True); - FUndoList := TPacketList.Create(True); - FRandomPresetsFile := FConfigDir + 'RandomPresets.xml'; + for i:=1 to FUndoListLength do + FUndoListArray[i] := TPacketList.Create(True); + FUndoList := @FUndoListArray[1]; + FUndoListFirstIndex := 0; + FundoListLastIndex := 0; + + if FProfileDir <> '' + then FRandomPresetsFile := FProfileDir + 'RandomPresets.xml' + else FRandomPresetsFile := FConfigDir + 'RandomPresets.xml'; LoadRandomPresets; + Logger.Send([lcClient, lcInfo], 'Завершение загрузки...'); DoubleBuffered := True; - pnlBottom.DoubleBuffered := True; + //pnlBottom.DoubleBuffered := True; FAccessChangedListeners := TAccessChangedListeners.Create; FSelectionListeners := TSelectionListeners.Create; FLastDraw := Now; + + Logger.ExitMethod([lcLandscape, lcDebug], 'TfrmMain.FormCreate(Sender: TObject)'); end; procedure TfrmMain.btnGoToClick(Sender: TObject); @@ -972,17 +1825,17 @@ var i: Integer; preset, tile: TDOMElement; children: TDOMNodeList; - tileNode: PVirtualNode; + tileNode: PVirtualItem; tileInfo: PTileInfo; begin presetName := cbRandomPreset.Text; - if InputQuery('Save Preset', 'Enter the name of the preset:', presetName) then + if InputQuery(lbDlgSaveRandPrsCaption, lbDlgSaveRandPrs, presetName) then begin preset := FindRandomPreset(presetName); if preset = nil then begin preset := FRandomPresetsDoc.CreateElement('Preset'); - preset.AttribStrings['Name'] := presetName; + preset.AttribStrings['Name'] := UTF8ToCP1251(presetName); FRandomPresetsDoc.DocumentElement.AppendChild(preset); cbRandomPreset.Items.AddObject(presetName, preset); end else @@ -992,14 +1845,14 @@ begin preset.RemoveChild(children[i]); end; - tileNode := vdtRandom.GetFirst; + tileNode := vdlRandom.GetFirst; while tileNode <> nil do begin - tileInfo := vdtRandom.GetNodeData(tileNode); + tileInfo := vdlRandom.GetNodeData(tileNode); tile := FRandomPresetsDoc.CreateElement('Tile'); tile.AttribStrings['ID'] := IntToStr(tileInfo^.ID); preset.AppendChild(tile); - tileNode := vdtRandom.GetNext(tileNode); + tileNode := vdlRandom.GetNext(tileNode); end; cbRandomPreset.ItemIndex := cbRandomPreset.Items.IndexOfObject(preset); @@ -1012,13 +1865,13 @@ procedure TfrmMain.cbRandomPresetChange(Sender: TObject); var preset, tile: TDOMElement; tiles: TDOMNodeList; - tileNode: PVirtualNode; + tileNode: PVirtualItem; tileInfo: PTileInfo; i, id: Integer; begin if cbRandomPreset.ItemIndex > -1 then begin - vdtRandom.Clear; + vdlRandom.Clear; preset := TDOMElement(cbRandomPreset.Items.Objects[cbRandomPreset.ItemIndex]); tiles := preset.ChildNodes; for i := 0 to tiles.Count - 1 do @@ -1028,8 +1881,8 @@ begin TryStrToInt(tile.AttribStrings['ID'], id) and (id < FLandscape.MaxStaticID + $4000) then begin - tileNode := vdtRandom.AddChild(nil); - tileInfo := vdtRandom.GetNodeData(tileNode); + tileNode := vdlRandom.AddItem(nil); + tileInfo := vdlRandom.GetNodeData(tileNode); tileInfo^.ID := id; end; end; @@ -1038,25 +1891,27 @@ end; procedure TfrmMain.btnAddRandomClick(Sender: TObject); var - selected, node: PVirtualNode; + selected: PVirtualItem; + node: PVirtualItem; sourceTileInfo, targetTileInfo: PTileInfo; begin - vdtRandom.BeginUpdate; + vdlRandom.BeginUpdate; selected := vdtTiles.GetFirstSelected; while selected <> nil do begin sourceTileInfo := vdtTiles.GetNodeData(selected); - node := vdtRandom.AddChild(nil); - targetTileInfo := vdtRandom.GetNodeData(node); - targetTileInfo^.ID := sourceTileInfo^.ID; + node := vdlRandom.AddItem(nil); + targetTileInfo := vdlRandom.GetNodeData(node); + targetTileInfo^.ID := sourceTileInfo^.ID; + targetTileInfo^.ptr := sourceTileInfo^.ptr; selected := vdtTiles.GetNextSelected(selected); end; - vdtRandom.EndUpdate; + vdlRandom.EndUpdate; end; procedure TfrmMain.btnClearLocationsClick(Sender: TObject); begin - if MessageDlg('Are you sure you want to delete all saved locations?', + if MessageDlg(lbDlgDelConfCaption, lbDlgDelConf, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin vstLocations.Clear; @@ -1086,7 +1941,7 @@ begin if HintStr = '-' then HintInfo.HideTimeout := Application.HintHidePause + Application.HintHidePausePerChar * (Length(FTileHint.Name) + - Length(FTileHint.Flags)); + Length(FTileHint.Obj) + Length(FTileHint.Flags)); end; procedure TfrmMain.btnAddLocationClick(Sender: TObject); @@ -1095,7 +1950,7 @@ var locationInfo: PLocationInfo; begin locationName := ''; - if InputQuery('New Location', 'Enter the name of the new location:', + if InputQuery(lbDlgNewQuerryCaption, lbDlgNewQuerry, locationName) then begin locationInfo := vstLocations.GetNodeData(vstLocations.AddChild(nil)); @@ -1113,17 +1968,66 @@ begin ProcessToolState; end; +procedure TfrmMain.acSelectionExecute(Sender: TObject); +begin + acSelection.Checked := True; + tbSelection.Down := True; + mnuSelection.Checked := True; + frmSelectionSettings.Show; + ProcessToolState; +end; + +function TfrmMain.GetNextUndoList: PPacketList; +var + i: Integer; +begin + Inc(FUndoListLastIndex, 1); + if FUndoListLastIndex > FUndoListLength + then FUndoListLastIndex := 1; + + if (FUndoListFirstIndex = FUndoListLastIndex) or (FUndoListFirstIndex = 0) + then Inc(FUndoListFirstIndex, 1); + if FUndoListFirstIndex > FUndoListLength + then FUndoListFirstIndex := 1; + + if FUndoListFirstIndex <= FUndoListLastIndex + then i := FUndoListLastIndex - FUndoListFirstIndex + 1 + else i := FUndoListLastIndex + FUndoListLength - FUndoListFirstIndex + 1; + tbUndo.Hint := lbToolbarUndo + ' (' + IntToStr(i) + ').'; + + FUndoListArray[FundoListLastIndex].Clear; + GetNextUndoList := @FUndoListArray[FundoListLastIndex]; +end; + procedure TfrmMain.acUndoExecute(Sender: TObject); var i: Integer; begin - for i := FUndoList.Count - 1 downto 0 do + for i := FUndoList^.Count - 1 downto 0 do begin - dmNetwork.Send(FUndoList[i]); - FUndoList[i] := nil; + dmNetwork.Send(FUndoList^[i]); + FUndoList^[i] := nil; end; - FUndoList.Clear; - acUndo.Enabled := False; + FUndoList^.Clear; + + if FUndoListLastIndex = FUndoListFirstIndex then + begin + FUndoListFirstIndex:= 0; + FUndoListLastIndex := 0; + tbUndo.Hint := lbToolbarUndo + ' (0).'; + acUndo.Enabled := False; + end + else + begin + Inc(FUndoListLastIndex, -1); + if FUndoListLastIndex = 0 + then FUndoListLastIndex := FUndoListLength; + FUndoList := @FUndoListArray[FundoListLastIndex]; + if FUndoListFirstIndex <= FUndoListLastIndex + then i := FUndoListLastIndex - FUndoListFirstIndex + 1 + else i := FUndoListLastIndex + FUndoListLength - FUndoListFirstIndex + 1; + tbUndo.Hint := lbToolbarUndo + ' (' + IntToStr(i) + ').'; + end; end; procedure TfrmMain.acVirtualLayerExecute(Sender: TObject); @@ -1131,12 +2035,30 @@ begin frmVirtualLayer.Show; end; +procedure TfrmMain.acTerrainExecute(Sender: TObject); +begin + acTerrain.Checked := not acTerrain.Checked; + //tbTerrain.Down := acTerrain.Checked; + RebuildScreenBuffer; +end; + +procedure TfrmMain.acStaticsExecute(Sender: TObject); +begin + acStatics.Checked := not acStatics.Checked; + RebuildScreenBuffer; +end; + procedure TfrmMain.acWalkableExecute(Sender: TObject); begin InvalidateFilter; FRepaintNeeded := True; end; +procedure TfrmMain.acGridExecute(Sender: TObject); +begin + +end; + procedure TfrmMain.acDrawExecute(Sender: TObject); begin acDraw.Checked := True; @@ -1146,6 +2068,15 @@ begin ProcessToolState; end; +procedure TfrmMain.acFillExecute(Sender: TObject); +begin + acFill.Checked := True; + tbFill.Down := True; + mnuFill.Checked := True; + frmFillSettings.Show; + ProcessToolState; +end; + procedure TfrmMain.acDeleteExecute(Sender: TObject); begin acDelete.Checked := True; @@ -1168,12 +2099,46 @@ begin frmElevateSettings.Show; end; + + +procedure TfrmMain.acSurfElevateExecute(Sender: TObject); +begin + acSurfElevate.Checked := True; + tbSurfElevate.Down := True; + mnuSurfElevate.Checked := True; + frmSurfElevateSettings.Show; + ProcessToolState; +end; + +procedure TfrmMain.acSurfStretchExecute(Sender: TObject); +begin + acSurfStretch.Checked := True; + tbSurfStretch.Down := True; + mnuSurfStretch.Checked := True; + frmSurfStretchSettings.Show; + ProcessToolState; +end; + +procedure TfrmMain.acSurfSmoothExecute(Sender: TObject); +begin + acSurfSmooth.Checked := True; + tbSurfSmooth.Down := True; + mnuSurfSmooth.Checked := True; + frmSurfSmoothSettings.Show; + ProcessToolState; +end; + procedure TfrmMain.acFilterExecute(Sender: TObject); begin if acFilter.Checked then begin frmFilter.Show; frmFilter.Locked := False; + if (tbFilter.Down) then begin + frmFilter.tFormClose.Interval := 1500; + frmFilter.tFormClose.Tag := PtrInt(True); + frmFilter.tFormClose.Enabled := True; + end; end else frmFilter.Hide; InvalidateFilter; @@ -1216,9 +2181,9 @@ end; procedure TfrmMain.btnClearRandomClick(Sender: TObject); begin - vdtRandom.BeginUpdate; - vdtRandom.Clear; - vdtRandom.EndUpdate; + vdlRandom.BeginUpdate; + vdlRandom.Clear; + vdlRandom.EndUpdate; end; procedure TfrmMain.btnDeleteLocationClick(Sender: TObject); @@ -1228,23 +2193,176 @@ end; procedure TfrmMain.btnDeleteRandomClick(Sender: TObject); begin - vdtRandom.BeginUpdate; - vdtRandom.DeleteSelectedNodes; - vdtRandom.EndUpdate; + vdlRandom.BeginUpdate; + vdlRandom.DeleteSelectedNodes; + vdlRandom.EndUpdate; end; procedure TfrmMain.cbStaticsChange(Sender: TObject); begin - if (not cbStatics.Checked) and (not cbTerrain.Checked) then - cbTerrain.Checked := True; - BuildTileList; + //tvGroups.Enabled := not (cbStatics.Checked or cbTerrain.Checked); + if mnuAutoHideGroupList.Checked then begin + if (((cbStatics.Checked) or (cbTerrain.Checked)) = spGroupList.Enabled) + then mnuAutoHideGroupListClick(Sender); + end else if (cbStatics.Checked or cbTerrain.Checked) + then tvGroups.ClearSelection; + + //if (not cbStatics.Checked) and (not cbTerrain.Checked) then + // cbTerrain.Checked := True; + + //if tvGroups.Selected <> nil then + // tvGroups.Selected := nil + //else + BuildTileList; end; procedure TfrmMain.cbTerrainChange(Sender: TObject); +begin + if mnuAutoHideGroupList.Checked then + if (((cbStatics.Checked) or (cbTerrain.Checked)) = spGroupList.Enabled) + then mnuAutoHideGroupListClick(Sender); + //if (not cbTerrain.Checked) and (not cbStatics.Checked) then + // cbStatics.Checked := True; + + //if tvGroups.Selected <> nil then + // tvGroups.Selected := nil + //else + BuildTileList; +end; + +procedure TfrmMain.tvSelectGroupsChanged(Sender: TObject); begin if (not cbTerrain.Checked) and (not cbStatics.Checked) then - cbStatics.Checked := True; - BuildTileList; + BuildTileList; + // if Sender = cbStatics then + // MessageDlg('Ошибка', 'Тайл с указанным ID не был найден.' + + // LineEnding + 'Проверте конфликты настроек фильтров.', mtError, [mbOK], 0); + if cbTerrain.Checked then cbTerrain.Checked := False; + if cbStatics.Checked then cbStatics.Checked := False; +end; + +procedure TfrmMain.mnuReloadGroupsClick(Sender: TObject); +var + fPath : string; +begin + FreeGroupLists; + LoadEntryTilesList; + LoadBrushTilesList; + LoadSurfsTilesList; + BuildGroupList; + + if FileExists(FProfileDir + 'ColorLight.xml') + then fPath := (FProfileDir + 'ColorLight.xml') + else if FileExists(FLocalDir + 'ColorLight.xml') + then fPath := (FLocalDir + 'ColorLight.xml') + else if FileExists(FConfigDir + 'ColorLight.xml') + then fPath := (FConfigDir + 'ColorLight.xml') + else if FileExists(ResMan.GetFile('ColorLight.xml')) + then fPath := (ResMan.GetFile('ColorLight.xml')) + else Exit; + FLightManager.LoadConfig(fPath); + + if FileExists(FProfileDir + 'VirtualTiles.xml') + then fPath := (FProfileDir + 'VirtualTiles.xml') + else if FileExists(FLocalDir + 'VirtualTiles.xml') + then fPath := (FLocalDir + 'VirtualTiles.xml') + else if FileExists(FConfigDir + 'VirtualTiles.xml') + then fPath := (FConfigDir + 'VirtualTiles.xml') + else if FileExists(ResMan.GetFile('VirtualTiles.xml')) + then fPath := (ResMan.GetFile('VirtualTiles.xml')) + else Exit; + LoadLightSourceTiles(fPath); + LoadVisibleTiles(fPath); +end; + +procedure TfrmMain.mnuSetLanguageClick(Sender: TObject); +var + settings: TIniFile; +begin + LanguageSet(Integer(TMenuItem(Sender).Tag)); + ReloadLanguageTranslation(); + frmMain.Menu := nil; // Перерисовываем главное меню + frmMain.Menu := MainMenu1; + ProcessAccessLevel; // Обновляем заголовок формы + + // Запоминаем выбранный язык + settings := TIniFile.Create(FConfigDir + 'LoginSettings.ini'); + settings.WriteString('Profile', 'Lang', TMenuItem(Sender).Caption); + settings.Free; +end; + +//procedure ssrSaveHandle(handle: HWND; filepath: PChar); external 'SSRender'; + //function GetDesktopWindow(): HWND; external 'SSRender'; +function GetDesktopWindow:HWND; external 'user32' name 'GetDesktopWindow'; +procedure TfrmMain.mnuMakeScreenShotClick(Sender: TObject); +var + Bitmap: TBitmap; + Image: TJPEGImage; + ScreenWND: HWND; + ScreenDC: HDC; + DateTime: TDateTime; + FolderPath: string; + Refocus: Boolean; + srcRect, destRect: TRect; + oglPoint: TPoint; +begin + Bitmap:= TBitmap.Create; + Image := TJPEGImage.Create; + // Снимаем фокус с окна (чтобы убрать стрелочки) + Refocus := oglGameWindow.Focused; + if Refocus then begin + oglGameWindowMouseLeave(Sender); + oglGameWindow.Paint; + end; + // Получение контекстного устройства + oglGameWindow.HandleNeeded; + ScreenWND := GetDesktopWindow();// oglGameWindow.Handle; //Handle;//0;// + ScreenDC := GetDC(ScreenWND); //GetDeviceContext(ScreenWND); + if ScreenDC<>0 then try + // Получаем "буффер" экрана + Bitmap.LoadFromDevice(ScreenDC); + // Размеры сохраняемого изображения + destRect.Left :=0; + destRect.Top :=0; + destRect.Right :=oglGameWindow.Width; + destRect.Bottom:=oglGameWindow.Height; + Image.SetSize(destRect.Right, destRect.Bottom); + // Сохраняемая область на экране + oglPoint.x := 0; oglPoint.y := 0; + oglPoint := oglGameWindow.ClientToScreen(oglPoint); + srcRect.Left := oglPoint.x; + srcRect.Top := oglPoint.y; + srcRect.Right := srcRect.Left + destRect.Right; + srcRect.Bottom := srcRect.Top + destRect.Bottom; + // Копируем область с экрана на сохраняемое изображение + Image.Canvas.CopyRect(destRect, Bitmap.Canvas, srcRect); + // Сохраняем файл + DateTime := Now; + FolderPath := FAppDir + '../ScreenShots/' + FormatDateTime('YYYY-MM-DD', DateTime) + '/'; + ForceDirectories(FolderPath); + Image.SaveToFile(FolderPath + FormatDateTime('HHNN-SSZZZ', DateTime) + '.jpg'); + WriteChatMessage('System', Format('%s "./../ScreenShots/%s/%s.jpg"', + [lbScreenShotMsg, FormatDateTime('YYYY-MM-DD', DateTime), FormatDateTime('HHNN-SSZZZ', DateTime)])); + finally + if ReleaseDC(ScreenWND, ScreenDC)<>1 then + MessageDlg(lbDlgFreeDcErrCaption, lbDlgFreeDcErr, mtError, [mbOK], 0); + Bitmap.Free; + Image.Free; + end else + MessageDlg(lbDlgGetDcErrCaption, lbDlgGetDcErr, mtError, [mbOK], 0); + // Возвращаем обратно фокус окна (если надо) + if Refocus then begin + oglGameWindowMouseEnter(Sender); + oglGameWindow.Paint; + end; + + //DateTime := Now; + //FolderPath := FAppDir + 'ScreenShots/' + FormatDateTime('YYYY-MM-DD', DateTime) + '/'; + //ForceDirectories(FolderPath); + //MessageDlg('Ошибка', Format('Handle: %d File: "%s"', [ScreenWND, FolderPath + FormatDateTime('HHNN-SSZZZ', DateTime) + '.bmp']), mtError, [mbOK], 0); + + //ssrSaveHandle(ScreenWND, PChar(FolderPath + FormatDateTime('HHNN-SSZZZ', DateTime) + '.bmp')); + //oglGameWindowResize(Sender); end; procedure TfrmMain.edChatKeyPress(Sender: TObject; var Key: char); @@ -1261,22 +2379,44 @@ begin end; procedure TfrmMain.edFilterEditingDone(Sender: TObject); +var + chrtemp: char; + strtemp: string; + inttemp: Integer; begin + strtemp := edFilter.Text; + if (Length(strtemp) > 2) and (strtemp[1] = '0') and ((strtemp[2] = 'x') or (strtemp[2] = 'X')) + then begin Delete(strtemp, 1, 1); strtemp[1] := '$'; end; + if (TryStrToInt(strtemp, inttemp)) then begin + edSearchID.Text := strtemp; + chrtemp := #13; + Self.edSearchIDKeyPress(nil, chrtemp); + edSearchID.Text := ''; + edFilter.Text := ''; + Exit; + end; + BuildTileList; end; procedure TfrmMain.FormActivate(Sender: TObject); begin + Logger.EnterMethod([lcLandscape, lcDebug], 'TfrmMain.FormActivate(Sender: TObject)'); if oglGameWindow.MouseEntered then oglGameWindowMouseEnter(Sender); + Logger.ExitMethod([lcLandscape, lcDebug], 'TfrmMain.FormActivate(Sender: TObject)'); end; procedure TfrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin + frmDrawSettings.rbTileList.Checked := True; + frmDrawSettings.rbRandom.Checked := False; dmNetwork.CheckClose(Self); end; procedure TfrmMain.FormDestroy(Sender: TObject); +var + i: Integer; begin CurrentTile := nil; SelectedTile := nil; @@ -1290,13 +2430,27 @@ begin FreeAndNil(FLightManager); FreeAndNil(FVLayerImage); FreeAndNil(FVLayerMaterial); + for i:=1 to FVLightSrcImageCount do + FreeAndNil(FVLightSrcImage[i]); + if FVLightSrcMaterial <> nil then begin + for i := 0 to FVLightSrcImageCount - 1 do + FreeAndNil(FVLightSrcMaterial[i]); + freemem(FVLightSrcMaterial); + FVLightSrcMaterial := nil; + end; FreeAndNil(FVirtualTiles); - FreeAndNil(FUndoList); + for i:=1 to FUndoListLength do + FreeAndNil(FUndoListArray[i]); FreeAndNil(FGLFont); FreeAndNil(FRandomPresetsDoc); FreeAndNil(FAccessChangedListeners); FreeAndNil(FSelectionListeners); - + + FreeAndNil(FTilesSelectionUndoRedoManager); + FreeAndNil(FGroupsSelectionUndoRedoManager); + FreeAndNil(FTilesSelectionUndoRedoCommandGroup); + FreeAndNil(FGroupsSelectionUndoRedoCommandGroup); + RegisterPacketHandler($0C, nil); end; @@ -1311,7 +2465,7 @@ var enteredText: String; tileID: Integer; tileType: Char; - node: PVirtualNode; + item: PVirtualItem; tileInfo: PTileInfo; begin if Key = #13 then @@ -1334,7 +2488,7 @@ begin tileID := 0; if not TryStrToInt(enteredText, tileID) then begin - MessageDlg('Error', 'The specified TileID is invalid.', mtError, [mbOK], 0); + MessageDlg(lbDlgSearchIdErrCaption, lbDlgSearchIdErr, mtError, [mbOK], 0); vdtTiles.SetFocus; Exit; end; @@ -1342,24 +2496,23 @@ begin if tileType = 'S' then Inc(tileID, $4000); - node := vdtTiles.GetFirst; - while node <> nil do + item := vdtTiles.GetFirst; + while item <> nil do begin - tileInfo := vdtTiles.GetNodeData(node); + tileInfo := vdtTiles.GetNodeData(item); if tileInfo^.ID = tileID then begin vdtTiles.ClearSelection; - vdtTiles.Selected[node] := True; - vdtTiles.FocusedNode := node; + vdtTiles.Selected[item] := True; + vdtTiles.FocusedNode := item; Break; end; - node := vdtTiles.GetNext(node); + item := vdtTiles.GetNext(item); end; - if node = nil then + if item = nil then begin - MessageDlg('Error', 'The tile with the specified ID could not be found.' + - LineEnding + 'Check for conflicting filter settings.', mtError, [mbOK], 0); + MessageDlg(lbDlgNotFoundErrCaption, lbDlgNotFoundErr, mtError, [mbOK], 0); vdtTiles.SetFocus; Exit; end; @@ -1368,9 +2521,73 @@ begin begin edSearchID.Visible := False; Key := #0; - end else if not (Key in ['$', '0'..'9', 'a'..'f', 'A'..'F', 's', 'S', - 't', 'T', #8]) then - Key := #0; + end else if not (Key in ['$', '0'..'9', 'a'..'f', 'A'..'F', 's', 'S', 't', 'T', #8]) + then Key := #0; +end; + +procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var UndoRedoManager: TUndoRedoManager; +begin + if Sender=tvGroups then UndoRedoManager:=FGroupsSelectionUndoRedoManager + else if Sender=vdtTiles then UndoRedoManager:=FTilesSelectionUndoRedoManager; + + if Button = mbExtra1 then UndoRedoManager.Undo; + if Button = mbExtra2 then UndoRedoManager.Redo; +end; + +procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +var UndoRedoManager: TUndoRedoManager; +begin + if Sender=tvGroups then UndoRedoManager:=FGroupsSelectionUndoRedoManager + else if Sender=vdtTiles then UndoRedoManager:=FTilesSelectionUndoRedoManager; + + if Key = VK_OEM_PLUS then UndoRedoManager.Redo; + if Key = VK_OEM_MINUS then UndoRedoManager.Undo; + if Key = VK_SPACE then if frmFilter.Visible then begin + frmFilter.Locked := True; + frmFilter.Hide; + frmFilter.Locked := False; + end else frmFilter.Show; +end; + +procedure TfrmMain.FormShow(Sender: TObject); +begin + //XMLPropStorage1.Restore; + XMLPropStorage1RestoreProperties(nil); + mnuAutoHideGroupListClick(nil); + mnuAutoHideRandomListClick(nil); +end; + +procedure TfrmMain.FormWindowStateChange(Sender: TObject); +//var +// ws: TWindowState; +// h: HWND; +begin + // �диотизм тот еще, но иначе приложение не коректно сворачивается + // Logger.Send([lcClient, lcDebug], 'Main Window State Chancged'); + if frmMain.WindowState = wsMinimized then begin + if frmRadarMap.Visible then frmRadarMap.WindowState := wsMinimized; + //if frmRegionControl.Visible then frmRegionControl.WindowState := wsMinimized; + //if frmLargeScaleCommand.Visible then frmLargeScaleCommand.WindowState := wsMinimized; + //if frmAccountControl.Visible then frmAccountControl.WindowState := wsMinimized; + //if frmAbout.Visible then frmAbout.WindowState := wsMinimized; + Application.Minimize; + end; // else Application.Restore; + + {h:=frmMain.Handle; + if frmMain.WindowState = wsMinimized then begin + ShowWindow(h,SW_HIDE); + SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) and not WS_EX_OVERLAPPEDWINDOW or WS_EX_STATICEDGE); + ShowWindow(h,SW_SHOWMINIMIZED); + end else begin + //ShowInTaskBar := stDefault; + ShowWindow(h,SW_HIDE); + SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) and not WS_EX_STATICEDGE or WS_EX_OVERLAPPEDWINDOW); + //ShowInTaskBar := stDefault; + ShowWindow(h,SW_RESTORE); + end;} + end; procedure TfrmMain.lblChatHeaderCaptionClick(Sender: TObject); @@ -1379,13 +2596,15 @@ begin begin pnlChat.Visible := False; spChat.Visible := False; - pnlChatHeader.AnchorSide[akBottom].Control := pnlBottom; + pnlChatHeader.AnchorSide[akBottom].Control := pcLeft; + pnlChatHeader.AnchorSide[akBottom].Side := asrBottom; end else begin spChat.Visible := True; pnlChat.Visible := True; spChat.Top := pnlChat.Top - spChat.Height; pnlChatHeader.AnchorSide[akBottom].Control := spChat; + pnlChatHeader.AnchorSide[akBottom].Side := asrTop; lblChatHeaderCaption.Font.Bold := False; lblChatHeaderCaption.Font.Italic := False; @@ -1413,6 +2632,306 @@ end; procedure TfrmMain.mnuAccountControlClick(Sender: TObject); begin frmAccountControl.Show; + frmAccountControl.BringToFront; +end; + +procedure TfrmMain.mnuTileListViewClick(Sender: TObject); +var + ViewMode: Word; + MainTile: Boolean; + AddHeight: Boolean; + + function UpdateProps(VTList: TVirtualList; ViewMode: Word; AddHeight: Boolean; Update: Boolean): Boolean; + var + ColumIdx: Word; + begin + Result := False; + if ((not Update) and (Word(VTList.Tag) = ViewMode)) + then Exit; + + for ColumIdx := 0 to 11 do begin + VTList.Header.Columns[ColumIdx].Tag := PtrInt(-1); + VTList.Header.Columns[ColumIdx].Options := VTList.Header.Columns[ColumIdx].Options - [coVisible]; + end; + + case ViewMode of + 4: ColumIdx := 44; + 3: ColumIdx := 80; + 2: ColumIdx := 96; + 1: ColumIdx := 44; + end; + if (AddHeight) + then inc(ColumIdx, 14); + VTList.DefaultNodeHeight := ColumIdx; + VTList.Tag := PtrInt(ViewMode); + if (ViewMode = 1) then begin + VTList.Header.Options := VTList.Header.Options + [hoVisible]; + VTList.TreeOptions.SelectionOptions := VTList.TreeOptions.SelectionOptions + [toFullRowSelect]; + VTList.TreeOptions.MiscOptions := VTList.TreeOptions.MiscOptions + [toFullRowDrag]; + VTList.Header.Columns[3].Options := VTList.Header.Columns[3].Options - [coVisible]; + VTList.Header.Columns[13].Options := VTList.Header.Columns[13].Options - [coVisible]; + end else begin + VTList.Header.Options := VTList.Header.Options - [hoVisible]; + VTList.TreeOptions.SelectionOptions := VTList.TreeOptions.SelectionOptions - [toFullRowSelect]; + VTList.TreeOptions.MiscOptions := VTList.TreeOptions.MiscOptions - [toFullRowDrag]; + VTList.Header.Columns[3].Options := VTList.Header.Columns[3].Options + [coVisible]; + VTList.Header.Columns[13].Options := VTList.Header.Columns[13].Options + [coVisible]; + end; + + case ViewMode of + 4: begin ColumIdx := 4; ViewMode := 7; end; + 3: begin ColumIdx := 8; ViewMode := 10; end; + 2: begin ColumIdx := 11; ViewMode := 12; end; + 1: begin ColumIdx := 0; ViewMode := 2; end; + end; + for ColumIdx := ColumIdx to ViewMode do begin + if (ViewMode <> 2) + then VTList.Header.Columns[ColumIdx].Tag := PtrInt(Word(VTList.Tag) + ColumIdx - ViewMode - 1) + else VTList.Header.Columns[ColumIdx].Tag := PtrInt(0); + VTList.Header.Columns[ColumIdx].Options := VTList.Header.Columns[ColumIdx].Options + [coVisible]; + end; + + VTList.BeginUpdate; + VTList.UpdateTileColumn(Word(VTList.Tag), Update); + VTList.EndUpdate; + Result := True; + end; + +begin + if (Sender <> nil) then begin + mnuTileListDrawInfo.Enabled := (Sender <> mnuTileListTable); + mnuMiscTileListDrawInfo.Enabled := (Sender <> mnuMiscTileListTable); + end; + MainTile := (Sender = mnuTileListTable) or (Sender = mnuTileListSmall) + or (Sender = mnuTileListMidle) or (Sender = mnuTileListLarge); + if ((Sender = mnuTileListTable) or (Sender = mnuMiscTileListTable)) then ViewMode := 1 else + if ((Sender = mnuTileListSmall) or (Sender = mnuMiscTileListSmall)) then ViewMode := 4 else + if ((Sender = mnuTileListMidle) or (Sender = mnuMiscTileListMidle)) then ViewMode := 3 else + if ((Sender = mnuTileListLarge) or (Sender = mnuMiscTileListLarge)) then ViewMode := 2; + + if ((MainTile) or (Sender = nil)) then begin + if ((Sender = nil) and (mnuTileListTable.Checked)) then ViewMode := 1 else + if ((Sender = nil) and (mnuTileListSmall.Checked)) then ViewMode := 4 else + if ((Sender = nil) and (mnuTileListMidle.Checked)) then ViewMode := 3 else + if ((Sender = nil) and (mnuTileListLarge.Checked)) then ViewMode := 2; + AddHeight := mnuTileListDrawInfo.Enabled and mnuTileListDrawInfo.Checked; + UpdateProps(vdtTiles, ViewMode, AddHeight, Sender = nil); + end; + if ((not MainTile) or (Sender = nil)) then begin + if ((Sender = nil) and (mnuMiscTileListTable.Checked)) then ViewMode := 1 else + if ((Sender = nil) and (mnuMiscTileListSmall.Checked)) then ViewMode := 4 else + if ((Sender = nil) and (mnuMiscTileListMidle.Checked)) then ViewMode := 3 else + if ((Sender = nil) and (mnuMiscTileListLarge.Checked)) then ViewMode := 2; + AddHeight := mnuMiscTileListDrawInfo.Enabled and mnuMiscTileListDrawInfo.Checked; + UpdateProps(vdlRandom, ViewMode, AddHeight, Sender = nil); + UpdateProps(frmFilter.vdtFilter, ViewMode, AddHeight, Sender = nil); + UpdateProps(frmLargeScaleCommand.vdlTerrainTiles, ViewMode, AddHeight, Sender = nil); + UpdateProps(frmLargeScaleCommand.vdlInsertStaticsTiles, ViewMode, AddHeight, Sender = nil); + UpdateProps(frmLargeScaleCommand.vdlDeleteStaticsTiles, ViewMode, AddHeight, Sender = nil); + end; + +// vdtTiles.Clear; +// BuildTileList; +end; + +procedure TfrmMain.mnuTileListDrawClick(Sender: TObject); +var + dheight: Integer; + + procedure UpdateHeight(TVList: TVirtualList; height: integer); + var + TVTree: TVirtualDrawTree; + node: PVirtualNode; + begin + TVTree := TVirtualDrawTree(TVList); + TVList.BeginUpdate; + TVList.DefaultNodeHeight := TVList.DefaultNodeHeight + height; + node := TVTree.GetFirst(); + while (node <> nil) do begin + node^.NodeHeight := node^.NodeHeight + height; + node := TVTree.GetNext(node); + end; + TVList.EndUpdate; + end; + +begin + if (Sender = mnuTileListDrawInfo) then begin + if (mnuTileListDrawInfo.Checked) + then UpdateHeight(vdtTiles, +14) + else UpdateHeight(vdtTiles, -14); + + end else if (Sender = mnuMiscTileListDrawInfo) then begin + if (mnuMiscTileListDrawInfo.Checked) + then dheight := +14 + else dheight := -14; + UpdateHeight(vdlRandom, dheight); + UpdateHeight(frmFilter.vdtFilter, dheight); + UpdateHeight(frmLargeScaleCommand.vdlTerrainTiles, dheight); + UpdateHeight(frmLargeScaleCommand.vdlInsertStaticsTiles, dheight); + UpdateHeight(frmLargeScaleCommand.vdlDeleteStaticsTiles, dheight); + end; + // Код является частью отрисовки OnDrawNode => ее надо принудительно вызвать + vdtTiles.Repaint; + vdlRandom.Repaint; + frmFilter.vdtFilter.Repaint; +end; + +procedure TfrmMain.mnuAutoHideGroupListClick(Sender: TObject); +begin + if mnuAutoHideGroupList.Checked then + begin + spGroupList.Enabled := (not cbTerrain.Checked) and (not cbStatics.Checked); + tvGroups.Visible := spGroupList.Enabled; + if not spGroupList.Enabled + then mnuAutoHideGroupList.Tag := spGroupList.Top; + //else mnuAutoHideGroupList.Tag := 0; + end else + begin + if mnuAutoHideGroupList.Tag > 0 + then spGroupList.Top := mnuAutoHideGroupList.Tag; + mnuAutoHideGroupList.Tag := 0; + spGroupList.Enabled := True; + tvGroups.Visible := True; + end; + + if spGroupList.Enabled then + begin + spGroupList.Cursor := crVSplit; + //if spGroupList.Tag > 0 then + // spGroupList.Height := spGroupList.Tag; + spGroupList.Height := 5; + end else + begin + spGroupList.Cursor := crDefault; + //spGroupList.Tag := spGroupList.Height; + spGroupList.Height := 1; + end; + + spGroupListMoved(Sender); +end; + +procedure TfrmMain.mnuAutoHideRandomListClick(Sender: TObject); +begin + if mnuAutoHideRandomList.Checked then + begin + if (not frmDrawSettings.rbRandom.Checked) and (Sender <> nil) + then mnuAutoHideRandomList.Tag := spTileList.Top; + //else mnuAutoHideRandomList.Tag := 0; + spTileList.Enabled := frmDrawSettings.rbRandom.Checked; + //gbRandom.Visible := frmDrawSettings.rbRandom.Checked; + cbRandomPreset.Visible := frmDrawSettings.rbRandom.Checked; + btnRandomPresetSave.Visible := frmDrawSettings.rbRandom.Checked; + btnRandomPresetDelete.Visible := frmDrawSettings.rbRandom.Checked; + vdlRandom.Visible := frmDrawSettings.rbRandom.Checked; + end else + begin + if mnuAutoHideRandomList.Tag > 0 + then spTileList.Top := mnuAutoHideRandomList.Tag; + mnuAutoHideRandomList.Tag := 0; + spTileList.Enabled := True; + //gbRandom.Visible := True; + cbRandomPreset.Visible := True; + btnRandomPresetSave.Visible := True; + btnRandomPresetDelete.Visible := True; + vdlRandom.Visible := True; + end; + + if spTileList.Enabled then + begin + spTileList.Cursor := crVSplit; + //if spTileList.Tag > 0 then + // spTileList.Height := spTileList.Tag; + spTileList.Height := 5; + end else + begin + spTileList.Cursor := crDefault; + //spTileList.Tag := spTileList.Height; + spTileList.Height := 1; + end; + + spTileListMoved(Sender); +end; + +procedure TfrmMain.mnuAutoShowFilterWindowClick(Sender: TObject); +begin + +end; + +procedure TfrmMain.mnuCompactHueSettingsClick(Sender: TObject); +begin + +end; + +procedure TfrmMain.spGroupListMoved(Sender: TObject); +var + anchor: integer; +begin + if mnuAutoHideGroupList.Checked then + if (spGroupList.Enabled) and (mnuAutoHideGroupList.Tag > 0) then + begin + spGroupList.Top := mnuAutoHideGroupList.Tag; + mnuAutoHideGroupList.Tag := 0; + end + else if not spGroupList.Enabled then + begin + spGroupList.Top := tvGroups.Top + 4; + Exit; + end; + + if spGroupList.Enabled then + if spGroupList.Top <= tvGroups.Top then + spGroupList.Top := tvGroups.Top + else begin + anchor := spTileList.Top - spGroupList.Height - vdtTiles.Constraints.MinHeight; + if spGroupList.Top > anchor then spGroupList.Top := (anchor - 1); + end; +end; + +procedure TfrmMain.spTileListMoved(Sender: TObject); +var + anchor: integer; +begin + if mnuAutoHideRandomList.Checked then + if (spTileList.Enabled) and (mnuAutoHideRandomList.Tag > 0) then + begin + spTileList.Top := mnuAutoHideRandomList.Tag; + mnuAutoHideRandomList.Tag := 0; + end + else if not spTileList.Enabled then + begin + spTileList.Top := gbRandom.Top + gbRandom.Height - spTileList.Tag + 3; + Exit; + end; + + if spTileList.Enabled then + if spTileList.Top + spTileList.Height >= gbRandom.Top + gbRandom.Height then + spTileList.Top := gbRandom.Top + gbRandom.Height - spTileList.Height + else begin + anchor := spGroupList.Top + spGroupList.Height + vdtTiles.Constraints.MinHeight; + if spTileList.Top < anchor then spTileList.Top := (anchor + 1); + end; +end; + +procedure TfrmMain.tbFilterMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + If Button = mbRight then + tbFilter.Tag := PtrInt(GetTickCount); +end; + +procedure TfrmMain.tbFilterMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if acFilter.Checked and (not frmFilter.Visible) and ((GetTickCount - DWORD(tbFilter.Tag)) < 1000) then begin + tbFilter.Tag := PtrInt(False); + frmFilter.Show; + end; +end; + +procedure TfrmMain.pcLeftResize(Sender: TObject); +begin + spGroupListMoved(Sender); + spTileListMoved(Sender); end; procedure TfrmMain.mnuDisconnectClick(Sender: TObject); @@ -1420,6 +2939,26 @@ begin dmNetwork.Disconnect; end; +procedure TfrmMain.mnuDocsClick(Sender: TObject); +begin + ShellExecute(Handle, 'open', PChar('http://dev.uoquint.ru/projects/centred/wiki'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmMain.mnuRusComClick(Sender: TObject); +begin + ShellExecute(Handle, 'open', PChar('http://forum.uokit.com/index.php?showforum=207'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmMain.mnuEng2ComClick(Sender: TObject); +begin + ShellExecute(Handle, 'open', PChar('http://craftuo.com/threads/centred.888'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + +procedure TfrmMain.mnuEngComClick(Sender: TObject); +begin + ShellExecute(Handle, 'open', PChar('http://board.uoquint.ru/'), nil, nil, 1 {SW_SHOWNORMAL}); +end; + procedure TfrmMain.oglGameWindowPaint(Sender: TObject); begin if mnuWhiteBackground.Checked then @@ -1442,16 +2981,70 @@ begin InvalidateScreenBuffer; end; -procedure TfrmMain.pmGrabTileInfoPopup(Sender: TObject); +procedure TfrmMain.pbRadarMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var posx, posy: Integer; begin - mnuGrabHue.Enabled := CurrentTile is TStaticItem; + posx := self.X+4 * Trunc((Y+X - (pbRadar.Height+pbRadar.Width)div 2)*cos(45)); + posy := self.Y+4 * Trunc((Y-X - (pbRadar.Height-pbRadar.Width)div 2)*cos(45)); + //if (posx < 0) then posx := 0 else if (posx >= 8*Landscape.Width) then posx := 8*Landscape.Width-1; + //if (posy < 0) then posy := 0 else if (posy >= 8*Landscape.Height) then posy := 8*Landscape.Height-1; + if (posx>=0)and(posy>=0)and(posx<8*Landscape.Width)and(posy<8*Landscape.Height) + then SetPos(posx, posy); end; -procedure TfrmMain.tbFilterMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); +procedure TfrmMain.pbRadarPaint(Sender: TObject); +var + posX, posY, scrW, scrH: Integer; + zoom: Single; + image: TSingleImage; begin - if acFilter.Checked and (not frmFilter.Visible) then - frmFilter.Show; + posX := (X div 8) - (pbRadar.Width div 4); + posY := (Y div 8) - (pbRadar.Height div 4); + + // NOTE: Не очень-то хорошо каждый раз создавать Image... + image := TSingleImage.CreateFromParams(pbRadar.Width+84, pbRadar.Height+84, ifA8R8G8B8); + StretchRect(frmRadarMap.Radar.ImageDataPointer^, posX, posY, pbRadar.Width div 2, pbRadar.Height div 2, + image.ImageDataPointer^, 0, 0, image.Width, image.Height, rfBicubic); + RotateImage(image.ImageDataPointer^, -45.0); + + DisplayImage(pbRadar.Canvas, (pbRadar.Width-image.Width) div 2, (pbRadar.Height-image.Height) div 2, image); + image.Free; + + posX := pbRadar.Width div 2; + posY := pbRadar.Width div 2; + if tbZoom.Down then zoom := tbZoom.Tag / 1000.0 else zoom := 1.0; + scrW := Trunc(0.25 * oglGameWindow.Width / 44.0 / zoom); + scrH := Trunc(0.25 * oglGameWindow.Height/ 44.0 / zoom); + + pbRadar.Canvas.Pen.Color := clBlack; + pbRadar.Canvas.Pen.Style := psSolid; + pbRadar.Canvas.Line(posX-scrW, posY-scrH, posX+scrW, posY-scrH); + pbRadar.Canvas.Line(posX+scrW, posY-scrH, posX+scrW, posY+scrH); + pbRadar.Canvas.Line(posX+scrW, posY+scrH, posX-scrW, posY+scrH); + pbRadar.Canvas.Line(posX-scrW, posY+scrH, posX-scrW, posY-scrH); + + pbRadar.Canvas.Pen.Color := clSilver; + pbRadar.Canvas.Pen.Style := psSolid; + pbRadar.Canvas.Line(posX-scrW-1, posY-scrH-1, posX+scrW+1, posY-scrH-1); + pbRadar.Canvas.Line(posX+scrW+1, posY-scrH-1, posX+scrW+1, posY+scrH+1); + pbRadar.Canvas.Line(posX+scrW+1, posY+scrH+1, posX-scrW-1, posY+scrH+1); + pbRadar.Canvas.Line(posX-scrW-1, posY+scrH+1, posX-scrW-1, posY-scrH-1); +end; + +procedure TfrmMain.pcLeftChange(Sender: TObject); +begin + +end; + +procedure TfrmMain.pmGrabTileInfoPopup(Sender: TObject); +var + isStatic: Boolean; +begin + isStatic := CurrentTile is TStaticItem; + mnuGrabHue.Enabled := isStatic; + mnuGrabFilterTileID.Enabled := isStatic; + mnuGrabFilterHue.Enabled := isStatic; end; procedure TfrmMain.tbRadarMapClick(Sender: TObject); @@ -1460,16 +3053,6 @@ begin frmRadarMap.BringToFront; end; -procedure TfrmMain.tbStaticsClick(Sender: TObject); -begin - RebuildScreenBuffer; -end; - -procedure TfrmMain.tbTerrainClick(Sender: TObject); -begin - RebuildScreenBuffer; -end; - procedure TfrmMain.tmGrabTileInfoTimer(Sender: TObject); begin tmGrabTileInfo.Enabled := False; @@ -1482,44 +3065,215 @@ end; procedure TfrmMain.tmMovementTimer(Sender: TObject); begin case FOverlayUI.ActiveArrow of - 0: MoveBy(-8, 0); - 1: MoveBy(-8, -8); - 2: MoveBy(0, -8); - 3: MoveBy(8, -8); - 4: MoveBy(8, 0); - 5: MoveBy(8, 8); - 6: MoveBy(0, 8); - 7: MoveBy(-8, 8); + 0: MoveBy(-1, 0); + 1: MoveBy(-1, -1); + 2: MoveBy( 0, -1); + 3: MoveBy(+1, -1); + 4: MoveBy(+1, 0); + 5: MoveBy(+1, +1); + 6: MoveBy( 0, +1); + 7: MoveBy(-1, +1); end; end; +procedure TfrmMain.tmSettingsCloseTimer(Sender: TObject); +begin + tmSettingsClose.Enabled := False; + tbTerrain.Down := acTerrain.Checked; + tbStatics.Down := acStatics.Checked; + tbNoDraw.Down := acNoDraw.Checked; + tbFlat.Down := acFlat.Checked; +end; + +procedure TfrmMain.tsNavigationContextPopup(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); +begin + +end; + +procedure TfrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); +begin + if Sender is TWinControl then + if not (TWinControl(Sender)).Focused + then (TWinControl(Sender)).SetFocus; +end; + +procedure TfrmMain.tvGroupsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); +var + nodeData : PGroupNode; +begin + nodeData := tvGroups.GetNodeData(Node); + CellText := nodeData^.Name; +end; + +procedure TfrmMain.tvGroupsDrawText(Sender: TBaseVirtualTree; + TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; + const CellText: String; const CellRect: TRect; var DefaultDraw: Boolean); +var + nodeData : PGroupNode; + TextWidth: Integer; +begin + nodeData := tvGroups.GetNodeData(Node); + + TargetCanvas.Font.Color := nodeData^.Color; + TargetCanvas.Font.Bold := nodeData^.Bold; + TargetCanvas.Font.Italic:= nodeData^.Ital; + TargetCanvas.TextOut(CellRect.Left, CellRect.Top+2, CellText); + + TextWidth := TargetCanvas.TextWidth(CellText); + TargetCanvas.Font.Color := TColor($00BBBBBB); + TargetCanvas.Font.Bold := False; + TargetCanvas.Font.Italic:= False; + TargetCanvas.TextOut(CellRect.Left + TextWidth + 6, CellRect.Top + 2, + Format('(%u)', [nodeData^.Items])); + + DefaultDraw := False; +end; + +procedure TfrmMain.tmSelectNodeTimer(Sender: TObject); +begin + tmSelectNode.Enabled := False; + if (FGroupsSelectionUndoRedoCommandGroup.UndoRedoCommands.Count > 0) then begin + if not FGroupsSelectionUndoRedoManager.Enabled then begin + tmSelectNode.Enabled := True; + Exit; + end; + FGroupsSelectionUndoRedoManager.ExecCommand(FGroupsSelectionUndoRedoCommandGroup); + FGroupsSelectionUndoRedoCommandGroup := TUndoRedoCommandGroup.Create; + end; + //if (FTilesSelectionUndoRedoCommandGroup.UndoRedoCommands.Count > 0) then + begin + if not FTilesSelectionUndoRedoManager.Enabled then begin + tmSelectNode.Enabled := True; + Exit; + end; + FTilesSelectionUndoRedoManager.ExecCommand(FTilesSelectionUndoRedoCommandGroup); + FTilesSelectionUndoRedoCommandGroup := TUndoRedoCommandGroup.Create; + end; +end; + +procedure TfrmMain.vdtTilesChange(Sender: TBaseVirtualTree; Node: PVirtualNode); +begin + if (Node <> nil) and (FTilesSelectionUndoRedoManager.Enabled) then begin + FTilesSelectionUndoRedoCommandGroup.Add( + TUndoRedoSelectVirtualNodeCommand.Create( + FTilesSelectionUndoRedoManager, Sender, Node) + ); + if not FTilesSelectionUndoRedoManager.Enabled + then vdtTiles.FocusedNode := PVirtualItem(Node); + if not tmSelectNode.Enabled + then tmSelectNode.Enabled := True + else tmSelectNode.Interval:= 250; + end; +end; + +procedure TfrmMain.tvGroupsChange(Sender: TBaseVirtualTree; Node: PVirtualNode); +var + item: PVirtualNode; +begin + if (Node <> nil) and (FGroupsSelectionUndoRedoManager.Enabled) then begin + FGroupsSelectionUndoRedoCommandGroup.Add( + TUndoRedoSelectVirtualNodeCommand.Create( + FGroupsSelectionUndoRedoManager, Sender, Node) + ); + if not tmSelectNode.Enabled + then tmSelectNode.Enabled := True + else tmSelectNode.Interval:= 250; + + if ((cbStatics.Checked or cbTerrain.Checked) and Sender.Selected[Node]) then begin + cbStatics.Checked := False; + cbTerrain.Checked := False; + Exit; + end; + end; + + BuildTileList; +end; + +procedure TfrmMain.tvGroupFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); +var + groupData: PGroupNode; +begin + groupData := Sender.GetNodeData(Node); + groupData^.Name := EmptyStr; + FreeMem(groupData^.GLink); + FreeMem(groupData^.GTile); + FreeMem(groupData^.Brush); + FreeMem(groupData^.Entry); +end; + +procedure TfrmMain.DropedownMenusClose(Sender: TObject); +begin + tmSettingsClose.Enabled := True; +end; + procedure TfrmMain.vdtRandomClick(Sender: TObject); var - node: PVirtualNode; + item: PVirtualItem; + node: PVirtualItem; + treeNode: PVirtualNode; tileInfo: PTileInfo; selectedID: Integer; -begin - if vdtRandom.SelectedCount = 1 then + + function TileInNode(Node: PVirtualNode; TileID: LongWord) : Boolean; + var + nodeData: ^TGroupNode; + i: Integer; begin - node := vdtRandom.GetFirstSelected; + Result := False; + nodeData := tvGroups.GetNodeData(Node); + for i := 0 to nodeData^.Count - 1 do + begin + if nodeData^.GTile[i].ID = TileID then + begin + Result := True; + break; + end; + end; + end; + +begin + if vdlRandom.SelectedCount = 1 then + begin + node := vdlRandom.GetFirstSelected; if node <> nil then begin - tileInfo := vdtRandom.GetNodeData(node); + tileInfo := vdlRandom.GetNodeData(node); selectedID := tileInfo^.ID; - node := vdtTiles.GetFirst; - while node <> nil do + // Выбираем группы + if (not cbStatics.Checked) and (not cbTerrain.Checked) then begin - tileInfo := vdtTiles.GetNodeData(node); + treeNode := tvGroups.GetFirst(); + while treeNode <> nil do + begin + if TileInNode(treeNode, selectedID) then + begin + tvGroups.Selected[treeNode] := True; + tvGroups.FocusedNode := treeNode; + if toMultiSelect in tvGroups.TreeOptions.SelectionOptions + then Break; + end; + treeNode := tvGroups.GetNext(treeNode); + end; + end; + + // Выбираем тайл + item := vdtTiles.GetFirst; + while item <> nil do + begin + tileInfo := vdtTiles.GetNodeData(item); if tileInfo^.ID = selectedID then begin vdtTiles.ClearSelection; - vdtTiles.Selected[node] := True; - vdtTiles.FocusedNode := node; - node := nil; + vdtTiles.Selected[item] := True; + vdtTiles.FocusedNode := item; + item := nil; end else - node := vdtTiles.GetNext(node); + item := vdtTiles.GetNext(item); end; + end; end; end; @@ -1570,67 +3324,267 @@ begin ProcessToolState; end; +procedure TfrmMain.vdtTilesDragAllowed(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); +begin + //vdtTiles.auto + Allowed := True; +end; + procedure TfrmMain.vdtTilesDrawHint(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; const R: TRect; Column: TColumnIndex ); +var + m_name : string; begin + vdtTiles.UpdateHintCanvas(HintCanvas); + HintCanvas.Font.Assign(Sender.Font); HintCanvas.Font.Style := [fsBold]; - DrawText(HintCanvas.Handle, PChar(FTileHint.Name), Length(FTileHint.Name), - FTileHint.NameRect, 0); + m_name := CP1251ToUTF8(FTileHint.Name); + DrawText(HintCanvas.Handle, PChar(m_name), Length(m_name), FTileHint.NameRect, 0); + HintCanvas.Font.Style := []; + DrawText(HintCanvas.Handle, PChar(FTileHint.Obj), Length(FTileHint.Obj), FTileHint.ObjRect, 0); HintCanvas.Font.Style := [fsItalic]; DrawText(HintCanvas.Handle, PChar(FTileHint.Flags), Length(FTileHint.Flags), FTileHint.FlagsRect, DT_WORDBREAK); end; -procedure TfrmMain.vdtTilesDrawNode(Sender: TBaseVirtualTree; - const PaintInfo: TVTPaintInfo); +procedure TfrmMain.vdtTilesDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo); var tileInfo: PTileInfo; textStyle: TTextStyle; artEntry: TArt; tileData: TTileData; - id: Integer; + id: LongWord; + rect, CellRect:TRect; + image: TSingleImage; + colorOld, colorNew: Word; + DrawInfo: Boolean; + oldcolor: DWORD; + newcolor: DWORD; + srcCanvas, dstCanvas: TFastARGB32Canvas; + tmpImage : TSingleImage; + bit: Integer; + + procedure DisplayNodeImage(main: Boolean; const Canvas: TCanvas; const CellRect: TRect; Image: TBaseImage; ForceStretch: Boolean = False); + var + Resised: Float; + DstSize: TSize; + DstRect: TRect; + //SrcRect: TRect; + begin + if (main and mnuTileListStretch.Checked) or (not main and mnuMiscTileListStretch.Checked) or (ForceStretch) then begin + + if ForceStretch or (DstSize.cy <> 44) then begin + DstSize.cx := CellRect.Right - CellRect.Left; + DstSize.cy := CellRect.Bottom - CellRect.Top; + if ForceStretch then begin + if (DstSize.cx <= 44) then id := 2 + else if (DstSize.cx <= 80) then id := 3 + else id := 4; + DstSize.cx := DstSize.cx - id; + DstSize.cy := DstSize.cy - id; + end; + Resised := Min(Min(Float(DstSize.cx)/Float(Image.Width), Float(DstSize.cy)/Float(Image.Height)), 1.0); + DstSize.cx := Trunc(Resised * Float(Image.Width)); + DstSize.cy := Trunc(Resised * Float(Image.Height)); + DstRect.Left := Trunc((CellRect.Left + CellRect.Right - DstSize.cx) / 2); + DstRect.Right := DstRect.Left + DstSize.cx; + if not ForceStretch + then DstRect.Bottom := CellRect.Bottom + else DstRect.Bottom := (CellRect.Bottom - CellRect.Top + DstSize.cy) div 2; + DstRect.Top := DstRect.Bottom - DstSize.cy + end else begin + DstRect := CellRect; + end; + DisplayImage(Canvas, DstRect, Image); + end else + if (main and mnuTileListClip.Checked) or (not main and mnuMiscTileListClip.Checked) then begin + //DstSize.cx := CellRect.Right - CellRect.Left; + //DstSize.cy := CellRect.Bottom - CellRect.Top; + //DstRect := CellRect; + //SrcRect.Top := 0; + //if (DstSize.cy <= Image.Height) then begin + // SrcRect.Bottom := DstSize.cy; + //end else begin + // SrcRect.Bottom := Image.Height; + // DstRect.Bottom := DstRect.Top + Image.Height; + //end; + //if (DstSize.cx <= Image.Width) then begin + // SrcRect.Left := (Image.Width - DstSize.cx) div 2; + // SrcRect.Right:= SrcRect.Left + DstSize.cx; + //end else begin + // SrcRect.Left := 0; + // SrcRect.Right:= Image.Width; + // DstRect.Left := DstRect.Left + (DstSize.cx - Image.Width) div 2; + // DstRect.Right:= DstRect.Left + Image.Width; + //end; + //Logger.Send([lcClient, lcDebug], 'TfrmMain.vdtTilesDrawNode [%d,%d,%d,%d](%d,%d) - [%d,%d,%d,%d](%d,%d) I(%d,%d) C[%d,%d,%d,%d](%d,%d)', + //[SrcRect.Top, SrcRect.Left, SrcRect.Bottom, SrcRect.Right, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top, + // DstRect.Top, DstRect.Left, DstRect.Bottom, DstRect.Right, DstRect.Right - DstRect.Left, DstRect.Bottom - DstRect.Top, + // Image.Width, Image.Height, + // CellRect.Top, CellRect.Left, CellRect.Bottom, CellRect.Right, CellRect.Right - CellRect.Left, CellRect.Bottom - CellRect.Top]); + + //DisplayImage(Canvas, DstRect, Image, SrcRect); + DisplayImage(Canvas, Trunc((CellRect.Left + CellRect.Right - Image.Width) / 2), CellRect.Top, Image); + Canvas.FillRect(CellRect.Left, CellRect.Bottom, CellRect.Right, CellRect.Bottom + 14); + end else + if (main and mnuTileListCentre.Checked) or (not main and mnuMiscTileListCentre.Checked) then begin + // TODO: .... + end; + end; + begin - tileInfo := Sender.GetNodeData(PaintInfo.Node); + if (not (Sender is TVirtualList)) + then tileInfo := Sender.GetNodeData(PaintInfo.Node) + else tileInfo := vdtTiles.GetNodeData(PVirtualItem(PaintInfo.Node)); + + //if (sender <> vdtTiles) then begin + //Logger.Send([lcClient, lcDebug], 'TfrmMain.vdtTilesDrawNode %.8x at cell [%d,%d]', [tileInfo^.ID, PaintInfo.Column, PaintInfo.Node^.Index]); + //Exit; + //end; +// Logger.Send([lcClient, lcDebug], 'TfrmMain.vdtTilesDrawNode %d', [tileInfo^.ID]); + + if (tileInfo^.ID = $FFFFFFFF) then exit; + textStyle := PaintInfo.Canvas.TextStyle; textStyle.Alignment := taCenter; textStyle.Layout := tlCenter; textStyle.Wordbreak := True; + PaintInfo.Canvas.Font.Color := Sender.Font.Color; + if (Sender = vdtTiles) then + PaintInfo.Canvas.Font.Color := TColor($808080); + + //Logger.Send([lcClient, lcDebug], 'vdtTilesDrawNode %.4x', [tileInfo^.ID]); + case PaintInfo.Column of 0: begin id := tileInfo^.ID; - if id > $3FFF then - Dec(id, $4000); - PaintInfo.Canvas.TextRect(PaintInfo.CellRect, 0, 0, Format('$%x', [id]), - textStyle); - end; - 1: - begin - if ResMan.Art.Exists(tileInfo^.ID) then - begin - artEntry := ResMan.Art.GetArt(tileInfo^.ID, - RGB2ARGB(PaintInfo.Canvas.Pixels[PaintInfo.CellRect.Left, - PaintInfo.CellRect.Top]), nil, False); - DisplayImage(PaintInfo.Canvas, PaintInfo.CellRect, artEntry.Graphic); - artEntry.Free; + if id > $2F000000 then + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, 0, 0, Format('BL%.3d', [id - $2F000000]), textStyle) + else if id > $1F000000 then + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, 0, 0, Format('ET%.3d', [id - $1F000000]), textStyle) + else begin + if id > $00003FFF then Dec(id, $00004000); + //PaintInfo.Canvas.TextRect(PaintInfo.CellRect, 0, 0, '4x', textStyle); + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, 0, 0, Format('$%.4x', [id]), textStyle); end; end; 2: begin - tileData := TTileData(ResMan.Tiledata.Block[tileInfo^.ID]); - PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left, - PaintInfo.CellRect.Top, ISO_8859_1ToUTF8(Trim(tileData.TileName)), - textStyle); - tileData.Free; + textStyle.Alignment := taLeftJustify; + if (tileInfo^.ID > $2F000000) then begin // Кисти + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left + 4, + PaintInfo.CellRect.Top, PGroupBrush(tileInfo^.ptr)^.Name, textStyle); + end else if (tileInfo^.ID > $1F000000) then begin // Объекты + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left + 4, + PaintInfo.CellRect.Top, PGroupEntry(tileInfo^.ptr)^.Name, textStyle); + end else begin // Тайлы + tileData := TTileData(ResMan.Tiledata.Block[tileInfo^.ID]); + PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left + 4, + PaintInfo.CellRect.Top, CP1251ToUTF8(Trim(tileData.TileName)), + textStyle); + tileData.Free; + end; end; + 3: begin Exit; end; + 13: begin Exit; end; + // 1: - 3: 4: 5: 6: - 7: 8: 9: - 10: 11: + else + begin + CellRect := PaintInfo.CellRect; + if (PaintInfo.Column = 1) + then DrawInfo := False + else if (sender = vdtTiles) + then DrawInfo := mnuTileListDrawInfo.Enabled and mnuTileListDrawInfo.Checked + else DrawInfo := mnuMiscTileListDrawInfo.Enabled and mnuMiscTileListDrawInfo.Checked; + if DrawInfo then begin + CellRect.Bottom := CellRect.Bottom - 14; + end; + + if (tileInfo^.ID > $2F000000) then begin // Кисти + //image := TSingleImage.CreateFromImage(PGroupBrush(tileInfo^.ptr)^.Image); + colorOld := $0000; colorNew := RGB2ARGB(PaintInfo.Canvas.Pixels[CellRect.Left,CellRect.Top]); + PGroupBrush(tileInfo^.ptr)^.Image.ReplaceColor(0,0,PGroupBrush(tileInfo^.ptr)^.Image.Width,PGroupBrush(tileInfo^.ptr)^.Image.Height, + @colorOld, @colorNew); + image := TSingleImage.CreateFromImage(PGroupBrush(tileInfo^.ptr)^.Image); + + image.Format := ifDefault; + DisplayNodeImage((Sender = vdtTiles), PaintInfo.Canvas, CellRect, image, True); + //DisplayImage(PaintInfo.Canvas, CellRect, image); + image.Free; + end else if (tileInfo^.ID > $1F000000) then begin// Объекты + //colorOld := $0000; colorNew := RGB2ARGB($00FFFFFF); + //PGroupEntry(tileInfo^.ptr)^.Image.ReplaceColor(0,0,PGroupEntry(tileInfo^.ptr)^.Image.Width,PGroupEntry(tileInfo^.ptr)^.Image.Height, + //@colorOld, @colorNew); + image := TSingleImage.CreateFromImage(PGroupEntry(tileInfo^.ptr)^.Image); + //oldcolor := PDWORD(Image.Bits)^; + //newcolor := $00FF0000;//PDWORD(Image.)^; + //image.ReplaceColor(0,0,Image.Width,Image.Height,@oldcolor,@newcolor); + //image.Format := ifDefault; + DisplayNodeImage((Sender = vdtTiles), PaintInfo.Canvas, CellRect, image, True); + image.Free; + end else if ResMan.Art.Exists(tileInfo^.ID) then // Тайлы + begin + artEntry := ResMan.Art.GetArt(tileInfo^.ID, + RGB2ARGB(PaintInfo.Canvas.Pixels[CellRect.Left, CellRect.Top]), nil, False); + DisplayNodeImage((Sender = vdtTiles), PaintInfo.Canvas, CellRect, artEntry.Graphic); + artEntry.Free; + if tileInfo^.ID > $3FFF then + if (FLightSourceTiles[tileInfo^.ID - $4000].image > 0) then // Источники света + begin + bit := FLightSourceTiles[tileInfo^.ID - $4000].image; + //rect.Right:=CellRect.Right; + //rect.Bottom:=CellRect.Bottom; + //rect.Left:=CellRect.Right - 24; + //rect.Top:=CellRect.Bottom - 24; + //DisplayImage(PaintInfo.Canvas, rect, FVLightSrcImage); + + //DisplayNodeImage((Sender = vdtTiles), PaintInfo.Canvas, CellRect, FVLightSrcImage, True); + + rect.Left := 0; + rect.Top := 0; + rect.Right:= FVLightSrcImage[bit].Width; + rect.Bottom:=FVLightSrcImage[bit].Height; + tmpImage := TSingleImage.CreateFromParams(rect.Right, rect.Bottom, ifA8R8G8B8); + srcCanvas := TFastARGB32Canvas.CreateForImage(FVLightSrcImage[bit]); + dstCanvas := TFastARGB32Canvas.CreateForImage(tmpImage); + + dstCanvas.FillColor32 := PaintInfo.Canvas.Pixels[CellRect.Left+4,CellRect.Top+4]; + dstCanvas.FillRect(rect); + srcCanvas.DrawAlpha(rect, dstCanvas, 0,0); + srcCanvas.Free; + dstCanvas.Free; + DisplayNodeImage((Sender = vdtTiles), PaintInfo.Canvas, CellRect, tmpImage, True); + tmpImage.Free; + end; + end; + + if DrawInfo then begin // Подписи тайлов + CellRect.Bottom := PaintInfo.CellRect.Bottom; + rect := PaintInfo.CellRect; + rect.Top := rect.Bottom - 14;; + id := tileInfo^.ID; + if id > $2F000000 then + PaintInfo.Canvas.TextRect(rect, 0, 0, Format('BL%.3d', [id - $2F000000]), textStyle) + else if id > $1F000000 then + PaintInfo.Canvas.TextRect(rect, 0, 0, Format('ET%.3d', [id - $1F000000]), textStyle) + else begin + if id > $00003FFF then Dec(id, $00004000); + //PaintInfo.Canvas.TextRect(rect, 0, 0, '4x', textStyle); + PaintInfo.Canvas.TextRect(rect, 0, 0, Format('0x%.4x', [id]), textStyle); + end; + end; + end; + end; end; procedure TfrmMain.vdtTilesEnter(Sender: TObject); begin - if acFilter.Checked and (not frmFilter.Visible) and (not frmFilter.Locked) then + if acFilter.Checked and mnuAutoShowFilterWindow.Checked and (not frmFilter.Visible) and (not frmFilter.Locked) then begin frmFilter.Locked := True; frmFilter.Show; @@ -1645,6 +3599,8 @@ var tileInfo: PTileInfo; tileData: TTiledata; prefix, flags: string; + id: LongWord; + cmHint: TCMHintShow; procedure UpdateFlags(AFlag: TTileDataFlag; AName: string); begin @@ -1658,68 +3614,94 @@ var end; begin - tileInfo := Sender.GetNodeData(Node); + case Word(Sender.Tag) of + 1: id := 0; + 2: id := min(max(0, Column - 10), 2); + 3: id := min(max(0, Column - 7), 3); + 4: id := min(max(0, Column - 3), 4); + end; + //Logger.Send([lcClient, lcDebug], 'vdtTilesGetHintSize', Column); + tileInfo := (TVirtualList(Sender)).GetNodeData(vdtTiles.GetItemAt(Node, Column));// @PTileInfo(Sender.GetNodeData(Node))[id]; flags := ''; +// if (FTileHint.Column = id) then Exit; +// FTileHint.Column := id; - tileData := ResMan.Tiledata.TileData[tileInfo^.ID]; - if tileInfo^.ID < $4000 then + if (tileInfo^.ID > $2F000000) then begin + FTileHint.Name := UTF8ToCP1251(PGroupBrush(tileInfo^.ptr)^.Name); + FTileHint.Obj := Format('Brush ID: 0x%.4x (%.5d)', [tileInfo^.ID-$2F000000, tileInfo^.ID-$2F000000]); + //flags := 'Brush'; + end else if (tileInfo^.ID > $1F000000) then begin + FTileHint.Name := UTF8ToCP1251(PGroupEntry(tileInfo^.ptr)^.Name); + FTileHint.Obj := Format('Entry ID: 0x%.4x (%.5d)', [tileInfo^.ID-$1F000000, tileInfo^.ID-$1F000000]); + //flags := 'Entry'; + end else begin - if TLandTiledata(tileData).TextureID > 0 then - flags := 'Stretchable'; + tileData := ResMan.Tiledata.TileData[tileInfo^.ID]; + if tileInfo^.ID < $4000 then begin + if TLandTiledata(tileData).TextureID > 0 then + flags := 'Stretchable'; + FTileHint.Obj := Format('LandT ID: 0x%.4x (%.5d)', [tileInfo^.ID, tileInfo^.ID]); + end else begin + FTileHint.Obj := Format('ItemT ID: 0x%.4x (%.5d)', [tileInfo^.ID-$4000, tileInfo^.ID-$4000]); + end; + + + if tdfArticleA in tileData.Flags then + prefix := 'a ' + else if tdfArticleAn in tileData.Flags then + prefix := 'an ' + else + prefix := ''; + + FTileHint.Name := AnsiProperCase(Format('%s%s', [prefix, tileData.TileName]), [' ']); + + UpdateFlags(tdfBackground, 'Background'); + UpdateFlags(tdfWeapon, 'Weapon'); + UpdateFlags(tdfTransparent, 'Transparent'); + UpdateFlags(tdfTranslucent, 'Translucent'); + UpdateFlags(tdfWall, 'Wall'); + UpdateFlags(tdfDamaging, 'Damaging'); + UpdateFlags(tdfImpassable, 'Impassable'); + UpdateFlags(tdfWet, 'Wet'); + UpdateFlags(tdfSurface, 'Surface'); + UpdateFlags(tdfBridge, 'Bridge'); + UpdateFlags(tdfGeneric, 'Generic'); + UpdateFlags(tdfWindow, 'Window'); + UpdateFlags(tdfNoShoot, 'NoShoot'); + UpdateFlags(tdfInternal, 'Internal'); + UpdateFlags(tdfFoliage, 'Foliage'); + UpdateFlags(tdfPartialHue, 'PartialHue'); + UpdateFlags(tdfMap, 'Map'); + UpdateFlags(tdfContainer, 'Container'); + UpdateFlags(tdfWearable, 'Wearable'); + UpdateFlags(tdfLightSource, 'Lightsource'); + UpdateFlags(tdfAnimation, 'Animation'); + UpdateFlags(tdfNoDiagonal, 'NoDiagonal'); //HoverOver + UpdateFlags(tdfArmor, 'Armor'); + UpdateFlags(tdfRoof, 'Roof'); + UpdateFlags(tdfDoor, 'Door'); + UpdateFlags(tdfStairBack, 'StairBack'); + UpdateFlags(tdfStairRight, 'StairRight'); end; - if tdfArticleA in tileData.Flags then - prefix := 'a ' - else if tdfArticleAn in tileData.Flags then - prefix := 'an ' - else - prefix := ''; - - FTileHint.Name := AnsiProperCase(Format('%s%s', - [prefix, tileData.TileName]), [' ']); FTileHint.NameRect.Left := 5; FTileHint.NameRect.Top := 5; Sender.Canvas.Font.Style := [fsBold]; - DrawText(Sender.Canvas.Handle, PChar(FTileHint.Name), Length(FTileHint.Name), + DrawText(Sender.Canvas.Handle, PChar(CP1251ToUTF8(FTileHint.Name)), Length(CP1251ToUTF8(FTileHint.Name)), FTileHint.NameRect, DT_CALCRECT); - - UpdateFlags(tdfBackground, 'Background'); - UpdateFlags(tdfWeapon, 'Weapon'); - UpdateFlags(tdfTransparent, 'Transparent'); - UpdateFlags(tdfTranslucent, 'Translucent'); - UpdateFlags(tdfWall, 'Wall'); - UpdateFlags(tdfDamaging, 'Damaging'); - UpdateFlags(tdfImpassable, 'Impassable'); - UpdateFlags(tdfWet, 'Wet'); - UpdateFlags(tdfSurface, 'Surface'); - UpdateFlags(tdfBridge, 'Bridge'); - UpdateFlags(tdfGeneric, 'Generic'); - UpdateFlags(tdfWindow, 'Window'); - UpdateFlags(tdfNoShoot, 'NoShoot'); - UpdateFlags(tdfInternal, 'Internal'); - UpdateFlags(tdfFoliage, 'Foliage'); - UpdateFlags(tdfPartialHue, 'PartialHue'); - UpdateFlags(tdfMap, 'Map'); - UpdateFlags(tdfContainer, 'Container'); - UpdateFlags(tdfWearable, 'Wearable'); - UpdateFlags(tdfLightSource, 'Lightsource'); - UpdateFlags(tdfAnimation, 'Animation'); - UpdateFlags(tdfNoDiagonal, 'NoDiagonal'); - UpdateFlags(tdfArmor, 'Armor'); - UpdateFlags(tdfRoof, 'Roof'); - UpdateFlags(tdfDoor, 'Door'); - UpdateFlags(tdfStairBack, 'StairBack'); - UpdateFlags(tdfStairRight, 'StairRight'); - + FTileHint.ObjRect.Left := 5; + FTileHint.ObjRect.Top := FTileHint.NameRect.Bottom + 6; + Sender.Canvas.Font.Style := []; + DrawText(Sender.Canvas.Handle, PChar(FTileHint.Obj), Length(FTileHint.Obj), FTileHint.ObjRect, DT_CALCRECT); FTileHint.Flags := Format('Flags = [%s]', [flags]); FTileHint.FlagsRect.Left := 5; - FTileHint.FlagsRect.Top := FTileHint.NameRect.Bottom + 5; + FTileHint.FlagsRect.Top := FTileHint.ObjRect.Bottom + 2; FTileHint.FlagsRect.Right := 145; Sender.Canvas.Font.Style := [fsItalic]; DrawText(Sender.Canvas.Handle, PChar(FTileHint.Flags), Length(FTileHint.Flags), FTileHint.FlagsRect, DT_CALCRECT or DT_WORDBREAK); - R := Rect(0, 0, Max(FTileHint.NameRect.Right, FTileHint.FlagsRect.Right) + 5, + R := Rect(0, 0, Max(Max(FTileHint.NameRect.Right, FTileHint.ObjRect.Right), FTileHint.FlagsRect.Right) + 5, FTileHint.FlagsRect.Bottom + 5); end; @@ -1785,6 +3767,31 @@ begin end; end; +procedure TfrmMain.vstClientsGetText(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; + var CellText: String); +var + clientInfo: PClientInfo; +begin + clientInfo := Sender.GetNodeData(Node); + case Column of + 1: CellText := clientInfo^.Name;//Format('%d, %d', [locationInfo^.X, locationInfo^.Y]); + 2: CellText := FormatDateTime('mm\dd - hh:mm:ss', clientInfo^.LogonDateTime); + end; +end; + +procedure TfrmMain.vstClientsGetImageIndex(Sender: TBaseVirtualTree; + Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; + var Ghosted: Boolean; var ImageIndex: Integer); +var + clientInfo: PClientInfo; +begin + clientInfo := Sender.GetNodeData(Node); + case Column of + 0: frmAccountControl.GetAccountImageIndex(clientInfo^.AccessLevel, ImageIndex); + end; +end; + procedure TfrmMain.vstLocationsDblClick(Sender: TObject); var node: PVirtualNode; @@ -1864,8 +3871,79 @@ begin end; procedure TfrmMain.XMLPropStorage1RestoreProperties(Sender: TObject); +var ws: Integer; begin - FTextureManager.UseAnims := mnuShowAnimations.Checked; + Logger.EnterMethod([lcLandscape, lcDebug], 'TfrmMain.XMLPropStorage1RestoreProperties(Sender: TObject);'); + + if Sender = nil then begin + FTextureManager.UseAnims := mnuShowAnimations.Checked; + tbTerrain.Down := acTerrain.Checked; + frmLightLevel.tbLightlevel.Position:=acLightLevel.Tag; + end; + + if mnuWindowedMode.Checked then begin + BorderStyle := bsSizeable; + FormStyle := fsNormal; + {if ((Tag<>0) and (mnuWindowedMode.Tag<>0)) then begin + ws := (Tag and $3); + if ws = 1 then WindowState := wsNormal else + if ws = 2 then WindowState := wsMinimized else + if ws = 3 then WindowState := wsMaximized; + Left := ((mnuWindowedMode.Tag shr 15) and $7FFF); + Top := (mnuWindowedMode.Tag and $7FFF); + Width := ((Tag shr 16) and $3FFF); + Height:= ((Tag shr 2) and $3FFF); + Tag := 0; mnuWindowedMode.Tag := 0; + end; } + end else begin + {if ((Tag = 0) and (mnuWindowedMode.Tag = 0)) then begin + if WindowState = wsNormal then ws := 1 else + if WindowState = wsMinimized then ws := 2 else + if WindowState = wsMaximized then ws := 3 else ws := 0; + Tag := ((Width and $3FFF) shl 16) or ((Height and $3FFF) shl 2) or (ws and $3); + mnuWindowedMode.Tag := ((Left and $7FFF) shl 15) or ((Top and $7FFF) shl 0); + end; } + BorderStyle := bsNone; + FormStyle := fsStayOnTop; + WindowState := wsMaximized; + end; + + //mnuTileListViewClick(nil); + //mnuAutoHideGroupListClick(nil); + //mnuAutoHideRandomListClick(nil); + Logger.ExitMethod([lcLandscape, lcDebug], 'TfrmMain.XMLPropStorage1RestoreProperties(Sender: TObject);'); +end; + +procedure TfrmMain.XMLPropStorage1SavingProperties(Sender: TObject); +var ws: Integer; +begin + Logger.EnterMethod([lcLandscape, lcDebug], 'TfrmMain.XMLPropStorage1SavingProperties(Sender: TObject);'); + //Hide; + if mnuWindowedMode.Checked then begin + if ((Tag<>0) and (mnuWindowedMode.Tag<>0)) then begin + ws := (Tag and $3); + if ws = 1 then WindowState := wsNormal else + if ws = 2 then WindowState := wsMinimized else + if ws = 3 then WindowState := wsMaximized; + Left := ((mnuWindowedMode.Tag shr 15) and $7FFF); + Top := (mnuWindowedMode.Tag and $7FFF); + Width := ((Tag shr 16) and $3FFF); + Height:= ((Tag shr 2) and $3FFF); + Tag := 0; mnuWindowedMode.Tag := 0; + end; + end else begin + if ((Tag = 0) and (mnuWindowedMode.Tag = 0)) then begin + if WindowState = wsNormal then ws := 1 else + if WindowState = wsMinimized then ws := 2 else + if WindowState = wsMaximized then ws := 3 else ws := 0; + Tag := ((Width and $3FFF) shl 16) or ((Height and $3FFF) shl 2) or (ws and $3); + mnuWindowedMode.Tag := ((Left and $7FFF) shl 15) or ((Top and $7FFF) shl 0); + end; + end; + //Show; + if spTileList.Top > spTileList.Parent.Height then + spTileList.Top := spTileList.Parent.Height - 200; + Logger.ExitMethod([lcLandscape, lcDebug], 'TfrmMain.XMLPropStorage1SavingProperties(Sender: TObject);'); end; procedure TfrmMain.SetX(const AValue: Integer); @@ -1890,6 +3968,7 @@ begin dmNetwork.Send(TUpdateClientPosPacket.Create(AX, AY)); InvalidateScreenBuffer; if frmRadarMap <> nil then frmRadarMap.Repaint; + pbRadar.Repaint; end; end; @@ -1924,6 +4003,9 @@ begin end; procedure TfrmMain.SetCurrentTile(const AValue: TWorldItem); +var + sRect: TRect; + w, h: Integer; begin //Logger.EnterMethod([lcClient, lcDebug], 'SetCurrentTile'); if AValue = FCurrentTile then @@ -1939,23 +4021,75 @@ begin if FCurrentTile = nil then begin - lblTileInfo.Caption := ''; + lblTileInfoIDLabel.Caption:= ''; + lblTileInfoIDValue.Caption:= ''; + lblTileInfoXLabel.Caption := ''; + lblTileInfoXValue.Caption := ''; + lblTileInfoYLabel.Caption := ''; + lblTileInfoYValue.Caption := ''; + lblTileInfoZLabel.Caption := ''; + lblTileInfoZValue.Caption := ''; + lblTileInfoHueLabel.Caption := ''; + lblTileInfoHueValue.Caption := ''; + lblTileInfoOLabel.Visible := False; + lblTileInfoWLabel.Visible := False; + lblTileInfoWValue.Visible := False; + lblTileInfoHLabel.Visible := False; + lblTileInfoHValue.Visible := False; + lblTileInfoCLabel.Visible := False; end else begin FCurrentTile.OnDestroy.RegisterEvent(@OnTileRemoved); - if FCurrentTile is TVirtualTile then - lblTileInfo.Caption := Format('Virtual Layer: X: %d, Y: %d, Z: %d', - [FCurrentTile.X, FCurrentTile.Y, FCurrentTile.Z]) - else if FCurrentTile is TMapCell then - lblTileInfo.Caption := Format('Terrain TileID: $%x, X: %d, Y: %d, Z: %d', - [FCurrentTile.TileID, FCurrentTile.X, FCurrentTile.Y, FCurrentTile.Z]) - else if FCurrentTile is TStaticItem then - lblTileInfo.Caption := Format('Static TileID: $%x, X: %d, Y: %d, Z: %d, Hue: $%x', - [FCurrentTile.TileID, FCurrentTile.X, FCurrentTile.Y, FCurrentTile.Z, - TStaticItem(FCurrentTile).Hue]); + lblTileInfoIDValue.Caption := Format('0x%.4x', [FCurrentTile.TileID]); + lblTileInfoIDValue.Font.Bold := True; + lblTileInfoXLabel.Caption := lbBottomCursorPosX; + lblTileInfoYLabel.Caption := lbBottomCursorPosY; + lblTileInfoZLabel.Caption := lbBottomCursorPosZ; + lblTileInfoXValue.Caption := Format('%d', [FCurrentTile.X]); + lblTileInfoYValue.Caption := Format('%d', [FCurrentTile.Y]); + lblTileInfoZValue.Caption := Format('%d', [FCurrentTile.Z]); + if FCurrentTile is TVirtualTile then begin + lblTileInfoIDLabel.Caption := lbBottomCursorVLayer1; + lblTileInfoIDValue.Font.Bold := False; + lblTileInfoIDValue.Caption := lbBottomCursorVLayer2; + lblTileInfoHueLabel.Caption:= ''; + lblTileInfoHueValue.Caption:= ''; + end + else if FCurrentTile is TMapCell then begin + lblTileInfoIDLabel.Caption := lbBottomCursorLandID; + lblTileInfoHueLabel.Caption:= ''; + lblTileInfoHueValue.Caption:= ''; + end + else if FCurrentTile is TStaticItem then begin + lblTileInfoIDLabel.Caption := lbBottomCursorItemID; + lblTileInfoHueLabel.Caption:= lbBottomCursorItemHue; + lblTileInfoHueValue.Caption:= Format('%.3x', [TStaticItem(FCurrentTile).Hue]); + end; + sRect := GetSelectedRect; + w := sRect.Right - sRect.Left + 1; + h := sRect.Bottom - sRect.Top + 1; + if ((w > 1) or (h > 1)) then begin + lblTileInfoOLabel.Visible := True; + lblTileInfoWLabel.Visible := True; + lblTileInfoWValue.Visible := True; + lblTileInfoHLabel.Visible := True; + lblTileInfoHValue.Visible := True; + lblTileInfoCLabel.Visible := True; + lblTileInfoWValue.Caption := Format('%d', [w]); + lblTileInfoHValue.Caption := Format('%d', [h]); + end else begin + lblTileInfoOLabel.Visible := False; + lblTileInfoWLabel.Visible := False; + lblTileInfoWValue.Visible := False; + lblTileInfoHLabel.Visible := False; + lblTileInfoHValue.Visible := False; + lblTileInfoCLabel.Visible := False; + end; end; UpdateSelection; + + //Logger.Send([lcClient, lcDebug], 'CurrentTile: %.5x (%.6d)', [CurrentTile.TileID, CurrentTile.TileID]); //Logger.ExitMethod([lcClient, lcDebug], 'SetCurrentTile'); end; @@ -1964,7 +4098,7 @@ begin //Logger.EnterMethod([lcClient, lcDebug], 'SetSelectedTile'); if AValue = FSelectedTile then begin - //Logger.ExitMethod([lcClient, lcDebug], 'SetSelectedTile'); + Logger.ExitMethod([lcClient, lcDebug], 'SetSelectedTile'); Exit; end; //Logger.Send([lcClient, lcDebug], 'Value', AValue); @@ -2049,7 +4183,7 @@ begin begin locationNode := vstLocations.AddChild(nil); locationInfo := vstLocations.GetNodeData(locationNode); - locationInfo^.Name := location.AttribStrings['Name']; + locationInfo^.Name := CP1251ToUTF8(location.AttribStrings['Name']); if TryStrToInt(location.AttribStrings['X'], j) then locationInfo^.X := j @@ -2084,8 +4218,8 @@ begin begin if presets[i].NodeName = 'Preset' then begin - cbRandomPreset.Items.AddObject(TDOMElement(presets[i]).AttribStrings['Name'], - presets[i]); + cbRandomPreset.Items.AddObject( + CP1251ToUTF8(TDOMElement(presets[i]).AttribStrings['Name']), presets[i]); end; end; end else @@ -2104,7 +4238,7 @@ end; procedure TfrmMain.PrepareMapCell(AMapCell: TMapCell); var - current, north, east, west: PBlockInfo; + current, north, east, west, tile1, tile4, tile3, tile6: PBlockInfo; cell: TMapCell; begin current := FScreenBuffer.UpdateSortOrder(AMapCell); @@ -2119,7 +4253,12 @@ begin north := nil; east := nil; west := nil; - while ((north = nil) or (east = nil) or (west = nil)) and + tile1 := nil; + tile4 := nil; + tile3 := nil; + tile6 := nil; + while ((north = nil) or (east = nil) or (west = nil) or + (tile1 = nil) or (tile3 = nil) or (tile4 = nil) or (tile6 = nil)) and FScreenBuffer.Iterate(current) do begin if current^.Item is TMapCell then @@ -2130,13 +4269,26 @@ begin else if (cell.X = AMapCell.X) and (cell.Y = AMapCell.Y - 1) then east := current else if (cell.X = AMapCell.X - 1) and (cell.Y = AMapCell.Y) then - west := current; + west := current + else if (cell.X = AMapCell.X) and (cell.Y = AMapCell.Y + 1) then + tile1 := current + else if (cell.X = AMapCell.X + 1) and (cell.Y = AMapCell.Y) then + tile3 := current + else if (cell.X = AMapCell.X - 1) and (cell.Y = AMapCell.Y + 1) then + tile4 := current + else if (cell.X = AMapCell.X + 1) and (cell.Y = AMapCell.Y - 1) then + tile6 := current; end; end; if north <> nil then PrepareScreenBlock(north); if east <> nil then PrepareScreenBlock(east); if west <> nil then PrepareScreenBlock(west); + if tile1 <> nil then PrepareScreenBlock(tile1); + if tile3 <> nil then PrepareScreenBlock(tile3); + if tile4 <> nil then PrepareScreenBlock(tile4); + if tile6 <> nil then PrepareScreenBlock(tile6); + end; procedure TfrmMain.InvalidateFilter; @@ -2171,9 +4323,10 @@ procedure TfrmMain.PrepareScreenBlock(ABlockInfo: PBlockInfo); var item: TWorldItem; drawX, drawY: Integer; - z, west, south, east: SmallInt; - rawZ, rawWest, rawSouth, rawEast: SmallInt; + z, west, south, east, tileNorth, tileWest, tileLeft, tileRight: SmallInt; + rawZ, rawWest, rawSouth, rawEast, rawTileNorth, rawTileWest, rawTileLeft, rawTileRight: SmallInt; staticItem: TStaticItem; + zoom: Single; begin //add normals to map tiles and materials where possible @@ -2266,6 +4419,22 @@ begin ABlockInfo^.DrawQuad[2][1] := drawY + 44 - south * 4; ABlockInfo^.DrawQuad[3][0] := drawX - 22; ABlockInfo^.DrawQuad[3][1] := drawY + 22 - west * 4; + + // Подготовка сетки рельефа для текстур + if mnuShowGrid.Checked or mnuShowBlocks.Checked then + begin + ABlockInfo^.LineWidth[0] := 0.9; + ABlockInfo^.LineDraw[0][0] := ABlockInfo^.DrawQuad[0]; + ABlockInfo^.LineDraw[0][1] := ABlockInfo^.DrawQuad[1]; + ABlockInfo^.LineWidth[1] := 0.9; + ABlockInfo^.LineDraw[1][0] := ABlockInfo^.DrawQuad[0]; + ABlockInfo^.LineDraw[1][1] := ABlockInfo^.DrawQuad[3]; + ABlockInfo^.LineWidth[2] := 0.8; + //ABlockInfo^.LineDraw[2][0] := ABlockInfo^.DrawQuad[0]; + //ABlockInfo^.LineDraw[2][1] := ABlockInfo^.DrawQuad[2]; + ABlockInfo^.LineDraw[2][0] := ABlockInfo^.DrawQuad[1]; + ABlockInfo^.LineDraw[2][1] := ABlockInfo^.DrawQuad[3]; + end; end else begin ABlockInfo^.DrawQuad[0][0] := drawX - 22; @@ -2276,8 +4445,33 @@ begin ABlockInfo^.DrawQuad[2][1] := drawY + ABlockInfo^.LowRes.Height - z * 4; ABlockInfo^.DrawQuad[3][0] := drawX - 22; ABlockInfo^.DrawQuad[3][1] := drawY + ABlockInfo^.LowRes.Height - z * 4; + + // Подготовка сетки рельефа для лендов + if mnuShowGrid.Checked or mnuShowBlocks.Checked then + begin + GetLandAlt(item.X, item.Y - 1, z, rawZ, tileNorth, rawTileNorth); + GetLandAlt(item.X - 1, item.Y, z, rawZ, tileWest, rawTileWest); + GetLandAlt(item.X - 1, item.Y + 1, z, rawZ, tileLeft, rawTileLeft); + GetLandAlt(item.X + 1, item.Y - 1, z, rawZ, tileRight, rawTileRight); + if (tileNorth <> z) or (tileRight <> z) + then ABlockInfo^.LineWidth[0] := 0.9 + else ABlockInfo^.LineWidth[0] := 0.8; + ABlockInfo^.LineDraw[0][0][0] := drawX; + ABlockInfo^.LineDraw[0][0][1] := ABlockInfo^.DrawQuad[0][1]; + ABlockInfo^.LineDraw[0][1][0] := ABlockInfo^.DrawQuad[1][0]; + ABlockInfo^.LineDraw[0][1][1] := ABlockInfo^.DrawQuad[1][1] + 22; + if (tileWest <> z) or (tileLeft <> z) + then ABlockInfo^.LineWidth[1] := 0.9 + else ABlockInfo^.LineWidth[1] := 0.8; + ABlockInfo^.LineDraw[1][0][0] := drawX; + ABlockInfo^.LineDraw[1][0][1] := ABlockInfo^.DrawQuad[0][1]; + ABlockInfo^.LineDraw[1][1][0] := ABlockInfo^.DrawQuad[3][0]; + ABlockInfo^.LineDraw[1][1][1] := ABlockInfo^.DrawQuad[3][1] - 22; + ABlockInfo^.LineWidth[2] := 0.0; + end; end; end else + // Виртуальный пол if item is TVirtualTile then begin ABlockInfo^.LowRes := FVLayerMaterial; @@ -2292,31 +4486,130 @@ begin ABlockInfo^.DrawQuad[2][1] := drawY + ABlockInfo^.LowRes.Height - z * 4; ABlockInfo^.DrawQuad[3][0] := drawX - 22; ABlockInfo^.DrawQuad[3][1] := drawY + ABlockInfo^.LowRes.Height - z * 4; + + // Подготовка сетки блоков на виртуальном полу + if (frmVirtualLayer.cbShowBlocks.Checked) then + begin + if (item.Y mod 8) <> 0 then + ABlockInfo^.LineWidth[0] := 0 + else begin + ABlockInfo^.LineWidth[0] := 1.6; + ABlockInfo^.LineDraw[0][0][0] := drawX; + ABlockInfo^.LineDraw[0][0][1] := ABlockInfo^.DrawQuad[0][1]; + ABlockInfo^.LineDraw[0][1][0] := ABlockInfo^.DrawQuad[1][0]; + ABlockInfo^.LineDraw[0][1][1] := ABlockInfo^.DrawQuad[1][1] + 22; + end; + if (item.X mod 8) <> 0 then + ABlockInfo^.LineWidth[1] := 0 + else begin + ABlockInfo^.LineWidth[1] := 1.6; + ABlockInfo^.LineDraw[1][0][0] := drawX; + ABlockInfo^.LineDraw[1][0][1] := ABlockInfo^.DrawQuad[0][1]; + ABlockInfo^.LineDraw[1][1][0] := ABlockInfo^.DrawQuad[3][0]; + ABlockInfo^.LineDraw[1][1][1] := ABlockInfo^.DrawQuad[3][1] - 22; + end; + + end; + end else begin staticItem := TStaticItem(item); - ABlockInfo^.LowRes := FTextureManager.GetStaticMaterial(staticItem); - ABlockInfo^.HueOverride := False; - ABlockInfo^.ScreenRect := Bounds(Trunc(drawX - ABlockInfo^.LowRes.RealWidth / 2), - Trunc(drawY + 44 - ABlockInfo^.LowRes.RealHeight - z * 4), - ABlockInfo^.LowRes.RealWidth, - ABlockInfo^.LowRes.RealHeight); + // Тайл виртуального источника света + if acNoDraw.Checked and mnuShowLightSource.Checked and (staticItem.TileID <= FLandscape.MaxStaticID) + and (FLightSourceTiles[staticItem.TileID].image > 0) then + begin + ABlockInfo^.LowRes := FVLightSrcMaterial[FLightSourceTiles[staticItem.TileID].image - 1]; + ABlockInfo^.LowRes.AddRef; + ABlockInfo^.ScreenRect := Bounds(Trunc(drawX - 12), Trunc(drawY - z * 4), 24, 24); + ABlockInfo^.DrawQuad[0][0] := drawX - 12; + ABlockInfo^.DrawQuad[0][1] := drawY + 12 - z * 4; + ABlockInfo^.DrawQuad[1][0] := drawX - 12 + ABlockInfo^.LowRes.Width; + ABlockInfo^.DrawQuad[1][1] := drawY + 12 - z * 4; + ABlockInfo^.DrawQuad[2][0] := drawX - 12 + ABlockInfo^.LowRes.Width; + ABlockInfo^.DrawQuad[2][1] := drawY + 12 + ABlockInfo^.LowRes.Height - z * 4; + ABlockInfo^.DrawQuad[3][0] := drawX - 12; + ABlockInfo^.DrawQuad[3][1] := drawY + 12 + ABlockInfo^.LowRes.Height - z * 4; + end else + // Тайлы обычной статики + begin + ABlockInfo^.LowRes := FTextureManager.GetStaticMaterial(staticItem); + ABlockInfo^.HueOverride := False; - ABlockInfo^.Translucent := tdfTranslucent in - ResMan.Tiledata.StaticTiles[staticItem.TileID].Flags; + ABlockInfo^.ScreenRect := Bounds(Trunc(drawX - ABlockInfo^.LowRes.RealWidth / 2), + Trunc(drawY + 44 - ABlockInfo^.LowRes.RealHeight - z * 4), + ABlockInfo^.LowRes.RealWidth, + ABlockInfo^.LowRes.RealHeight); - south := ABlockInfo^.LowRes.RealHeight; - east := ABlockInfo^.LowRes.RealWidth div 2; + ABlockInfo^.Translucent := tdfTranslucent in + ResMan.Tiledata.StaticTiles[staticItem.TileID].Flags; - ABlockInfo^.DrawQuad[0][0] := drawX - east; - ABlockInfo^.DrawQuad[0][1] := drawY + 44 - south - z * 4; - ABlockInfo^.DrawQuad[1][0] := drawX - east + ABlockInfo^.LowRes.Width; - ABlockInfo^.DrawQuad[1][1] := drawY + 44 - south - z * 4; - ABlockInfo^.DrawQuad[2][0] := drawX - east + ABlockInfo^.LowRes.Width; - ABlockInfo^.DrawQuad[2][1] := drawY + 44 - south + ABlockInfo^.LowRes.Height - z * 4; - ABlockInfo^.DrawQuad[3][0] := drawX - east; - ABlockInfo^.DrawQuad[3][1] := drawY + 44 - south + ABlockInfo^.LowRes.Height - z * 4; + south := ABlockInfo^.LowRes.RealHeight; + east := ABlockInfo^.LowRes.RealWidth div 2; + + ABlockInfo^.DrawQuad[0][0] := drawX - east; + ABlockInfo^.DrawQuad[0][1] := drawY + 44 - south - z * 4; + ABlockInfo^.DrawQuad[1][0] := drawX - east + ABlockInfo^.LowRes.Width; + ABlockInfo^.DrawQuad[1][1] := drawY + 44 - south - z * 4; + ABlockInfo^.DrawQuad[2][0] := drawX - east + ABlockInfo^.LowRes.Width; + ABlockInfo^.DrawQuad[2][1] := drawY + 44 - south + ABlockInfo^.LowRes.Height - z * 4; + ABlockInfo^.DrawQuad[3][0] := drawX - east; + ABlockInfo^.DrawQuad[3][1] := drawY + 44 - south + ABlockInfo^.LowRes.Height - z * 4; + end; + end; + + + if tbZoom.Down then begin + zoom := tbZoom.Tag / 1000.0; + + ABlockInfo^.ScreenRect.Left := Trunc(zoom * (ABlockInfo^.ScreenRect.Left -drawX)+drawX); + ABlockInfo^.ScreenRect.Top := Trunc(zoom * (ABlockInfo^.ScreenRect.Top -drawY)+drawY);; + ABlockInfo^.ScreenRect.Right := Trunc(zoom * (ABlockInfo^.ScreenRect.Right -drawX)+drawX); + ABlockInfo^.ScreenRect.Bottom := Trunc(zoom * (ABlockInfo^.ScreenRect.Bottom -drawY)+drawY); + + //south:= Trunc(zoom*(ABlockInfo^.DrawQuad[2][1] - ABlockInfo^.DrawQuad[0][1])); + //east := Trunc(zoom*(ABlockInfo^.DrawQuad[2][0] - ABlockInfo^.DrawQuad[0][0])); + + for z:=0 to 3 do begin + ABlockInfo^.DrawQuad[z][0] := Trunc(zoom * (ABlockInfo^.DrawQuad[z][0] -drawX)+drawX); + ABlockInfo^.DrawQuad[z][1] := Trunc(zoom * (ABlockInfo^.DrawQuad[z][1] -drawY)+drawY); + end; + if item is TMapCell then begin + inc(ABlockInfo^.DrawQuad[0][1], -1); + inc(ABlockInfo^.DrawQuad[1][0], +1); + inc(ABlockInfo^.DrawQuad[2][1], +1); + inc(ABlockInfo^.DrawQuad[3][0], -1); + end else if zoom < 1.0 then begin + inc(ABlockInfo^.DrawQuad[0][0], -1); + inc(ABlockInfo^.DrawQuad[0][1], -1); + //inc(ABlockInfo^.DrawQuad[1][0], +1); + inc(ABlockInfo^.DrawQuad[1][1], -1); + //inc(ABlockInfo^.DrawQuad[2][0], +1); + //inc(ABlockInfo^.DrawQuad[2][1], +1); + inc(ABlockInfo^.DrawQuad[3][0], -1); + //inc(ABlockInfo^.DrawQuad[3][1], +1); + end; + + if not acFlat.Checked and (item is TMapCell) and + ((rawWest <> rawZ) or (rawSouth <> rawZ) or (rawEast <> rawZ)) then + for z:=0 to 3 do begin + ABlockInfo^.RealQuad[z][0] := Trunc(zoom * (ABlockInfo^.RealQuad[z][0] -drawX)+drawX); + ABlockInfo^.RealQuad[z][1] := Trunc(zoom * (ABlockInfo^.RealQuad[z][1] -drawY)+drawY); + end; + + rawZ := -1; + if ((mnuShowGrid.Checked or mnuShowBlocks.Checked) and (item is TMapCell)) + then if (ABlockInfo^.HighRes <> nil) then rawZ:=2 else rawZ:= 1 + else if (frmVirtualLayer.cbShowBlocks.Checked and (item is TVirtualTile)) + then if ((item.Y mod 8 = 0) or (item.X mod 8 = 0)) then rawZ := 1; + + for z:=0 to rawZ do begin + //ABlockInfo^.LineWidth[z] := zoom * ABlockInfo^.LineWidth[z]; + ABlockInfo^.LineDraw[z][0][0] := TGLint(Trunc(zoom *(ABlockInfo^.LineDraw[z][0][0] -drawX)+drawX)); + ABlockInfo^.LineDraw[z][0][1] := TGLint(Trunc(zoom *(ABlockInfo^.LineDraw[z][0][1] -drawY)+drawY)); + ABlockInfo^.LineDraw[z][1][0] := TGLint(Trunc(zoom *(ABlockInfo^.LineDraw[z][1][0] -drawX)+drawX)); + ABlockInfo^.LineDraw[z][1][1] := TGLint(Trunc(zoom *(ABlockInfo^.LineDraw[z][1][1] -drawY)+drawY)); + end; end; end; @@ -2326,7 +4619,11 @@ var intensity, red, green, blue: GLfloat; blockInfo: PBlockInfo; item: TWorldItem; + i : byte; + zoom: Single; begin + if tbZoom.Down then zoom := tbZoom.Tag / 1000.0 else zoom:=1.0; + if not (sbsValid in FScreenBufferState) then RebuildScreenBuffer; @@ -2427,11 +4724,112 @@ begin if (blockInfo^.Text <> nil) then blockInfo^.Text.Render(blockInfo^.ScreenRect); + + ///////////////// + // Рендинг сетки рельефа + if (mnuShowGrid.Checked) and (blockInfo^.Item is TMapCell) then + begin + glDisable(GL_TEXTURE_2D); // не использовать цвет текстуры + glEnable(GL_LINE_SMOOTH); // сглаживание линий + //glDisable(GL_LINE_SMOOTH); + + if (tbFlat.Down) then + begin + glColor4f(0.8, 0.8, 0.8, 0.9); // цвет линий + glLineWidth(0.1); // ширина линий + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[0][0]); + glVertex2iv(@blockInfo^.LineDraw[0][1]); + glVertex2iv(@blockInfo^.LineDraw[1][0]); + glVertex2iv(@blockInfo^.LineDraw[1][1]); + glEnd; + end else + begin + if blockInfo^.LineWidth[0] < 0.85 + then glColor4f(1.0, 1.0, 0.0, 0.5) // цвет линий + else glColor4f(1.0, 1.0, 1.0, 1.0); // цвет линий + glLineWidth(blockInfo^.LineWidth[0]); // ширина линий + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[0][0]); + glVertex2iv(@blockInfo^.LineDraw[0][1]); + glEnd; + if blockInfo^.LineWidth[1] < 0.85 + then glColor4f(1.0, 1.0, 0.0, 0.5) // цвет линий + else glColor4f(1.0, 1.0, 1.0, 1.0); // цвет линий + glLineWidth(blockInfo^.LineWidth[1]); // ширина линий + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[1][0]); + glVertex2iv(@blockInfo^.LineDraw[1][1]); + glEnd; + if blockInfo^.LineWidth[2] > 0 then + begin + glColor4f(1.3281, 0.2510, 1.0, 0.8); // цвет линий + glLineWidth(blockInfo^.LineWidth[2]);// ширина линий + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[2][0]); + glVertex2iv(@blockInfo^.LineDraw[2][1]); + glEnd; + end; + end; + + glDisable(GL_LINE_SMOOTH); + glEnable(GL_TEXTURE_2D); + end else if (mnuShowBlocks.Checked) and (blockInfo^.Item is TMapCell) then + begin // Рендинг сетки блоков + glDisable(GL_TEXTURE_2D); // не использовать цвет текстуры + glEnable(GL_LINE_SMOOTH); // сглаживание линий + + if (blockInfo^.Item.X mod 8 = 0) then begin + glLineWidth(2.0); + glColor4f(1.0, 1.0, 0.0, 0.5); + end else begin + glColor4f(0.8, 0.8, 0.8, 0.9); + glLineWidth(0.1); + end; + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[1][0]); + glVertex2iv(@blockInfo^.LineDraw[1][1]); + glEnd; + if (blockInfo^.Item.Y mod 8 = 0) then begin + glLineWidth(2.0); + glColor4f(1.0, 1.0, 0.0, 0.5); + end else begin + glColor4f(0.8, 0.8, 0.8, 0.9); + glLineWidth(0.1); + end; + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[0][0]); + glVertex2iv(@blockInfo^.LineDraw[0][1]); + glEnd; + + glDisable(GL_LINE_SMOOTH); + glEnable(GL_TEXTURE_2D); + end else if (frmVirtualLayer.cbShowBlocks.Checked) and (blockInfo^.Item is TVirtualTile) then + begin + glDisable(GL_TEXTURE_2D); // не использовать цвет текстуры + glEnable(GL_LINE_SMOOTH); // сглаживание линий + + for i := 0 to 1 do if blockInfo^.LineWidth[i] > 0 then begin + glColor4f(0.0, 0.65, 0.68, 0.50); // цвет линий + glLineWidth(blockInfo^.LineWidth[i]); // ширина линий + glBegin(GL_LINES); + glVertex2iv(@blockInfo^.LineDraw[i][0]); + glVertex2iv(@blockInfo^.LineDraw[i][1]); + glEnd; + end; + + glDisable(GL_LINE_SMOOTH); + glEnable(GL_TEXTURE_2D); + end; + + //////////////// end; if (FLightManager.LightLevel > 0) and not acFlat.Checked then - FLightManager.Draw(oglGameWindow.ClientRect); + FLightManager.Draw(oglGameWindow.ClientRect, zoom); FOverlayUI.Draw(oglGameWindow); + + FLandscape.ResizeBlockCache(0); end; procedure TfrmMain.SaveLocations; @@ -2449,7 +4847,7 @@ begin begin locationInfo := vstLocations.GetNodeData(locationNode); location := xmlDoc.CreateElement('Location'); - location.AttribStrings['Name'] := locationInfo^.Name; + location.AttribStrings['Name'] := UTF8ToCP1251(locationInfo^.Name); location.AttribStrings['X'] := IntToStr(locationInfo^.X); location.AttribStrings['Y'] := IntToStr(locationInfo^.Y); xmlDoc.DocumentElement.AppendChild(location); @@ -2540,55 +4938,1657 @@ begin end; end; -procedure TfrmMain.BuildTileList; +function TfrmMain.LoadListError(condition: Boolean; filename, message : string): Boolean; inline; var - minID, maxID, i, lastID: Integer; - node: PVirtualNode; - tileInfo: PTileInfo; - filter: string; + answer: Word; + l, c: Word; begin - maxID := $3FFF; - if cbTerrain.Checked then minID := $0 else minID := $4000; - if cbStatics.Checked then maxID := maxID + FLandscape.MaxStaticID; - filter := AnsiLowerCase(UTF8ToISO_8859_1(edFilter.Text)); - - node := vdtTiles.GetFirstSelected; - if node <> nil then + result := False; + if not condition + then Exit; + + l := Length(filename); + for c := l downto 1 do + if (filename[c] = '\') or (filename[c] = '/') + then break; + if c > 1 then inc(c); + answer := MessageDlg(Format(GetParseErText('MessageDlgCaption'), [Copy(filename, c, l-c+1)]), + Format(GetParseErText('MessageDlgTxtLine1')+sLineBreak+ + GetParseErText('MessageDlgTxtLine2')+sLineBreak+sLineBreak+ + GetParseErText('MessageDlgTxtLine3'), + [message, filename]), mtError, [mbAbort, mbRetry, mbIgnore], 0); + if answer = mrAbort + then begin + Application.Terminate; + Halt; + end; + result := (answer = mrRetry); +end; + +procedure TfrmMain.LoadVisibleTiles(AFileName: String); +var + XMLDoc: TXMLDocument; + iNode, node: TDOMNode; + s: string; + i, id: Integer; +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['VirtualTiles.xml'])); + FVisibleTiles := TBits.Create($4000 + FLandscape.MaxStaticID); + for i := 0 to FVisibleTiles.Size - 1 do + FVisibleTiles[i] := True; + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, AFileName); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'virtualtiles' then begin - tileInfo := vdtTiles.GetNodeData(node); - lastID := tileInfo^.ID; - end else - lastID := -1; - - vdtTiles.BeginUpdate; - vdtTiles.Clear; - - for i := minID to maxID do - begin - if ResMan.Art.Exists(i) then + iNode := XMLDoc.DocumentElement.FirstChild; + while iNode <> nil do begin - if (filter <> '') and (Pos(filter, AnsiLowerCase( - ResMan.Tiledata.TileData[i].TileName)) = 0) then Continue; - node := vdtTiles.AddChild(nil); - tileInfo := vdtTiles.GetNodeData(node); - tileInfo^.ID := i; - if i = lastID then - vdtTiles.Selected[node] := True; + if LowerCase(iNode.NodeName) = 'unused' then + begin + node := iNode.FirstChild; + while node <> nil do + begin + s := LowerCase(node.NodeName); + if (s = 'tile') or (s = 'land') or (s = 'item') then + for i := node.Attributes.Length - 1 downto 0 do + if LowerCase(node.Attributes[i].NodeName) = 'id' then + if TryStrToInt(node.Attributes[i].NodeValue, id) then + begin + if s = 'item' + then Inc(id, $4000); + if (id >= 0) and (id < FVisibleTiles.Size) + then FVisibleTiles[id] := False; + end; + node := node.NextSibling; + end; + end; + iNode := iNode.NextSibling; end; end; - - if vdtTiles.GetFirstSelected = nil then - begin - node := vdtTiles.GetFirst; - if node <> nil then - vdtTiles.Selected[node] := True; +end; + +procedure TfrmMain.LoadLightSourceTiles(AFileName: String); +var + XMLDoc: TXMLDocument; + iNode, node: TDOMNode; + s: string; + i, id, bit: Integer; +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['VirtualTiles.xml'])); + if (FLightSourceTiles = nil) then begin + getmem(FLightSourceTiles, (FLandscape.MaxStaticID + 1) * SizeOf(TLightTile)); + for i := 0 to FLandscape.MaxStaticID - 1 do + FillByte(FLightSourceTiles[i], SizeOf(TLightTile), 0); end; + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, AFileName); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'virtualtiles' then + begin + iNode := XMLDoc.DocumentElement.FirstChild; + while iNode <> nil do + begin + if LowerCase(iNode.NodeName) = 'lightsource' then + begin + node := iNode.FirstChild; + while node <> nil do + begin + s := LowerCase(node.NodeName); + if (s = 'tile') or (s = 'item') then begin + id :=-1; + bit := 1; + for i := node.Attributes.Length - 1 downto 0 do + begin + if LowerCase(node.Attributes[i].NodeName) = 'id' then + if TryStrToInt(node.Attributes[i].NodeValue, id) then + begin + if s = 'tile' + then Inc(id, -$4000); + //if (id >= 0) and (id < FLightSourceTiles.Size) + // then FLightSourceTiles[id] := True; + end; + if LowerCase(node.Attributes[i].NodeName) = 'icon' then + if TryStrToInt(node.Attributes[i].NodeValue, bit) then + if (bit < 1) or (bit > FVLightSrcImageCount) then + bit := 1; + end; + if (id >= 0) and (id <= FLandscape.MaxStaticID) then + begin + FLightSourceTiles[id].image := bit; + end; + end; + node := node.NextSibling; + end; + end; + iNode := iNode.NextSibling; + end; + end; + +end; + +procedure TfrmMain.LoadSurfsTilesList; +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['SurfaceInf.xml'])); +end; + +{ + +procedure TfrmMain.LoadSurfsTilesList; +var + fPath, str, attribute : string; + XMLDoc: TXMLDocument; + cNode, sNode, eNode : TDOMNode; + c, s, e, a : Integer; + + tCount: Integer; + tHash1: ^DWORD; + tHash2: ^DWORD; + tIndex: ^LongWord; + + +value : Integer; + //e, t, a, value : Integer; + +// cCount : Word; + sCount : ^Word; + eCount : ^PWord; +begin + if FileExists(FProfileDir + 'SurfaceInf.xml') + then fPath := (FProfileDir + 'SurfaceInf.xml') + else if FileExists(FLocalDir + 'SurfaceInf.xml') + then fPath := (FLocalDir + 'SurfaceInf.xml') + else if FileExists(FConfigDir + 'SurfaceInf.xml') + then fPath := (FConfigDir + 'SurfaceInf.xml') + else if FileExists(ResMan.GetFile('SurfaceInf.xml')) + then fPath := (ResMan.GetFile('SurfaceInf.xml')) + else Exit; + + + + + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, fPath); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'surfaceinf' then + begin + // Подсчет категорий + FSurfsList.GroupCount := 0; + cNode := XMLDoc.DocumentElement.FirstChild; + while cNode <> nil do + begin + if LowerCase(cNode.NodeName) = 'category' then + inc(FSurfsList.GroupCount); + cNode := cNode.NextSibling; + end; + getmem(sCount, FSurfsList.GroupCount * SizeOf( Word)); + getmem(eCount, FSurfsList.GroupCount * SizeOf(PWord)); + + // Подсчет объектов + cNode := XMLDoc.DocumentElement.FirstChild; + while cNode <> nil do + begin + if LowerCase(cNode.NodeName) = 'category' then + begin + sNode := cNode.FirstChild; + while sNode <> nil do + begin + + + + sNode := sNode.NextSibling; + end; + end; + + cNode := cNode.NextSibling; + end; + //////////////////////////////////////////////////////////////////////////// + + + // Создание списка + FSurfsList.TilesCount := $4000 + FLandscape.MaxStaticID; + getmem(FSurfsList.Tiles, FSurfsList.TilesCount * SizeOf(PSurfGrad)); + getmem(FSurfsList.Grads, FSurfsList.GradsCount * SizeOf(TSurfGrad)); + getmem(FSurfsList.Group, FSurfsList.GroupCount * SizeOf(TSurfGroup)); + + tCount := 0; + + c := 0; // -------------- 1 + cNode := XMLDoc.DocumentElement.FirstChild; + while cNode <> nil do + begin + if LowerCase(cNode.NodeName) = 'category' then begin + FSurfsList.Group[c].Name := 'NoName'; + for a := cNode.Attributes.Length - 1 downto 0 do begin + if LowerCase(cNode.Attributes[a].NodeName) = 'name' then + FSurfsList.Group[c].Name := CP1251ToUTF8(cNode.Attributes[a].NodeValue); + end; + // ?????? FSurfsList.Group[c].Count + getmem(FSurfsList.Group[c].Info, FSurfsList.Group[c].Count * SizeOf(TSurfGroup)); + + s := 0; // -------------- 2 + sNode := cNode.FirstChild; + while sNode <> nil do + begin + if LowerCase(sNode.NodeName) = 'surafece' then begin + FSurfsList.Group[c].Info[s].Name := 'NoName'; + FSurfsList.Group[c].Info[s].TileID := $4001; + for a := sNode.Attributes.Length - 1 downto 0 do begin + if LowerCase(sNode.Attributes[a].NodeName) = 'name' then + FSurfsList.Group[c].Info[s].Name := CP1251ToUTF8(sNode.Attributes[a].NodeValue); + if LowerCase(sNode.Attributes[a].NodeName) = 'tileid' then + if TryStrToInt(sNode.Attributes[a].NodeValue, value) then + FSurfsList.Group[c].Info[s].TileID := value; + end; + CalcStringCRC32(LowerCase(FSurfsList.Group[c].Info[s].Name), + FSurfsList.Group[c].Info[s].TileHash); + // ?????? FSurfsList.Group[c].Info[s].GradCount + getmem(FSurfsList.Group[c].Info[s].GradHash, FSurfsList.Group[c].Info[s].GradCount * SizeOf(LongWord)); + + e := 0; // -------------- 3 + eNode := sNode.FirstChild; + while eNode <> nil do + begin + str := LowerCase(eNode.NodeName); + if (str = 'item') or (str = 'land') or (str = 'tile') then begin + str := 'NoType'; + for a := eNode.Attributes.Length - 1 downto 0 do begin + if LowerCase(sNode.Attributes[a].NodeName) = 'type' then + str := CP1251ToUTF8(eNode.Attributes[a].NodeValue); + end; + CalcStringCRC32(LowerCase(FSurfsList.Group[c].Name + '|' + str), + FSurfsList.Group[c].Info[s].GradHash[e]); + inc(tCount); + end else if str = 'brush' then begin + // TODO + + end; + inc(e); + eNode := eNode.NextSibling; + end; // -------------- 3 + + end; + inc(s); + sNode := sNode.NextSibling; + end; // -------------- 2 + + end; + inc(c); + cNode := cNode.NextSibling; + end; // -------------- 1 + + //////////////////////////////////////////////////////////////////////////// + + // Построение списка TSurfGrad + getmem(tHash, tCount * SizeOf(DWORD)); + tCount := 0; + for c := 0 to FSurfsList.GroupCount do + for s := 0 to FSurfsList.Group[c].Count do + for e := 0 to FSurfsList.Group[c].Info[s].GradCount do + begin + for a := tCount-1 downto -1 do + if a < 0 then begin + tHash[tCount] = FSurfsList.Group[c].Info[s].GradHash[e]; + inc(tCount); + end else if tHash[a] = FSurfsList.Group[c].Info[s].GradHash[e] + then break; + end; + + FSurfsList.GradsCount := tCount; + getmem(FSurfsList.Grads, FSurfsList.GradsCount * SizeOf(TSurfGrad)); + + + + + freemem(gHash); + + + + getmem(sCount, FSurfsList.GroupCount * SizeOf( Word)); + getmem(eCount, FSurfsList.GroupCount * SizeOf(PWord)); + + // Подсчет объектов + cNode := XMLDoc.DocumentElement.FirstChild; + while cNode <> nil do + begin + if LowerCase(cNode.NodeName) = 'category' then + begin + sNode := cNode.FirstChild; + while sNode <> nil do + begin + + + + sNode := sNode.NextSibling; + end; + end; + + cNode := cNode.NextSibling; + end; + + + + end; + + +end; + +} + +procedure TfrmMain.LoadEntryTilesList; +var + fPath, s, attribute : string; + XMLDoc: TXMLDocument; + eNode, tNode : TDOMNode; + e, t, a, value : Integer; + // Создание миниатюр + id : Integer; + hue : Word; + alt : integer; + + artHue : THue; + artEntry : TArt; + dSize: TSize; + entHash: QWORD; + Resised: Float; + tCRC32, CacheLen: DWORD; + cacheHash, cachePost: PDWORD; + imageData: TImageData; + imageCache: TFileStream; + imageTemp: TSingleImage; + dX, dY, dZ, dW, dH : Integer; + entStack, entFirst, entLast, entPrev, entNext: PByte; + dstCanvas: TFastARGB32Canvas; + srcCanvas: TFastARGB32Canvas; +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['TilesEntry.xml'])); + if FileExists(FProfileDir + 'TilesEntry.xml') + then fPath := (FProfileDir + 'TilesEntry.xml') + else if FileExists(FLocalDir + 'TilesEntry.xml') + then fPath := (FLocalDir + 'TilesEntry.xml') + else if FileExists(FConfigDir + 'TilesEntry.xml') + then fPath := (FConfigDir + 'TilesEntry.xml') + else if FileExists(ResMan.GetFile('TilesEntry.xml')) + then fPath := (ResMan.GetFile('TilesEntry.xml')) + else Exit; + + FEntryList.Count := 0; + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, fPath); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'tilesentry' then + begin + // Подсчет объектов + eNode := XMLDoc.DocumentElement.FirstChild; + while eNode <> nil do + begin + if LowerCase(eNode.NodeName) = 'entry' then + inc(FEntryList.Count); + eNode := eNode.NextSibling; + end; + getmem(FEntryList.Entry, FEntryList.Count * SizeOf(PGroupEntry)); + + // Построение списка + eNode := XMLDoc.DocumentElement.FirstChild; + for e := 0 to FEntryList.Count - 1 do begin + //Logger.Send([lcInfo], 'Entry: %d / %d - Start...', [e, FEntryList.Count]); + + new (FEntryList.Entry[e]); + FEntryList.Entry[e]^.Name := 'NoName'; + for a := eNode.Attributes.Length - 1 downto 0 do begin + if LowerCase(eNode.Attributes[a].NodeName) = 'id' then + if TryStrToInt(eNode.Attributes[a].NodeValue, value) then + FEntryList.Entry[e]^.ID := value; + if LowerCase(eNode.Attributes[a].NodeName) = 'name' then + FEntryList.Entry[e]^.Name := CP1251ToUTF8(eNode.Attributes[a].NodeValue); + end; + + // Подсчет тайлов + tNode := eNode.FirstChild; + FEntryList.Entry[e]^.Count := 0; + while tNode <> nil do begin + s := LowerCase(tNode.NodeName); + if (s = 'tile') or (s = 'item') or (s = 'land') then + inc(FEntryList.Entry[e]^.Count); + tNode := tNode.NextSibling; + end; + getmem(FEntryList.Entry[e]^.ETile, FEntryList.Entry[e]^.Count * SizeOf(TEntryTile)); + + // Чтение списка тайлов + tNode := eNode.FirstChild; + for t := 0 to FEntryList.Entry[e]^.Count - 1 do + begin + //Logger.Send([lcInfo], 'Entry: %d - Item: %d / %d', [e, t, FEntryList.Entry[e]^.Count]); + FEntryList.Entry[e]^.ETile[t].ID := 0; + FEntryList.Entry[e]^.ETile[t].Hue := 0; + FEntryList.Entry[e]^.ETile[t].X := 0; + FEntryList.Entry[e]^.ETile[t].Y := 0; + FEntryList.Entry[e]^.ETile[t].Z := 0; + for a := tNode.Attributes.Length - 1 downto 0 do begin + attribute := LowerCase(tNode.Attributes[a].NodeName); + if attribute = 'id' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) then begin + if s = 'item' then Inc(value, $4000); + FEntryList.Entry[e]^.ETile[t].ID := value; + end; + end else if attribute = 'hue' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then FEntryList.Entry[e]^.ETile[t].Hue := value; + end else if attribute = 'x' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then FEntryList.Entry[e]^.ETile[t].X := value; + end else if attribute = 'y' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then FEntryList.Entry[e]^.ETile[t].Y := value; + end else if attribute = 'z' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then FEntryList.Entry[e]^.ETile[t].Z := value; + end; + end; + + while (tNode <> nil) do begin + tNode := tNode.NextSibling; + if tNode <> nil then begin + s := LowerCase(tNode.NodeName); + if (s = 'tile') or (s = 'item') or (s = 'land') + then break; + end; + end; + + end; + + while (eNode <> nil) do begin + eNode := eNode.NextSibling; + if (eNode <> nil) and (LowerCase(eNode.NodeName) = 'entry') + then break; + end; + end; + end; + XMLDoc.Free; + + Logger.Send([lcInfo], 'TfrmMain.LoadEntryTilesList SizeOf(TImageFormat)', SizeOf(TImageFormat)); + // Создание миниатюр + if (FProfileDir <> '') + then fPath := FProfileDir + else fPath := FConfigDir; + fPath := fPath + 'TilesEntry.cache'; + if not FileExists(fPath) + then FileClose(FileCreate(fPath)); + imageCache := TFileStream.Create(fPath, fmOpenReadWrite); + if (imageCache.Size < 4) then begin + value := 0; + cacheHash := nil; + cachePost := nil; + imageCache.WriteDWord(value); + end else begin + value := imageCache.ReadDWord; + getmem(cacheHash, 4 * value); + getmem(cachePost, 4 * value); + end; + + t := 0; + CacheLen := value; + while (t < value) do begin + cacheHash[t] := imageCache.ReadDWord; + cachePost[t] := imageCache.Position; + imageCache.Position := imageCache.Position + 12; + e := imageCache.ReadDWord; + imageCache.Position := imageCache.Position + e; + inc(t); + end; + + for e := 0 to FEntryList.Count - 1 do begin + s := Format('e:%d|n:%s|', [FEntryList.Entry[e]^.ID, FEntryList.Entry[e]^.Name]); + for t := 0 to FEntryList.Entry[e]^.Count - 1 do + s := s + Format('i:%d|h:%d|x:%d|y:%d|z:%d|', [FEntryList.Entry[e]^.ETile[t].ID, FEntryList.Entry[e]^.ETile[t].Hue, + FEntryList.Entry[e]^.ETile[t].X, FEntryList.Entry[e]^.ETile[t].Y, FEntryList.Entry[e]^.ETile[t].Z]); + CalcStringCRC32(s, tCRC32); + FEntryList.Entry[e]^.Image := nil; + // Чтение изображения из кэша + for t := 0 to value - 1 do + if (cacheHash[t] = tCRC32) then begin + imageCache.Position := cachePost[t]; + imageCache.Read(imageData, 16); + getmem(imageData.Bits, imageData.Size); + imageCache.Read(PByte(imageData.Bits)^, imageData.Size); + imageData.Palette := nil; + FEntryList.Entry[e]^.Image := TSingleImage.CreateFromData(imageData); + freemem(imageData.Bits); + //Logger.Send([lcInfo], 'TfrmMain.LoadEntryTilesList entry %d Loaded from Cache', [FEntryList.Entry[e]^.ID]); + //FEntryList.Entry[e]^.Image.Format := ifA1R5G5B5; + Break; + end; + if (FEntryList.Entry[e]^.Image <> nil) + then Continue; + + // Сортировка тайлов для отрисовки + dW := 0; + dH := 0; + alt:= 0; + getmem(entStack, FEntryList.Entry[e]^.Count * 12); + FillByte(entStack^, FEntryList.Entry[e]^.Count * 12, 0); + entFirst := entStack; + entLast := entStack; + for t := 0 to FEntryList.Entry[e]^.Count - 1 do begin + dSize := ResMan.Art.GetArtSize(FEntryList.Entry[e]^.ETile[t].ID); + dX := 44 * (FEntryList.Entry[e]^.ETile[t].X - FEntryList.Entry[e]^.ETile[t].Y); + dY := -22 * (FEntryList.Entry[e]^.ETile[t].X + FEntryList.Entry[e]^.ETile[t].Y) + 4 * FEntryList.Entry[e]^.ETile[t].Z; + if (dY >= 0) then begin + dH := max(dH, alt + dY + dSize.cy); + end else begin + a := alt; + alt:= max(alt, Abs(dY)); + dH := alt + max(dH - a, max(0, dSize.cy + dY)); + end; + dW := max(dW, Abs(dX) + dSize.cx); + dX := min(max(0, FEntryList.Entry[e]^.ETile[t].X + 1023), 2047); + dY := min(max(0, FEntryList.Entry[e]^.ETile[t].Y + 1023), 2047); + dZ := min(max(0, FEntryList.Entry[e]^.ETile[t].Z + 255), 513); + + entHash := DWORD(dX) * 1064440 + DWORD(dY) * 520 + DWORD(dZ + 7); + if (tdfFoliage in ResMan.Tiledata.TileData[FEntryList.Entry[e]^.ETile[t].ID].Flags) + then Inc(entHash, +1); + PDWord(entLast)^ := entHash; + PDWord(entLast + 4)^ := DWord(t); + + if (entLast = entStack) then begin + inc(entLast, 12); + end else begin + entNext := entFirst; + entPrev := nil; + while True do begin + if (entNext = nil) then begin + PDWord(entPrev + 8)^ := PtrInt(entLast); + inc(entLast, 12); + Break; + end else if (PDWord(entNext)^ >= entHash) then begin + if (entPrev <> nil) then begin + PDWord(entPrev + 8)^ := PtrInt(entLast); + end else begin + entFirst := entLast; + end; + PDWord(entLast + 8)^ := PtrInt(entNext); + inc(entLast, 12); + Break; + end; + entPrev := entNext; + entNext := PByte(PDWord(entNext + 8)^); + end; + end; + end; + + // Отрисовка изображения миниатюры + //Logger.Send([lcInfo], 'TfrmMain.LoadEntryTilesList %d dW: %d dH: %d', [FEntryList.Entry[e]^.ID, dW, dH]); + FEntryList.Entry[e]^.Image := TSingleImage.CreateFromParams(dW, dH, ifA8R8G8B8); + dstCanvas := TFastARGB32Canvas.CreateForImage(FEntryList.Entry[e]^.Image); + dstCanvas.FillColor32 := $00404040; + dstCanvas.FillRect(Rect(0,0,FEntryList.Entry[e]^.Image.Width,FEntryList.Entry[e]^.Image.Height)); + entNext := entFirst; + while (entNext <> nil) do begin + +//if ((FEntryList.Entry[e]^.ID < 9120) and (FEntryList.Entry[e]^.ID > 9025)) +//then break; + t := PDWord(entNext + 4)^; + //Logger.Send([lcInfo], 'TfrmMain.LoadEntryTilesList t: %d [%d/%d]', [t, alt, FEntryList.Entry[e]^.Image.Height]); + entNext := PByte(PDWord(entNext + 8)^); + id := FEntryList.Entry[e]^.ETile[t].ID; + hue := FEntryList.Entry[e]^.ETile[t].Hue; + if ResMan.Art.Exists(id) then begin + if hue > 0 + then artHue := ResMan.Hue.Hues[hue - 1] + else artHue := nil; + + artEntry := ResMan.Art.GetArt(id, EncodeUOColor($0FF0F000), artHue, tdfPartialHue in TTileData(ResMan.Tiledata.Block[id]).Flags); + srcCanvas := TFastARGB32Canvas.CreateForImage(artEntry.Graphic); + dX := (FEntryList.Entry[e]^.Image.Width - artEntry.Graphic.Width) div 2 + 22 * (FEntryList.Entry[e]^.ETile[t].X - FEntryList.Entry[e]^.ETile[t].Y); + dY := FEntryList.Entry[e]^.Image.Height - artEntry.Graphic.Height - alt + + 22 * (FEntryList.Entry[e]^.ETile[t].X + FEntryList.Entry[e]^.ETile[t].Y) - 4 * FEntryList.Entry[e]^.ETile[t].Z; + srcCanvas.DrawAlpha(Rect(0,0,artEntry.Graphic.Width,artEntry.Graphic.Height), dstCanvas, dX,dY); + srcCanvas.Free; + artEntry.Free; + end; + end; + + + // Уменьшение изоображения + dW := 93; + dH := 96; + dSize.cx := FEntryList.Entry[e]^.Image.Width; + dSize.cy := FEntryList.Entry[e]^.Image.Height; + Resised := Min(Min(Float(dW)/Float(dSize.cx), Float(dH)/Float(dSize.cy)), 1.0); + dSize.cx := Trunc(Resised * Float(dSize.cx)); + dSize.cy := Trunc(Resised * Float(dSize.cy)); + imageTemp := TSingleImage.CreateFromParams(dSize.cx, dSize.cy, ifA8R8G8B8); + srcCanvas := TFastARGB32Canvas.CreateForImage(imageTemp); + dstCanvas.StretchDrawAdd(Rect(0,0,FEntryList.Entry[e]^.Image.Width,FEntryList.Entry[e]^.Image.Height), + srcCanvas, Rect(0,0,dSize.cx,dSize.cy), rfNearest);//rfBilinear); + srcCanvas.Free; + dstCanvas.Free; + freemem(entStack); + FEntryList.Entry[e]^.Image.Free; + FEntryList.Entry[e]^.Image := imageTemp; + + // Сохранение изоображение в кэше + imageCache.Position := imageCache.Size; + imageCache.WriteDWord(tCRC32); + imageData := FEntryList.Entry[e]^.Image.ImageDataPointer^; + imageCache.Write(imageData, 16); + imageCache.Write(imageData.Bits^, imageData.Size); + inc(CacheLen, +1); + //Logger.Send([lcInfo], 'TfrmMain.LoadEntryTilesList imageData.Palette <> nil', imageData.Palette <> nil); + + // + Application.ProcessMessages; + end; + + if (value > 0) then begin + freemem(cacheHash); + freemem(cachePost); + end; + imageCache.Position := 0; + imageCache.WriteDWord(CacheLen); + imageCache.Free; + + { // Отладка - проверка считанного файла + Logger.EnterMethod([lcInfo, lcDebug], 'TfrmMain.LoadEntryTilesList'); + Logger.Send([lcInfo], 'Entries Number: %x', [FEntryList.Count]); + for e := 0 to FEntryList.Count - 1 do begin + Logger.Send([lcInfo], '<Entry Id="%.4d" Name="%s" Tiles="%x">', + [FEntryList.Entry[e]^.ID, FEntryList.Entry[e]^.Name, FEntryList.Entry[e]^.Count]); + for t := 0 to FEntryList.Entry[e]^.Count - 1 do + Logger.Send([lcInfo], ' <Tile Id="0x%.5x" Hue="0x%.3x" X="%d" Y="%d" Z="%d">', + [FEntryList.Entry[e]^.ETile[t].ID, FEntryList.Entry[e]^.ETile[t].Hue, + FEntryList.Entry[e]^.ETile[t].X, FEntryList.Entry[e]^.ETile[t].Y, FEntryList.Entry[e]^.ETile[t].Z]); + Logger.Send([lcInfo], '</Entry>'); + end; + Logger.ExitMethod([lcInfo, lcDebug], 'TfrmMain.LoadEntryTilesList'); + } +end; + +procedure TfrmMain.LoadBrushTilesList; +var + fPath, s, attribute : string; + XMLDoc: TXMLDocument; + bNode, tNode, eNode : TDOMNode; + z, b, t, a, e, value: Integer; + uu, ur, ll, ul, dl, dr : Word; + valueF : Single; + tile: TBrushTile; + // Создание миниатюр + id : Integer; + destColor, hue : Word; + destRect: TRect; + + texmEntry : TTexture; + dX, dY, dW, dH : Integer; +begin + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['TilesBrush.xml'])); + if FileExists(FProfileDir + 'TilesBrush.xml') + then fPath := (FProfileDir + 'TilesBrush.xml') + else if FileExists(FLocalDir + 'TilesBrush.xml') + then fPath := (FLocalDir + 'TilesBrush.xml') + else if FileExists(FConfigDir + 'TilesBrush.xml') + then fPath := (FConfigDir + 'TilesBrush.xml') + else if FileExists(ResMan.GetFile('TilesBrush.xml')) + then fPath := (ResMan.GetFile('TilesBrush.xml')) + else Exit; + + FBrushList.Count := 0; + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, fPath); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'tilesbrush' then + begin + // Подсчет объектов + bNode := XMLDoc.DocumentElement.FirstChild; + while bNode <> nil do + begin + if LowerCase(bNode.NodeName) = 'brush' then + inc(FBrushList.Count); + bNode := bNode.NextSibling; + end; + getmem(FBrushList.Brush, FBrushList.Count * SizeOf(PGroupBrush)); + + // Построение списка + bNode := XMLDoc.DocumentElement.FirstChild; + for b := 0 to FBrushList.Count - 1 do begin + //Logger.Send([lcInfo], 'Brush: %d / %d - Start...', [b+1, FBrushList.Count]); + new (FBrushList.Brush[b]); + FBrushList.Brush[b]^.ID := 0; + FBrushList.Brush[b]^.Name := 'NoName'; + for a := bNode.Attributes.Length - 1 downto 0 do begin + if LowerCase(bNode.Attributes[a].NodeName) = 'id' then + if TryStrToInt(bNode.Attributes[a].NodeValue, value) then + FBrushList.Brush[b]^.ID := value; + if LowerCase(bNode.Attributes[a].NodeName) = 'name' then + FBrushList.Brush[b]^.Name := CP1251ToUTF8(bNode.Attributes[a].NodeValue); + end; + + // Тестирование... + if LoadListError((FBrushList.Brush[b]^.ID = 0) or (FBrushList.Brush[b]^.ID > 9999), + fPath, Format(GetParseErText('blTagBrushAttrID'), [FBrushList.Brush[b]^.ID, FBrushList.Brush[b]^.Name])) + //'Missmatch or wrong <ID> attribute in BrushID: %.4d ("%s"). Brush ID must be larger 0 and less than 9999', [FBrushList.Brush[b]^.ID, FBrushList.Brush[b]^.Name])) + then begin LoadBrushTilesList; Exit; end; + if b > 0 then for z := b-1 downto 0 do begin + if LoadListError(FBrushList.Brush[z]^.ID = FBrushList.Brush[b]^.ID, + fPath, Format(GetParseErText('blTagBrushDuplicate'), [FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + end; + + // Подсчет тайлов и переходов + tNode := bNode.FirstChild; + FBrushList.Brush[b]^.Count := 0; + FBrushList.Brush[b]^.ECount := 0; + while tNode <> nil do begin + s := LowerCase(tNode.NodeName); + if (s = 'tile') or (s = 'land') then + inc(FBrushList.Brush[b]^.Count) + else if (s = 'edge') then + inc(FBrushList.Brush[b]^.ECount); + tNode := tNode.NextSibling; + end; + getmem(FBrushList.Brush[b]^.BTile, FBrushList.Brush[b]^.Count * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.EdgeId, FBrushList.Brush[b]^.ECount * SizeOf(PWord)); + getmem(FBrushList.Brush[b]^.BEdges, FBrushList.Brush[b]^.ECount * SizeOf(PGroupBrushEdge)); + + // Тестирование... + if LoadListError(FBrushList.Brush[b]^.Count = 0, + fPath, Format(GetParseErText('blTagBrushEmpty'), [FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + + + // Чтение списка тайлов + tNode := bNode.FirstChild; + t := 0; e := 0; + while tNode <> nil do + begin + s := LowerCase(tNode.NodeName); + if (s = 'tile') or (s = 'land') then begin + //Logger.Send([lcInfo], 'Brush: %d - Land: %d / %d', [b+1, t+1, FBrushList.Brush[b]^.Count]); + tile.ID := $FFFF; + tile.Chance := 1.0; + for a := tNode.Attributes.Length - 1 downto 0 do begin + attribute := LowerCase(tNode.Attributes[a].NodeName); + if attribute = 'id' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then tile.ID := value; + end else if attribute = 'chance' then begin + if TryStrToFloat(tNode.Attributes[a].NodeValue, valueF) + then tile.Chance := valueF; + end; + end; + tile.Mask := $0F; + tile.Brush1 := FBrushList.Brush[b]; + tile.Brush2 := FBrushList.Brush[b]; + + // Тестирование... + if LoadListError(tile.ID = $FFFF, + fPath, Format(GetParseErText('blTagTileAttrID'), [FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + if LoadListError(tile.ID > $3FFF, + fPath, Format(GetParseErText('blTagTileAttrIDOutOfRange'), [tile.ID, tile.ID, FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + if LoadListError(FBrushList.Tiles[tile.ID].ID = tile.ID, + fPath, Format(GetParseErText('blTagTileRedeclaration'), [tile.ID, tile.ID, FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + + FBrushList.Tiles[tile.ID] := tile; + FBrushList.Brush[b]^.BTile[t] := @FBrushList.Tiles[tile.ID]; + inc(t); + end else if (s = 'edge') then begin + //Logger.Send([lcInfo], 'Brush: %d - Edge: %d / %d', [b+1, e+1, FBrushList.Brush[b]^.ECount]); + //new (FBrushList.Brush[b]^.EdgeId[e]); + new (FBrushList.Brush[b]^.BEdges[e]); + FBrushList.Brush[b]^.BEdges[e]^.ID := 0; + for a := tNode.Attributes.Length - 1 downto 0 do begin + attribute := LowerCase(tNode.Attributes[a].NodeName); + if attribute = 'to' then begin + if TryStrToInt(tNode.Attributes[a].NodeValue, value) + then FBrushList.Brush[b]^.BEdges[e]^.ID := value; + end; + end; + // Тестирование... + if LoadListError((FBrushList.Brush[b]^.BEdges[e]^.ID = 0) or (FBrushList.Brush[b]^.BEdges[e]^.ID > 9999), + fPath, Format(GetParseErText('blTagEdgeAttrTo'), [FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + + // Подсчет тайлов в переходе + eNode := tNode.FirstChild; + FBrushList.Brush[b]^.BEdges[e]^.CountUU := 0; + FBrushList.Brush[b]^.BEdges[e]^.CountUR := 0; + FBrushList.Brush[b]^.BEdges[e]^.CountLL := 0; + FBrushList.Brush[b]^.BEdges[e]^.CountUL := 0; + FBrushList.Brush[b]^.BEdges[e]^.CountDL := 0; + FBrushList.Brush[b]^.BEdges[e]^.CountDR := 0; + while eNode <> nil do begin + s := LowerCase(eNode.NodeName); + if (s = 'tile') or (s = 'land') then begin + attribute := ''; + for a := eNode.Attributes.Length - 1 downto 0 do begin + attribute := LowerCase(eNode.Attributes[a].NodeName); + if attribute = 'type' then begin + s := LowerCase(CP1251ToUTF8(eNode.Attributes[a].NodeValue)); + if s = 'uu' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountUU) + else if s = 'ur' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountUR) + else if s = 'll' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountLL) + else if s = 'ul' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountUL) + else if s = 'dl' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountDL) + else if s = 'dr' then inc(FBrushList.Brush[b]^.BEdges[e]^.CountDR); + break; + end; + end; + + if LoadListError((attribute<>'type') or ((s<>'uu')and(s<>'ur')and(s<>'ll')and(s<>'ul')and(s<>'dl')and(s<>'dr')), + fPath, Format(GetParseErText('blTagTile2AttrType'), [tile.ID, tile.ID, FBrushList.Brush[b]^.BEdges[e]^.ID, FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + end; + eNode := eNode.NextSibling; + end; + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileUU, FBrushList.Brush[b]^.BEdges[e]^.CountUU * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileUR, FBrushList.Brush[b]^.BEdges[e]^.CountUR * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileLL, FBrushList.Brush[b]^.BEdges[e]^.CountLL * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileUL, FBrushList.Brush[b]^.BEdges[e]^.CountUL * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileDL, FBrushList.Brush[b]^.BEdges[e]^.CountDL * SizeOf(PBrushTile)); + getmem(FBrushList.Brush[b]^.BEdges[e]^.BTileDR, FBrushList.Brush[b]^.BEdges[e]^.CountDR * SizeOf(PBrushTile)); + // Чтение списка тайлов в переходе + uu := 0; ur := 0; ll := 0; ul := 0; dl := 0; dr := 0; + eNode := tNode.FirstChild; + while eNode <> nil do begin + s := LowerCase(eNode.NodeName); + if (s = 'tile') or (s = 'land') then begin + //Logger.Send([lcInfo], 'Brush: %d - Edge: %d - Land: %d / %d', [b+1, e+1, uu+ur+ll+ul+dl+dr+1, FBrushList.Brush[b]^.BEdges[e]^.CountUU+FBrushList.Brush[b]^.BEdges[e]^.CountUR+FBrushList.Brush[b]^.BEdges[e]^.CountLL+FBrushList.Brush[b]^.BEdges[e]^.CountUL+FBrushList.Brush[b]^.BEdges[e]^.CountDL+FBrushList.Brush[b]^.BEdges[e]^.CountDR]); + tile.ID := $FFFF; + tile.Chance := 1.0; + for a := eNode.Attributes.Length - 1 downto 0 do begin + attribute := LowerCase(eNode.Attributes[a].NodeName); + if attribute = 'type' then begin + s := LowerCase(CP1251ToUTF8(eNode.Attributes[a].NodeValue)); + if s = 'uu' then tile.Mask := $03 + else if s = 'ur' then tile.Mask := $07 + else if s = 'll' then tile.Mask := $09 + else if s = 'ul' then tile.Mask := $0B + else if s = 'dl' then tile.Mask := $0D + else if s = 'dr' then tile.Mask := $0E; + end else if attribute = 'id' then begin + if TryStrToInt(eNode.Attributes[a].NodeValue, value) + then tile.ID := value; + end else if attribute = 'chance' then begin + if TryStrToFloat(eNode.Attributes[a].NodeValue, valueF) + then tile.Chance := valueF; + end; + end; + + // Тестирование... + if LoadListError(tile.ID = $FFFF, + fPath, Format(GetParseErText('blTagTile2AttrID'), [FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + if LoadListError(tile.ID > $3FFF, + fPath, Format(GetParseErText('blTagTile2AttrIDOutOfRange'), [tile.ID, tile.ID, FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + if LoadListError(FBrushList.Tiles[tile.ID].ID = tile.ID, + fPath, Format(GetParseErText('blTagTile2Redeclaration'), [tile.ID, tile.ID, FBrushList.Brush[b]^.ID])) + then begin LoadBrushTilesList; Exit; end; + + tile.Brush1 := FBrushList.Brush[b]; + tile.Brush2 := nil; + FBrushList.Tiles[tile.ID] := tile; + if tile.Mask = $03 then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileUU[uu] := @FBrushList.Tiles[tile.ID]; inc(uu); + end else if tile.Mask = $07 then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileUR[ur] := @FBrushList.Tiles[tile.ID]; inc(ur); + end else if tile.Mask = $09 then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileLL[ll] := @FBrushList.Tiles[tile.ID]; inc(ll); + end else if tile.Mask = $0B then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileUL[ul] := @FBrushList.Tiles[tile.ID]; inc(ul); + end else if tile.Mask = $0D then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileDL[dl] := @FBrushList.Tiles[tile.ID]; inc(dl); + end else if tile.Mask = $0E then begin + FBrushList.Brush[b]^.BEdges[e]^.BTileDR[dr] := @FBrushList.Tiles[tile.ID]; inc(dr); + end; + FBrushList.Tiles[tile.ID].ID := FBrushList.Brush[b]^.BEdges[e]^.ID; // Временно запоминаем ID перехода (позже востанавливаем ID тайла) + end; + eNode := eNode.NextSibling; + end; + FBrushList.Brush[b]^.EdgeId[e] := @(FBrushList.Brush[b]^.BEdges[e]^.ID); + inc(e); + end; + tNode := tNode.NextSibling; + end; + bNode := bNode.NextSibling; + end; + end; + XMLDoc.Free; + + // Задание вторичных кистей + for t := 0 to $3FFF do begin + if (FBrushList.Tiles[t].Brush1 <> nil) and (FBrushList.Tiles[t].Brush2 = nil) + then begin + for b := 0 to FBrushList.Count - 1 do + if FBrushList.Brush[b]^.ID = FBrushList.Tiles[t].ID then begin + FBrushList.Tiles[t].Brush2 := FBrushList.Brush[b]; + break; + end; + + // Тестирование... + if LoadListError((FBrushList.Tiles[t].Brush2 = nil), + fPath, Format(GetParseErText('blTagEdgeUnknown'), [FBrushList.Tiles[t].Brush1^.ID, FBrushList.Tiles[t].ID])) + then begin LoadBrushTilesList; Exit; end; + + FBrushList.Tiles[t].ID := t; + end else if (FBrushList.Tiles[t].Brush1 = nil) and (FBrushList.Tiles[t].Brush2 = nil) + then begin // Пустые тайлы + FBrushList.Tiles[t].ID:= $FFFF; + FBrushList.Tiles[t].Mask:= $00; + end; + end; + + // Тестирование... +// for t := 0 to $3FFF do +// if LoadListError((FBrushList.Tiles[t].Brush1 <> nil) and (FBrushList.Tiles[t].Brush2 = nil), +// fPath, Format(GetParseErText('blTagTile2Redeclaration'), [FBrushList.Brush[b]^.ID])) +// then begin LoadBrushTilesList; Exit; end; + + + // Создание миниатюр + for b := 0 to FBrushList.Count - 1 do begin + //FBrushList.Brush[b]^.Image := TTexture(ResMan.Texmaps.Block[t]).Graphic; + FBrushList.Brush[b]^.Image := TSingleImage.CreateFromParams(96, 96, ifA1R5G5B5); + + //FBrushList.Brush[b]^.Image.Bits .Canvas.Brush.Color := $00FF9000;//DecodeUOColor(destColor); + //FBrushList.Brush[b]^.Image.Canvas.Clear; + + //if FBrushList.Brush[b]^.Image.FormatInfo.BytesPerPixel = 2 + // then FillWord(FBrushList.Brush[b]^.Image.Bits^, + // FBrushList.Brush[b]^.Image.Width * FBrushList.Brush[b]^.Image.Height, + // $0000) + // else FillDWord(FBrushList.Brush[b]^.Image.Bits^, + // FBrushList.Brush[b]^.Image.Width * FBrushList.Brush[b]^.Image.Height, + // $00000000); + + t := ResMan.Tiledata.LandTiles[FBrushList.Brush[b]^.BTile[0]^.ID].TextureID; + texmEntry := TTexture(ResMan.Texmaps.Block[t]); + //texmEntry.Graphic.CopyTo(0, 0, texmEntry.Graphic.Width, texmEntry.Graphic.Height, + // FBrushList.Brush[b]^.Image, 0, 0); + texmEntry.Graphic.StretchTo(0, 0, texmEntry.Graphic.Width, texmEntry.Graphic.Height, + FBrushList.Brush[b]^.Image, 2, 2, + FBrushList.Brush[b]^.Image.Width-4, FBrushList.Brush[b]^.Image.Height-4, + rfNearest); + texmEntry.Free; + end; + + { // Отладка - проверка считанного файла + Logger.EnterMethod([lcInfo, lcDebug], 'TfrmMain.LoadBrushTilesList'); + Logger.Send([lcInfo], 'Brushes Number: %x', [FBrushList.Count]); + for b := 0 to FBrushList.Count - 1 do begin + Logger.Send([lcInfo], '<Brush Id="%.4d" Name="%s" Tiles="%d" Edges="%d">', + [FBrushList.Brush[b]^.ID, FBrushList.Brush[b]^.Name, FBrushList.Brush[b]^.Count, FBrushList.Brush[b]^.ECount]); + for t := 0 to FBrushList.Brush[b]^.Count - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BTile[t]^.ID, FBrushList.Brush[b]^.BTile[t]^.Chance, FBrushList.Brush[b]^.BTile[t]^.Mask]); + for e := 0 to FBrushList.Brush[b]^.ECount - 1 do begin + Logger.Send([lcInfo], ' <Edge To="%d" Tiles="%d">', + [FBrushList.Brush[b]^.EdgeId[e]^, FBrushList.Brush[b]^.BEdges[e]^.CountUU+FBrushList.Brush[b]^.BEdges[e]^.CountUR+FBrushList.Brush[b]^.BEdges[e]^.CountLL+FBrushList.Brush[b]^.BEdges[e]^.CountUL+FBrushList.Brush[b]^.BEdges[e]^.CountDL+FBrushList.Brush[b]^.BEdges[e]^.CountDR]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUU - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUR - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountLL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountDL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountDR - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.Mask]); + Logger.Send([lcInfo], ' </Edge>'); + end; + Logger.Send([lcInfo], '</Brush>'); + end; + Logger.ExitMethod([lcInfo, lcDebug], 'TfrmMain.LoadBrushTilesList'); + } +end; + +procedure TfrmMain.BuildGroupList; +var + XMLDoc: TXMLDocument; + iNode : TDOMNode; + fPath : string; + vNode : PVirtualNode; + bTemp : array[0..$E000] of Word; + gTemp : array[0..$FFFF] of Boolean; + + procedure SumItems(Node: PVirtualNode; Count: Integer; var Items: LongWord); + var + i : Integer; + item : PVirtualNode; + group: PGroupNode; + begin + group := tvGroups.GetNodeData(Node); + Items += group^.Count; + Items += group^.Entries; + Items += group^.Brushes; + + for i := 0 to group^.Links - 1 do + if group^.GLink[i] <> nil then + SumItems(group^.GLink[i], 0, Items); + + if (Count > 0) then + begin + item := tvGroups.GetFirstChild(Node); + while item <> nil do + begin + SumItems(item, Count - 1, Items); + item := tvGroups.GetNextSibling(item); + end; + end; + end; + + procedure ProcessNode(Node: TDOMNode; TreeNode: PVirtualNode); + var + element: TDOMElement; + cNode: TDOMNode; + s: string; + i, j, k, e, b, d, q, id: Integer; + group: PGroupNode; + begin + if Node = nil then Exit; // выходим, если достигнут конец документа + if LowerCase(Node.NodeName) <> 'group' then Exit; + + // добавляем узел в дерево + TreeNode := tvGroups.AddChild(TreeNode); + group := tvGroups.GetNodeData(TreeNode); + + // сохраняем данные узла + e := 0; b := 0; d := 0; + group^.Count := 0; + cNode := Node.FirstChild; + while cNode <> nil do + begin + s := LowerCase(cNode.NodeName); + if (s = 'tile') or (s = 'land') or (s = 'item') + then Inc(group^.Count, 1) + else if (s = 'entry') then Inc(e, 1) + else if (s = 'brush') then Inc(b, 1) + else if (s = 'link') then // Inc(d, 1); + for i := 0 to cNode.Attributes.Length - 1 do + if LowerCase(cNode.Attributes[i].NodeName) = 'groupid' then Inc(d, 1) + else if LowerCase(cNode.Attributes[i].NodeName) = 'brushid' then + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then begin + for j := 0 to Length(FBrushList.Tiles) - 1 do + if (FBrushList.Tiles[j].ID <> $FFFF) and + ((id = FBrushList.Tiles[j].Brush1^.ID) or (id = FBrushList.Tiles[j].Brush2^.ID)) + then Inc(group^.Count, 1); + end; + cNode := cNode.NextSibling; + end; + + group^.Entries := e; group^.Brushes := b; group^.Links := d; + k := 0; e := 0; b := 0; d := 0; + getmem(group^.lids, group^.Links * SizeOf(LongWord)); + getmem(group^.GLink, group^.Links * SizeOf(PVirtualnode)); + getmem(group^.GTile, group^.Count * SizeOf(TGroupTile)); + getmem(group^.Entry, group^.Entries * SizeOf(PGroupEntry)); + getmem(group^.Brush, group^.Brushes * SizeOf(PGroupBrush)); + cNode := Node.FirstChild; + while cNode <> nil do + begin + s := LowerCase(cNode.NodeName); + if (s = 'tile') or (s = 'land') or (s = 'item') then + begin + for i := cNode.Attributes.Length - 1 downto 0 do + begin + if LowerCase(cNode.Attributes[i].NodeName) = 'id' then + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then + begin + if s = 'item' then + Inc(id, $4000); + group^.GTile[k].ID := id; + Inc(k, 1); + end; + end; + end + else if (s = 'entry') then + begin + for i := cNode.Attributes.Length - 1 downto 0 do + begin + if LowerCase(cNode.Attributes[i].NodeName) = 'id' then + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then + begin + group^.Entry[e] := nil; + for j := 0 to FEntryList.Count - 1 do + if FEntryList.Entry[j]^.ID = id then begin + group^.Entry[e] := FEntryList.Entry[j]; + break; + end; + Inc(e, 1); + end; + end; + end + else if (s = 'brush') then + begin + for i := cNode.Attributes.Length - 1 downto 0 do + begin + if LowerCase(cNode.Attributes[i].NodeName) = 'id' then + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then + begin + group^.Brush[b] := nil; + for j := 0 to FBrushList.Count - 1 do + if FBrushList.Brush[j]^.ID = id then begin + group^.Brush[b] := FBrushList.Brush[j]; + break; + end; + Inc(b, 1); + end; + end; + end + else if (s = 'link') then + begin + for i := 0 to cNode.Attributes.Length - 1 do + begin + if LowerCase(cNode.Attributes[i].NodeName) = 'groupid' then + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then + begin + group^.lids[d] := id; + Inc(d, 1); + end; + if LowerCase(cNode.Attributes[i].NodeName) = 'brushid' then // + if TryStrToInt(cNode.Attributes[i].NodeValue, id) then + begin + bTemp[$0000]:=$0000; bTemp[$D000]:=$D000; + bTemp[$1000]:=$1000; bTemp[$2000]:=$2000; bTemp[$3000]:=$3000; bTemp[$4000]:=$4000; + bTemp[$5000]:=$5000; bTemp[$6000]:=$6000; bTemp[$7000]:=$7000; bTemp[$8000]:=$8000; + bTemp[$9000]:=$9000; bTemp[$A000]:=$A000; bTemp[$B000]:=$B000; bTemp[$C000]:=$C000; + for j := 0 to Length(gTemp)-1 do gTemp[j] := False; + for j := 0 to Length(FBrushList.Tiles) - 1 do begin + if (FBrushList.Tiles[j].ID = $FFFF) then Continue; + if (id = FBrushList.Tiles[j].Brush1^.ID) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$0000], 1); bTemp[bTemp[$0000]] := j; Continue; + end; + + if (FBrushList.Tiles[j].Mask = $0B) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$1000],1); bTemp[bTemp[$1000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$1000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $0D) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$2000],1); bTemp[bTemp[$2000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$2000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $07) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$3000],1); bTemp[bTemp[$3000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$3000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $0E) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$4000],1); bTemp[bTemp[$4000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$4000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + + if (FBrushList.Tiles[j].Mask = $09) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$5000],1); bTemp[bTemp[$5000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$5000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $03) and (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$6000],1); bTemp[bTemp[$6000]]:=j; + gTemp[FBrushList.Tiles[j].Brush1^.ID]:=True; + bTemp[bTemp[$6000]+$0800]:=FBrushList.Tiles[j].Brush1^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $03) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$7000],1); bTemp[bTemp[$7000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$7000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $09) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$8000],1); bTemp[bTemp[$8000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$8000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + + if (FBrushList.Tiles[j].Mask = $0E) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$9000],1); bTemp[bTemp[$9000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$9000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $0D) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$A000],1); bTemp[bTemp[$A000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$A000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $07) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$B000],1); bTemp[bTemp[$B000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$B000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + if (FBrushList.Tiles[j].Mask = $0B) and (id = FBrushList.Tiles[j].Brush1^.ID) then begin + inc(bTemp[$C000],1); bTemp[bTemp[$C000]]:=j; + gTemp[FBrushList.Tiles[j].Brush2^.ID]:=True; + bTemp[bTemp[$C000]+$0800]:=FBrushList.Tiles[j].Brush2^.ID; + Continue; + end; + + if (id = FBrushList.Tiles[j].Brush1^.ID) or (id = FBrushList.Tiles[j].Brush2^.ID) then begin + inc(bTemp[$D000],1); // то что не удалось расортировать (вообще мы никогда не должны сюда попадать) + bTemp[bTemp[$D000]] := j; + end; + + end; + + for j := $0001 to bTemp[$0000] do begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + + for q := 0 to Length(gTemp)-1 do + if gTemp[q] then begin + for j := $1001 to bTemp[$1000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $2001 to bTemp[$2000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $3001 to bTemp[$3000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $4001 to bTemp[$4000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $5001 to bTemp[$5000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $6001 to bTemp[$6000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $7001 to bTemp[$7000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $8001 to bTemp[$8000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $9001 to bTemp[$9000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $A001 to bTemp[$A000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $B001 to bTemp[$B000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + for j := $C001 to bTemp[$C000] do if (bTemp[j+$0800]=q) then begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + end; + + for j := $D001 to bTemp[$D000] do begin + group^.GTile[k].ID := bTemp[j]; Inc(k, 1); + end; + + end; + end; + end; + cNode := cNode.NextSibling; + end; + + // переходим к дочернему узлу + cNode := Node.FirstChild; + + // проходим по всем дочерним узлам + while cNode <> nil do + begin + ProcessNode(cNode, TreeNode); + cNode := cNode.NextSibling; + end; + + // сохраняем данные узла + k:= 0; + group^.ID := 0; + group^.Nodes:= 0; + group^.Name := 'NoName'; + group^.Color:= TColor($00000000); + if tvGroups.ChildCount[TreeNode] = 0 + then group^.Ital := True + else group^.Ital := False; + if tvGroups.ChildCount[TreeNode] > 4 + then group^.Bold := True + else group^.Bold := False; + if Node.HasAttributes and (Node.Attributes.Length>0) then + for i := 0 to Node.Attributes.Length - 1 do + if LowerCase(Node.Attributes[i].NodeName) = 'name' then begin + group^.Name := CP1251ToUTF8(Node.Attributes[i].NodeValue) + end else if LowerCase(Node.Attributes[i].NodeName) = 'color' then begin + if TryStrToInt(Node.Attributes[i].NodeValue, k) then + group^.Color:=TColor(((k and$0000FF)shl 16)or(k and$00FF00)or((k and$FF0000)shr 16)); + end else if LowerCase(Node.Attributes[i].NodeName) = 'bold' then begin + TryStrToBool(Node.Attributes[i].NodeValue, group^.Bold); + end else if LowerCase(Node.Attributes[i].NodeName) = 'ital' then begin + TryStrToBool(Node.Attributes[i].NodeValue, group^.Ital); + end else if LowerCase(Node.Attributes[i].NodeName) = 'id' then begin + if TryStrToInt(Node.Attributes[i].NodeValue, d) then group^.ID := d; + end else if LowerCase(Node.Attributes[i].NodeName) = 'nodes' then begin + if TryStrToInt(Node.Attributes[i].NodeValue, k) then + begin if k=-1 then k:=$FFFF; group^.Nodes := Max(0, k); k:=0; end; + end; + end; + + procedure BuildLinks(Node: PVirtualNode); + var + i : Integer; + item : PVirtualNode; + group: PGroupNode; + begin + group := tvGroups.GetNodeData(Node); + + for i := 0 to group^.Links - 1 do + begin + //Logger.Send([lcClient, lcDebug], 'BuildLinks: %.4d / %.4d - id: %d', [i+1, group^.Links, group^.lids[i]]); + group^.GLink[i] := nil; + if group^.lids[i] = 0 then continue; + + item := tvGroups.GetFirst(); + while item <> nil do + begin + if group^.lids[i] = PGroupNode(tvGroups.GetNodeData(item))^.ID then + begin + //Logger.Send([lcClient, lcDebug], 'BuildLinks: Group id: %d Found', [group^.lids[i]]); + group^.GLink[i] := item; + break; + end; + item := tvGroups.GetNext(item); + end + end; + + FreeMem(group^.lids); + group^.lids := nil; + end; + +begin + tvGroups.BeginUpdate; + tvGroups.Clear; + + frmInitialize.SetStatusLabel(Format(frmInitialize.SplashLoading, ['TilesGroup.xml'])); + if FileExists(FProfileDir + 'TilesGroup.xml') + then fPath := (FProfileDir + 'TilesGroup.xml') + else if FileExists(FLocalDir + 'TilesGroup.xml') + then fPath := (FLocalDir + 'TilesGroup.xml') + else if FileExists(FConfigDir + 'TilesGroup.xml') + then fPath := (FConfigDir + 'TilesGroup.xml') + else if FileExists(ResMan.GetFile('TilesGroup.xml')) + then fPath := (ResMan.GetFile('TilesGroup.xml')) + else Exit; + + // Читаем xml файл с жесткого диска + ReadXMLFile(XMLDoc, fPath); + if LowerCase(XMLDoc.DocumentElement.NodeName) = 'tilesgroup' then + begin + iNode := XMLDoc.DocumentElement.FirstChild; + while iNode <> nil do + begin + if LowerCase(iNode.NodeName) = 'group' then + ProcessNode(iNode, nil); // Рекурсия + iNode := iNode.NextSibling; + end; + + // Построение Указателей + vNode := tvGroups.GetFirst(); + while vNode <> nil do + begin + BuildLinks(vNode); + vNode := tvGroups.GetNext(vNode); + end; + // Подсчет Items + vNode := tvGroups.GetFirst(); + while vNode <> nil do + begin + SumItems(vNode, PGroupNode(tvGroups.GetNodeData(vNode))^.Nodes, + PGroupNode(tvGroups.GetNodeData(vNode))^.Items); + vNode := tvGroups.GetNext(vNode); + end; + end; + + XMLDoc.Free; + tvGroups.EndUpdate; +end; + +procedure TfrmMain.FreeGroupLists; +var i, j, k : Integer; +begin + for i:=0 to FEntryList.Count-1 do begin + FreeMem(FEntryList.Entry[i]^.ETile); + FEntryList.Entry[i]^.Image.Destroy; + end; + FreeMem(FEntryList.Entry); + FEntryList.Count:=0; + + for i:=0 to FBrushList.Count-1 do begin + //for j:=0 to FBrushList.Brush[i]^.Count-1 do begin + // FreeMem(FBrushList.Brush[i]^.BTile[j]); + //end; + FreeMem(FBrushList.Brush[i]^.BEdges); + FreeMem(FBrushList.Brush[i]^.BTile); + FBrushList.Brush[i]^.Image.Destroy; + FBrushList.Count:=0; + end; + + for i:=0 to $3FFF do begin + FBrushList.Tiles[i].ID := 0; + FBrushList.Tiles[i].Brush1:=nil; + FBrushList.Tiles[i].Brush2:=nil; + end; + +end; + +procedure TfrmMain.BuildTileList; +var + minID, maxID, i, k, lastID: Integer; + item : PVirtualItem; + groupNode : PVirtualNode; + tileInfo: PTileInfo; + filter : string; + nodeData: PGroupNode; + + procedure AddNodeTiles(Node: PVirtualNode; Count: Integer); + var + item: PVirtualItem; + groupNode: PVirtualNode; + nodeData: PGroupNode; + tileInfo: PTileInfo; + lastID: LongWord; + i, j: Integer; + + //b,t,e: Integer; + begin + nodeData := tvGroups.GetNodeData(Node); + Logger.Send([lcInfo], 'Brushes: %d - Entries: %d - Tiles: %d', [nodeData^.Brushes, nodeData^.Entries, nodeData^.Count]); + { + Logger.EnterMethod([lcInfo, lcDebug], 'TfrmMain.AddNodeTiles-Entries'); + Logger.Send([lcInfo], 'Entries Number: %d', [FEntryList.Count]); + for e := 0 to FEntryList.Count - 1 do begin + Logger.Send([lcInfo], '<Entry Id="%.4d" Name="%s" Tiles="%x">', + [FEntryList.Entry[e]^.ID, FEntryList.Entry[e]^.Name, FEntryList.Entry[e]^.Count]); + for t := 0 to FEntryList.Entry[e]^.Count - 1 do + Logger.Send([lcInfo], ' <Tile Id="0x%.5x" Hue="0x%.3x" X="%d" Y="%d" Z="%d">', + [FEntryList.Entry[e]^.ETile[t].ID, FEntryList.Entry[e]^.ETile[t].Hue, + FEntryList.Entry[e]^.ETile[t].X, FEntryList.Entry[e]^.ETile[t].Y, FEntryList.Entry[e]^.ETile[t].Z]); + Logger.Send([lcInfo], '</Entry>'); + end; + Logger.ExitMethod([lcInfo, lcDebug], 'TfrmMain.AddNodeTiles-Entries'); + Logger.EnterMethod([lcInfo, lcDebug], 'TfrmMain.AddNodeTiles-Brushes'); + Logger.Send([lcInfo], 'Brushes Number: %x', [FBrushList.Count]); + for b := 0 to FBrushList.Count - 1 do begin + Logger.Send([lcInfo], '<Brush Id="%.4d" Name="%s" Tiles="%d" Edges="%d">', + [FBrushList.Brush[b]^.ID, FBrushList.Brush[b]^.Name, FBrushList.Brush[b]^.Count, FBrushList.Brush[b]^.ECount]); + for t := 0 to FBrushList.Brush[b]^.Count - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BTile[t]^.ID, FBrushList.Brush[b]^.BTile[t]^.Chance, FBrushList.Brush[b]^.BTile[t]^.Mask]); + for e := 0 to FBrushList.Brush[b]^.ECount - 1 do begin + Logger.Send([lcInfo], ' <Edge To="%d" Tiles="%d">', + [FBrushList.Brush[b]^.EdgeId[e]^, FBrushList.Brush[b]^.BEdges[e]^.CountUU+FBrushList.Brush[b]^.BEdges[e]^.CountUR+FBrushList.Brush[b]^.BEdges[e]^.CountLL+FBrushList.Brush[b]^.BEdges[e]^.CountUL+FBrushList.Brush[b]^.BEdges[e]^.CountDL+FBrushList.Brush[b]^.BEdges[e]^.CountDR]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUU - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUU[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUR - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUR[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountLL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileLL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountUL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileUL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountDL - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileDL[t]^.Mask]); + for t := 0 to FBrushList.Brush[b]^.BEdges[e]^.CountDR - 1 do + Logger.Send([lcInfo], ' <Land Id="0x%.4x" Chance="%.2f" Mask="0x%.2x">', + [FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.ID, FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.Chance, FBrushList.Brush[b]^.BEdges[e]^.BTileDR[t]^.Mask]); + Logger.Send([lcInfo], ' </Edge>'); + end; + Logger.Send([lcInfo], '</Brush>'); + end; + Logger.ExitMethod([lcInfo, lcDebug], 'TfrmMain.AddNodeTiles-Brushes'); + } + + for i := 0 to nodeData^.Count - 1 do + begin + lastID := nodeData^.GTile[i].ID; + if FVisibleTiles[lastID] and ResMan.Art.Exists(lastID) then + begin + if (filter <> '') and (Pos(filter, AnsiLowerCase( + ResMan.Tiledata.TileData[lastID].TileName)) = 0) then Continue; + item := vdtTiles.AddItem(nil); + tileInfo := vdtTiles.GetNodeData(item); + tileInfo^.ID := lastID; + end; + end; + + for i := 0 to nodeData^.Brushes - 1 do + begin + if nodeData^.Brush[i] = nil then Continue; + lastID := $2F000000 + LongWord(nodeData^.Brush[i]^.ID); + //if FVisibleTiles[lastID] and ResMan.Art.Exists(lastID) then + begin + if (filter <> '') and (Pos(filter, AnsiLowerCase( + nodeData^.Brush[i]^.Name)) = 0) then Continue; + item := vdtTiles.AddItem(nil); + tileInfo := vdtTiles.GetNodeData(item); + tileInfo^.ID := lastID; + tileInfo^.ptr:= nodeData^.Brush[i]; + end; + end; + + for i := 0 to nodeData^.Entries - 1 do + begin + if nodeData^.Entry[i] = nil then Continue; + lastID := $1F000000 + LongWord(nodeData^.Entry[i]^.ID); + //if FVisibleTiles[lastID] and ResMan.Art.Exists(lastID) then + begin + if (filter <> '') and (Pos(filter, AnsiLowerCase( + nodeData^.Entry[i]^.Name)) = 0) then Continue; + item := vdtTiles.AddItem(nil); + tileInfo := vdtTiles.GetNodeData(item); + tileInfo^.ID := lastID; + tileInfo^.ptr:= nodeData^.Entry[i]; + end; + end; + + // Добавление сылок групп + for i := 0 to nodeData^.Links - 1 do + if nodeData^.GLink[i] <> nil then + AddNodeTiles(nodeData^.GLink[i], 0); + + // Добавление вложенных подгрупп + if (Count > 0) then + begin + groupNode := tvGroups.GetFirstChild(Node); + while groupNode <> nil do + begin + AddNodeTiles(groupNode, Count - 1); + groupNode := tvGroups.GetNextSibling(groupNode); + end; + end; + + end; + +begin + filter := AnsiLowerCase(UTF8ToCP1251(edFilter.Text)); + + Logger.Send([lcInfo], 'TfrmMain.BuildTileList: %s', ['Start']); + // Сортировка по группам + if (not cbStatics.Checked) and (not cbTerrain.Checked) then + begin + vdtTiles.BeginUpdate; + vdtTiles.Clear; + groupNode := tvGroups.GetFirstSelected(); + while groupNode <> nil do + begin + nodeData := tvGroups.GetNodeData(groupNode); + AddNodeTiles(groupNode, nodeData^.Nodes); + groupNode := tvGroups.GetNextSelected(groupNode); + end; + vdtTiles.EndUpdate; + end else + // Старое построение - список всех land и\или item тайлов + begin + Logger.Send([lcInfo], 'TfrmMain.BuildTileList: start'); + maxID := $3FFF; + if cbTerrain.Checked then minID := $0 else minID := $4000; + if cbStatics.Checked then maxID := maxID + FLandscape.MaxStaticID; + + item := vdtTiles.GetFirstSelected; + if item <> nil then + begin + tileInfo := vdtTiles.GetNodeData(item); + lastID := tileInfo^.ID; + end else + lastID := -1; - vdtTiles.EndUpdate; + vdtTiles.BeginUpdate; + vdtTiles.Clear; + + Logger.Send([lcInfo], 'TfrmMain.BuildTileList: from %.4x to %.4x', [minID, maxID]); + for i := minID to maxID do + begin + if FVisibleTiles[i] and ResMan.Art.Exists(i) then + begin + if (filter <> '') and (Pos(filter, AnsiLowerCase( + ResMan.Tiledata.TileData[i].TileName)) = 0) then Continue; + item := vdtTiles.AddItem(nil); + tileInfo := vdtTiles.GetNodeData(item); + tileInfo^.ID := i; + + //Logger.Send([lcInfo], 'TfrmMain.BuildTileList: tileInfo %.4x == %.4x', [i, PTileInfo(vdtTiles.GetNodeData(vdtTiles.GetFirst()))^.ID]); + + if i = lastID then + vdtTiles.Selected[item] := True; + end; + end; - node := vdtTiles.GetFirstSelected; - if node <> nil then - vdtTiles.FocusedNode := node; + vdtTiles.EndUpdate; + + item := vdtTiles.GetFirstSelected; + if item <> nil then + vdtTiles.FocusedNode := item; + end; + + Logger.Send([lcInfo], 'TfrmMain.BuildTileList: %s', ['End']); end; procedure TfrmMain.ProcessToolState; @@ -2597,10 +6597,10 @@ var begin if acSelect.Checked then begin - //lblTip.Caption := 'Right click shows a menu with all the tools.'; - lblTip.Caption := 'Press and hold the left mouse button to show a list with' - + ' actions (eg. grab hue).'; - oglGameWindow.Cursor := crDefault; + //lblTip.Caption := 'Нажатие правой кнопки мышки покажет меню со всеми инструментами.'; + //lblTip.Caption := 'Нажмите и удерживайте левую кнопку мышки, чтобы просмотреть список действий.'; + //'Press and hold the left mouse button to show a list with actions (eg. grab hue).'; + oglGameWindow.Cursor := +01;//crDefault; //no highlighted tiles in "selection" mode Logger.Send([lcClient, lcDebug], 'Disable highlighting'); @@ -2610,8 +6610,9 @@ begin blockInfo^.Highlighted := False; end else begin - lblTip.Caption := 'Press and hold the left mouse button to target an area.'; - oglGameWindow.Cursor := crHandPoint; + //lblTip.Caption := 'Нажмите и удерживайте левую кнопку мышки, чтобы выбрать область.'; + //'Press and hold the left mouse button to target an area.'; + oglGameWindow.Cursor := +03;//crHandPoint; end; FRepaintNeeded := True; @@ -2619,14 +6620,24 @@ end; procedure TfrmMain.ProcessAccessLevel; begin - mnuAdministration.Visible := (dmNetwork.AccessLevel >= alAdministrator); + mnuAdministration.Visible := (dmNetwork.AccessLevel >= alDeveloper); + mnuShutdown.Visible := (dmNetwork.AccessLevel >= alAdministrator); + mnuAccountControl.Visible := (dmNetwork.AccessLevel >= alAdministrator); + mnuRegionControl.Visible := (dmNetwork.AccessLevel >= alAdministrator); + acSelection.Enabled := (dmNetwork.AccessLevel >= alNormal); acDraw.Enabled := (dmNetwork.AccessLevel >= alNormal); acMove.Enabled := (dmNetwork.AccessLevel >= alNormal); acElevate.Enabled := (dmNetwork.AccessLevel >= alNormal); + acSurfElevate.Enabled := (dmNetwork.AccessLevel >= alNormal); + acSurfStretch.Enabled := (dmNetwork.AccessLevel >= alNormal); + acSurfSmooth.Enabled := (dmNetwork.AccessLevel >= alNormal); acDelete.Enabled := (dmNetwork.AccessLevel >= alNormal); acHue.Enabled := (dmNetwork.AccessLevel >= alNormal); - Caption := Format('UO CentrED - [%s (%s)]', [dmNetwork.Username, - GetAccessLevelString(dmNetwork.AccessLevel)]); + acFill.Enabled := (dmNetwork.AccessLevel >= alNormal); + Caption := Format('UO CentrED+ v%s [%s "%s" (%s) | %s "%s"]', + //Caption := Format('UO CentrED+ v%s !!! pre-release (not stable version) !!! [%s "%s" (%s) | %s "%s"]', + [VersionInfo.GetProductVersionString, lbFormTitleAccount, dmNetwork.Username, + GetAccessLevel(dmNetwork.AccessLevel), lbFormTitleProfile, dmNetwork.Profile]); end; procedure TfrmMain.RebuildScreenBuffer; @@ -2634,11 +6645,13 @@ var blockInfo: PBlockInfo; i, tileX, tileY: Integer; virtualTile: TVirtualTile; + zoom: Single; begin //Logger.EnterMethod([lcClient], 'RebuildScreenBuffer'); + if tbZoom.Down then zoom:= tbZoom.Tag / 1000.0 else zoom:= 1.0; FDrawDistance := Trunc(Sqrt(oglGameWindow.Width * oglGameWindow.Width + - oglGamewindow.Height * oglGamewindow.Height) / 44); + oglGamewindow.Height * oglGamewindow.Height) / (44 * zoom)); //Logger.Send([lcClient], 'DrawDistance', FDrawDistance); {$HINTS off}{$WARNINGS off} @@ -2701,11 +6714,21 @@ begin FVirtualTiles.Delete(i); end; + if acNoDraw.Checked and mnuShowLightSource.Checked then + begin + if FVLightSrcMaterial = nil then begin + getmem(FVLightSrcMaterial, FVLightSrcImageCount * SizeOf(TSimpleMaterial)); + for i := 1 to FVLightSrcImageCount do + FVLightSrcMaterial[i-1] := TSimpleMaterial.Create(FVLightSrcImage[i]); + end; + end; + //Logger.Send([lcClient, lcDebug], 'VirtualTiles', FVirtualTiles.Count); FLandscape.FillDrawList(FScreenBuffer, FX + FLowOffsetX, FY + FLowOffsetY, - FRangeX, FRangeY, tbTerrain.Down, tbStatics.Down, acNoDraw.Checked, - FVirtualTiles); + FRangeX, FRangeY, acTerrain.Checked, acStatics.Checked, mnuShowWalls.Checked, + mnuShowBridges.Checked, mnuShowRoofs.Checked, mnuShowSurfaces.Checked, mnuShowFoliage.Checked, + mnuShowWater.Checked, acNoDraw.Checked and mnuShowNoDrawTiles.Checked, FVirtualTiles); //Pre-process the buffer blockInfo := nil; @@ -2732,6 +6755,7 @@ end; procedure TfrmMain.UpdateCurrentTile(AX, AY: Integer); var blockInfo: PBlockInfo; + zoom: Single; begin //Logger.EnterMethod([lcClient, lcDebug], 'UpdateCurrentTile'); FOverlayUI.ActiveArrow := FOverlayUI.HitTest(AX, AY); @@ -2743,7 +6767,9 @@ begin Exit; end; - blockInfo := FScreenBuffer.Find(Point(AX, AY)); + if tbZoom.Down then zoom := tbZoom.Tag / 1000.0 else zoom := 1.0; + + blockInfo := FScreenBuffer.Find(Point(AX, AY), zoom); if blockInfo <> nil then CurrentTile := blockInfo^.Item else @@ -2759,6 +6785,7 @@ var staticTileData: TStaticTileData; lastSurface: PBlockInfo; surfaceTop: Integer; + zoom: Single; begin blockInfo := nil; lastSurface := nil; @@ -2767,8 +6794,12 @@ begin if blockInfo^.State in [ssNormal, ssFiltered] then begin blockInfo^.State := ssNormal; - if (blockInfo^.Item.Z < frmBoundaries.tbMinZ.Position) or - (blockInfo^.Item.Z > frmBoundaries.tbMaxZ.Position) then + if (blockInfo^.Item.X < frmBoundaries.seMinX.Value) or + (blockInfo^.Item.X > frmBoundaries.seMaxX.Value) or + (blockInfo^.Item.Y < frmBoundaries.seMinY.Value) or + (blockInfo^.Item.Y > frmBoundaries.seMaxY.Value) or + (blockInfo^.Item.Z < frmBoundaries.tbMinZ.Position) or + (blockInfo^.Item.Z > frmBoundaries.tbMaxZ.Position) then begin blockInfo^.State := ssFiltered; end else @@ -2829,9 +6860,10 @@ begin Include(FScreenBufferState, sbsFiltered); + if tbZoom.Down then zoom := tbZoom.Tag / 1000.0 else zoom := 1.0; if (FLightManager.LightLevel > 0) and not acFlat.Checked then FLightManager.UpdateLightMap(FX + FLowOffsetX, FRangeX + 1, FY + FLowOffsetY, - FRangeY + 1, FScreenBuffer); + FRangeY + 1, FScreenBuffer, zoom); end; procedure TfrmMain.UpdateSelection; @@ -2844,47 +6876,278 @@ procedure TfrmMain.UpdateSelection; begin ABlockInfo^.HueOverride := AHighlighted; if AHighlighted then + begin + ABlockInfo^.Hue := frmHueSettings.GetHue; ABlockInfo^.LowRes := FTextureManager.GetStaticMaterial( - TStaticItem(ABlockInfo^.Item), frmHueSettings.lbHue.ItemIndex) - else + TStaticItem(ABlockInfo^.Item), ABlockInfo^.Hue); + end else + begin ABlockInfo^.LowRes := FTextureManager.GetStaticMaterial( TStaticItem(ABlockInfo^.Item)); end; + end; end else begin ABlockInfo^.Highlighted := AHighlighted; end; end; - procedure AddGhostTile(AX, AY: Word; ABaseTile: TWorldItem); + procedure AddGhostTile(AX, AY: Word; ABaseTile: TWorldItem; selecetion: TRect); + + // Получение ID текстуры для тайлов при использовании кисти + function GetTileId(brush: PGroupBrush; mask: byte; tileId: LongWord) : Integer; + var + i, j : Integer; + tileMask : Byte; + tileBrush, tempBrush: PGroupBrush; + brushEdge: PGroupBrushEdge; + randnf, chance, factor: Float; + brushCount: LongWord; + brushTiles: ^PBrushTile; + begin + GetTileId := tileId; + if FBrushList.Tiles[tileId].ID <> tileId + then exit; + + if (FBrushList.Tiles[tileId].Brush1^.ID <> brush^.ID) and (FBrushList.Tiles[tileId].Brush2^.ID <> brush^.ID) + and (FBrushList.Tiles[tileId].Brush1^.ID <> FBrushList.Tiles[tileId].Brush2^.ID) + then begin + i:=0; j:=0; + tileMask := FBrushList.Tiles[tileId].Mask and not(mask); + if (tileMask and $01) <> 0 then inc(i); + if (tileMask and $02) <> 0 then inc(i); + if (tileMask and $04) <> 0 then inc(i); + if (tileMask and $08) <> 0 then inc(i); + tileMask := not(FBrushList.Tiles[tileId].Mask or $F0) and not(mask); + if (tileMask and $01) <> 0 then inc(j); + if (tileMask and $02) <> 0 then inc(j); + if (tileMask and $04) <> 0 then inc(j); + if (tileMask and $08) <> 0 then inc(j); + if i > j + then tileBrush := FBrushList.Tiles[tileId].Brush1 + else tileBrush := FBrushList.Tiles[tileId].Brush2; + tileMask := $00; + end else + if (FBrushList.Tiles[tileId].Brush1^.ID = brush^.ID) and (FBrushList.Tiles[tileId].Brush2^.ID = brush^.ID) + then begin + tileBrush := nil; + end else if (FBrushList.Tiles[tileId].Brush1^.ID = FBrushList.Tiles[tileId].Brush2^.ID) + then begin + tileBrush := FBrushList.Tiles[tileId].Brush1; + tileMask := $00; + end else begin + if brush^.ID = FBrushList.Tiles[tileId].Brush1^.ID then begin + tileBrush := FBrushList.Tiles[tileId].Brush2; + tileMask := FBrushList.Tiles[tileId].Mask; + end else + if brush^.ID = FBrushList.Tiles[tileId].Brush2^.ID then begin + tileBrush := FBrushList.Tiles[tileId].Brush1; + tileMask := not(FBrushList.Tiles[tileId].Mask or $F0); + end; + end; + + // Сумирование масок + if tileBrush = nil then begin + mask := $0F; + end else begin + //Logger.Send([lcInfo], '1 Brush Id= %d Mask= 0x%.2x TileMask= 0x%.2x tileId= 0x%.4x', [brush^.ID, mask, tileMask, tileId]); + mask := tileMask or mask; + //Logger.Send([lcInfo], '2 Brush Id= %d Mask= 0x%.2x TileMask= 0x%.2x tileId= 0x%.4x', [brush^.ID, mask, tileMask, tileId]); + if (mask = $01) or (mask = $02) or (mask = $04) or (mask = $05) or + (mask = $06) or (mask = $08) or (mask = $0A) or (mask = $0C) + then begin + mask := not(mask or $F0); + tempBrush:= brush; + brush:= tileBrush; + tileBrush:= tempBrush; + end; + end; + + // Получение данных кисти + brushCount:= 0; brushEdge:= nil; brushTiles:= nil; + if mask = $0F then begin + brushCount := brush^.Count; brushTiles := brush^.BTile; + end else begin + for i := 0 to brush^.ECount-1 do begin + // Logger.Send([lcInfo], 'i= %d/%d EdgeId= %d BrushId= %d', [i, brush^.ECount-1, mask, brush^.EdgeId[i]^, tileBrush^.ID]); + if brush^.EdgeId[i]^ = tileBrush^.ID then begin + brushEdge := brush^.BEdges[i]; + break; + end; end; + if brushEdge <> nil then + case mask of + $0E: begin brushCount := brushEdge^.CountDR; brushTiles := brushEdge^.BTileDR; end; + $0D: begin brushCount := brushEdge^.CountDL; brushTiles := brushEdge^.BTileDL; end; + $0B: begin brushCount := brushEdge^.CountUL; brushTiles := brushEdge^.BTileUL; end; + $07: begin brushCount := brushEdge^.CountUR; brushTiles := brushEdge^.BTileUR; end; + $09: begin brushCount := brushEdge^.CountLL; brushTiles := brushEdge^.BTileLL; end; + $03: begin brushCount := brushEdge^.CountUU; brushTiles := brushEdge^.BTileUU; end; + end; + end; + + //Logger.Send([lcInfo], 'Brush Id= %d Mask= 0x%.2x TileMask= 0x%.2x tileId= 0x%.4x', [brush^.ID, mask, tileMask, tileId]); + + // Находение ID тайла + chance := 0; factor := 0; + for i := 0 to brushCount - 1 do + chance := chance + brushTiles[i]^.Chance; + if chance > 0 then + factor := 1.0 / chance; + randnf := Random; chance := 0; + for i := 0 to brushCount - 1 do begin + chance := chance + factor * brushTiles[i]^.Chance; + if randnf <= chance then begin + GetTileId := brushTiles[i]^.ID; + break; + end; + end; + + //if (FBrushList.Tiles[GetTileId].Mask <> FBrushList.Tiles[tileId].Mask) + //or (FBrushList.Tiles[GetTileId].ID <> GetTileId) or (FBrushList.Tiles[tileId].ID <> tileId) + //or (FBrushList.Tiles[GetTileId].Brush1^.ID <> FBrushList.Tiles[tileId].Brush1^.ID) + //or (FBrushList.Tiles[GetTileId].Brush2^.ID <> FBrushList.Tiles[tileId].Brush2^.ID) + //or (GetTileId < 0) or (GetTileId > $3FFF) then GetTileId:= -1; + end; + var blockInfo: PBlockInfo; tileInfo: PTileInfo; - node: PVirtualNode; + item: PVirtualItem; + node: PVirtualItem; cell: TMapCell; ghostTile: TGhostTile; - i: Integer; + i, randalt: Integer; begin + if frmDrawSettings.cbProbability.Checked and frmDrawSettings.cbProbability.Enabled + and (frmDrawSettings.seProbability.Value < 100 * Random) + then exit; + tileInfo := nil; if frmDrawSettings.rbTileList.Checked then begin - node := vdtTiles.GetFirstSelected; - if node <> nil then - tileInfo := vdtTiles.GetNodeData(node); + item := vdtTiles.GetFirstSelected; + if item <> nil then + tileInfo := vdtTiles.GetNodeData(item); end else if frmDrawSettings.rbRandom.Checked then begin - node := vdtRandom.GetFirst; - for i := 1 to Random(vdtRandom.RootNodeCount) do - node := vdtRandom.GetNext(node); + node := vdlRandom.GetFirst; + for i := 1 to Random(vdlRandom.TilesCount) do + node := vdlRandom.GetNext(node); if node <> nil then - tileInfo := vdtRandom.GetNodeData(node); + tileInfo := vdlRandom.GetNodeData(node); end; if tileInfo <> nil then begin - if tileInfo^.ID < $4000 then - begin + if tileInfo^.ID > $2F000000 then + begin // **** Кисти **** + cell := FLandscape.MapCell[AX, AY]; + if cell <> nil then + begin + //Logger.Send([lcInfo], '!!! AX= %d AY= %d ', [AX, AY]); + //Logger.Send([lcInfo], 'MapCell GhostId= 0x%.4x TileId= 0x%.4x Id= 0x%.4x', [cell.RawTileID, cell.TileID, cell.ID]); + inc(selecetion.Left, -1); inc(selecetion.Top, -1); + if not IsInRect(AX, AY, selecetion) then exit; + inc(selecetion.Left, +1); inc(selecetion.Top, +1); + + if (AX = selecetion.Left) then begin + AddGhostTile(selecetion.Left-1, AY, ABaseTile, selecetion); + end; + if (AY = selecetion.Top) then begin + AddGhostTile(AX, selecetion.Top-1, ABaseTile, selecetion); + end; + if (AX = selecetion.Left) and (AY = selecetion.Top) then begin + AddGhostTile(selecetion.Left-1, selecetion.Top-1, ABaseTile, selecetion); + end; + + if (AX = selecetion.Right) and (AY = selecetion.Bottom) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $01, cell.RawTileID) + else if (AX = selecetion.Left-1) and (AY = selecetion.Bottom) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $02, cell.RawTileID) + else if (AX = selecetion.Left-1) and (AY = selecetion.Top-1) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $04, cell.RawTileID) + else if (AX = selecetion.Right) and (AY = selecetion.Top-1) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $08, cell.RawTileID) + else if (AX = selecetion.Right) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $09, cell.RawTileID) + else if (AY = selecetion.Bottom) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $03, cell.RawTileID) + else if (AY = selecetion.Top-1) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $0C, cell.RawTileID) + else if (AX = selecetion.Left-1) + then randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $06, cell.RawTileID) + else randalt := GetTileId(PGroupBrush(tileInfo^.ptr), $0F, cell.RawTileID); + + if (randalt > 0) then begin //Добавление текстур + cell.IsGhost := True; + cell.GhostID := randalt; + if frmDrawSettings.cbForceAltitude.Checked then + cell.GhostZ := frmDrawSettings.seForceAltitude.Value + else + cell.GhostZ := cell.RawZ; + if frmDrawSettings.cbRandomHeight.Checked then + cell.GhostZ := cell.GhostZ + Random(frmDrawSettings.seRandomHeight.Value); + + PrepareMapCell(cell); + end; + end; + end else if tileInfo^.ID > $1F000000 then + begin // **** Объекты ***** + for i := 0 to PGroupEntry(tileInfo^.ptr)^.Count - 1 do begin + if frmDrawSettings.cbUseFreeTilesOnly.Checked then begin + blockInfo := FScreenBuffer.Find(AX + PGroupEntry(tileInfo^.ptr)^.ETile[i].X, + AY + PGroupEntry(tileInfo^.ptr)^.ETile[i].Y); + if (blockInfo <> nil) and (blockInfo^.Next <> nil) and + (blockInfo^.Item.X = blockInfo^.Next^.Item.X) and (blockInfo^.Item.Y = blockInfo^.Next^.Item.Y) + then exit; + end; + end; + + if frmDrawSettings.cbRandomHeight.Checked + then randalt := Random(frmDrawSettings.seRandomHeight.Value) + else randalt := 0; + for i := 0 to PGroupEntry(tileInfo^.ptr)^.Count - 1 do begin + ghostTile := TGhostTile.Create(nil, nil, 0, 0); + ghostTile.TileID := PGroupEntry(tileInfo^.ptr)^.ETile[i].ID - $4000; + ghostTile.Hue := PGroupEntry(tileInfo^.ptr)^.ETile[i].Hue; + ghostTile.X := AX + PGroupEntry(tileInfo^.ptr)^.ETile[i].X; + ghostTile.Y := AY + PGroupEntry(tileInfo^.ptr)^.ETile[i].Y; + ghostTile.CenterX := AX; + ghostTile.CenterY := AY; + if ((not frmDrawSettings.cbForceAltitude.Enabled) or (not frmDrawSettings.cbForceAltitude.Checked)) then + begin + if frmDrawSettings.cbUseSurfaceAltitude.Checked then begin + blockInfo := FScreenBuffer.Find(AX, AY); + if blockInfo <> nil then + ABaseTile := blockInfo^.Item; + ghostTile.Z := ABaseTile.Z; + end; + + if ABaseTile is TStaticItem then + ghostTile.Z := ABaseTile.Z + ResMan.Tiledata.StaticTiles[ABaseTile.TileID].Height + else if ABaseTile is TMapCell then + ghostTile.Z := ResMan.Landscape.GetEffectiveAltitude(TMapCell(ABaseTile)) + else // if ABaseTile is TVirtualTile then + ghostTile.Z := ABaseTile.Z; + end else + ghostTile.Z := frmDrawSettings.seForceAltitude.Value; + ghostTile.Z := ghostTile.Z + randalt + PGroupEntry(tileInfo^.ptr)^.ETile[i].Z;; + { + Logger.Send([lcInfo], ' <Entry Id="%.4d Tile %.2d/%.2d - Id="0x%.4x" Hue="0x%.3x" X="%d" Y="%d" Z="%d">', + [PGroupEntry(tileInfo^.ptr)^.ID, i, PGroupEntry(tileInfo^.ptr)^.Count, ghostTile.TileID, + ghostTile.Hue, ghostTile.X, ghostTile.Y, ghostTile.Z]); + } + ghostTile.UpdatePriorities(ResMan.Tiledata.StaticTiles[ghostTile.TileID], MaxInt); + ghostTile.CanBeEdited := True; + + FVirtualTiles.Add(ghostTile); + blockInfo := FScreenBuffer.Insert(ghostTile); + blockInfo^.State := ssGhost; + PrepareScreenBlock(blockInfo); + end; + end else if tileInfo^.ID < $4000 then + begin // **** Текстуры **** cell := FLandscape.MapCell[AX, AY]; if cell <> nil then begin @@ -2900,18 +7163,34 @@ procedure TfrmMain.UpdateSelection; PrepareMapCell(cell); end; end else - begin + begin // **** Статика ***** + if frmDrawSettings.cbUseFreeTilesOnly.Checked then begin + blockInfo := FScreenBuffer.Find(AX, AY); + if (blockInfo <> nil) and (blockInfo^.Next <> nil) and + (blockInfo^.Item.X = blockInfo^.Next^.Item.X) and (blockInfo^.Item.Y = blockInfo^.Next^.Item.Y) + then exit; + end; + ghostTile := TGhostTile.Create(nil, nil, 0, 0); ghostTile.TileID := tileInfo^.ID - $4000; - ghostTile.Hue := frmHueSettings.lbHue.ItemIndex; - ghostTile.X := AX; - ghostTile.Y := AY; - if not frmDrawSettings.cbForceAltitude.Checked then + ghostTile.Hue := frmHueSettings.GetHue; + ghostTile.X := AX; ghostTile.CenterX := AX; + ghostTile.Y := AY; ghostTile.CenterY := AY; + + if ((not frmDrawSettings.cbForceAltitude.Enabled) or (not frmDrawSettings.cbForceAltitude.Checked)) then begin - ghostTile.Z := ABaseTile.Z; + if frmDrawSettings.cbUseSurfaceAltitude.Checked then begin + blockInfo := FScreenBuffer.Find(AX, AY); + if blockInfo <> nil then + ABaseTile := blockInfo^.Item; + end; + //ghostTile.Z := ABaseTile.Z; if ABaseTile is TStaticItem then - ghostTile.Z := ghostTile.Z + - ResMan.Tiledata.StaticTiles[ABaseTile.TileID].Height; + ghostTile.Z := ABaseTile.Z + ResMan.Tiledata.StaticTiles[ABaseTile.TileID].Height + else if ABaseTile is TMapCell then + ghostTile.Z := ResMan.Landscape.GetEffectiveAltitude(TMapCell(ABaseTile)) + else // if ABaseTile is TVirtualTile then + ghostTile.Z := ABaseTile.Z; end else ghostTile.Z := frmDrawSettings.seForceAltitude.Value; if frmDrawSettings.cbRandomHeight.Checked then @@ -2937,6 +7216,7 @@ var item: TWorldItem; cell: TMapCell; i, tileX, tileY: Integer; + brushMod: Boolean; // Актевирован Режим работы с кистями begin //Logger.EnterMethod([lcClient, lcDebug], 'UpdateSelection'); @@ -2944,6 +7224,8 @@ begin //procedure is pointless - the selection should stay intact. if (CurrentTile <> nil) or (SelectedTile = nil) then begin + brushMod := (vdtTiles.GetFirstSelected <> nil) and (PTileInfo(vdtTiles.GetNodeData(vdtTiles.GetFirstSelected))^.ID >= $2F000000); + if CurrentTile = nil then selectedRect := Rect(-1, -1, -1, -1) else @@ -2954,15 +7236,19 @@ begin for i := FVirtualTiles.Count - 1 downto 0 do begin item := FVirtualTiles[i]; - if (item is TGhostTile) and not IsInRect(item.X, item.Y, selectedRect) then + if (item is TGhostTile) and not IsInRect((item as TGhostTile).CenterX, + (item as TGhostTile).CenterY, selectedRect) then begin FScreenBuffer.Delete(item); FVirtualTiles.Delete(i); end; end; //Logger.Send([lcClient, lcDebug], 'FSelection', FSelection); - for tileX := FSelection.Left to FSelection.Right do - for tileY := FSelection.Top to FSelection.Bottom do + if brushMod then begin // Для кистей + i:= -1; inc(selectedRect.Left, -1); inc(selectedRect.Top, -1); + end else i:= 0; + for tileX := FSelection.Left+i to FSelection.Right do + for tileY := FSelection.Top+i to FSelection.Bottom do if not IsInRect(tileX, tileY, selectedRect) then begin cell := FLandscape.MapCell[tileX, tileY]; @@ -2972,6 +7258,9 @@ begin PrepareMapCell(cell); end; end; + if brushMod then begin // Для кистей + inc(selectedRect.Left, +1); inc(selectedRect.Top, +1); + end; if (CurrentTile <> nil) and (not acSelect.Checked) then begin @@ -2980,12 +7269,35 @@ begin begin {Logger.Send([lcClient, lcDebug], 'Multiple Targets'); Logger.Send([lcClient, lcDebug], 'SelectedRect', selectedRect);} + //Logger.Send([lcClient, lcDebug], 'SelectedTile: %.5x (%.6d)', [SelectedTile.TileID, SelectedTile.TileID]); //set new ghost tiles - if acDraw.Checked then + + if acDraw.Checked then begin for tileX := selectedRect.Left to selectedRect.Right do for tileY := selectedRect.Top to selectedRect.Bottom do if not IsInRect(tileX, tileY, FSelection) then - AddGhostTile(tileX, tileY, SelectedTile); + AddGhostTile(tileX, tileY, SelectedTile, selectedRect); + if brushMod then begin // Для кистей + if (selectedRect.Left > FSelection.Left) then + for tileY := selectedRect.Top to selectedRect.Bottom do + AddGhostTile(selectedRect.Left, tileY, SelectedTile, selectedRect); + if (selectedRect.Top > FSelection.Top) then + for tileX := selectedRect.Left to selectedRect.Right do + AddGhostTile(tileX, selectedRect.Top, SelectedTile, selectedRect); + if (selectedRect.Right < FSelection.Right) then + for tileY := selectedRect.Top to selectedRect.Bottom do + AddGhostTile(selectedRect.Right, tileY, SelectedTile, selectedRect); + if (selectedRect.Bottom < FSelection.Bottom) then + for tileX := selectedRect.Left to selectedRect.Right do + AddGhostTile(tileX, selectedRect.Bottom, SelectedTile, selectedRect); + if (selectedRect.Right > FSelection.Right) then + for tileY := FSelection.Top to FSelection.Bottom do + AddGhostTile(FSelection.Right, tileY, SelectedTile, selectedRect); + if (selectedRect.Bottom > FSelection.Bottom) then + for tileX := FSelection.Left to FSelection.Right do + AddGhostTile(tileX, FSelection.Bottom, SelectedTile, selectedRect); + end; + end; while FScreenBuffer.Iterate(blockInfo) do if (blockInfo^.State = ssNormal) then SetHighlight(blockInfo, IsInRect(blockInfo^.Item.X, blockInfo^.Item.Y, @@ -2993,13 +7305,12 @@ begin end else begin //Logger.Send([lcClient, lcDebug], 'Single Target'); - if acDraw.Checked and not IsInRect(CurrentTile.X, CurrentTile.Y, - FSelection) then - AddGhostTile(CurrentTile.X, CurrentTile.Y, CurrentTile); + //Logger.Send([lcClient, lcDebug], 'CurrentTile: %.5x (%.6d)', [CurrentTile.TileID, CurrentTile.TileID]); + if acDraw.Checked and not IsInRect(CurrentTile.X, CurrentTile.Y, FSelection) then + AddGhostTile(CurrentTile.X, CurrentTile.Y, CurrentTile, selectedRect); while FScreenBuffer.Iterate(blockInfo) do if blockInfo^.State = ssNormal then - SetHighlight(blockInfo, (blockInfo^.Item = CurrentTile) and - not acDraw.Checked); + SetHighlight(blockInfo, (blockInfo^.Item = CurrentTile) and not acDraw.Checked); end; end; FSelection := selectedRect; @@ -3043,27 +7354,53 @@ var sender, msg: string; i: Integer; accessLevel: TAccessLevel; + clientNode: PVirtualNode; + clientInfo: PClientInfo; begin case ABuffer.ReadByte of $01: //client connected begin sender := ABuffer.ReadStringNull; - lbClients.Items.Add(sender); + vstClients.BeginUpdate; + clientNode := vstClients.AddChild(nil); + clientInfo := vstClients.GetNodeData(clientNode); + clientInfo^.Name := sender; + clientInfo^.AccessLevel := TAccessLevel(ABuffer.ReadByte); + clientInfo^.LogonDateTime := Now; + vstClients.EndUpdate; if sender <> dmNetwork.Username then - WriteChatMessage('System', Format('User "%s" has connected.', [sender])); + WriteChatMessage('System', Format(lbUserLoginedMsg, [sender])); end; $02: begin sender := ABuffer.ReadStringNull; - lbClients.Items.Delete(lbClients.Items.IndexOf(sender)); + vstClients.BeginUpdate; + clientNode := vstClients.GetFirst; + while clientNode <> nil do begin + clientInfo := vstClients.GetNodeData(clientNode); + if (clientInfo^.Name = sender) + then begin + vstClients.DeleteNode(clientNode); + break; + end + else clientNode := vstClients.GetNext(clientNode); + end; + vstClients.EndUpdate; if sender <> dmNetwork.Username then - WriteChatMessage('System', Format('User "%s" has disconnected.', [sender])); + WriteChatMessage('System', Format(lbUserLogoutedMsg, [sender])); end; $03: //Client list begin - lbClients.Clear; + vstClients.Clear; while ABuffer.Position < ABuffer.Size do - lbClients.Items.Add(ABuffer.ReadStringNull); + begin + sender := ABuffer.ReadStringNull; + clientNode := vstClients.AddChild(nil); + clientInfo := vstClients.GetNodeData(clientNode); + clientInfo^.Name := sender; + clientInfo^.AccessLevel := TAccessLevel(ABuffer.ReadByte); + clientInfo^.LogonDateTime := IncSecond(dmNetwork.ServerStart, ABuffer.ReadDWord); + end; end; $04: //Set pos begin @@ -3088,12 +7425,12 @@ begin dmNetwork.AccessLevel := accessLevel; if accessLevel = alNone then begin - MessageDlg('AccessLevel change', 'Your account has been locked.', mtWarning, [mbOK], 0); + MessageDlg(lbDlgBlockedAccessCaption, lbDlgBlockedAccess, mtWarning, [mbOK], 0); mnuDisconnectClick(nil); end else begin ProcessAccessLevel; - MessageDlg('AccessLevel change', Format('Your accesslevel has been changed to %s.', [GetAccessLevelString(accessLevel)]), mtWarning, [mbOK], 0); + MessageDlg(lbDlgCnangedAccessCaption, Format(lbDlgCnangedAccess, [GetAccessLevel(accessLevel)]), mtWarning, [mbOK], 0); end; end; @@ -3103,7 +7440,7 @@ begin end; end; -function TfrmMain.GetInternalTileID(ATile: TWorldItem): Word; +function TfrmMain.GetInternalTileID(ATile: TWorldItem): LongWord; begin Result := ATile.TileID; if ATile is TStaticItem then @@ -3176,11 +7513,15 @@ begin end; procedure TfrmMain.GetDrawOffset(AX, AY: Integer; out DrawX, DrawY: Integer); inline; +var + zoom: Single; begin + if tbZoom.Down then zoom := tbZoom.Tag / 1000.0 else zoom := 1.0; + Dec(AX, FX); Dec(AY, FY); - DrawX := (oglGameWindow.Width div 2) + (AX - AY) * 22; - DrawY := (oglGamewindow.Height div 2) + (AX + AY) * 22; + DrawX := (oglGameWindow.Width div 2) + Trunc((AX - AY) * 22 * zoom); + DrawY := (oglGamewindow.Height div 2) + Trunc((AX + AY) * 22 * zoom); end; initialization diff --git a/Client/UfrmRadar.lfm b/Client/UfrmRadar.lfm index d108a02..ca91bb8 100644 --- a/Client/UfrmRadar.lfm +++ b/Client/UfrmRadar.lfm @@ -1,50 +1,69 @@ object frmRadarMap: TfrmRadarMap - Left = 290 - Height = 360 - Top = 171 - Width = 479 + Left = 1091 + Height = 262 + Top = 724 + Width = 603 HorzScrollBar.Page = 478 VertScrollBar.Page = 359 - ActiveControl = sbMain - Caption = 'Radar Map (1:8)' - ClientHeight = 360 - ClientWidth = 479 + Caption = 'Миникарта (1:8)' + ClientHeight = 262 + ClientWidth = 603 + Constraints.MinHeight = 192 + Constraints.MinWidth = 230 + FormStyle = fsStayOnTop OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnResize = FormResize Position = poOwnerFormCenter ShowInTaskBar = stAlways - LCLVersion = '0.9.29' + LCLVersion = '0.9.30.2' object pnlBottom: TPanel Left = 0 Height = 21 - Top = 339 - Width = 479 + Top = 241 + Width = 603 Align = alBottom BevelOuter = bvNone ClientHeight = 21 - ClientWidth = 479 + ClientWidth = 603 TabOrder = 0 object lblPosition: TLabel Left = 8 Height = 21 Top = 0 - Width = 41 + Width = 1 Align = alLeft BorderSpacing.Left = 8 Layout = tlCenter ParentColor = False end + object cbStayOnTop: TCheckBox + Left = 461 + Height = 21 + Top = 0 + Width = 142 + Align = alRight + Caption = 'Поверх главного окна' + Checked = True + OnChange = cbStayOnTopChange + State = cbChecked + TabOrder = 0 + end end object sbMain: TScrollBox Left = 0 - Height = 339 + Height = 241 Top = 0 - Width = 479 + Width = 603 + HorzScrollBar.Page = 475 + HorzScrollBar.Range = 292 + VertScrollBar.Page = 335 + VertScrollBar.Range = 202 Align = alClient - ClientHeight = 335 - ClientWidth = 475 + AutoScroll = False + ClientHeight = 237 + ClientWidth = 599 TabOrder = 1 object pbRadar: TPaintBox Left = 0 diff --git a/Client/UfrmRadar.pas b/Client/UfrmRadar.pas index 9d588ca..c4a9df5 100644 --- a/Client/UfrmRadar.pas +++ b/Client/UfrmRadar.pas @@ -32,7 +32,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, ImagingClasses, ImagingComponents, ImagingTypes, UEnhancedMemoryStream, crc, - StdCtrls; + StdCtrls, LConvEncoding, Windows, ShellAPI, Logging, LCLIntf; type @@ -41,10 +41,12 @@ type { TfrmRadarMap } TfrmRadarMap = class(TForm) + cbStayOnTop: TCheckBox; lblPosition: TLabel; pbRadar: TPaintBox; pnlBottom: TPanel; sbMain: TScrollBox; + procedure cbStayOnTopChange(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); @@ -68,28 +70,53 @@ type var frmRadarMap: TfrmRadarMap; + FormMaxWidthConst : Integer; + FormMaxHeightConst: Integer; implementation uses UdmNetwork, UGameResources, UPacketHandlers, UPackets, UfrmInitialize, - UfrmMain, UGraphicHelper; + UfrmMain, UfrmLogin, UGraphicHelper, Language; { TfrmRadarMap } +//{$I winapi.inc} procedure TfrmRadarMap.FormCreate(Sender: TObject); +var IntfWidth, IntfHeight: integer; begin + LanguageTranslate(Self); + FRadar := TSingleImage.CreateFromParams(ResMan.Landscape.Width, ResMan.Landscape.Height, ifA8R8G8B8); pbRadar.Width := FRadar.Width; pbRadar.Height := FRadar.Height; sbMain.ClientWidth := FRadar.Width; sbMain.ClientHeight := FRadar.Height; - ClientWidth := sbMain.Width + sbMain.VertScrollBar.Size; - ClientHeight := sbMain.Height + sbMain.HorzScrollBar.Size + pnlBottom.Height; - Constraints.MaxWidth := Width; + ClientWidth := sbMain.Width;// + sbMain.VertScrollBar.Size; + ClientHeight := sbMain.Height + pnlBottom.Height;// + sbMain.HorzScrollBar.Size; + Constraints.MaxWidth := Width; Constraints.MaxHeight := Height; - + + //LCLIntf.GetWindowSize(Handle, IntfWidth, IntfHeight); Screen.Width + if (Width >= frmMain.Width) then begin + Left := frmMain.Left; + Width := frmMain.Width; + end; + if (Height >= frmMain.Height) then begin + Top := frmMain.Top; + Height:= frmMain.Height; + end; + + //sbMain.HorzScrollBar.Increment:=8; + //sbMain.VertScrollBar.Increment:=8; + sbMain.HorzScrollBar.Range := FRadar.Width; + sbMain.VertScrollBar.Range := FRadar.Height; + + FormMaxWidthConst := Constraints.MaxWidth; + FormMaxHeightConst := Constraints.MaxHeight; + cbStayOnTopChange(Sender); + FRadarDependencies := TList.Create; RegisterPacketHandler($0D, TPacketHandler.Create(0, @OnRadarHandlingPacket)); @@ -102,8 +129,16 @@ begin CloseAction := caHide; end; +procedure TfrmRadarMap.cbStayOnTopChange(Sender: TObject); +begin + if cbStayOnTop.Checked + then FormStyle := fsStayOnTop + else FormStyle := fsNormal; +end; + procedure TfrmRadarMap.FormDestroy(Sender: TObject); var + confdir : string; radarMap: TRadarColorMap; x, y: Integer; radarMapFile: TFileStream; @@ -115,8 +150,12 @@ begin for y := 0 to FRadar.Height - 1 do radarMap[x * FRadar.Height + y] := EncodeUOColor(PInteger(FRadar.PixelPointers[x, y])^); - radarMapFile := TFileStream.Create(GetAppConfigDir(False) + 'RadarMap.cache', - fmCreate); + if (sprofile <> '') then + if (frmMain.ProfileDir <> '') + then confdir := frmMain.ProfileDir + else confdir := frmMain.ConfigDir; + + radarMapFile := TFileStream.Create(confdir + 'RadarMap.cache', fmCreate); radarMapFile.Write(radarMap[0], Length(radarMap) * SizeOf(Word)); radarMapFile.Free; @@ -125,8 +164,36 @@ begin end; procedure TfrmRadarMap.FormResize(Sender: TObject); +var hScroll, vScroll : Boolean; begin - sbMain.AutoScroll := (Width < Constraints.MaxWidth) or (Height < Constraints.MaxHeight); + if (Width > FormMaxWidthConst-10) and (Height > FormMaxHeightConst-10) then begin + Width := FormMaxWidthConst; + Height := FormMaxHeightConst; + Constraints.MaxWidth := FormMaxWidthConst; + Constraints.MaxHeight := FormMaxHeightConst; + end; + + hScroll := (Width < Constraints.MaxWidth); + vScroll := (Height < Constraints.MaxHeight); + + if hScroll <> sbMain.HorzScrollBar.Visible then begin + if hScroll + then Constraints.MaxHeight := FormMaxHeightConst + sbMain.HorzScrollBar.Size + else Constraints.MaxHeight := FormMaxHeightConst; + sbMain.HorzScrollBar.Visible := hScroll; + //FormResize(Sender); // Повторный вызов, для коррекции + end; + + if vScroll <> sbMain.VertScrollBar.Visible then begin + if vScroll + then Constraints.MaxWidth := FormMaxWidthConst + sbMain.VertScrollBar.Size + else Constraints.MaxWidth := FormMaxWidthConst; + sbMain.VertScrollBar.Visible := vScroll; + FormResize(Sender); exit; // Повторный вызов, для коррекции + end; + + sbMain.HorzScrollBar.Page := sbMain.ClientWidth; + sbMain.VertScrollBar.Page := sbMain.ClientHeight; end; procedure TfrmRadarMap.pbRadarMouseDown(Sender: TObject; Button: TMouseButton; @@ -166,6 +233,7 @@ end; procedure TfrmRadarMap.OnRadarHandlingPacket(ABuffer: TEnhancedMemoryStream); var + confdir: string; subID: Byte; checksum, realChecksum: Cardinal; radarMapFile: TFileStream; @@ -179,7 +247,14 @@ begin begin checksum := ABuffer.ReadCardinal; realChecksum := crc32(0, nil, 0); - radarMapFileName := GetAppConfigDir(False) + 'RadarMap.cache'; + if (sprofile <> '') then + if (frmMain.ProfileDir <> '') + then confdir := frmMain.ProfileDir + else confdir := frmMain.ConfigDir; + //if (sprofile <> '') + // then confdir := GetAppConfigDir(False) + 'Profiles' + PathDelim + UTF8ToCP1251(sprofile) + PathDelim + // else confdir := GetAppConfigDir(False); + radarMapFileName := confdir + 'RadarMap.cache'; if FileExists(radarMapFileName) then begin radarMapFile := TFileStream.Create(radarMapFileName, fmOpenRead); @@ -192,7 +267,7 @@ begin if checksum <> realChecksum then begin - frmInitialize.lblStatus.Caption := 'Updating Radar Map'; + frmInitialize.lblStatus.Caption := frmInitialize.SplashUpdatingMiniMap; frmInitialize.Show; frmInitialize.SetModal; //frmMain.Enabled := False; diff --git a/Client/UfrmRegionControl.lfm b/Client/UfrmRegionControl.lfm index 64cce01..b77b636 100644 --- a/Client/UfrmRegionControl.lfm +++ b/Client/UfrmRegionControl.lfm @@ -1,20 +1,22 @@ object frmRegionControl: TfrmRegionControl - Left = 247 - Height = 413 - Top = 139 + Left = 1069 + Height = 390 + Top = 110 Width = 620 - ActiveControl = vstRegions - Caption = 'Region Control' - ClientHeight = 413 + Caption = 'Управление Регионами' + ClientHeight = 390 ClientWidth = 620 + Constraints.MinHeight = 390 + Constraints.MinWidth = 620 Font.Height = -11 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy + OnResize = FormResize OnShow = FormShow Position = poOwnerFormCenter ShowInTaskBar = stAlways - LCLVersion = '0.9.29' + LCLVersion = '0.9.30.2' object sbArea: TScrollBox AnchorSideLeft.Control = vstRegions AnchorSideLeft.Side = asrBottom @@ -23,11 +25,11 @@ object frmRegionControl: TfrmRegionControl AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnClose Left = 160 - Height = 372 + Height = 349 Top = 0 Width = 460 Anchors = [akTop, akLeft, akRight, akBottom] - ClientHeight = 368 + ClientHeight = 345 ClientWidth = 456 TabOrder = 0 object pbArea: TPaintBox @@ -47,11 +49,11 @@ object frmRegionControl: TfrmRegionControl AnchorSideBottom.Side = asrBottom Left = 548 Height = 25 - Top = 380 + Top = 357 Width = 64 Anchors = [akRight, akBottom] BorderSpacing.Around = 8 - Caption = 'Close' + Caption = 'Закрыть' OnClick = btnCloseClick TabOrder = 1 end @@ -61,11 +63,11 @@ object frmRegionControl: TfrmRegionControl AnchorSideBottom.Side = asrBottom Left = 476 Height = 25 - Top = 380 + Top = 357 Width = 64 Anchors = [akRight, akBottom] BorderSpacing.Right = 4 - Caption = 'Save' + Caption = 'Сохранить' Enabled = False OnClick = btnSaveClick TabOrder = 2 @@ -84,7 +86,7 @@ object frmRegionControl: TfrmRegionControl Header.Columns = < item Position = 0 - Text = 'Regions' + Text = 'Регионы' Width = 156 end> Header.DefaultHeight = 17 @@ -105,47 +107,46 @@ object frmRegionControl: TfrmRegionControl AnchorSideBottom.Control = spRegionsArea Left = 4 Height = 22 - Hint = 'Add region' + Hint = 'Добавить регион' Top = 134 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003A8C44FF368940FF32873CFF2F84 - 37FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000459653FF419950FF7DC28FFF96D0A6FF96CFA6FF78BE - 89FF368D42FF2C8134FF00000000000000000000000000000000000000000000 - 0000000000004D9C5DFF64B478FFA8DBB5FF87CC98FF66BC7DFF64BA7CFF86CB - 98FFA5D9B4FF58AA6BFF2C8134FF000000000000000000000000000000000000 - 000056A366FF6AB97DFFA8DBB2FF60BC77FF5CBA73FF59B870FF59B56FFF58B5 - 6FFF5BB774FFA5D9B3FF5AAA6CFF2C8234FF0000000000000000000000000000 - 000053AB68FFAADDB4FF64C179FF5FBE71FF60BC77FFFFFFFFFFFFFFFFFF59B8 - 70FF58B56EFF5CB774FFA6DAB4FF388F43FF00000000000000000000000061AC - 75FF8ACC98FF89D396FF6BC67AFF63C170FF55AB65FFFFFFFFFFFFFFFFFF59B8 - 70FF59B870FF5BB972FF85CC97FF7BBE8DFF308539FF000000000000000065AF - 7AFFA9DDB3FF7DCF8AFF75CC81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF67BE7DFF9CD4ABFF34883DFF000000000000000069B2 - 7EFFB6E2BEFF8BD597FF7AC986FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF69C17EFF9DD4AAFF388B42FF00000000000000006DB5 - 83FFACDDB6FFA6DFAFFF81CB8CFF7CC986FF6EBD79FFFFFFFFFFFFFFFFFF5BAC - 6AFF60BC77FF5CBA73FF8BD199FF80C592FF3C8E47FF00000000000000000000 - 000085C797FFD2EED7FF95D9A0FF8AD394FF7FC889FFFFFFFFFFFFFFFFFF79CD - 85FF6BC37CFF6FC77EFFACDFB5FF459E57FF0000000000000000000000000000 - 000070B887FFAADAB7FFD8F1DCFF92D89DFF88CD93FF84CC8EFF8BD496FF8AD4 - 95FF83D28EFFAFE0B7FF6BB97DFF489856FF0000000000000000000000000000 - 00000000000070B887FFAFDCBBFFDCF2E0FFB6E4BDFF9BDBA5FF96D9A0FFA5DF - AFFFC0E8C5FF79C28AFF509E5FFF000000000000000000000000000000000000 - 0000000000000000000071B887FF94CEA4FFC3E6CBFFCFEBD4FFC9E9CEFFAFDD - B8FF6DB97FFF58A569FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000006EB684FF6AB380FF67B17CFF63AE - 77FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = mnuAddRegionClick @@ -159,48 +160,47 @@ object frmRegionControl: TfrmRegionControl AnchorSideBottom.Side = asrBottom Left = 30 Height = 22 - Hint = 'Delete region' + Hint = 'Удалить регион' Top = 134 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Left = 4 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003853BEFF3551BDFF304BBCFF2E4E - B8FF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FF00000000000000000000000000000000000000000000 - 0000000000004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FF000000000000000000000000000000000000 - 00005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FF0000000000000000000000000000 - 00004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF0000000000000000000000005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF00000000000000005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF00000000000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF0000000000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF00000000000000000000 - 00007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF0000000000000000000000000000 - 00006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF0000000000000000000000000000 - 0000000000006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFF000000000000000000000000000000000000 - 000000000000000000006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF00000000000000000000000000000000000000000000 - 000000000000000000000000000000000000686ADDFF6364DCFF6164DAFF5D63 - D9FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = mnuDeleteRegionClick @@ -215,7 +215,7 @@ object frmRegionControl: TfrmRegionControl AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnDeleteArea Left = 4 - Height = 124 + Height = 97 Top = 179 Width = 152 Anchors = [akTop, akLeft, akRight, akBottom] @@ -247,7 +247,7 @@ object frmRegionControl: TfrmRegionControl Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 - Caption = 'Area:' + Caption = 'Область:' ParentColor = False end object spRegionsArea: TSplitter @@ -269,47 +269,46 @@ object frmRegionControl: TfrmRegionControl AnchorSideRight.Control = btnDeleteArea Left = 43 Height = 22 - Hint = 'Add area' - Top = 307 + Hint = 'Добавить область' + Top = 280 Width = 22 Anchors = [akTop, akRight] - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003A8C44FF368940FF32873CFF2F84 - 37FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000459653FF419950FF7DC28FFF96D0A6FF96CFA6FF78BE - 89FF368D42FF2C8134FF00000000000000000000000000000000000000000000 - 0000000000004D9C5DFF64B478FFA8DBB5FF87CC98FF66BC7DFF64BA7CFF86CB - 98FFA5D9B4FF58AA6BFF2C8134FF000000000000000000000000000000000000 - 000056A366FF6AB97DFFA8DBB2FF60BC77FF5CBA73FF59B870FF59B56FFF58B5 - 6FFF5BB774FFA5D9B3FF5AAA6CFF2C8234FF0000000000000000000000000000 - 000053AB68FFAADDB4FF64C179FF5FBE71FF60BC77FFFFFFFFFFFFFFFFFF59B8 - 70FF58B56EFF5CB774FFA6DAB4FF388F43FF00000000000000000000000061AC - 75FF8ACC98FF89D396FF6BC67AFF63C170FF55AB65FFFFFFFFFFFFFFFFFF59B8 - 70FF59B870FF5BB972FF85CC97FF7BBE8DFF308539FF000000000000000065AF - 7AFFA9DDB3FF7DCF8AFF75CC81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF67BE7DFF9CD4ABFF34883DFF000000000000000069B2 - 7EFFB6E2BEFF8BD597FF7AC986FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF59B870FF69C17EFF9DD4AAFF388B42FF00000000000000006DB5 - 83FFACDDB6FFA6DFAFFF81CB8CFF7CC986FF6EBD79FFFFFFFFFFFFFFFFFF5BAC - 6AFF60BC77FF5CBA73FF8BD199FF80C592FF3C8E47FF00000000000000000000 - 000085C797FFD2EED7FF95D9A0FF8AD394FF7FC889FFFFFFFFFFFFFFFFFF79CD - 85FF6BC37CFF6FC77EFFACDFB5FF459E57FF0000000000000000000000000000 - 000070B887FFAADAB7FFD8F1DCFF92D89DFF88CD93FF84CC8EFF8BD496FF8AD4 - 95FF83D28EFFAFE0B7FF6BB97DFF489856FF0000000000000000000000000000 - 00000000000070B887FFAFDCBBFFDCF2E0FFB6E4BDFF9BDBA5FF96D9A0FFA5DF - AFFFC0E8C5FF79C28AFF509E5FFF000000000000000000000000000000000000 - 0000000000000000000071B887FF94CEA4FFC3E6CBFFCFEBD4FFC9E9CEFFAFDD - B8FF6DB97FFF58A569FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000006EB684FF6AB380FF67B17CFF63AE - 77FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000464 + 000C025D0073025D00BA025D00CC025D00CC025D00CC025D00CC025D00CC025D + 00CC025D00CC025D00CC025D00BA025D00730464000CFFFFFF00FFFFFF00066D + 0073129208DD20CC10F922D911FF22D911FF22D911FF22D911FF22D911FF22D9 + 11FF22D911FF22D911FF1FCC0FF9109207DD066D0073FFFFFF00FFFFFF000A7D + 00BA25CA15F922D111FF22D111FF22D111FF22D111FF22B611FF22B611FF22D1 + 11FF22D111FF22D111FF22D111FF20C80FF90A7D00BAFFFFFF00FFFFFF000C84 + 00CC2BCC1AFF22C811FF22C811FF22C811FF22BC11FFE8E8E8FFECECECFF22BC + 11FF22C811FF22C811FF22C811FF22C811FF0C8400CCFFFFFF00FFFFFF000D89 + 00CC31C620FF22BE11FF22BE11FF22BE11FF22B511FFE4E4E4FFE8E8E8FF22B5 + 11FF22BE11FF22BE11FF22BE11FF23BE12FF0D8900CCFFFFFF00FFFFFF000E8D + 00CC41C330FF23B412FF22A811FF22A811FF22A411FFE0E0E0FFE4E4E4FF22A4 + 11FF22A811FF22A811FF22B411FF25B514FF0E8D00CCFFFFFF00FFFFFF000F92 + 00CC52C941FF33AF22FFD4D4D4FFD3D3D3FFD7D7D7FFDCDCDCFFE0E0E0FFE4E4 + E4FFE8E8E8FFECECECFF22A611FF28AF17FF0F9200CCFFFFFF00FFFFFF001096 + 00CC55CC44FF3CB32BFFF8F8F8FFE1E1E1FFD5D5D5FFD7D7D7FFDCDCDCFFE0E0 + E0FFE4E4E4FFE8E8E8FF22A011FF2CAA1BFF109600CCFFFFFF00FFFFFF00119A + 00CC5AD149FF47BE36FF3EB52DFF3EB52DFF37AE26FFEBEBEBFFE2E2E2FF259D + 14FF239B12FF239B12FF279F16FF39B128FF119A00CCFFFFFF00FFFFFF00129E + 00CC60D74FFF4EC53DFF4EC53DFF4EC53DFF44BB33FFFFFFFFFFFFFFFFFF44BB + 33FF4EC53DFF4EC53DFF4EC53DFF58CF47FF129E00CCFFFFFF00FFFFFF0013A2 + 00CC67DE56FF57CE46FF57CE46FF57CE46FF4AC139FFFFFFFFFFFFFFFFFF4AC1 + 39FF57CE46FF57CE46FF57CE46FF60D74FFF13A200CCFFFFFF00FFFFFF0014A5 + 00BA64DE53F95FD64EFF5FD64EFF5FD64EFF5FD64EFF50C73FFF50C73FFF5FD6 + 4EFF5FD64EFF5FD64EFF5FD64EFF60DA4FF914A500BAFFFFFF00FFFFFF0014A8 + 007337C124DD66E054F96EE55DFF6EE55DFF6EE55DFF6EE55DFF6DE45CFF6DE4 + 5CFF6DE45CFF6DE45CFF64DF53F936BF23DD14A80073FFFFFF00FFFFFF0015A9 + 000C15AA007315AA00BA15AA00CC15AA00CC15AA00CC15AA00CC15AA00CC15AA + 00CC15AA00CC15AA00CC15AA00BA15AA007315A9000CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnAddAreaClick @@ -322,49 +321,48 @@ object frmRegionControl: TfrmRegionControl AnchorSideBottom.Control = seX1 Left = 69 Height = 22 - Hint = 'Delete area' - Top = 307 + Hint = 'Удалить область' + Top = 280 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 4 BorderSpacing.Around = 4 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003853BEFF3551BDFF304BBCFF2E4E - B8FF000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178 - E4FF334DC1FF2B4AB7FF00000000000000000000000000000000000000000000 - 0000000000004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84 - EEFF9EA0F4FF515DD7FF2B4AB7FF000000000000000000000000000000000000 - 00005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56 - E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FF0000000000000000000000000000 - 00004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF0000000000000000000000005C62 - D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59 - E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF00000000000000005F63 - DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF00000000000000006469 - DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF0000000000000000676A - DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F - ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF00000000000000000000 - 00007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84 - F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF0000000000000000000000000000 - 00006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92 - F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF0000000000000000000000000000 - 0000000000006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9 - FBFFBAC7FCFF707BE9FF4C5BCCFF000000000000000000000000000000000000 - 000000000000000000006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4 - F4FF6670E2FF535ED1FF00000000000000000000000000000000000000000000 - 000000000000000000000000000000000000686ADDFF6364DCFF6164DAFF5D63 - D9FF000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111D1FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111C8FF1111 + C8FF1111C8FF1111C8FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111BEFF1111 + BEFF1111BEFF1111BEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111A8FF1111A8FF1111A8FF1111A8FF1111A8FF1111 + A8FF1111A8FF1111A8FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FFD0D0D0FFCCCCCCFFD1D1D1FFDCDCDCFFE8E8E8FFEEEE + EEFFEEEEEEFFEEEEEEFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFFF8F8F8FFDEDEDEFFCECECEFFD1D1D1FFDCDCDCFFE8E8 + E8FFEEEEEEFFEEEEEEFF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF3737BFFF3737BFFF3232BAFF2727B0FF1C1CA6FF1616 + A0FF12129CFF12129CFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242CAFF4242 + CAFF4242CAFF4242CAFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FF4F4FD7FF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnDeleteAreaClick @@ -377,46 +375,45 @@ object frmRegionControl: TfrmRegionControl AnchorSideTop.Control = btnDeleteArea Left = 95 Height = 22 - Hint = 'Delete all areas' - Top = 307 + Hint = 'Удалить все области' + Top = 280 Width = 22 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000 - EFFF0000EDFF0000EDFF00000000000000000000000000000000000000000000 - 0000000000000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443 - F7FF3242F7FF141BF1FF0000EDFF000000000000000000000000000000000000 - 00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909 - F5FF161BF5FF3343F7FF141BF1FF0000EDFF0000000000000000000000000000 - F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333 - F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF00000000000000000000 - FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA - FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF00000000000000000000 - FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1 - FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00000000000000000000 - FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF00000000000000000000 - FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC - FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF00000000000000000000 - FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2 - FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FF00000000000000000000 - FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC - FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000000000000000 - FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B - FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000 - 00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D - FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000 - 0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663 - FEFF5461FEFF2227FCFF0000FBFF000000000000000000000000000000000000 - 000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000 - FDFF0000FDFF0000FDFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 640C00005D7300005DBA00005DCC00005DCC00005DCC00005DCC00005DCC0000 + 5DCC00005DCC00005DCC00005DBA00005D730000640CFFFFFF00FFFFFF000000 + 6D73080893DD1010CCF91111D9FF1111D9FF1111D9FF1111D9FF1111D9FF1111 + D9FF1111D9FF1111D9FF0F0FCCF9070792DD00006D73FFFFFF00FFFFFF000000 + 7DBA1616CBF91111D1FF1111D1FF1111B6FF1111D1FF1111D1FF1111D1FF1111 + D1FF1111B6FF1111D1FF1111D1FF0F0FC8F900007DBAFFFFFF00FFFFFF000000 + 84CC1C1CCEFF1111C8FF1111B2FFDCDCDCFF1111B2FF1111C8FF1111C8FF1111 + B2FFEEEEEEFF1111B2FF1111C8FF1111C8FF000084CCFFFFFF00FFFFFF000000 + 89CC2222C8FF1111BEFFD1D1D1FFD6D6D6FFDCDCDCFF1111ADFF1111ADFFEAEA + EAFFEEEEEEFFEEEEEEFF1111BEFF1212BEFF000089CCFFFFFF00FFFFFF000000 + 8DCC3434C7FF1212B4FF1111B4FFD1D1D1FFD6D6D6FFDCDCDCFFE2E2E2FFE6E6 + E6FFEAEAEAFF1111B4FF1111B4FF1414B6FF00008DCCFFFFFF00FFFFFF000000 + 92CC4646CEFF2626B5FF1414ABFF1111AAFFD1D1D1FFD6D6D6FFDCDCDCFFE2E2 + E2FF1111AAFF1111AAFF1111AAFF1818B0FF000092CCFFFFFF00FFFFFF000000 + 96CC4A4AD2FF3333BBFF2E2EB8FF13139FFFCECECEFFD1D1D1FFD6D6D6FFDCDC + DCFF11119EFF1111A1FF1111A1FF1D1DACFF000096CCFFFFFF00FFFFFF000000 + 9ACC5050D8FF3737BFFF2323ABFFFFFFFFFFF7F7F7FFE8E8E8FFDEDEDEFFDBDB + DBFFDDDDDDFF11119BFF1616A0FF2B2BB5FF00009ACCFFFFFF00FFFFFF000000 + 9ECC5A5AE2FF4242CAFFFFFFFFFFFFFFFFFFFFFFFFFF4242CAFF4242CAFFFFFF + FFFFFFFFFFFFFFFFFFFF4242CAFF4E4ED6FF00009ECCFFFFFF00FFFFFF000000 + A2CC6262EAFF4F4FD7FF4F4FD7FFFFFFFFFF4F4FD7FF4F4FD7FF4F4FD7FF4F4F + D7FFFFFFFFFF4F4FD7FF4F4FD7FF5A5AE2FF0000A2CCFFFFFF00FFFFFF000000 + A5BA6060ECF95B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5B + E3FF5B5BE3FF5B5BE3FF5B5BE3FF5B5BE7F90000A5BAFFFFFF00FFFFFF000000 + A8732A2AC7DD6363EFF96D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6DF5FF6D6D + F5FF6D6DF5FF6C6CF4FF6262EEF92929C5DD0000A873FFFFFF00FFFFFF000000 + A90C0000AA730000AABA0000AACC0000AACC0000AACC0000AACC0000AACC0000 + AACC0000AACC0000AACC0000AABA0000AA730000A90CFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnClearAreaClick @@ -429,8 +426,9 @@ object frmRegionControl: TfrmRegionControl AnchorSideTop.Side = asrCenter Left = 4 Height = 14 - Top = 339 - Width = 8 + Top = 313 + Width = 7 + AutoSize = False BorderSpacing.Left = 4 Caption = 'X' Enabled = False @@ -439,11 +437,12 @@ object frmRegionControl: TfrmRegionControl object seX1: TSpinEdit AnchorSideLeft.Control = seY1 AnchorSideBottom.Control = seY1 - Left = 20 - Height = 19 - Top = 337 + Left = 18 + Height = 21 + Top = 310 Width = 50 Anchors = [akLeft, akBottom] + AutoSize = False BorderSpacing.Bottom = 8 Enabled = False OnChange = seX1Change @@ -454,10 +453,11 @@ object frmRegionControl: TfrmRegionControl AnchorSideLeft.Control = seX1 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = seX1 - Left = 78 - Height = 19 - Top = 337 + Left = 76 + Height = 21 + Top = 310 Width = 50 + AutoSize = False BorderSpacing.Left = 8 Enabled = False OnChange = seX1Change @@ -470,8 +470,9 @@ object frmRegionControl: TfrmRegionControl AnchorSideTop.Side = asrCenter Left = 4 Height = 14 - Top = 366 - Width = 8 + Top = 342 + Width = 6 + AutoSize = False Caption = 'Y' Enabled = False ParentColor = False @@ -482,11 +483,12 @@ object frmRegionControl: TfrmRegionControl AnchorSideRight.Control = seX1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnGrab1 - Left = 20 - Height = 19 - Top = 364 + Left = 18 + Height = 21 + Top = 339 Width = 50 - Anchors = [akLeft, akRight, akBottom] + Anchors = [akLeft, akBottom] + AutoSize = False BorderSpacing.Left = 8 Enabled = False OnChange = seX1Change @@ -499,11 +501,12 @@ object frmRegionControl: TfrmRegionControl AnchorSideTop.Side = asrBottom AnchorSideRight.Control = seX2 AnchorSideRight.Side = asrBottom - Left = 78 - Height = 19 - Top = 364 + Left = 76 + Height = 21 + Top = 339 Width = 50 Anchors = [akTop, akLeft, akRight] + AutoSize = False BorderSpacing.Top = 8 Enabled = False OnChange = seX1Change @@ -515,14 +518,13 @@ object frmRegionControl: TfrmRegionControl AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 34 + Left = 32 Height = 22 - Hint = 'Grab coordinates from the main window.' - Top = 387 + Hint = 'Выбрать тайл в главном окне и взять его координаты.' + Top = 364 Width = 22 Anchors = [akLeft, akBottom] BorderSpacing.Around = 4 - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -570,13 +572,12 @@ object frmRegionControl: TfrmRegionControl AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = btnGrab1 AnchorSideBottom.Side = asrBottom - Left = 92 + Left = 90 Height = 22 - Hint = 'Grab coordinates from the main window.' - Top = 387 + Hint = 'Выбрать тайл в главном окне и взять его координаты.' + Top = 364 Width = 22 Anchors = [akLeft, akBottom] - Color = clBtnFace Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 @@ -623,11 +624,11 @@ object frmRegionControl: TfrmRegionControl left = 48 top = 43 object mnuAddRegion: TMenuItem - Caption = 'Add' + Caption = 'Добавить' OnClick = mnuAddRegionClick end object mnuDeleteRegion: TMenuItem - Caption = 'Delete' + Caption = 'Удалить' Enabled = False OnClick = mnuDeleteRegionClick end diff --git a/Client/UfrmRegionControl.pas b/Client/UfrmRegionControl.pas index 1f3c9f5..f6969b3 100644 --- a/Client/UfrmRegionControl.pas +++ b/Client/UfrmRegionControl.pas @@ -77,6 +77,7 @@ type vstRegions: TVirtualStringTree; procedure btnGrab1Click(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormResize(Sender: TObject); procedure mnuAddRegionClick(Sender: TObject); procedure mnuDeleteRegionClick(Sender: TObject); procedure btnAddAreaClick(Sender: TObject); @@ -121,6 +122,15 @@ type property OnRegionModified: TRegionModifiedEvent read FOnRegionModified write FOnRegionModified; property OnRegionDeleted: TRegionDeletedEvent read FOnRegionDeleted write FOnRegionDeleted; property OnRegionList: TRegionListEvent read FOnRegionList write FOnRegionList; + public + lbDlgUnsaveCaption: string; + lbDlgUnsave: string; + lbDlgDelConfCaption: string; + lbDlgDelConf: string; + lbDlgNewExistsCaption: string; + lbDlgNewExists: string; + lbNewInputQueryCaption: string; + lbNewInputQuery: string; end; var @@ -130,7 +140,7 @@ implementation uses UGameResources, UfrmRadar, UfrmMain, UdmNetwork, UPacket, UGUIPlatformUtils, - UAdminHandling, UPacketHandlers; + UAdminHandling, UPacketHandlers, Language; type { TModifyRegionPacket } @@ -195,18 +205,32 @@ end; procedure TfrmRegionControl.FormCreate(Sender: TObject); begin + LanguageTranslate(Self); + pbArea.Width := frmRadarMap.Radar.Width; pbArea.Height := frmRadarMap.Radar.Height; seX1.MaxValue := ResMan.Landscape.CellWidth; seX2.MaxValue := ResMan.Landscape.CellWidth; seY1.MaxValue := ResMan.Landscape.CellHeight; seY2.MaxValue := ResMan.Landscape.CellHeight; - + + Constraints.MaxWidth := 4 + Width - sbArea.ClientWidth + pbArea.Width + sbArea.VertScrollBar.Size; + Width := Constraints.MaxWidth; + Height := Height - sbArea.ClientHeight + frmRadarMap.Radar.Height; + if (Width >= frmMain.Width) then begin + Left := frmMain.Left; + Width := frmMain.Width; + end; + if (Height >= frmMain.Height) then begin + Top := frmMain.Top; + Height:= frmMain.Height; + end; + vstArea.NodeDataSize := SizeOf(TRect); vstRegions.NodeDataSize := SizeOf(TRegionInfo); FTempRegionNode := nil; - + frmRadarMap.Dependencies.Add(pbArea); frmMain.RegisterAccessChangedListener(@OnAccessChanged); @@ -274,7 +298,7 @@ var regionInfo: PRegionInfo; begin regionName := ''; - if InputQuery('New Region', 'Enter the name for the new region:', regionName) then + if InputQuery(lbNewInputQueryCaption, lbNewInputQuery, regionName) then begin CheckUnsaved; @@ -289,8 +313,7 @@ begin btnSave.Enabled := True; end else begin - MessageDlg('New Region', 'The region could not be added. A region with ' + - 'that name already exists.', mtError, [mbOK], 0); + MessageDlg(lbDlgNewExistsCaption, lbDlgNewExists, mtError, [mbOK], 0); end; end; end; @@ -301,6 +324,16 @@ begin CheckUnsaved; end; +procedure TfrmRegionControl.FormResize(Sender: TObject); +var maxW: Integer; +begin + + seY1.Update; seY1.Repaint; + seX1.Update; seX1.Repaint; + seX2.Update; seX2.Repaint; + seY2.Update; seY2.Repaint; +end; + procedure TfrmRegionControl.btnGrab1Click(Sender: TObject); begin FSelectFirst := (Sender = btnGrab1); @@ -316,8 +349,8 @@ var regionInfo: PRegionInfo; begin regionNode := vstRegions.GetFirstSelected; - if (regionNode <> nil) and (MessageDlg('Delete Region', 'Are you sure, you ' + - 'want to delete the selected region?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then + if (regionNode <> nil) and (MessageDlg(lbDlgDelConfCaption, lbDlgDelConf, + mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin regionInfo := vstRegions.GetNodeData(regionNode); dmNetwork.Send(TDeleteRegionPacket.Create(regionInfo^.Name)); @@ -577,7 +610,7 @@ var regionInfo: PRegionInfo; begin regionInfo := Sender.GetNodeData(Node); - CellText := UTF8Encode(regionInfo^.Name); + CellText := regionInfo^.Name; end; function TfrmRegionControl.FindRegion(AName: string): PVirtualNode; @@ -601,8 +634,7 @@ procedure TfrmRegionControl.CheckUnsaved; begin if btnSave.Enabled then begin - if MessageDlg('Unsaved changes', 'There are unsaved ' + - 'changes.' + #13#10+#13#10+ 'Do you want to save them now?', + if MessageDlg(lbDlgUnsaveCaption, lbDlgUnsave, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin btnSaveClick(nil); diff --git a/Client/UndoRedoCmd.pas b/Client/UndoRedoCmd.pas new file mode 100644 index 0000000..898b506 --- /dev/null +++ b/Client/UndoRedoCmd.pas @@ -0,0 +1,281 @@ +unit UndoRedoCmd; + +interface +uses + Classes, SysUtils, VirtualTrees; + +type + IUndoRedoCommand = interface (IUnknown) + ['{D84BFD00-8396-11D6-B4FA-000021D960D4}'] + procedure Execute; + procedure Redo; + procedure Undo; + end; + + IUndoRedoCommandGroup = interface (IUndoRedoCommand) + ['{9169AE00-839B-11D6-B4FA-000021D960D4}'] + function GetUndoRedoCommands: TInterfaceList; + property UndoRedoCommands: TInterfaceList read GetUndoRedoCommands; + end; + + TUndoRedoCommandGroup = class (TInterfacedObject, IUndoRedoCommandGroup, + IUndoRedoCommand) + private + FList: TInterfaceList; + FCanRedo: Boolean; + public + constructor Create; + destructor Destroy; override; + procedure Add(const AUndoRedoCommand: IUndoRedoCommand); + procedure Execute; + function GetUndoRedoCommands: TInterfaceList; + procedure Redo; + procedure Undo; + property UndoRedoCommands: TInterfaceList read GetUndoRedoCommands; + end; + + TUndoRedoManager = class (TObject) + private + FRedoList: TInterfaceList; + FUndoList: TInterfaceList; + FTransactLevel: Integer; + FTransaction: IUndoRedoCommandGroup; + function GetCanRedo: Integer; + function GetCanUndo: Integer; + public + Enabled: Boolean; + constructor Create; + destructor Destroy; override; + procedure BeginTransaction; + procedure EndTransaction; + procedure ExecCommand(const AUndoRedoCommand: IUndoRedoCommand); + procedure Redo(RedoCount: Integer = 1); + procedure Undo(UndoCount: Integer = 1); + property CanRedo: Integer read GetCanRedo; + property CanUndo: Integer read GetCanUndo; + end; + + + TUndoRedoSelectVirtualNodeCommand = class (TInterfacedObject, IUndoRedoCommand) + private + m_UndoRedoManag : TUndoRedoManager; + m_VirtualTree: TBaseVirtualTree; + m_VirtualNode: PVirtualNode; + m_ForwardDir : Boolean; + public + constructor Create(UndoRedoManag: TUndoRedoManager; VirtualTree: TBaseVirtualTree; VirtualNode: PVirtualNode); + //destructor Destroy; override; + procedure Execute; + procedure Redo; + procedure Undo; + end; + +implementation + +{ +**************************** TCommands Types *********************************** +} +constructor TUndoRedoSelectVirtualNodeCommand.Create( + UndoRedoManag: TUndoRedoManager; VirtualTree: TBaseVirtualTree; VirtualNode: PVirtualNode); +begin + m_UndoRedoManag := UndoRedoManag; + m_VirtualTree := VirtualTree; + m_VirtualNode := VirtualNode; + m_ForwardDir := VirtualTree.Selected[VirtualNode]; +end; + +procedure TUndoRedoSelectVirtualNodeCommand.Execute; +begin +end; + +procedure TUndoRedoSelectVirtualNodeCommand.Redo; +begin + m_UndoRedoManag.Enabled := False; + m_VirtualTree.Selected[m_VirtualNode] := m_ForwardDir; + m_UndoRedoManag.Enabled := True; +end; + +procedure TUndoRedoSelectVirtualNodeCommand.Undo; +begin + m_UndoRedoManag.Enabled := False; + //m_VirtualTree.Selected[m_VirtualNode] := not m_ForwardDir; + if m_ForwardDir + then m_VirtualTree.Selected[m_VirtualNode] := False + else m_VirtualTree.Selected[m_VirtualNode] := True; + m_UndoRedoManag.Enabled := True; +end; + +{ +**************************** TUndoRedoCommandGroup ***************************** +} +constructor TUndoRedoCommandGroup.Create; +begin + inherited Create; + FList:= TInterfaceList.Create; +end; + +destructor TUndoRedoCommandGroup.Destroy; +begin + FList.Free; + inherited Destroy; +end; + +procedure TUndoRedoCommandGroup.Add(const AUndoRedoCommand: IUndoRedoCommand); +begin + FList.Add(AUndoRedoCommand); +end; + +procedure TUndoRedoCommandGroup.Execute; +var + I: Integer; +begin + for I:= 0 to FList.Count-1 do + (FList[I] as IUndoRedoCommand).Execute; +end; + +function TUndoRedoCommandGroup.GetUndoRedoCommands: TInterfaceList; +begin + Result:= FList; +end; + +procedure TUndoRedoCommandGroup.Redo; +var + I: Integer; +begin + if FCanRedo then + begin + for I:= 0 to FList.Count-1 do + (FList[I] as IUndoRedoCommand).Redo; + + FCanRedo:= False; + end + else + raise Exception.Create('Must call TUndoRedoCommandGroup.Undo before calling Redo.'); +end; + +procedure TUndoRedoCommandGroup.Undo; +var + I: Integer; +begin + if FCanRedo then + raise Exception.Create('TUndoRedoCommandGroup.Undo already called'); + + for I:= FList.Count-1 downto 0 do + (FList[I] as IUndoRedoCommand).Undo; + + FCanRedo:= True; +end; + +{ +******************************* TUndoRedoManager ******************************* +} +constructor TUndoRedoManager.Create; +begin + inherited Create; + FRedoList:= TInterfaceList.Create; + FUndoList:= TInterfaceList.Create; + Enabled := True; +end; + +destructor TUndoRedoManager.Destroy; +begin + FRedoList.Free; + FUndoList.Free; + inherited Destroy; +end; + +procedure TUndoRedoManager.BeginTransaction; +begin + Inc(FTransactLevel); + if FTransactLevel = 1 then + FTransaction:= TUndoRedoCommandGroup.Create; +end; + +procedure TUndoRedoManager.EndTransaction; +begin + Dec(FTransactLevel); + if (FTransactLevel = 0) then + begin + if FTransaction.UndoRedoCommands.Count > 0 then + begin + FRedoList.Clear; + FUndoList.Add(FTransaction); + end; + FTransaction:= nil; + end + else if FTransactLevel < 0 then + raise Exception.Create('Unmatched TUndoRedoManager.BeginTransaction and EndTransaction'); +end; + +procedure TUndoRedoManager.ExecCommand(const AUndoRedoCommand: IUndoRedoCommand); +begin + if Enabled then begin + BeginTransaction; + try + FTransaction.UndoRedoCommands.Add(AUndoRedoCommand); + AUndoRedoCommand.Execute; + finally + EndTransaction; + end; + end; + +end; + +function TUndoRedoManager.GetCanRedo: Integer; +begin + Result:= FRedoList.Count; +end; + +function TUndoRedoManager.GetCanUndo: Integer; +begin + Result:= FUndoList.Count; +end; + +procedure TUndoRedoManager.Redo(RedoCount: Integer = 1); +var + I: Integer; + Item: IUndoRedoCommand; + RedoLast: Integer; +begin + if FTransactLevel <> 0 then + raise Exception.Create('Cannot Redo while in Transaction'); + + // Index of last redo item + RedoLast:= FRedoList.Count - RedoCount; + if RedoLast < 0 then + RedoLast:= 0; + + for I:= FRedoList.Count-1 downto RedoLast do + begin + Item:= FRedoList[I] as IUndoRedoCommand; + FRedoList.Delete(I); + FUndoList.Add(Item); + Item.Redo; + end; +end; + +procedure TUndoRedoManager.Undo(UndoCount: Integer = 1); +var + I: Integer; + Item: IUndoRedoCommand; + UndoLast: Integer; +begin + if FTransactLevel <> 0 then + raise Exception.Create('Cannot undo while in Transaction'); + + // Index of last undo item + UndoLast:= FUndoList.Count - UndoCount; + if UndoLast < 0 then + UndoLast:= 0; + + for I:= FUndoList.Count-1 downto UndoLast do + begin + Item:= FUndoList[I] as IUndoRedoCommand; + FUndoList.Delete(I); + FRedoList.Add(Item); + Item.Undo; + end; +end; + + +end. diff --git a/Client/language.pas b/Client/language.pas new file mode 100644 index 0000000..266b36e --- /dev/null +++ b/Client/language.pas @@ -0,0 +1,980 @@ +(* + * CDDL HEADER START + * + * gfgfgfg + *) +unit Language; +{$mode objfpc}{$H+} + +interface +uses IniFiles, UfrmLogin, UdmNetwork, UfrmInitialize, UfrmMain, UfrmDrawSettings, + UfrmConfirmation, UfrmMoveSettings, UfrmElevateSettings, UfrmHueSettings, + UfrmBoundaries, UfrmVirtualLayer, UfrmFilter, UfrmLightlevel, UfrmRadar, + UfrmAccountControl, UfrmEditAccount, UfrmRegionControl, UfrmLargeScaleCommand, + UfrmAbout, UGameResources, UfrmFillSettings, UfrmSelectionSettings, + UfrmSurfElevateSettings, UfrmSurfStretchSettings, UfrmSurfSmoothSettings; + +procedure LanguageLoad(form: TfrmLogin; lang: string; path: string); +procedure LanguageSet(index: Integer); +function LanguageGetName() : string; +procedure ReloadLanguageTranslation(); +procedure LanguageTranslate(form: TfrmLogin); +procedure LanguageTranslate(form: TfrmInitialize; unet: TdmNetwork; resm: TGameResourceManager); +procedure LanguageTranslate(form: TfrmMain); + + +procedure LanguageTranslate(form: TfrmConfirmation); +procedure LanguageTranslate(form: TfrmSelectionSettings); +procedure LanguageTranslate(form: TfrmMoveSettings); +procedure LanguageTranslate(form: TfrmElevateSettings); +procedure LanguageTranslate(form: TfrmSurfElevateSettings); +procedure LanguageTranslate(form: TfrmSurfStretchSettings); +procedure LanguageTranslate(form: TfrmSurfSmoothSettings); +procedure LanguageTranslate(form: TfrmDrawSettings); +procedure LanguageTranslate(form: TfrmHueSettings); +procedure LanguageTranslate(form: TfrmFillSettings); +procedure LanguageTranslate(form: TfrmVirtualLayer); +procedure LanguageTranslate(form: TfrmBoundaries); +procedure LanguageTranslate(form: TfrmFilter); +procedure LanguageTranslate(form: TfrmLightlevel); +procedure LanguageTranslate(form: TfrmRadarMap); +procedure LanguageTranslate(form: TfrmAccountControl); +procedure LanguageTranslate(form: TfrmEditAccount); +procedure LanguageTranslate(form: TfrmRegionControl); +procedure LanguageTranslate(form: TfrmLargeScaleCommand); +procedure LanguageTranslate(form: TfrmAbout); +function GetParseErText(key: string) : string; + + +implementation +uses SysUtils, Classes, LConvEncoding, Menus; + + +var + LangPath : string; + LangFile : TIniFile; + LangIndex: Integer; + LangFlags: array of Integer; + LangAbbrs: array of string; + Languages: array of string; + LangFiles: array of string; + CodePages: array of Integer; + +procedure LanguageLoad(form: TfrmLogin; lang: string; path: string); +var + langSize : Integer; + nodeIndex: Integer; + tempIndex: Integer; + searchRec: TSearchRec; + flags: array of Integer; + abbrs: array of string; + langs: array of string; + files: array of string; + pages: array of Integer; +begin + LangPath := path; + LangIndex:= -1; + LangSize := -1; + if FindFirst(LangPath+'*.ini', faAnyFile, searchRec) = 0 then + begin + repeat + inc(LangSize); + SetLength(flags, LangSize+1); + SetLength(abbrs, LangSize+1); + SetLength(langs, LangSize+1); + SetLength(files, LangSize+1); + SetLength(pages, LangSize+1); + + files[langSize] := CP1251ToUTF8(searchRec.Name); + LangFile := TIniFile.Create(LangPath + files[langSize]); + flags[langSize] := LangFile.ReadInteger('info', 'LangFlag', -1); + abbrs[langSize] := LangFile.ReadString( 'info', 'LangAbbr', ''); + langs[langSize] := LangFile.ReadString( 'info', 'Language', ''); + pages[langSize] := LangFile.ReadInteger('info', 'CodePage', 1250); + LangFile.Free; + LangFile:=nil; + + if ((flags[langSize] < 100) or (flags[langSize] > 107)) + then flags[langSize] := 99; + + if ((LowerCase(abbrs[langSize]) = 'rus') or (LowerCase(langs[langSize]) = 'русский')) + then form.cbLanguage.Items.Insert(0, files[langSize]) + else if ((LowerCase(abbrs[langSize]) = 'eng') or (LowerCase(langs[langSize]) = 'english')) + then if form.cbLanguage.Items.Count > 1 + then form.cbLanguage.Items.Insert(1, files[langSize]) + else form.cbLanguage.Items.Insert(0, files[langSize]) + else form.cbLanguage.Items.Add(files[langSize]); + + until FindNext(searchRec) <> 0; + end; + FindClose(searchRec); + + SetLength(LangFlags, LangSize+1); + SetLength(LangAbbrs, LangSize+1); + SetLength(Languages, LangSize+1); + SetLength(CodePages, LangSize+1); + SetLength(LangFiles, LangSize+1); + for nodeIndex := 0 to langSize do + for tempIndex := 0 to langSize do + if form.cbLanguage.Items[nodeIndex] = files[tempIndex] then + begin + LangFlags[nodeIndex] := flags[tempIndex]; + LangAbbrs[nodeIndex] := abbrs[tempIndex]; + Languages[nodeIndex] := langs[tempIndex]; + CodePages[nodeIndex] := pages[tempIndex]; + LangFiles[nodeIndex] := files[tempIndex]; + form.cbLanguage.Items[nodeIndex] := UpCase(LangAbbrs[nodeIndex]); + if Languages[nodeIndex] = lang then + begin + LangIndex := nodeIndex; + form.cbLanguage.ItemIndex := nodeIndex; + form.cbLanguageChange(nil); + end; + + end; + + if LangIndex < 0 then begin + LangIndex := 0; + form.cbLanguage.ItemIndex := 0; + form.cbLanguageChange(nil); + end; + SetLength(flags, 0); + SetLength(abbrs, 0); + SetLength(langs, 0); + SetLength(files, 0); + SetLength(pages, 0); +end; + +procedure LanguageSet(index: Integer); +begin + LangIndex := index; + if (LangFile <> nil) + then LangFile.Free; + LangFile := TIniFile.Create(LangPath + LangFiles[LangIndex]); +end; + +function LanguageGetName() : string; +begin + Result := Languages[LangIndex]; +end; + +function GetText(section : string; key: string) : string; +var text : string; +begin + text := LangFile.ReadString(section, key, ''); + if (text <> '') + then result := text + else result := Format('%%%%[%s]%s%%%%', [section, key]); +end; + +procedure ReloadLanguageTranslation(); +begin + //LangFile.Free; + //LanguageSet(LangIndex); +// LanguageTranslate(frmLogin); + LanguageTranslate(frmInitialize, dmNetwork, nil); + LanguageTranslate(frmMain); + LanguageTranslate(frmConfirmation); + LanguageTranslate(frmSelectionSettings); + LanguageTranslate(frmMoveSettings); + LanguageTranslate(frmElevateSettings); + LanguageTranslate(frmSurfElevateSettings); + LanguageTranslate(frmSurfStretchSettings); + LanguageTranslate(frmSurfSmoothSettings); + LanguageTranslate(frmDrawSettings); + LanguageTranslate(frmHueSettings); + LanguageTranslate(frmFillSettings); + LanguageTranslate(frmVirtualLayer); + LanguageTranslate(frmBoundaries); + LanguageTranslate(frmFilter); + LanguageTranslate(frmLightlevel); + LanguageTranslate(frmRadarMap); + LanguageTranslate(frmAccountControl); + LanguageTranslate(frmEditAccount); + LanguageTranslate(frmRegionControl); + LanguageTranslate(frmLargeScaleCommand); + LanguageTranslate(frmAbout); +end; + +// ----------------------------------------------------------------------------= + +procedure LanguageTranslate(form: TfrmLogin); +begin + form.gbConnection.Caption := GetText('Login', 'ConnectionSettings'); + form.lblHost.Caption := GetText('Login', 'Server'); + form.lblUsername.Caption := GetText('Login', 'Account'); + form.lblPassword.Caption := GetText('Login', 'Password'); + + form.gbData.Caption := GetText('Login', 'MulFiles'); + form.lblData.Caption := GetText('Login', 'MulFilesDesc'); + form.edData.DialogTitle := form.lblData.Caption; + + form.gbBaner.Caption := GetText('Login', 'Project'); + form.imgBaner.Hint := GetText('Login', 'WebSite'); + + form.btnOK.Caption := GetText('Login', 'Connect'); + form.btnCancel.Caption := GetText('Login', 'Exit'); + + form.gbProfiles.Caption := GetText('Login', 'Profile'); + form.btnSaveProfile.Hint := GetText('Login', 'SaveProfile'); + form.btnDefaultOptions.Hint := GetText('Login', 'ClearProfile'); + form.btnDeleteProfile.Hint := GetText('Login', 'DeleteProfile'); + form.SaveProfileCaption := GetText('Login', 'SaveProfileCaption'); + form.SaveProfileDescription := GetText('Login', 'SaveProfileDescription'); +end; + +procedure LanguageTranslate(form: TfrmInitialize; unet: TdmNetwork; resm: TGameResourceManager); +begin + if form <> nil then begin + form.SplashConnection := GetText('Splash', 'Connection'); + form.SplashAuthorization := GetText('Splash', 'Authorization'); + form.SplashInicialization := GetText('Splash', 'Inicialization'); + form.SplashLoading := GetText('Splash', 'Loading'); + form.SplashUpdates := GetText('Splash', 'Updates'); + form.SplashSuspend := GetText('Splash', 'Suspend'); + form.SplashUpdatingMiniMap := GetText('Splash', 'UpdatingMiniMap'); + end; + if unet <> nil then begin + unet.ErrorCaption := GetText('Splash', 'ErrorCaption'); + unet.WrongServer := GetText('Splash', 'WrongServer'); + unet.WrongAccount := GetText('Splash', 'WrongAccount'); + unet.WrongPassword := GetText('Splash', 'WrongPassword'); + unet.NoAccess := GetText('Splash', 'NoAccess'); + unet.AlreadyLogined := GetText('Splash', 'AlreadyLogined'); + unet.TCPErrorCaption := GetText('Splash', 'TCPErrorCaption'); + unet.UnsuportedVersion := GetText('Splash', 'UnsuportedVersion'); + end; + if resm <> nil then begin + resm.lbDlgErrorFilePathCaption := GetText('Splash', 'DlgErrorFilePathCaption'); + resm.lbDlgErrorFilePathMsg := GetText('Splash', 'DlgErrorFilePathMsg'); + end; +end; + +procedure LanguageTranslate(form: TfrmMain); +var + index: Integer; + entry: TMenuItem; +begin + form.lbFormTitleProfile := GetText('Login', 'Account'); + form.lbFormTitleAccount := GetText('Login', 'Profile'); + + // ---------- + form.mnuCentrED.Caption := GetText('MainMenu', 'File'); + form.mnuCentrED.Hint := GetText('MainMenu', 'FileHint'); + form.mnuMakeScreenShot.Caption := GetText('MainMenu', 'FileScreenShoot'); + form.mnuMakeScreenShot.Hint := GetText('MainMenu', 'FileScreenShootHint'); + form.mnuReloadGroups.Caption := GetText('MainMenu', 'FileReloadGroups'); + form.mnuReloadGroups.Hint := GetText('MainMenu', 'FileReloadGroupsHint'); + form.mnuSetLanguage.Caption := GetText('MainMenu', 'FileSetLanguage'); + form.mnuSetLanguage.Hint := GetText('MainMenu', 'FileSetLanguageHint'); + + form.mnuSetLanguage.ImageIndex := LangFlags[LangIndex]; + form.mnuSetLanguage.Tag := PtrInt(LangIndex); + form.mnuSetLanguage.Clear; + for index:= 0 to length(Languages)-1 do begin + entry:= TMenuItem.Create(form); + entry.Caption := Languages[index]; + entry.ImageIndex := LangFlags[index]; + entry.Tag := PtrInt(index); + entry.OnClick := @form.mnuSetLanguageClick; + form.mnuSetLanguage.Add(entry); + end; + + form.mnuDisconnect.Caption := GetText('MainMenu', 'FileDisconnetct'); + form.mnuDisconnect.Hint := GetText('MainMenu', 'FileDisconnetctHint'); + form.mnuExit.Caption := GetText('MainMenu', 'FileExit'); + form.mnuExit.Hint := GetText('MainMenu', 'FileExitHint'); + + form.mnuAdministration.Caption := GetText('MainMenu', 'Admin'); + form.mnuAdministration.Hint := GetText('MainMenu', 'AdminHint'); + form.mnuFlush.Caption := GetText('MainMenu', 'AdminFlush'); + form.mnuFlush.Hint := GetText('MainMenu', 'AdminFlushHint'); + form.mnuShutdown.Caption := GetText('MainMenu', 'AdminShutDown'); + form.mnuShutdown.Hint := GetText('MainMenu', 'AdminShutDownHint'); + form.mnuAccountControl.Caption := GetText('MainMenu', 'AdminAccounts'); + form.mnuAccountControl.Hint := GetText('MainMenu', 'AdminAccountsHint'); + form.mnuRegionControl.Caption := GetText('MainMenu', 'AdminRegions'); + form.mnuRegionControl.Hint := GetText('MainMenu', 'AdminRegionsHint'); + form.mnuLargeScaleCommands.Caption := GetText('MainMenu', 'AdminCommands'); + form.mnuLargeScaleCommands.Hint := GetText('MainMenu', 'AdminCommandsHint'); + + form.mnuSettings.Caption := GetText('MainMenu', 'Settings'); + form.mnuSettings.Hint := GetText('MainMenu', 'SettingsHint'); + form.mnuWindowedMode.Caption := GetText('MainMenu', 'SettingsWindowed'); + form.mnuWindowedMode.Hint := GetText('MainMenu', 'SettingsWindowedHint'); + + form.mnuTileList.Caption := GetText('MainMenu', 'SettingsMainTileList'); + form.mnuTileList.Hint := GetText('MainMenu', 'SettingsMainTileListHint'); + form.mnuTileListTable.Caption := GetText('MainMenu', 'SettingsTileListTable'); + form.mnuTileListTable.Hint := GetText('MainMenu', 'SettingsTileListTableHint'); + form.mnuTileListSmall.Caption := GetText('MainMenu', 'SettingsTileListSmall'); + form.mnuTileListSmall.Hint := GetText('MainMenu', 'SettingsTileListSmallHint'); + form.mnuTileListMidle.Caption := GetText('MainMenu', 'SettingsTileListMidle'); + form.mnuTileListMidle.Hint := GetText('MainMenu', 'SettingsTileListMidleHint'); + form.mnuTileListLarge.Caption := GetText('MainMenu', 'SettingsTileListLarge'); + form.mnuTileListLarge.Hint := GetText('MainMenu', 'SettingsTileListLargeHint'); + form.mnuTileListStretch.Caption := GetText('MainMenu', 'SettingsTileListStretch'); + form.mnuTileListStretch.Hint := GetText('MainMenu', 'SettingsTileListStretchHint'); + form.mnuTileListClip.Caption := GetText('MainMenu', 'SettingsTileListClip'); + form.mnuTileListClip.Hint := GetText('MainMenu', 'SettingsTileListClipHint'); + form.mnuTileListCentre.Caption := GetText('MainMenu', 'SettingsTileListCentre'); + form.mnuTileListCentre.Hint := GetText('MainMenu', 'SettingsTileListCentreHint'); + form.mnuTileListDrawInfo.Caption := GetText('MainMenu', 'SettingsTileListDrawInfo'); + form.mnuTileListDrawInfo.Hint := GetText('MainMenu', 'SettingsTileListDrawInfoHint'); + + form.mnuMiscTileList.Caption := GetText('MainMenu', 'SettingsMiscTileList'); + form.mnuMiscTileList.Hint := GetText('MainMenu', 'SettingsMiscTileListHint'); + form.mnuMiscTileListTable.Caption := GetText('MainMenu', 'SettingsTileListTable'); + form.mnuMiscTileListTable.Hint := GetText('MainMenu', 'SettingsTileListTableHint'); + form.mnuMiscTileListSmall.Caption := GetText('MainMenu', 'SettingsTileListSmall'); + form.mnuMiscTileListSmall.Hint := GetText('MainMenu', 'SettingsTileListSmallHint'); + form.mnuMiscTileListMidle.Caption := GetText('MainMenu', 'SettingsTileListMidle'); + form.mnuMiscTileListMidle.Hint := GetText('MainMenu', 'SettingsTileListMidleHint'); + form.mnuMiscTileListLarge.Caption := GetText('MainMenu', 'SettingsTileListLarge'); + form.mnuMiscTileListLarge.Hint := GetText('MainMenu', 'SettingsTileListLargeHint'); + form.mnuMiscTileListStretch.Caption:= GetText('MainMenu', 'SettingsTileListStretch'); + form.mnuMiscTileListStretch.Hint := GetText('MainMenu', 'SettingsTileListStretchHint'); + form.mnuMiscTileListClip.Caption := GetText('MainMenu', 'SettingsTileListClip'); + form.mnuMiscTileListClip.Hint := GetText('MainMenu', 'SettingsTileListClipHint'); + form.mnuMiscTileListCentre.Caption := GetText('MainMenu', 'SettingsTileListCentre'); + form.mnuMiscTileListCentre.Hint := GetText('MainMenu', 'SettingsTileListCentreHint'); + form.mnuMiscTileListDrawInfo.Caption:=GetText('MainMenu', 'SettingsTileListDrawInfo'); + form.mnuMiscTileListDrawInfo.Hint := GetText('MainMenu', 'SettingsTileListDrawInfoHint'); + + form.mnuAutoHideGroupList.Caption := GetText('MainMenu', 'SettingsHideGroups'); + form.mnuAutoHideGroupList.Hint := GetText('MainMenu', 'SettingsHideGroupsHint'); + form.mnuAutoHideRandomList.Caption := GetText('MainMenu', 'SettingsHideRandom'); + form.mnuAutoHideRandomList.Hint := GetText('MainMenu', 'SettingsHideRandomHint'); + form.mnuAutoShowFilterWindow.Caption:=GetText('MainMenu', 'SettingsAutoShowFilter'); + form.mnuAutoShowFilterWindow.Hint := GetText('MainMenu', 'SettingsAutoShowFilterHint'); + form.mnuShowAnimations.Caption := GetText('MainMenu', 'SettingsPlayAnimation'); + form.mnuShowAnimations.Hint := GetText('MainMenu', 'SettingsPlayAnimationHint'); + form.mnuSecurityQuestion.Caption := GetText('MainMenu', 'SettingsQuestion'); + form.mnuSecurityQuestion.Hint := GetText('MainMenu', 'SettingsQuestionHint'); + form.mnuWhiteBackground.Caption := GetText('MainMenu', 'SettingsWhiteBack'); + form.mnuWhiteBackground.Hint := GetText('MainMenu', 'SettingsWhiteBackHint'); + + form.mnuHelp.Caption := GetText('MainMenu', 'Help'); + form.mnuHelp.Hint := GetText('MainMenu', 'HelpHint'); + + form.mnuDocs.Caption := GetText('MainMenu', 'HelpDocs'); + form.mnuDocs.Hint := GetText('MainMenu', 'HelpDocsHint'); + form.mnuSupport.Caption := GetText('MainMenu', 'HelpSupport'); + form.mnuSupport.Hint := GetText('MainMenu', 'HelpSupportHint'); + form.mnuEngCom.Caption := GetText('MainMenu', 'HelpSupportEng'); + form.mnuEngCom.Hint := GetText('MainMenu', 'HelpSupportEngHint'); + form.mnuEng2Com.Caption := GetText('MainMenu', 'HelpSupportEng2'); + form.mnuEng2Com.Hint := GetText('MainMenu', 'HelpSupportEng2Hint'); + form.mnuRusCom.Caption := GetText('MainMenu', 'HelpSupportRus'); + form.mnuRusCom.Hint := GetText('MainMenu', 'HelpSupportRusHint'); + + form.mnuAbout.Caption := GetText('MainMenu', 'HelpAbout'); + form.mnuAbout.Hint := GetText('MainMenu', 'HelpAboutHint'); + + // ---------- + form.lbFormTitleAccount := GetText('MainForm', 'FormTitleAccount'); + form.lbFormTitleProfile := GetText('MainForm', 'FormTitleProfile'); + form.lblChatHeaderCaption.Caption := GetText('MainForm', 'BottomChatHeader'); + form.lblTileInfoWLabel.Caption := GetText('MainForm', 'BottomCursorWidth'); + form.lblTileInfoHLabel.Caption := GetText('MainForm', 'BottomCursorHeight'); + form.lbBottomCursorVLayer1 := GetText('MainForm', 'BottomCursorVLayer1'); + form.lbBottomCursorVLayer2 := GetText('MainForm', 'BottomCursorVLayer2'); + form.lbBottomCursorItemId := GetText('MainForm', 'BottomCursorItemId'); + form.lbBottomCursorLandId := GetText('MainForm', 'BottomCursorLandId'); + form.lbBottomCursorPosX := GetText('MainForm', 'BottomCursorPosX'); + form.lbBottomCursorPosY := GetText('MainForm', 'BottomCursorPosY'); + form.lbBottomCursorPosZ := GetText('MainForm', 'BottomCursorPosZ'); + form.lbBottomCursorItemHue := GetText('MainForm', 'BottomCursorItemHue'); + form.vstChat.Header.Columns[0].Text:= GetText('MainForm', 'BottomChatTime'); + form.vstChat.Header.Columns[1].Text:= GetText('MainForm', 'BottomChatSender'); + form.vstChat.Header.Columns[2].Text:= GetText('MainForm', 'BottomChatMessage'); + + form.mnuGrabTileID.Caption := GetText('MainForm', 'GrabTileId'); + form.mnuGrabTileID.Hint := GetText('MainForm', 'GrabTileIdHint'); + form.mnuGrabHue.Caption := GetText('MainForm', 'GrabTileHue'); + form.mnuGrabHue.Hint := GetText('MainForm', 'GrabTileHueHint'); + form.mnuGrabFilterTileID.Caption := GetText('MainForm', 'GrabTileAddIdToFilter'); + form.mnuGrabFilterTileID.Hint := GetText('MainForm', 'GrabTileAddIdToFilterHint'); + form.mnuGrabFilterHue.Caption := GetText('MainForm', 'GrabTileAddHueToFilter'); + form.mnuGrabFilterHue.Hint := GetText('MainForm', 'GrabTileAddHueToFilterHint'); + form.mnuGrabVirtualLayerZ.Caption := GetText('MainForm', 'GrabTileSetVLayer'); + form.mnuGrabVirtualLayerZ.Hint := GetText('MainForm', 'GrabTileSetVLayerHint'); + form.mnuGrabBoundaries.Caption := GetText('MainForm', 'GrabBoundaries'); + form.mnuGrabBoundaries.Hint := GetText('MainForm', 'GrabBoundariesHint'); + form.mnuGrabBoundMinZ.Caption := GetText('MainForm', 'GrabBoundMinZ'); + form.mnuGrabBoundMinZ.Hint := GetText('MainForm', 'GrabBoundMinZHint'); + form.mnuGrabBoundMaxZ.Caption := GetText('MainForm', 'GrabBoundMaxZ'); + form.mnuGrabBoundMaxZ.Hint := GetText('MainForm', 'GrabBoundMaxZHint'); + form.mnuGrabBoundMinX.Caption := GetText('MainForm', 'GrabBoundMinX'); + form.mnuGrabBoundMinX.Hint := GetText('MainForm', 'GrabBoundMinXHint'); + form.mnuGrabBoundMaxX.Caption := GetText('MainForm', 'GrabBoundMaxX'); + form.mnuGrabBoundMaxX.Hint := GetText('MainForm', 'GrabBoundMaxXHint'); + form.mnuGrabBoundMinY.Caption := GetText('MainForm', 'GrabBoundMinY'); + form.mnuGrabBoundMinY.Hint := GetText('MainForm', 'GrabBoundMinYHint'); + form.mnuGrabBoundMaxY.Caption := GetText('MainForm', 'GrabBoundMaxY'); + form.mnuGrabBoundMaxY.Hint := GetText('MainForm', 'GrabBoundMaxYHint'); + + form.mnuSelect.Caption := GetText('MainForm', 'ToolsSelect'); + form.mnuSelect.Hint := GetText('MainForm', 'ToolsSelectHint'); + form.mnuSelection.Caption := GetText('MainForm', 'ToolsSelection'); + form.mnuSelection.Hint := GetText('MainForm', 'ToolsSelectionHint'); + form.mnuMove.Caption := GetText('MainForm', 'ToolsMove'); + form.mnuMove.Hint := GetText('MainForm', 'ToolsMoveHint'); + form.mnuElevate.Caption := GetText('MainForm', 'ToolsElevate'); + form.mnuElevate.Hint := GetText('MainForm', 'ToolsElevateHint'); + form.mnuSurfElevate.Caption := GetText('MainForm', 'ToolsSurfElevate'); + form.mnuSurfElevate.Hint := GetText('MainForm', 'ToolsSurfElevateHint'); + form.mnuSurfStretch.Caption := GetText('MainForm', 'ToolsSurfStretch'); + form.mnuSurfStretch.Hint := GetText('MainForm', 'ToolsSurfStretchHint'); + form.mnuSurfSmooth.Caption := GetText('MainForm', 'ToolsSurfSmooth'); + form.mnuSurfSmooth.Hint := GetText('MainForm', 'ToolsSurfSmoothHint'); + form.mnuDraw.Caption := GetText('MainForm', 'ToolsDraw'); + form.mnuDraw.Hint := GetText('MainForm', 'ToolsDrawHint'); + form.mnuSetHue.Caption := GetText('MainForm', 'ToolsSetHue'); + form.mnuSetHue.Hint := GetText('MainForm', 'ToolsSetHueHint'); + form.mnuFill.Caption := GetText('MainForm', 'ToolsFill'); + form.mnuFill.Hint := GetText('MainForm', 'ToolsSetFill'); + form.mnuDelete.Caption := GetText('MainForm', 'ToolsDelete'); + form.mnuDelete.Hint := GetText('MainForm', 'ToolsDeleteHint'); + form.mnuVirtualLayer.Caption := GetText('MainForm', 'ToolsVLayer'); + form.mnuVirtualLayer.Hint := GetText('MainForm', 'ToolsVLayerHint'); + form.mnuBoundaries.Caption := GetText('MainForm', 'ToolsBoundaries'); + form.mnuBoundaries.Hint := GetText('MainForm', 'ToolsBoundariesHint'); + + + form.lbDlgWindowedModeSwitchCaption:= GetText('MainForm', 'DlgWindowedModeSwitchCaption'); + form.lbDlgWindowedModeSwitch := GetText('MainForm', 'DlgWindowedModeSwitch'); + form.lbScreenShotMsg := GetText('MainForm', 'ScreenShotMsg'); + form.lbUserLoginedMsg := GetText('MainForm', 'UserLoginedMsg'); + form.lbUserLogoutedMsg := GetText('MainForm', 'UserLogoutedMsg'); + form.lbDlgGetDcErrCaption := GetText('MainForm', 'DlgGetDcErrCaption'); + form.lbDlgGetDcErr := GetText('MainForm', 'DlgGetDcErr'); + form.lbDlgFreeDcErrCaption := GetText('MainForm', 'DlgFreeDcErrCaption'); + form.lbDlgFreeDcErr := GetText('MainForm', 'DlgFreeDcErr'); + form.lbDlgCnangedAccessCaption := GetText('MainForm', 'DlgCnangedAccessCaption'); + form.lbDlgCnangedAccess := GetText('MainForm', 'DlgCnangedAccess'); + form.lbDlgBlockedAccessCaption := GetText('MainForm', 'DlgBlockedAccessCaption'); + form.lbDlgBlockedAccess := GetText('MainForm', 'DlgBlockedAccess'); + + // ---------- + form.tbDisconnect.Hint := GetText('ToolBar', 'DisconnectHint'); + form.tbSelect.Hint := GetText('ToolBar', 'SelectHint'); + form.tbSelection.Hint := GetText('ToolBar', 'SelectionHint'); + form.tbMoveTile.Hint := GetText('ToolBar', 'MoveTileHint'); + form.tbElevateTile.Hint := GetText('ToolBar', 'ElevateTileHint'); + form.tbSurfElevate.Hint := GetText('ToolBar', 'SurfElevateHint'); + form.tbSurfStretch.Hint := GetText('ToolBar', 'SurfStretchHint'); + form.tbSurfSmooth.Hint := GetText('ToolBar', 'SurfSmoothHint'); + form.tbDrawTile.Hint := GetText('ToolBar', 'DrawTileHint'); + form.tbSetHue.Hint := GetText('ToolBar', 'SetHueHint'); + form.tbFill.Hint := GetText('ToolBar', 'FillHint'); + form.tbDeleteTile.Hint := GetText('ToolBar', 'DeleteTileHint'); + form.tbUndo.Hint := GetText('ToolBar', 'UndoHint') + ' (0).'; + form.lbToolbarUndo := GetText('ToolBar', 'UndoHint'); + form.tbRedo.Hint := GetText('ToolBar', 'RedoHint') + ' (0).'; + // form.lbToolbarRedo -- ???????? + form.tbVirtualLayer.Hint := GetText('ToolBar', 'VirtualLayerHint'); + form.tbBoundaries.Hint := GetText('ToolBar', 'BoundariesHint'); + form.tbFilter.Hint := GetText('ToolBar', 'FilterHint'); + form.tbTerrain.Hint := GetText('ToolBar', 'TerrainHint'); + form.tbStatics.Hint := GetText('ToolBar', 'StaticsHint'); + form.tbNoDraw.Hint := GetText('ToolBar', 'NoDrawHint'); + form.tbWalkable.Hint := GetText('ToolBar', 'WalkableHint'); + form.tbFlat.Hint := GetText('ToolBar', 'FlatHint'); + form.tbLightlevel.Hint := GetText('ToolBar', 'LightlevelHint');; + form.tbZoom.Hint := GetText('ToolBar', 'ZoomHint'); + form.tbRadarMap.Hint := GetText('ToolBar', 'RadarMapHint'); + + form.mnuShowGrid.Caption := GetText('ToolBar', 'ShowGrid'); + form.mnuShowGrid.Hint := GetText('ToolBar', 'ShowGridHint'); + form.mnuShowBlocks.Caption := GetText('ToolBar', 'ShowBlocks'); + form.mnuShowBlocks.Hint := GetText('ToolBar', 'ShowBlocksHint'); + + form.mnuShowWalls.Caption := GetText('ToolBar', 'ShowWalls'); + form.mnuShowWalls.Hint := GetText('ToolBar', 'ShowWallsHint'); + form.mnuShowBridges.Caption := GetText('ToolBar', 'ShowBridges'); + form.mnuShowBridges.Hint := GetText('ToolBar', 'ShowBridgesHint'); + form.mnuShowSurfaces.Caption := GetText('ToolBar', 'ShowSurfaces'); + form.mnuShowSurfaces.Hint := GetText('ToolBar', 'ShowSurfacesHint'); + form.mnuShowRoofs.Caption := GetText('ToolBar', 'ShowRoofs'); + form.mnuShowRoofs.Hint := GetText('ToolBar', 'ShowRoofsHint'); + form.mnuShowFoliage.Caption := GetText('ToolBar', 'ShowFoliage'); + form.mnuShowFoliage.Hint := GetText('ToolBar', 'ShowFoliageHint'); + form.mnuShowWater.Caption := GetText('ToolBar', 'ShowWater'); + form.mnuShowWater.Hint := GetText('ToolBar', 'ShowWaterHint'); + + form.mnuShowNoDrawTiles.Caption := GetText('ToolBar', 'ShowNoDrawTiles'); + form.mnuShowNoDrawTiles.Hint := GetText('ToolBar', 'ShowNoDrawTilesHint'); + form.mnuShowLightSource.Caption := GetText('ToolBar', 'ShowLightSource'); + form.mnuShowLightSource.Hint := GetText('ToolBar', 'ShowLightSourceHint'); + + form.mnuFlatShowHeight.Caption := GetText('ToolBar', 'FlatShowHeight'); + form.mnuFlatShowHeight.Hint := GetText('ToolBar', 'FlatShowHeightHint'); + + form.mnuZoom025.Caption := GetText('ToolBar', 'Zoom025'); + form.mnuZoom025.Hint := GetText('ToolBar', 'Zoom025Hint'); + form.mnuZoom033.Caption := GetText('ToolBar', 'Zoom033'); + form.mnuZoom033.Hint := GetText('ToolBar', 'Zoom033Hint'); + form.mnuZoom050.Caption := GetText('ToolBar', 'Zoom050'); + form.mnuZoom050.Hint := GetText('ToolBar', 'Zoom050Hint'); + form.mnuZoom075.Caption := GetText('ToolBar', 'Zoom075'); + form.mnuZoom075.Hint := GetText('ToolBar', 'Zoom075Hint'); + form.mnuZoom100.Caption := GetText('ToolBar', 'Zoom100'); + form.mnuZoom100.Hint := GetText('ToolBar', 'Zoom100Hint'); + form.mnuZoom150.Caption := GetText('ToolBar', 'Zoom150'); + form.mnuZoom150.Hint := GetText('ToolBar', 'Zoom150Hint'); + form.mnuZoom200.Caption := GetText('ToolBar', 'Zoom200'); + form.mnuZoom200.Hint := GetText('ToolBar', 'Zoom200Hint'); + form.mnuZoom300.Caption := GetText('ToolBar', 'Zoom300'); + form.mnuZoom300.Hint := GetText('ToolBar', 'Zoom300Hint'); + form.mnuZoom400.Caption := GetText('ToolBar', 'Zoom400'); + form.mnuZoom400.Hint := GetText('ToolBar', 'Zoom400Hint'); + + // ---------- + form.tsTiles.Caption := GetText('TabTiles', 'TabPage'); + + form.cbTerrain.Caption := GetText('TabTiles', 'Lands'); + form.cbTerrain.Hint := GetText('TabTiles', 'LandsHint'); + form.cbStatics.Caption := GetText('TabTiles', 'Items'); + form.cbStatics.Hint := GetText('TabTiles', 'ItemsHint'); + form.lblFilter.Caption := GetText('TabTiles', 'edFilterLabel'); + form.edFilter.Hint := GetText('TabTiles', 'edFilterHint'); + + form.vdtTiles.Header.Columns[0].Text := GetText('TabTiles', 'TilesId'); + form.vdtTiles.Header.Columns[1].Text := GetText('TabTiles', 'TilesImage'); + form.vdtTiles.Header.Columns[2].Text := GetText('TabTiles', 'TilesName'); + + form.mnuAddToRandom.Caption := GetText('TabTiles', 'TilesAddToRandom'); + form.mnuAddToRandom.Hint := GetText('TabTiles', 'TilesAddToRandomHint'); + + form.gbRandom.Caption := GetText('TabTiles', 'RandomBlock'); + form.vdtRandom.Header.Columns[0].Text := GetText('TabTiles', 'RandomId'); + form.vdtRandom.Header.Columns[1].Text := GetText('TabTiles', 'RandomImage'); + form.vdtRandom.Header.Columns[2].Text := GetText('TabTiles', 'RandomName'); + form.btnClearRandom.Hint := GetText('TabTiles', 'RandomClearHint'); + form.btnDeleteRandom.Hint := GetText('TabTiles', 'RandomRemoveHint'); + form.btnAddRandom.Hint := GetText('TabTiles', 'RandomAddHint'); + form.btnRandomPresetSave.Hint := GetText('TabTiles', 'RandomSaveHint'); + form.btnRandomPresetDelete.Hint := GetText('TabTiles', 'RandomDeleteHint'); + + form.lbDlgSaveRandPrsCaption := GetText('TabTiles', 'DlgSaveRandPrsCaption'); + form.lbDlgSaveRandPrs := GetText('TabTiles', 'DlgSaveRandPrs'); + form.lbDlgSearchIdErrCaption := GetText('TabTiles', 'DlgSearchIdErrCaption'); + form.lbDlgSearchIdErr := GetText('TabTiles', 'DlgSearchIdErr'); + form.lbDlgNotFoundErrCaption := GetText('TabTiles', 'DlgNotFoundErrCaption'); + form.lbDlgNotFoundErr := GetText('TabTiles', 'DlgNotFoundErr'); + + // ---------- + form.tsObjects.Caption := GetText('TabObjects', 'TabPage'); + + // ---------- + form.tsNavigation.Caption := GetText('TabNavigation', 'TabPage'); + + form.vstClients.Header.Columns[1].Text := GetText('TabNavigation', 'ClientsAccounts'); + form.vstClients.Header.Columns[2].Text := GetText('TabNavigation', 'ClientsUptime'); + + form.mnuGoToClient.Caption := GetText('TabNavigation', 'ClientsGoTo'); + form.mnuGoToClient.Hint := GetText('TabNavigation', 'ClientsGoToHint'); + + form.vstLocations.Header.Columns[0].Text := GetText('TabNavigation', 'LocationsPosition'); + form.vstLocations.Header.Columns[1].Text := GetText('TabNavigation', 'LocationsName'); + form.btnClearLocations.Hint := GetText('TabNavigation', 'LocationsClearHint'); + form.btnDeleteLocation.Hint := GetText('TabNavigation', 'LocationsRemoveHint'); + form.btnAddLocation.Hint := GetText('TabNavigation', 'LocationsAddHint'); + + form.gbGoTo.Caption := GetText('TabNavigation', 'GoToBlock'); + form.lblX.Caption := GetText('TabNavigation', 'GoToPosX'); + form.lblY.Caption := GetText('TabNavigation', 'GoToPosY'); + form.btnGoTo.Caption := GetText('TabNavigation', 'GoToButton'); + form.btnGoTo.Hint := GetText('TabNavigation', 'GoToButtonHint'); + + form.lbDlgDelConfCaption := GetText('TabNavigation', 'DlgDelConfCaption'); + form.lbDlgDelConf := GetText('TabNavigation', 'DlgDelConf'); + form.lbDlgNewQuerryCaption := GetText('TabNavigation', 'DlgNewQuerryCaption'); + form.lbDlgNewQuerry := GetText('TabNavigation', 'DlgNewQuerry'); +end; + +procedure LanguageTranslate(form: TfrmConfirmation); +begin + form.Caption := GetText('ConfForm', 'FormTitle'); + form.btnYes.Caption := GetText('ConfForm', 'Yes'); + form.btnNo.Caption := GetText('ConfForm', 'No'); +end; + +procedure LanguageTranslate(form: TfrmSelectionSettings); +begin + form.Caption := GetText('SelnForm', 'FormTitle'); + // TODO +end; + +procedure LanguageTranslate(form: TfrmMoveSettings); +begin + form.Caption := GetText('MoveForm', 'FormTitle'); + form.seOffset.Hint := GetText('MoveForm', 'OffsetHint'); + form.cbAsk.Caption := GetText('MoveForm', 'Ask'); + form.cbAsk.Hint := GetText('MoveForm', 'AskHint'); + form.btnCancel.Caption := GetText('MoveForm', 'Cancel'); + form.gbMovment.Caption := GetText('MoveForm', 'Movment'); + form.cbLand.Caption := GetText('MoveForm', 'Land'); + form.cbLand.Hint := GetText('MoveForm', 'LandHint'); + form.cbItem.Caption := GetText('MoveForm', 'Item'); + form.cbItem.Hint := GetText('MoveForm', 'ItemHint'); +end; + +procedure LanguageTranslate(form: TfrmElevateSettings); +begin + form.Caption := GetText('ElevForm', 'FormTitle'); + form.rbRaise.Caption := GetText('ElevForm', 'Raise'); + form.rbRaise.Hint := GetText('ElevForm', 'RaiseHint'); + form.rbLower.Caption := GetText('ElevForm', 'Lower'); + form.rbLower.Hint := GetText('ElevForm', 'LowerHint'); + form.rbSet.Caption := GetText('ElevForm', 'Set'); + form.rbSet.Hint := GetText('ElevForm', 'SetHint'); + form.cbRandomHeight.Caption := GetText('ElevForm', 'AddRandom'); + form.cbRandomHeight.Hint := GetText('ElevForm', 'AddRandomHint'); +end; + +procedure LanguageTranslate(form: TfrmSurfElevateSettings); +begin + form.Caption := GetText('SElvForm', 'FormTitle'); + // TODO +end; + +procedure LanguageTranslate(form: TfrmSurfStretchSettings); +begin + form.Caption := GetText('SStrForm', 'FormTitle'); + // TODO +end; + +procedure LanguageTranslate(form: TfrmSurfSmoothSettings); +begin + form.Caption := GetText('SSmtForm', 'FormTitle'); + // TODO +end; + +procedure LanguageTranslate(form: TfrmDrawSettings); +begin + form.Caption := GetText('DrawForm', 'FormTitle'); + form.rbTileList.Caption := GetText('DrawForm', 'UseTiles'); + form.rbTileList.Hint := GetText('DrawForm', 'UseTilesHint'); + form.rbRandom.Caption := GetText('DrawForm', 'UseRandom'); + form.rbRandom.Hint := GetText('DrawForm', 'UseRandomHint'); + form.cbProbability.Caption := GetText('DrawForm', 'Probability'); + form.cbProbability.Hint := GetText('DrawForm', 'ProbabilityHint'); + form.cbUseFreeTilesOnly.Caption := GetText('DrawForm', 'FreeTiles'); + form.cbUseFreeTilesOnly.Hint := GetText('DrawForm', 'FreeTilesHint'); + form.cbUseSurfaceAltitude.Caption := GetText('DrawForm', 'SurfaceAlt'); + form.cbUseSurfaceAltitude.Hint := GetText('DrawForm', 'SurfaceAltHint'); + form.cbForceAltitude.Caption := GetText('DrawForm', 'ForceAlt'); + form.cbForceAltitude.Hint := GetText('DrawForm', 'ForceAltHint'); + form.cbRandomHeight.Caption := GetText('DrawForm', 'AddRandomAlt'); + form.cbRandomHeight.Hint := GetText('DrawForm', 'AddRandomAltHint'); + form.gbHue.Caption := GetText('DrawForm', 'ItemColor'); +end; + +procedure LanguageTranslate(form: TfrmHueSettings); +begin + form.Caption := GetText('HuesForm', 'FormTitle'); + form.cbRandom.Caption := GetText('HuesForm', 'Random'); + form.cbRandom.Hint := GetText('HuesForm', 'RandomHint'); + form.lblHue.Caption := GetText('HuesForm', 'Color'); + form.gbPreview.Caption := GetText('HuesForm', 'PreviewBlock'); + form.ShowAll.Caption := GetText('HuesForm', 'ShowAll'); + form.ShowAll.Hint := GetText('HuesForm', 'ShowAllHint'); + form.lblTileId.Caption := GetText('HuesForm', 'Tile'); + form.gbLastUsed.Caption := GetText('HuesForm', 'LastUsedBlock'); + form.gbRandom.Caption := GetText('HuesForm', 'RandomBlock'); + form.btnAddRandom.Hint := GetText('HuesForm', 'AddPresetHint'); + form.btnDeleteRandom.Hint := GetText('HuesForm', 'RemovePresetHint'); + form.btnClearRandom.Hint := GetText('HuesForm', 'ClearPresetHint'); + form.btnRandomPresetSave.Hint := GetText('HuesForm', 'SavePresetHint'); + form.btnRandomPresetDelete.Hint := GetText('HuesForm', 'DeletePresetHint'); + + form.lbDlgBadColrCaption := GetText('HuesForm', 'DlgBadColrCaption'); + form.lbDlgBadColr := GetText('HuesForm', 'DlgBadColr'); + form.lbDlgBadTileCaption := GetText('HuesForm', 'DlgBadTileCaption'); + form.lbDlgBadTile := GetText('HuesForm', 'DlgBadTile'); + form.lbDlgSavePrsCaption := GetText('HuesForm', 'DlgSavePrsCaption'); + form.lbDlgSavePrs := GetText('HuesForm', 'DlgSavePrs'); + form.lbNoHuesName := GetText('HuesForm', 'NoHuesName'); +end; + +procedure LanguageTranslate(form: TfrmFillSettings); +begin + form.Caption := GetText('FillForm', 'FormTitle'); + form.lblFillType.Caption := GetText('FillForm', 'FillType'); + form.cbFillReview.Caption := GetText('FillForm', 'FillReview'); + form.cbFillConfirm.Caption := GetText('FillForm', 'FillConfirm'); + form.gbHue.Caption := GetText('FillForm', 'ItemColor'); + // TODO +end; + +procedure LanguageTranslate(form: TfrmVirtualLayer); +begin + form.Caption := GetText('VLayForm', 'FormTitle'); + form.cbShowLayer.Caption := GetText('VLayForm', 'ShowLayer'); + form.cbShowLayer.Hint := GetText('VLayForm', 'ShowLayerHint'); + form.cbShowBlocks.Caption := GetText('VLayForm', 'ShowBlocks'); + form.cbShowBlocks.Hint := GetText('VLayForm', 'ShowBlocksHint'); +end; + +procedure LanguageTranslate(form: TfrmBoundaries); +begin + form.Caption := GetText('BounForm', 'FormTitle'); + form.GroupBox1.Caption := GetText('BounForm', 'AltBlock');; + form.lblMinZ.Caption := GetText('BounForm', 'MinAlt'); + form.lblMinZ.Hint := GetText('BounForm', 'MinAltHint'); + form.lblMaxZ.Caption := GetText('BounForm', 'MaxAlt'); + form.lblMaxZ.Hint := GetText('BounForm', 'MaxAltHint'); + form.GroupBox2.Caption := GetText('BounForm', 'XYBlock'); + form.lblAxeX.Caption := GetText('BounForm', 'AxeXName'); + form.seMinX.Hint := GetText('BounForm', 'MinXHint'); + form.seMaxX.Hint := GetText('BounForm', 'MaxXHint'); + form.sbClearXbnd.Hint := GetText('BounForm', 'XClearHint'); + form.lblAxeY.Caption := GetText('BounForm', 'AxeYName'); + form.seMinY.Hint := GetText('BounForm', 'MinYHint'); + form.seMaxY.Hint := GetText('BounForm', 'MaxYHint'); + form.sbClearYbnd.Hint := GetText('BounForm', 'YClearHint'); +end; + +procedure LanguageTranslate(form: TfrmFilter); +begin + form.Caption := GetText('FiltForm', 'FormTitle'); + form.rgFilterType.Caption := GetText('FiltForm', 'FilterBlock'); + form.rgFilterType.Items[0] := GetText('FiltForm', 'FilterType1'); + form.rgFilterType.Items[1] := GetText('FiltForm', 'FilterType2'); + form.GroupBox1.Caption := GetText('FiltForm', 'TileBlock'); + form.cbTileFilter.Caption := GetText('FiltForm', 'TileUse'); + form.cbTileFilter.Hint := GetText('FiltForm', 'TileUseHint'); + form.Label1.Caption := GetText('FiltForm', 'TileHelp'); + form.vdtFilter.Header.Columns[0].Text := GetText('FiltForm', 'TileId'); + form.vdtFilter.Header.Columns[1].Text := GetText('FiltForm', 'TileImage'); + form.vdtFilter.Header.Columns[2].Text := GetText('FiltForm', 'TileName'); + form.btnDelete.Hint := GetText('FiltForm', 'TileRemoveHint'); + form.btnClear.Hint := GetText('FiltForm', 'TileClearHint'); + form.GroupBox2.Caption := GetText('FiltForm', 'ColorBlock'); + form.cbHueFilter.Caption := GetText('FiltForm', 'ColorUse'); + form.cbHueFilter.Hint := GetText('FiltForm', 'ColorUseHint'); + form.vdtHues.Header.Columns[1].Text := GetText('FiltForm', 'ColorHue'); + form.vdtHues.Header.Columns[2].Text := GetText('FiltForm', 'ColorName'); + + form.mnuCheckHues.Caption := GetText('FiltForm', 'ColorCheck'); + form.mnuCheckHues.Hint := GetText('FiltForm', 'ColorCheckHint'); + form.mnuUncheckHues.Caption := GetText('FiltForm', 'ColorUncheck'); + form.mnuUncheckHues.Hint := GetText('FiltForm', 'ColorUncheckHint'); +end; + +procedure LanguageTranslate(form: TfrmLightlevel); +begin + form.Caption := GetText('LighForm', 'FormTitle'); +end; + +procedure LanguageTranslate(form: TfrmRadarMap); +begin + form.Caption := GetText('RMapForm', 'FormTitle'); + form.cbStayOnTop.Caption := GetText('RMapForm', 'StayOnTop'); + form.cbStayOnTop.Hint := GetText('RMapForm', 'StayOnTopHint'); +end; + +procedure LanguageTranslate(form: TfrmAccountControl); +begin + form.Caption := GetText('MAccForm', 'FormTitle'); + form.tbRefresh.Hint := GetText('MAccForm', 'RefreshHint'); + form.tbAddUser.Hint := GetText('MAccForm', 'AddUserHint'); + form.tbEditUser.Hint := GetText('MAccForm', 'EditUserHint'); + form.tbDeleteUser.Hint := GetText('MAccForm', 'DeleteUserHint'); + form.vstAccounts.Header.Columns[1].Text := GetText('MAccForm', 'UserName'); + form.vstAccounts.Header.Columns[2].Text := GetText('MAccForm', 'Access'); + form.vstAccounts.Header.Columns[3].Text := GetText('MAccForm', 'Regions'); + + form.lbDlgDelConfCaption := GetText('MAccForm', 'DlgDelConfCaption'); + form.lbDlgDelConf := GetText('MAccForm', 'DlgDelConf'); + form.lbDlgAddNotiCaption := GetText('MAccForm', 'DlgAddNotiCaption'); + form.lbDlgAddNoti := GetText('MAccForm', 'DlgAddNoti'); + form.lbDlgModNotiCaption := GetText('MAccForm', 'DlgModNotiCaption'); + form.lbDlgModNoti := GetText('MAccForm', 'DlgModNoti'); + form.lbDlgInvlErrCaption := GetText('MAccForm', 'DlgInvlErrCaption'); + form.lbDlgInvlErr := GetText('MAccForm', 'DlgInvlErr'); + form.lbDlgDelNotiCaption := GetText('MAccForm', 'DlgDelNotiCaption'); + form.lbDlgDelNoti := GetText('MAccForm', 'DlgDelNoti'); + form.lbDlgDelfErrCaption := GetText('MAccForm', 'DlgDelfErrCaption'); + form.lbDlgDelfErr := GetText('MAccForm', 'DlgDelfErr'); +end; + +procedure LanguageTranslate(form: TfrmEditAccount); +begin + form.Caption := GetText('EAccForm', 'FormTitle'); + form.tsGeneral.Caption := GetText('EAccForm', 'TabGeneral'); + form.tsRegions.Caption := GetText('EAccForm', 'TabRegions'); + form.lblUsername.Caption := GetText('EAccForm', 'Account'); + form.lblPassword.Caption := GetText('EAccForm', 'Password'); + form.lblAccessLevel.Caption := GetText('EAccForm', 'Access'); + form.lblPasswordHint.Caption := GetText('EAccForm', 'PswHelp'); + form.Label1.Caption := GetText('EAccForm', 'AllowRegions'); + form.btnOK.Caption := GetText('EAccForm', 'Apply'); + form.btnCancel.Caption := GetText('EAccForm', 'Cancel'); + + form.cbAccessLevel.Items[0] := GetText('EAccForm', 'AccessNone'); + form.cbAccessLevel.Items[1] := GetText('EAccForm', 'AccessViewer'); + form.cbAccessLevel.Items[2] := GetText('EAccForm', 'AccessNormal'); + form.cbAccessLevel.Items[3] := GetText('EAccForm', 'AccessDevelop'); + form.cbAccessLevel.Items[4] := GetText('EAccForm', 'AccessAdmin'); +end; + +procedure LanguageTranslate(form: TfrmRegionControl); +begin + form.Caption := GetText('MRegForm', 'FormTitle'); + form.vstRegions.Header.Columns[0].Text := GetText('MRegForm', 'Regions'); + form.mnuAddRegion.Caption := GetText('MRegForm', 'AddRegion'); + form.mnuAddRegion.Hint := GetText('MRegForm', 'AddRegionHint'); + form.btnAddRegion.Hint := GetText('MRegForm', 'AddRegionHint'); + form.mnuDeleteRegion.Caption := GetText('MRegForm', 'DeleteRegion'); + form.mnuDeleteRegion.Hint := GetText('MRegForm', 'DeleteRegionHint'); + form.btnDeleteRegion.Hint := GetText('MRegForm', 'DeleteRegionHint'); + form.Label1.Caption := GetText('MRegForm', 'Area'); + form.btnAddArea.Hint := GetText('MRegForm', 'AddAreaHint'); + form.btnDeleteArea.Hint := GetText('MRegForm', 'DeleteAreaHint'); + form.btnClearArea.Hint := GetText('MRegForm', 'ClearAreaHint'); + form.lblX.Caption := GetText('MRegForm', 'PosX'); + form.lblY.Caption := GetText('MRegForm', 'PosY'); + form.btnGrab1.Hint := GetText('MRegForm', 'PosGrab1Hint'); + form.btnGrab2.Hint := GetText('MRegForm', 'PosGrab2Hint'); + form.btnSave.Caption := GetText('MRegForm', 'Save'); + form.btnClose.Caption := GetText('MRegForm', 'Close'); + + form.lbDlgUnsaveCaption := GetText('MRegForm', 'DlgUnsaveCaption'); + form.lbDlgUnsave := GetText('MRegForm', 'DlgUnsave'); + form.lbDlgDelConfCaption := GetText('MRegForm', 'DlgDelConfCaption'); + form.lbDlgDelConf := GetText('MRegForm', 'DlgDelConf'); + form.lbDlgNewExistsCaption := GetText('MRegForm', 'DlgNewExistsCaption'); + form.lbDlgNewExists := GetText('MRegForm', 'DlgNewExists'); + form.lbNewInputQueryCaption := GetText('MRegForm', 'NewInputQueryCaption'); + form.lbNewInputQuery := GetText('MRegForm', 'NewInputQuery'); +end; + +procedure LanguageTranslate(form: TfrmLargeScaleCommand); +begin + form.Caption := GetText('GCmdForm', 'FormTitle'); + form.vstActions.Header.Columns[0].Text := GetText('GCmdForm', 'Actions'); + form.Label1.Caption := GetText('GCmdForm', 'Ares'); + form.btnAddArea.Hint := GetText('GCmdForm', 'AddAreaHint'); + form.btnDeleteArea.Hint := GetText('GCmdForm', 'DeleteAreaHint'); + form.btnClearArea.Hint := GetText('GCmdForm', 'ClearAreaHint'); + form.lblY.Caption := GetText('GCmdForm', 'PosX'); + form.lblX.Caption := GetText('GCmdForm', 'PosY'); + form.btnGrab1.Hint := GetText('GCmdForm', 'PosGrab1Hint'); + form.btnGrab2.Hint := GetText('GCmdForm', 'PosGrab2Hint'); + form.btnExecute.Caption := GetText('GCmdForm', 'Execute'); + form.btnClose.Caption := GetText('GCmdForm', 'Close'); + + // ---------- + form.pgArea.Caption := GetText('GCmdForm', 'PageSelectArea'); + form.mnuSelectTopLeft.Caption := GetText('GCmdForm', 'psaSelectTL'); + form.mnuSelectTopLeft.Hint := GetText('GCmdForm', 'psaSelectTLHint'); + form.mnuSelectTopRight.Caption := GetText('GCmdForm', 'psaSelectTR'); + form.mnuSelectTopRight.Hint := GetText('GCmdForm', 'psaSelectTRHint'); + form.mnuSelectBottomLeft.Caption := GetText('GCmdForm', 'psaSelectBL'); + form.mnuSelectBottomLeft.Hint := GetText('GCmdForm', 'psaSelectBLHint'); + form.mnuSelectBottomRight.Caption := GetText('GCmdForm', 'psaSelectBR'); + form.mnuSelectBottomRight.Hint := GetText('GCmdForm', 'psaSelectBRHint'); + + // ---------- + form.pgCopyMove.Caption := GetText('GCmdForm', 'PageCopyMove'); + form.rgCMAction.Caption := GetText('GCmdForm', 'pcmActionBloack'); + form.rgCMAction.Items[0] := GetText('GCmdForm', 'pcmAction1'); + form.rgCMAction.Items[1] := GetText('GCmdForm', 'pcmAction2'); + form.gbCMOffset.Caption := GetText('GCmdForm', 'pcmOffsetBlock'); + form.Label9.Caption := GetText('GCmdForm', 'pcmOffsetPosX'); + form.Label10.Caption := GetText('GCmdForm', 'pcmOffsetPosY'); + form.btnGrabOffset.Hint := GetText('GCmdForm', 'pcmOffsetGrabHint'); + form.cbCMEraseTarget.Caption := GetText('GCmdForm', 'pcmEraseTarget'); + form.cbCMEraseTarget.Hint := GetText('GCmdForm', 'pcmEraseTargetHint'); + + // ---------- + form.pgModifyAltitude.Caption := GetText('GCmdForm', 'PageModifyAlt'); + form.rbSetTerrainAltitude.Caption := GetText('GCmdForm', 'pmaSetLandAlt'); + form.rbSetTerrainAltitude.Hint := GetText('GCmdForm', 'pmaSetLandAltHint'); + form.Label2.Caption := GetText('GCmdForm', 'pmaSetLandAltHelp'); + form.rbRelativeAltitudeChange.Caption := GetText('GCmdForm', 'pmaChangeRelativeAlt'); + form.rbRelativeAltitudeChange.Hint := GetText('GCmdForm', 'pmaChangeRelativeAltHint'); + form.Label3.Caption := GetText('GCmdForm', 'pmaSetAltFromTo'); + form.Label4.Caption := GetText('GCmdForm', 'pmaTo'); + + // ---------- + form.pgDrawTerrain.Caption := GetText('GCmdForm', 'PageDrawTerrain'); + form.gbDrawTerrainTiles.Caption := GetText('GCmdForm', 'pdtTileBlock'); + form.lblDrawTerrainTilesDesc.Caption := GetText('GCmdForm', 'pdtTileHelp'); + form.vdtTerrainTiles.Header.Columns[0].Text := GetText('GCmdForm', 'pdtId'); + form.vdtTerrainTiles.Header.Columns[1].Text := GetText('GCmdForm', 'pdtImage'); + form.vdtTerrainTiles.Header.Columns[2].Text := GetText('GCmdForm', 'pdtName'); + form.btnDeleteTerrain.Hint := GetText('GCmdForm', 'pdtDeleteHint'); + form.btnClearTerrain.Hint := GetText('GCmdForm', 'pdtClearHint'); + + // ---------- + form.pgDeleteStatics.Caption := GetText('GCmdForm', 'PageDeleteItems'); + form.gbDeleteStaticsTiles.Caption := GetText('GCmdForm', 'pdiTileBlock'); + form.lblDeleteStaticsTilesDesc.Caption := GetText('GCmdForm', 'pdiTileHelp'); + form.vdtDeleteStaticsTiles.Header.Columns[0].Text := GetText('GCmdForm', 'pdiId'); + form.vdtDeleteStaticsTiles.Header.Columns[1].Text := GetText('GCmdForm', 'pdiImage'); + form.vdtDeleteStaticsTiles.Header.Columns[2].Text := GetText('GCmdForm', 'pdiName'); + form.btnDeleteDStaticsTiles.Hint := GetText('GCmdForm', 'pdiDeleteHint'); + form.btnClearDStaticsTiles.Hint := GetText('GCmdForm', 'pdiClearHint'); + form.GroupBox1.Caption := GetText('GCmdForm', 'pdiAltBoundBlock'); + form.Label7.Caption := GetText('GCmdForm', 'pdiAltBoundHelp'); + form.Label8.Caption := GetText('GCmdForm', 'pdiAltBoundTo'); + + // ---------- + form.pgInsertStatics.Caption := GetText('GCmdForm', 'PageInsertItems'); + form.gbInserStaticsTiles.Caption := GetText('GCmdForm', 'piiTileBlock'); + form.lblInsertStaticsTiles.Caption := GetText('GCmdForm', 'piiTileHelp'); + form.vdtInsertStaticsTiles.Header.Columns[0].Text := GetText('GCmdForm', 'piiId'); + form.vdtInsertStaticsTiles.Header.Columns[1].Text := GetText('GCmdForm', 'piiImage'); + form.vdtInsertStaticsTiles.Header.Columns[2].Text := GetText('GCmdForm', 'piiName'); + form.btnDeleteIStaticsTiles.Hint := GetText('GCmdForm', 'piiDeleteHint'); + form.btnClearIStaticsTiles.Hint := GetText('GCmdForm', 'piiClearHint'); + form.gbStaticsProbability.Caption := GetText('GCmdForm', 'piiProbBlock'); + form.Label5.Caption := GetText('GCmdForm', 'piiProbHelp'); + form.Label6.Caption := GetText('GCmdForm', 'piiProbPercent'); + form.gbStaticsPlacement.Caption := GetText('GCmdForm', 'piiAltPlaceBlock'); + form.rbPlaceStaticsOnTerrain.Caption := GetText('GCmdForm', 'piiAltPlace1'); + form.rbPlaceStaticsOnTop.Caption := GetText('GCmdForm', 'piiAltPlace2'); + form.rbPlaceStaticsOnZ.Caption := GetText('GCmdForm', 'piiAltPlace3'); + + // ---------- + // Обновляем вписок для перезагрузки текста + form.RenameNode(-1, form.pgArea.Caption); + form.RenameNode( 0, form.pgCopyMove.Caption); + form.RenameNode( 1, form.pgModifyAltitude.Caption); + form.RenameNode( 2, form.pgDrawTerrain.Caption); + form.RenameNode( 3, form.pgDeleteStatics.Caption); + form.RenameNode( 4, form.pgInsertStatics.Caption); + +end; +{ +procedure LanguageTranslate(form: TfrmMain); +begin + form.Caption := GetText('MainForm', ''); + form.Hint := GetText('MainForm', 'Hint'); +end; + +procedure LanguageTranslate(form: TfrmMain); +begin + form.Caption := GetText('MainForm', ''); + form.Hint := GetText('MainForm', 'Hint'); +end; + } + +procedure LanguageTranslate(form: TfrmAbout); +begin + form.Caption := GetText('AbouForm', 'FormTitle'); + form.lbVersion := GetText('AbouForm', 'Version'); + form.lbBuild := GetText('AbouForm', 'Build'); +end; + +function GetParseErText(key: string) : string; +begin + Result := GetText('ParseErr', key); +end; + +end. + diff --git a/Imaging/ImagingClasses.pas b/Imaging/ImagingClasses.pas index 6a49c30..8b799be 100644 --- a/Imaging/ImagingClasses.pas +++ b/Imaging/ImagingClasses.pas @@ -144,7 +144,7 @@ type { Indicates whether the current image is valid (proper format, allowed dimensions, right size, ...).} property Valid: Boolean read GetValid; - {{ Specifies the bounding rectangle of the image.} + { Specifies the bounding rectangle of the image.} property BoundsRect: TRect read GetBoundsRect; { This event occurs when the image data size has just changed. That means image width, height, or format has been changed.} diff --git a/Imaging/ImagingComponents.pas b/Imaging/ImagingComponents.pas index 393ebf5..a9c0252 100644 --- a/Imaging/ImagingComponents.pas +++ b/Imaging/ImagingComponents.pas @@ -336,7 +336,7 @@ implementation uses {$IF Defined(LCL)} {$IF Defined(LCLGTK2)} - GLib2, GDK2, GTK2, GTKDef, GTKProc, + GLib2, GDK2, GTK2, GTK2Def, GTK2Proc, {$ELSEIF Defined(LCLGTK)} GDK, GTK, GTKDef, GTKProc, {$IFEND} diff --git a/MulProvider/UArtProvider.pas b/MulProvider/UArtProvider.pas index 96e6fc2..cdac299 100644 --- a/MulProvider/UArtProvider.pas +++ b/MulProvider/UArtProvider.pas @@ -30,23 +30,49 @@ unit UArtProvider; interface uses - Graphics, UMulProvider, UMulBlock, UGenericIndex, UArt, UHue; + Classes, Graphics, UMulProvider, UMulBlock, UGenericIndex, UArt, UHue, types; type TArtProvider = class(TIndexedMulProvider) + constructor Create(OldFormat: Boolean; AData, AIndex: TStream; AReadOnly: Boolean = False); overload; + constructor Create(OldFormat: Boolean; AData, AIndex: string; AReadOnly: Boolean = False); overload; protected + UseOldArtFormat: Boolean; function GetData(AID: Integer; AIndex: TGenericIndex): TMulBlock; override; function GetArtData(AID: Integer; AIndex: TGenericIndex; AColor: Word; AHue: THue; APartialHue: Boolean): TArt; public function GetArt(AID: Integer; AColor: Word; AHue: THue; APartialHue: Boolean): TArt; function GetFlatLand(AID: Integer): TArt; + function GetArtSize(AID: Integer): TSize; end; implementation +uses + Logging; + + { TArtProvider } +constructor TArtProvider.Create(OldFormat: Boolean; AData, AIndex: TStream; AReadOnly: Boolean = False); +begin + inherited Create(AData, AIndex, AReadOnly); + UseOldArtFormat := OldFormat; + if UseOldArtFormat + then Logger.Send([lcInfo], 'Using pre-Alpha ArtData Format') + else Logger.Send([lcInfo], 'Using common ArtData Format'); +end; + +constructor TArtProvider.Create(OldFormat: Boolean; AData, AIndex: string; AReadOnly: Boolean = False); +begin + inherited Create(AData, AIndex, AReadOnly); + UseOldArtFormat := OldFormat; + if UseOldArtFormat + then Logger.Send([lcInfo], 'Using pre-Alpha ArtData Format') + else Logger.Send([lcInfo], 'Using common ArtData Format'); +end; + function TArtProvider.GetData(AID: Integer; AIndex: TGenericIndex): TMulBlock; begin Result := GetArtData(AID, AIndex, clBlack, nil, False); @@ -60,14 +86,14 @@ begin if AID < $4000 then Result := TArt.Create(FData, AIndex, atLand, AColor, AHue, APartialHue) else - Result := TArt.Create(FData, AIndex, atStatic, AColor, AHue, APartialHue); + Result := TArt.Create(FData, AIndex, atStatic, AColor, AHue, APartialHue, UseOldArtFormat); end else begin if AID < $4000 then Result := TArt.Create(nil, nil, atLand, AColor, AHue, APartialHue) else - Result := TArt.Create(nil, nil, atStatic, AColor, AHue, APartialHue); + Result := TArt.Create(nil, nil, atStatic, AColor, AHue, APartialHue, UseOldArtFormat); end; Result.ID := AID; end; @@ -91,11 +117,38 @@ var begin FIndex.Position := CalculateIndexOffset(AID); genericIndex := TGenericIndex.Create(FIndex); - Result := TArt.Create(FData, genericIndex, atLandFlat); + Result := TArt.Create(FData, genericIndex, atLandFlat, UseOldArtFormat); genericIndex.Free; Result.OnChanged := @OnChanged; Result.OnFinished := @OnFinished; end; +function TArtProvider.GetArtSize(AID: Integer): TSize; +var + genericIndex: TGenericIndex; + //genericBlock: TMemoryStream; + value: SmallInt; +begin + if (AID < $4000) + then Result := Size(44, 44) + else begin + FIndex.Position := CalculateIndexOffset(AID); + genericIndex := TGenericIndex.Create(FIndex); + if (genericIndex.Lookup <> -1) and (genericIndex.Size > 0) then begin + FData.Position := genericIndex.Lookup + 4; + //genericBlock := TMemoryStream.Create; + //genericBlock.CopyFrom(FData, 8); + //genericBlock.Position := 4; + + FData.Read(value, SizeOf(SmallInt)); Result.cx := value; + FData.Read(value, SizeOf(SmallInt)); Result.cy := value; + + //if Assigned(genericBlock) then genericBlock.Free; + end else + Result := Size(0, 0); + genericIndex.Free; + end; +end; + end. diff --git a/MulProvider/UTexmapProvider.pas b/MulProvider/UTexmapProvider.pas index b9fbd21..34272b4 100644 --- a/MulProvider/UTexmapProvider.pas +++ b/MulProvider/UTexmapProvider.pas @@ -30,23 +30,50 @@ unit UTexmapProvider; interface uses - UMulProvider, UMulBlock, UGenericIndex, UTexture; + Classes, UMulProvider, UMulBlock, UGenericIndex, UTexture; type TTexmapProvider = class(TIndexedMulProvider) + constructor Create(OldFormat: Boolean; AData, AIndex: TStream; AReadOnly: Boolean = False); overload; + constructor Create(OldFormat: Boolean; AData, AIndex: string; AReadOnly: Boolean = False); overload; protected + UseOldArtFormat: Boolean; function GetData(AID: Integer; AIndex: TGenericIndex): TMulBlock; override; end; implementation +uses + Logging; + { TTexmapProvider } +constructor TTexmapProvider.Create(OldFormat: Boolean; AData, AIndex: TStream; AReadOnly: Boolean = False); +begin + inherited Create(AData, AIndex, AReadOnly); + UseOldArtFormat := OldFormat; + if UseOldArtFormat + then Logger.Send([lcInfo], 'Using textures in ArtData') + else Logger.Send([lcInfo], 'Using textures in TexMaps'); +end; + +constructor TTexmapProvider.Create(OldFormat: Boolean; AData, AIndex: string; AReadOnly: Boolean = False); +begin + inherited Create(AData, AIndex, AReadOnly); + UseOldArtFormat := OldFormat; + if UseOldArtFormat + then Logger.Send([lcInfo], 'Using textures in ArtData') + else Logger.Send([lcInfo], 'Using textures in TexMaps'); +end; + function TTexmapProvider.GetData(AID: Integer; AIndex: TGenericIndex): TMulBlock; begin - if (AIndex.Lookup > -1) and (AIndex.Size > 0) then - Result := TTexture.Create(FData, AIndex) - else + if (AIndex.Lookup > -1) and (AIndex.Size > 0) then begin + //Result := TTexture.Create(FData, AIndex) + if not UseOldArtFormat + then Result := TTexture.Create(FData, AIndex) + else Result := TOldTexture.Create(Cardinal(AID)); + end else Result := TTexture.Create(-1); Result.ID := AID; end; diff --git a/MulProvider/UTileDataProvider.pas b/MulProvider/UTileDataProvider.pas index 99f8f50..3fb2474 100644 --- a/MulProvider/UTileDataProvider.pas +++ b/MulProvider/UTileDataProvider.pas @@ -39,22 +39,27 @@ type { TTiledataProvider } TTiledataProvider = class(TMulProvider) - constructor Create(AData: TStream; AReadOnly: Boolean = False); overload; override; - constructor Create(AData: string; AReadOnly: Boolean = False); overload; override; + constructor Create(OldFormat: Boolean; AData: TStream; AReadOnly: Boolean = False); overload; + constructor Create(OldFormat: Boolean; AData: string; AReadOnly: Boolean = False); overload; destructor Destroy; override; protected FLandTiles: TLandTileDataArray; + FEmptyLandTile: TLandTileData; FStaticTiles: TStaticTileDataArray; + FEmptyStaticTile: TStaticTileData; FStaticCount: Cardinal; + UseOldTileDataFormat: Boolean; procedure InitArray; function CalculateOffset(AID: Integer): Integer; override; function GetData(AID, AOffset: Integer): TMulBlock; override; procedure SetData(AID, AOffset: Integer; ABlock: TMulBlock); override; function GetTileData(AID: Integer): TTiledata; + function GetLandTileData(AID: Integer): TLandTileData; + function GetStaticTileData(AID: Integer): TStaticTileData; public function GetBlock(AID: Integer): TMulBlock; override; - property LandTiles: TLandTileDataArray read FLandTiles; - property StaticTiles: TStaticTileDataArray read FStaticTiles; + property LandTiles[AID: Integer]: TLandTileData read GetLandTileData; + property StaticTiles[AID: Integer]: TStaticTileData read GetStaticTileData; property TileData[AID: Integer]: TTiledata read GetTileData; //all tiles, no cloning property StaticCount: Cardinal read FStaticCount; end; @@ -68,18 +73,26 @@ uses function TTiledataProvider.CalculateOffset(AID: Integer): Integer; begin - Result := GetTileDataOffset(AID); + Result := GetTileDataOffset(AID, UseOldTileDataFormat); end; -constructor TTiledataProvider.Create(AData: TStream; AReadOnly: Boolean = False); +constructor TTiledataProvider.Create(OldFormat: Boolean; AData: TStream; AReadOnly: Boolean = False); begin - inherited; + inherited Create(AData, AReadOnly); + UseOldTileDataFormat := OldFormat; //(FData.Size <= 1644544); + if UseOldTileDataFormat + then Logger.Send([lcInfo], 'Using Old TileData Format') + else Logger.Send([lcInfo], 'Using New TileData Format'); InitArray; end; -constructor TTiledataProvider.Create(AData: string; AReadOnly: Boolean = False); +constructor TTiledataProvider.Create(OldFormat: Boolean; AData: string; AReadOnly: Boolean = False); begin - inherited; + inherited Create(AData, AReadOnly); + UseOldTileDataFormat := OldFormat; //(FData.Size <= 1644544); + if UseOldTileDataFormat + then Logger.Send([lcInfo], 'Using Old TileData Format') + else Logger.Send([lcInfo], 'Using New TileData Format'); InitArray; end; @@ -117,23 +130,60 @@ var begin FData.Position := 0; Logger.Send([lcInfo], 'Loading $4000 LandTiledata Entries'); - for i := $0 to $3FFF do - begin - if i mod 32 = 0 then - FData.Seek(4, soFromCurrent); - FLandTiles[i] := TLandTileData.Create(FData); - end; + if UseOldTileDataFormat + then for i := $0 to $3FFF do + begin + if i mod 32 = 0 then + FData.Seek(4, soFromCurrent); + FLandTiles[i] := TLandOldTileData.Create(FData); + end + else for i := $0 to $3FFF do + begin + if i mod 32 = 0 then + FData.Seek(4, soFromCurrent); + FLandTiles[i] := TLandTileData.Create(FData); + end; - FStaticCount := ((FData.Size - FData.Position) div StaticTileGroupSize) * 32; + if UseOldTileDataFormat + then FStaticCount := ((FData.Size - FData.Position) div StaticOldTileGroupSize) * 32 + else FStaticCount := ((FData.Size - FData.Position) div StaticTileGroupSize) * 32; Logger.Send([lcInfo], 'Loading $%x StaticTiledata Entries', [FStaticCount]); SetLength(FStaticTiles, FStaticCount); - for i := 0 to FStaticCount - 1 do - begin - if i mod 32 = 0 then - FData.Seek(4, soFromCurrent); - FStaticTiles[i] := TStaticTileData.Create(FData); - end; + if UseOldTileDataFormat + then for i := 0 to FStaticCount - 1 do + begin + if i mod 32 = 0 then + FData.Seek(4, soFromCurrent); + FStaticTiles[i] := TStaticOldTileData.Create(FData); + end + else for i := 0 to FStaticCount - 1 do + begin + if i mod 32 = 0 then + FData.Seek(4, soFromCurrent); + FStaticTiles[i] := TStaticTileData.Create(FData); + end; + + // empty + FEmptyLandTile := FLandTiles[0].Clone; + FEmptyLandTile.Flags := []; + FEmptyLandTile.TextureID := 0; + + FEmptyStaticTile := FStaticTiles[0].Clone; + FEmptyStaticTile.Flags := []; + //FEmptyStaticTile.Flags2 := 0; + FEmptyStaticTile.TileName := '!! NOT EXISTING !!'; + FEmptyStaticTile.Weight := 0; + FEmptyStaticTile.Quality := 0; + FEmptyStaticTile.Unknown1 := 0; + FEmptyStaticTile.Unknown2 := 0; + FEmptyStaticTile.Quantity := 0; + FEmptyStaticTile.AnimID := 0; + FEmptyStaticTile.Unknown3 := 0; + FEmptyStaticTile.Hue := 0; + FEmptyStaticTile.Unknown4 := 0; + FEmptyStaticTile.Height := 0; + end; procedure TTiledataProvider.SetData(AID, AOffset: Integer; @@ -145,11 +195,15 @@ begin if AID < $4000 then begin FreeAndNil(FLandTiles[AID]); - FLandTiles[AID] := TLandTileData(ABlock.Clone); + if UseOldTileDataFormat + then FLandTiles[AID] := TLandOldTileData(ABlock.Clone) + else FLandTiles[AID] := TLandTileData(ABlock.Clone); end else begin FreeAndNil(FStaticTiles[AID - $4000]); - FStaticTiles[AID - $4000] := TStaticTileData(ABlock.Clone); + if UseOldTileDataFormat + then FStaticTiles[AID - $4000] := TStaticOldTileData(ABlock.Clone) + else FStaticTiles[AID - $4000] := TStaticTileData(ABlock.Clone); end; if not FReadOnly then @@ -164,7 +218,23 @@ begin if AID < $4000 then Result := FLandTiles[AID] else - Result := FStaticTiles[AID - $4000]; + Result := StaticTiles[AID - $4000]; +end; + +function TTiledataProvider.GetLandTileData(AID: Integer): TLandTileData; +begin + if (AID >= 0) and (AID < $4000) then + Result := FLandTiles[AID] + else + Result := FEmptyLandTile; +end; + +function TTiledataProvider.GetStaticTileData(AID: Integer): TStaticTileData; +begin + if (AID >= 0) and (AID < FStaticCount) then + Result := FStaticTiles[AID] + else + Result := FEmptyStaticTile; end; end. diff --git a/ResourceBuilder.pas b/ResourceBuilder.pas index 3ada35b..583b223 100644 --- a/ResourceBuilder.pas +++ b/ResourceBuilder.pas @@ -27,8 +27,9 @@ program ResourceBuilder; {$mode objfpc}{$H+} + uses - SysUtils, Classes; + SysUtils, Classes, strutils, Crc32Hash; var fileList: TStringList; @@ -36,7 +37,8 @@ var i, count: Integer; size: Cardinal; lookupTable: array of Cardinal; - + fnHashTable: array of Cardinal; + begin if ParamCount <> 2 then begin @@ -50,11 +52,14 @@ begin count := fileList.Count; outfile.Write(count, SizeOf(Integer)); SetLength(lookupTable, count); + SetLength(fnHashTable, count); outfile.Write(lookupTable[0], count * SizeOf(Cardinal)); + outfile.Write(fnHashTable[0], count * SizeOf(Cardinal)); for i := 0 to count - 1 do begin lookupTable[i] := outfile.Position; - writeln(i, ': ', fileList.Strings[i]); + CalcStringCRC32(AnsiLowerCase(fileList.Strings[i]), fnHashTable[i]); + writeln(Format('#%.3d 0x%.8x : %s', [i, Int64(fnHashTable[i]), fileList.Strings[i]])); infile := TFileStream.Create(fileList.Strings[i], fmOpenRead); infile.Position := 0; size := infile.Size; @@ -64,6 +69,7 @@ begin end; outfile.Position := SizeOf(Integer); outfile.Write(lookupTable[0], count * SizeOf(Cardinal)); + outfile.Write(fnHashTable[0], count * SizeOf(Cardinal)); outfile.Free; fileList.Free; end. diff --git a/Server/UAccount.pas b/Server/UAccount.pas index 14e5b8c..484315d 100644 --- a/Server/UAccount.pas +++ b/Server/UAccount.pas @@ -49,15 +49,18 @@ type FPasswordHash: string; FLastPos: TPoint; FRegions: TStringList; + FLastLogon: TDateTime; procedure SetAccessLevel(const AValue: TAccessLevel); procedure SetPasswordHash(const AValue: string); procedure SetLastPos(const AValue: TPoint); + procedure SetLastLogon(const ADateTime: TDateTime); public property Name: string read FName; property AccessLevel: TAccessLevel read FAccessLevel write SetAccessLevel; property PasswordHash: string read FPasswordHash write SetPasswordHash; property LastPos: TPoint read FLastPos write SetLastPos; property Regions: TStringList read FRegions; + property LastLogon: TDateTime read FLastLogon write SetLastLogon; procedure Invalidate; end; @@ -154,6 +157,11 @@ begin Invalidate; end; +procedure TAccount.SetLastLogon(const ADateTime: TDateTime); +begin + FLastLogon := ADateTime; +end; + procedure TAccount.Invalidate; begin FOwner.Invalidate; diff --git a/Server/UAdminHandling.pas b/Server/UAdminHandling.pas index 149e17c..8ff6eb5 100644 --- a/Server/UAdminHandling.pas +++ b/Server/UAdminHandling.pas @@ -108,9 +108,13 @@ procedure OnAdminHandlerPacket(ABuffer: TEnhancedMemoryStream; ANetState: TNetState); var packetHandler: TPacketHandler; + packetID: Byte; begin - if not ValidateAccess(ANetState, alAdministrator) then Exit; - packetHandler := AdminPacketHandlers[ABuffer.ReadByte]; + if not ValidateAccess(ANetState, alDeveloper) then Exit; + packetID := ABuffer.ReadByte; + if ((packetID <> $01) and not ValidateAccess(ANetState, alAdministrator)) then Exit; + + packetHandler := AdminPacketHandlers[packetID]; if packetHandler <> nil then packetHandler.Process(ABuffer, ANetState); end; diff --git a/Server/UCEDServer.pas b/Server/UCEDServer.pas index f7b63ee..96aab04 100644 --- a/Server/UCEDServer.pas +++ b/Server/UCEDServer.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, lNet, UEnhancedMemoryStream, UConfig, ULandscape, - UNetState, UPacket, dateutils, + UNetState, UPacket, dateutils, LConvEncoding, Language, {$IFDEF Linux}BaseUnix,{$ENDIF} {$IFDEF Windows}Windows,{$ENDIF} UPacketHandlers, UConnectionHandling; @@ -44,6 +44,7 @@ type constructor Create; destructor Destroy; override; protected + FWorkStart: TDateTime; FLandscape: TLandscape; FTCPServer: TLTcp; FQuit: Boolean; @@ -57,6 +58,7 @@ type procedure ProcessBuffer(ANetState: TNetState); procedure CheckNetStates; public + property WorkStart: TDateTime read FWorkStart; property Landscape: TLandscape read FLandscape; property TCPServer: TLTcp read FTCPServer; property Quit: Boolean read FQuit write FQuit; @@ -79,13 +81,13 @@ uses {$IFDEF Linux} procedure OnSigInt(ASignal: cint); cdecl; begin - Writeln(TimeStamp, 'Killed'); + Writeln(TimeStamp, GetText('Aborting')); if CEDServerInstance <> nil then CEDServerInstance.Quit := True; end; procedure OnSigSegv(ASignal: cint); cdecl; begin - Writeln(TimeStamp, 'Internal error'); + Writeln(TimeStamp, GetText('InternEr')); Halt; //if CEDServerInstance <> nil then CEDServerInstance.Quit := True; end; @@ -97,7 +99,7 @@ begin Result := False; if (ACtrl = CTRL_C_EVENT) or (ACtrl = CTRL_BREAK_EVENT) then begin - Writeln(TimeStamp, 'Killed'); + Writeln(TimeStamp, GetText('Aborting')); if CEDServerInstance <> nil then CEDServerInstance.Quit := True; Result := True; end; @@ -109,9 +111,10 @@ end; constructor TCEDServer.Create; begin inherited Create; + FWorkStart := Now; FLandscape := TLandscape.Create(Config.Map.MapFile, Config.Map.StaticsFile, Config.Map.StaIdxFile, Config.Tiledata, Config.Radarcol, Config.Map.Width, - Config.Map.Height, FValid); + Config.Map.Height, Config.Map.FormatFlags, FValid); FTCPServer := TLTcp.Create(nil); FTCPServer.OnAccept := @OnAccept; FTCPServer.OnCanSend := @OnCanSend; @@ -145,7 +148,7 @@ end; procedure TCEDServer.OnAccept(ASocket: TLSocket); begin - writeln(TimeStamp, 'Connect: ', ASocket.PeerAddress); + writeln(TimeStamp, GetText('Connects') + ' ', ASocket.PeerAddress); ASocket.UserData := TNetState.Create(ASocket); SendPacket(TNetState(ASocket.UserData), TProtocolVersionPacket.Create(ProtocolVersion)); end; @@ -172,11 +175,16 @@ procedure TCEDServer.OnDisconnect(ASocket: TLSocket); var netState: TNetState; begin - writeln(TimeStamp, 'Disconnect: ', ASocket.PeerAddress); + writeln(TimeStamp, GetText('ConLosts') + ' ', ASocket.PeerAddress); if ASocket.UserData <> nil then begin netState := TNetState(ASocket.UserData); ASocket.UserData := nil; + {$IFDEF NetLog} + if netState.Account <> nil + then writeln(TimeStamp, '$OnDisconnect("',netState.Account.Name,'")') + else writeln(TimeStamp, '$OnDisconnect("UNKNOWN")') + {$ENDIF} if netState.Account <> nil then SendPacket(nil, TClientDisconnectedPacket.Create(netState.Account.Name)); netState.Free; @@ -203,8 +211,9 @@ end; procedure TCEDServer.OnError(const AError: string; ASocket: TLSocket); begin - writeln(TimeStamp, 'Error: ', ASocket.PeerAddress, ' :: ', AError); + writeln(TimeStamp, GetText('ErrorLbl') + ' ', ASocket.PeerAddress, ' :: ', TranslateTextA(AError)); //OnDisconnect(ASocket); + ASocket.Disconnect(True); end; procedure TCEDServer.ProcessBuffer(ANetState: TNetState); @@ -220,6 +229,12 @@ begin while (buffer.Size >= 1) and ANetState.Socket.Connected do begin packetID := buffer.ReadByte; + {$IFDEF NetLog} + if (ANetState.Account <> nil) + then writeln(TimeStamp, Format('NetState: [0x%.2x] <<-- "%s"', [packetID, ANetState.Account.Name])) + else writeln(TimeStamp, Format('NetState: [0x%.2x] <<-- "NEW (%s:%d)"', [packetID, ANetState.Socket.PeerAddress, ANetState.Socket.PeerPort])); + {$ENDIF} + packetHandler := PacketHandlers[packetID]; if packetHandler <> nil then begin @@ -243,7 +258,7 @@ begin Break; //wait for more data end else begin - Writeln(TimeStamp, 'Dropping client due to unknown packet [', packetID, ']: ', ANetState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('UnkPack1'), packetID, GetText('UnkPack2') + ' ', ANetState.Socket.PeerAddress); Disconnect(ANetState.Socket); buffer.Clear; end; @@ -253,7 +268,7 @@ begin on E: Exception do begin Logger.SendException([lcServer], 'Error processing buffer', E); - Writeln(TimeStamp, 'Error processing buffer of client: ', ANetState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('BufferEr') + ' ', ANetState.Socket.PeerAddress); end; end; end; @@ -273,13 +288,16 @@ begin if (SecondsBetween(netState.LastAction, Now) > 120) then begin if netState.Account <> nil then - Writeln(TimeStamp, 'Timeout: ', netState.Account.Name, ' (', netState.Socket.PeerAddress, ')') + Writeln(TimeStamp, GetText('TimeOuts') + ' ', netState.Account.Name, ' (', netState.Socket.PeerAddress, ')') else - Writeln(TimeStamp, 'Timeout: ', netState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('TimeOuts') + ' ', netState.Socket.PeerAddress); Disconnect(netState.Socket); end; end else {TODO : Unnecessary ...} begin + {$IFDEF NetLog} + Writeln(TimeStamp, GetText('$CheckNetStates - OnDisconnect')); + {$ENDIF} OnDisconnect(FTCPServer.Iterator); end; end; @@ -290,7 +308,7 @@ procedure TCEDServer.Run; begin if not FValid then begin - Writeln(TimeStamp, 'Invalid data. Check the map size and the files.'); + Writeln(TimeStamp, GetText('BadFacet')); Exit; end; @@ -317,22 +335,37 @@ var begin if ANetState <> nil then begin + {$IFDEF NetLog} + if (ANetState.Account <> nil) + then writeln(TimeStamp, Format('NetState: [0x%.2x] -->> "%s"', [APacket.PacketID, ANetState.Account.Name])) + else writeln(TimeStamp, Format('NetState: [0x%.2x] -->> "NEW (%s:%d)"', [APacket.PacketID, ANetState.Socket.PeerAddress, ANetState.Socket.PeerPort])); + {$ENDIF} + ANetState.SendQueue.Seek(0, soFromEnd); ANetState.SendQueue.CopyFrom(APacket.Stream, 0); OnCanSend(ANetState.Socket); end else //broadcast begin + {$IFDEF NetLog} + write(TimeStamp, Format('NetState: [0x%.2x] -->> "BROADCAST: ', [APacket.PacketID])); + {$ENDIF} FTCPServer.IterReset; while FTCPServer.IterNext do begin netState := TNetState(FTCPServer.Iterator.UserData); if (netState <> nil) and (FTCPServer.Iterator.Connected) then begin + {$IFDEF NetLog} + write('.'); + {$ENDIF} netState.SendQueue.Seek(0, soFromEnd); netState.SendQueue.CopyFrom(APacket.Stream, 0); OnCanSend(netState.Socket); end; end; + {$IFDEF NetLog} + writeln(' "'); + {$ENDIF} end; if AFreePacket then APacket.Free; diff --git a/Server/UClientHandling.pas b/Server/UClientHandling.pas index 6c614ba..6346b8f 100644 --- a/Server/UClientHandling.pas +++ b/Server/UClientHandling.pas @@ -31,14 +31,14 @@ interface uses Classes, SysUtils, UPacket, UPacketHandlers, UConfig, UAccount, UNetState, - UEnhancedMemoryStream, UEnums, Math; + UEnhancedMemoryStream, UEnums, dateutils, Math; type { TClientConnectedPacket } TClientConnectedPacket = class(TPacket) - constructor Create(AUsername: string); + constructor Create(AAccount: TAccount); end; { TClientDisconnectedPacket } @@ -170,11 +170,12 @@ end; { TClientConnectedPacket } -constructor TClientConnectedPacket.Create(AUsername: string); +constructor TClientConnectedPacket.Create(AAccount: TAccount); begin inherited Create($0C, 0); FStream.WriteByte($01); - FStream.WriteStringNull(AUsername); + FStream.WriteStringNull(AAccount.Name); + FStream.WriteByte(Byte(AAccount.AccessLevel)); end; { TClientDisconnectedPacket } @@ -200,8 +201,11 @@ begin repeat netState := TNetState(CEDServerInstance.TCPServer.Iterator.UserData); if (netState <> nil) and (netState <> AAvoid) and - (netState.Account <> nil) then + (netState.Account <> nil) then begin FStream.WriteStringNull(netState.Account.Name); + FStream.WriteByte(Byte(netState.Account.AccessLevel)); + FStream.WriteDWord(DWord(SecondsBetween(netState.Account.LastLogon, CEDServerInstance.WorkStart))); + end; until not CEDServerInstance.TCPServer.IterNext; end; end; diff --git a/Server/UConfig.pas b/Server/UConfig.pas index e99d44b..4c616e7 100644 --- a/Server/UConfig.pas +++ b/Server/UConfig.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, DOM, XMLRead, XMLWrite, md5, Keyboard, UAccount, - UXmlHelper, UInterfaces, UEnums, URegions; + UXmlHelper, UInterfaces, UEnums, URegions, LConvEncoding, Language; type @@ -50,17 +50,20 @@ type FStaIdxFile: string; FWidth: Word; FHeight: Word; + FFormatFlags: Cardinal; procedure SetHeight(const AValue: Word); procedure SetMapFile(const AValue: string); procedure SetStaIdxFile(const AValue: string); procedure SetStaticsFile(const AValue: string); procedure SetWidth(const AValue: Word); + procedure SetFormatFlags(const AValue: Cardinal); public property MapFile: string read FMapFile write SetMapFile; property StaticsFile: string read FStaticsFile write SetStaticsFile; property StaIdxFile: string read FStaIdxFile write SetStaIdxFile; property Width: Word read FWidth write SetWidth; property Height: Word read FHeight write SetHeight; + property FormatFlags: Cardinal read FFormatFlags write SetFormatFlags; end; { TConfig } @@ -76,6 +79,7 @@ type FMap: TMapInfo; FTiledata: string; FRadarcol: string; + FLanguage: string; FRegions: TRegionList; FAccounts: TAccountList; FChanged: Boolean; @@ -89,6 +93,7 @@ type property Radarcol: string read FRadarcol write SetRadarcol; property Regions: TRegionList read FRegions; property Accounts: TAccountList read FAccounts; + property Language: string read FLanguage; procedure Flush; procedure Invalidate; end; @@ -97,13 +102,14 @@ var AppDir: string; ConfigFile: string; Config: TConfig; + tmp_i: Integer; function TimeStamp: string; implementation const - CONFIGVERSION = 3; + CONFIGVERSION = 5; function QueryPassword: String; var @@ -130,7 +136,9 @@ end; function TimeStamp: string; begin - Result := '[' + DateTimeToStr(Now) + '] '; + //Result := '[' + DateTimeToStr(Now) + '] '; + //Result := FormatDateTime('[yyyy.mm.dd hh:mm:ss] ', Now); + Result := FormatDateTime('[hh:mm:ss] ', Now); end; { TMapInfo } @@ -149,22 +157,19 @@ begin FStaticsFile := TXmlHelper.ReadString(AElement, 'Statics', 'statics0.mul'); FWidth := TXmlHelper.ReadInteger(AElement, 'Width', 768); FHeight := TXmlHelper.ReadInteger(AElement, 'Height', 512); + FFormatFlags := $F0000000 + Cardinal(TXmlHelper.ReadInteger(AElement, 'Format', $0000) and $0000FFFF); end; procedure TMapInfo.Serialize(AElement: TDOMElement); begin - TXmlHelper.WriteString(AElement, 'Map', FMapFile); + TXmlHelper.WriteString(AElement, 'Map', FMapFile); TXmlHelper.WriteString(AElement, 'StaIdx', FStaIdxFile); - TXmlHelper.WriteString(AElement, 'Statics', FStaticsFile); - TXmlHelper.WriteInteger(AElement, 'Width', FWidth); - TXmlHelper.WriteInteger(AElement, 'Height', FHeight); + TXmlHelper.WriteString(AElement, 'Statics',FStaticsFile); + TXmlHelper.WriteInteger(AElement,'Width', FWidth); + TXmlHelper.WriteInteger(AElement,'Height', FHeight); + TXmlHelper.WriteString(AElement, 'Format', Format('0x%.8x', [(FFormatFlags and $0000FFFF)])); end; -procedure TMapInfo.SetHeight(const AValue: Word); -begin - FHeight := AValue; - FOwner.Invalidate; -end; procedure TMapInfo.SetMapFile(const AValue: string); begin @@ -190,6 +195,18 @@ begin FOwner.Invalidate; end; +procedure TMapInfo.SetHeight(const AValue: Word); +begin + FHeight := AValue; + FOwner.Invalidate; +end; + +procedure TMapInfo.SetFormatFlags(const AValue: Cardinal); +begin + FFormatFlags := AValue; + FOwner.Invalidate; +end; + { TConfig } constructor TConfig.Create(AFilename: string); @@ -216,8 +233,9 @@ begin FTiledata := TXmlHelper.ReadString(xmlDoc.DocumentElement, 'Tiledata', 'tiledata.mul'); FRadarcol := TXmlHelper.ReadString(xmlDoc.DocumentElement, 'Radarcol', 'radarcol.mul'); - + FLanguage := TXmlHelper.ReadString(xmlDoc.DocumentElement, 'Language', '..\Language\English.ini'); xmlElement := TDOMElement(xmlDoc.DocumentElement.FindNode('Regions')); + if assigned(xmlElement) then FRegions := TRegionList.Deserialize(Self, xmlElement) else @@ -243,27 +261,37 @@ begin FMap := TMapInfo.Create(Self); FAccounts := TAccountList.Create(Self); FRegions := TRegionList.Create(Self); - - Writeln('Configuring Network'); - Writeln('==================='); - Write ('Port [2597]: '); + + Writeln(''); + Writeln('=============='); + FLanguage := '..\Language\English.ini'; + Writeln(UTF8ToCP866('language file [' + FLanguage + ']')); + Readln (stringValue); + if (stringValue <> '') + then FLanguage := stringValue; + LanguageLoad(FLanguage); + Writeln(''); + + Writeln(GetText('iNetwork')); + Writeln('=============='); + Write (GetText('iSetPort') + UTF8ToCP866(' [2597]: ')); Readln (stringValue); intValue := 0; if not TryStrToInt(stringValue, intValue) then intValue := 2597; FPort := intValue; Writeln(''); - Writeln('Configuring Paths'); - Writeln('================='); - Write ('map [map0.mul]: '); + Writeln(GetText('iDatPath')); + Writeln('==============='); + Write ('map [map0.mul]: '); Readln (FMap.FMapFile); if FMap.MapFile = '' then FMap.MapFile := 'map0.mul'; - Write ('statics [statics0.mul]: '); - Readln (FMap.FStaticsFile); - if FMap.StaticsFile = '' then FMap.StaticsFile := 'statics0.mul'; - Write ('staidx [staidx0.mul]: '); + Write ('staidx [staidx0.mul]: '); Readln (FMap.FStaIdxFile); if FMap.StaIdxFile = '' then FMap.StaIdxFile := 'staidx0.mul'; + Write ('statics [statics0.mul]: '); + Readln (FMap.FStaticsFile); + if FMap.StaticsFile = '' then FMap.StaticsFile := 'statics0.mul'; Write ('tiledata [tiledata.mul]: '); Readln (FTiledata); if FTiledata = '' then FTiledata := 'tiledata.mul'; @@ -272,25 +300,29 @@ begin if FRadarcol = '' then FRadarcol := 'radarcol.mul'; Writeln(''); - Writeln('Parameters'); - Writeln('=========='); - Write ('Map width [768]: '); + Writeln(GetText('iMapDesc')); + Writeln('==============='); + Write (GetText('iMapWidt') + UTF8ToCP866(' [768]: ')); Readln (stringValue); if not TryStrToInt(stringValue, intValue) then intValue := 768; FMap.Width := intValue; - Write ('Map height [512]: '); + Write (GetText('iMapHeig') + UTF8ToCP866(' [512]: ')); Readln (stringValue); if not TryStrToInt(stringValue, intValue) then intValue := 512; FMap.Height := intValue; + Write (GetText('iDFormat') + UTF8ToCP866(' [0x0000]: ')); + Readln (stringValue); + if not TryStrToInt(stringValue, intValue) then intValue := $0000; + FMap.FormatFlags := $F0000000 + Cardinal(intValue); Writeln(''); - Writeln('Admin account'); - Writeln('============='); + Writeln(GetText('iAccount')); + Writeln('======================'); repeat - Write('Account name: '); + Write(GetText('iUserAcc') + UTF8ToCP866(' ')); Readln(stringValue); until stringValue <> ''; - Write ('Password [hidden]: '); + Write (GetText('iUserPas') + UTF8ToCP866(' ')); password := QueryPassword; FAccounts.Add(TAccount.Create(FAccounts, stringValue, MD5Print(MD5String(password)), alAdministrator, nil)); @@ -308,6 +340,7 @@ end; procedure TConfig.Serialize(AElement: TDOMElement); begin + TXmlHelper.WriteString(AElement, 'Language', FLanguage); TXmlHelper.WriteInteger(AElement, 'Port', FPort); FMap.Serialize(TXmlHelper.AssureElement(AElement, 'Map')); TXmlHelper.WriteString(AElement, 'Tiledata', FTiledata); @@ -360,10 +393,15 @@ begin AppDir := ExtractFilePath(ParamStr(0)); if AppDir[Length(AppDir)] <> PathDelim then AppDir := AppDir + PathDelim; - - {TODO : add command line parameter to specify the config} + Config := nil; - ConfigFile := ChangeFileExt(ParamStr(0), '.xml'); + ConfigFile := ''; + for tmp_i := 0 to ParamCount do begin + if LowerCase(ExtractFileExt(ParamStr(tmp_i))) = '.xml' + then ConfigFile := ExtractFilePath(ParamStr(0)) + ParamStr(1); + end; + if ConfigFile = '' + then ConfigFile := ChangeFileExt(ParamStr(0), '.xml'); end; end. diff --git a/Server/UConnectionHandling.pas b/Server/UConnectionHandling.pas index e56520d..59a7adf 100644 --- a/Server/UConnectionHandling.pas +++ b/Server/UConnectionHandling.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, UPacket, UPacketHandlers, UConfig, UAccount, UNetState, - UEnhancedMemoryStream, UEnums; + UEnhancedMemoryStream, UEnums, dateutils, LConvEncoding, Language; type @@ -109,29 +109,29 @@ begin if not invalid then begin - Writeln(TimeStamp, 'Login (', username, '): ', ANetState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('UserReg1'), username, GetText('UserReg2'), ANetState.Socket.PeerAddress); ANetState.Account := account; CEDServerInstance.SendPacket(ANetState, TLoginResponsePacket.Create(lsOK, account)); CEDServerInstance.SendPacket(ANetState, TCompressedPacket.Create( TClientListPacket.Create(ANetState))); - CEDServerInstance.SendPacket(nil, TClientConnectedPacket.Create(username)); + CEDServerInstance.SendPacket(nil, TClientConnectedPacket.Create(account)); CEDServerInstance.SendPacket(ANetState, TSetClientPosPacket.Create(account.LastPos)); end; end else begin - Writeln(TimeStamp, 'Invalid password for ', username); + Writeln(TimeStamp, GetText('WrongPas') + ' ', username); CEDServerInstance.SendPacket(ANetState, TLoginResponsePacket.Create(lsInvalidPassword)); CEDServerInstance.Disconnect(ANetState.Socket); end; end else begin - Writeln(TimeStamp, 'Access denied for ', username); + Writeln(TimeStamp, GetText('UserBan1') + ' ', username, ' ' + GetText('UserBan2')); CEDServerInstance.SendPacket(ANetState, TLoginResponsePacket.Create(lsNoAccess)); CEDServerInstance.Disconnect(ANetState.Socket); end; end else begin - Writeln(TimeStamp, 'Invalid account specified: ', ANetState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('WrongAcc') + ' ', ANetState.Socket.PeerAddress); CEDServerInstance.SendPacket(ANetState, TLoginResponsePacket.Create(lsInvalidUser)); CEDServerInstance.Disconnect(ANetState.Socket); end; @@ -148,22 +148,26 @@ constructor TProtocolVersionPacket.Create(AVersion: Cardinal); begin inherited Create($02, 0); FStream.WriteByte($01); - FStream.WriteCardinal(AVersion); + FStream.WriteCardinal($1000 + AVersion); end; { TLoginResponsePacket } -constructor TLoginResponsePacket.Create(AState: TLoginState; - AAccount: TAccount = nil); +constructor TLoginResponsePacket.Create(AState: TLoginState; AAccount: TAccount = nil); +var + val1, val2, val3, val4 : Word; begin inherited Create($02, 0); FStream.WriteByte($03); FStream.WriteByte(Byte(AState)); if AState = lsOK then begin + AAccount.LastLogon := Now; FStream.WriteByte(Byte(AAccount.AccessLevel)); + FStream.WriteDWord(DWord(SecondsBetween(Now, CEDServerInstance.WorkStart))); FStream.WriteWord(Config.Map.Width); FStream.WriteWord(Config.Map.Height); + FStream.WriteCardinal(Config.Map.FormatFlags); WriteAccountRestrictions(FStream, AAccount); end; end; diff --git a/Server/ULandscape.pas b/Server/ULandscape.pas index 42361e5..4357cc1 100644 --- a/Server/ULandscape.pas +++ b/Server/ULandscape.pas @@ -32,8 +32,8 @@ interface uses SysUtils, Classes, math, UGenericIndex, UMap, UStatics, UWorldItem, UTileDataProvider, URadarMap, - UCacheManager, ULinkedList, UBufferedStreams, - UEnhancedMemoryStream, UPacketHandlers, UPackets, UNetState, UEnums; + UCacheManager, ULinkedList, UBufferedStreams, Language, + UEnhancedMemoryStream, UPacketHandlers, UPackets, UNetState, UEnums, LConvEncoding; type PRadarBlock = ^TRadarBlock; @@ -79,9 +79,9 @@ type TLandscape = class constructor Create(AMap, AStatics, AStaIdx, ATiledata, ARadarCol: string; - AWidth, AHeight: Word; var AValid: Boolean); + AWidth, AHeight: Word; FormatFlags: Cardinal; var AValid: Boolean); constructor Create(AMap, AStatics, AStaIdx, ATiledata: TStream; - ARadarCol: string; AWidth, AHeight: Word; var AValid: Boolean); + ARadarCol: string; AWidth, AHeight: Word; FormatFlags: Cardinal; var AValid: Boolean); destructor Destroy; override; protected FWidth: Word; @@ -194,7 +194,7 @@ begin for i := 0 to 63 do Cells[i] := TStaticItemList.Create(True); - if (AData <> nil) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then + if (AData <> nil) and (AIndex.Lookup >= 0) and (AIndex.Size > 0) then begin AData.Position := AIndex.Lookup; block := TMemoryStream.Create; @@ -285,11 +285,11 @@ end; { TLandscape } constructor TLandscape.Create(AMap, AStatics, AStaIdx, ATiledata, - ARadarCol: string; AWidth, AHeight: Word; var AValid: Boolean); + ARadarCol: string; AWidth, AHeight: Word; FormatFlags: Cardinal; var AValid: Boolean); var map, statics, staidx, tiledata: TStream; begin - Write(TimeStamp, 'Loading Map'); + Write(TimeStamp, GetText('dfLoader') + ' Map'); map := TFileStream.Create(AMap, fmOpenReadWrite); Write(', Statics'); statics := TFileStream.Create(AStatics, fmOpenReadWrite); @@ -297,12 +297,12 @@ begin staidx := TBufferedReader.Create(TFileStream.Create(AStaIdx, fmOpenReadWrite), True); Writeln(', Tiledata'); tiledata := TFileStream.Create(ATiledata, fmOpenRead or fmShareDenyWrite); - Create(map, statics, staidx, tiledata, ARadarCol, AWidth, AHeight, AValid); + Create(map, statics, staidx, tiledata, ARadarCol, AWidth, AHeight, FormatFlags, AValid); FOwnsStreams := True; end; constructor TLandscape.Create(AMap, AStatics, AStaIdx, ATiledata: TStream; - ARadarCol: string; AWidth, AHeight: Word; var AValid: Boolean); + ARadarCol: string; AWidth, AHeight: Word; FormatFlags: Cardinal; var AValid: Boolean); var blockID: Integer; begin @@ -316,30 +316,33 @@ begin FStaIdx := AStaIdx; FTiledata := ATiledata; FOwnsStreams := False; + if (FormatFlags and $F0000000) = 0 then + raise Exception.Create('TLandscape.Create Unknown Format data flags.'); + UseStaticsOldFormat := (FormatFlags and $00000001) <> 0; + AValid := Validate; if AValid then begin - Write(TimeStamp, 'Creating Cache'); + Write(TimeStamp, GetText('Creating') + ' ' + GetText('crtCache')); FBlockCache := TBlockCache.Create(256); FBlockCache.OnRemoveObject := @OnRemoveCachedObject; Write(', Tiledata'); - FTiledataProvider := TTiledataProvider.Create(ATiledata); - Write(', Subscriptions'); + FTiledataProvider := TTiledataProvider.Create((FormatFlags and $00000008) = 0, ATiledata); + Write(UTF8ToCP866(', ') + GetText('crtIndex')); //Subscriptions SetLength(FBlockSubscriptions, AWidth * AHeight); for blockID := 0 to AWidth * AHeight - 1 do FBlockSubscriptions[blockID] := TLinkedList.Create; Writeln(', RadarMap'); - FRadarMap := TRadarMap.Create(FMap, FStatics, FStaIdx, FWidth, FHeight, - ARadarCol); + FRadarMap := TRadarMap.Create(FMap, FStatics, FStaIdx, FWidth, FHeight, ARadarCol); - RegisterPacketHandler($06, TPacketHandler.Create(8, @OnDrawMapPacket)); + RegisterPacketHandler($06, TPacketHandler.Create( 8, @OnDrawMapPacket)); RegisterPacketHandler($07, TPacketHandler.Create(10, @OnInsertStaticPacket)); RegisterPacketHandler($08, TPacketHandler.Create(10, @OnDeleteStaticPacket)); RegisterPacketHandler($09, TPacketHandler.Create(11, @OnElevateStaticPacket)); RegisterPacketHandler($0A, TPacketHandler.Create(14, @OnMoveStaticPacket)); RegisterPacketHandler($0B, TPacketHandler.Create(12, @OnHueStaticPacket)); - RegisterPacketHandler($0E, TPacketHandler.Create(0, @OnLargeScaleCommandPacket)); + RegisterPacketHandler($0E, TPacketHandler.Create( 0, @OnLargeScaleCommandPacket)); end; end; @@ -562,17 +565,21 @@ var size: Integer; index: TGenericIndex; begin + // Карта if AWorldBlock is TMapBlock then begin FMap.Position := ((AWorldBlock.X * FHeight) + AWorldBlock.Y) * 196; AWorldBlock.Write(FMap); AWorldBlock.Changed := False; + // Статика end else if AWorldBlock is TStaticBlock then begin FStaIdx.Position := ((AWorldBlock.X * FHeight) + AWorldBlock.Y) * 12; index := TGenericIndex.Create(FStaIdx); size := AWorldBlock.GetSize; - if (size > index.Size) or (index.Lookup < 0) then + // Если размер блока больше чем в мул файле или в мул файле блока нет или + // смещение на блок равно 0 (статика океана), то создаем новый блок в конце файла + if (size > index.Size) or (index.Lookup <= 0) then begin FStatics.Position := FStatics.Size; index.Lookup := FStatics.Position; @@ -799,7 +806,7 @@ begin if (staticInfo.X = newX) and (staticInfo.Y = newY) then Exit; if ((abs(staticInfo.X - newX) > 8) or (abs(staticInfo.Y - newY) > 8)) and - (not ValidateAccess(ANetState, alAdministrator)) then Exit; + (not ValidateAccess(ANetState, alDeveloper)) then Exit; sourceBlock := GetStaticBlock(staticInfo.X div 8, staticInfo.Y div 8); targetBlock := GetStaticBlock(newX div 8, newY div 8); @@ -946,10 +953,10 @@ var cmOperation: TLSCopyMove; additionalAffectedBlocks: TBits; begin - if not ValidateAccess(ANetState, alAdministrator) then Exit; - Writeln(TimeStamp, ANetState.Account.Name, ' begins large scale operation'); + if not ValidateAccess(ANetState, alDeveloper) then Exit; + Writeln(TimeStamp, ANetState.Account.Name, ' ' + GetText('LCmdRuns')); CEDServerInstance.SendPacket(nil, TServerStatePacket.Create(ssOther, - Format('%s is performing large scale operations ...', [ANetState.Account.Name]))); + Format(GetText('LCmdUsed'), [ANetState.Account.Name]))); //Bitmask emptyBits := TBits.Create(64); @@ -1157,7 +1164,7 @@ begin end; CEDServerInstance.SendPacket(nil, TServerStatePacket.Create(ssRunning)); - Writeln(TimeStamp, 'Large scale operation ended.'); + Writeln(TimeStamp, GetText('LCmdEnds')); end; end. diff --git a/Server/UPacketHandlers.pas b/Server/UPacketHandlers.pas index e27f85c..7dc6bcc 100644 --- a/Server/UPacketHandlers.pas +++ b/Server/UPacketHandlers.pas @@ -29,7 +29,7 @@ interface uses Classes, SysUtils, dzlib, UConfig, UNetState, UEnhancedMemoryStream, UEnums, - ULinkedList, URegions; + ULinkedList, URegions, LConvEncoding, Language; type TPacketProcessor = procedure(ABuffer: TEnhancedMemoryStream; ANetState: TNetState); @@ -151,7 +151,7 @@ begin uncompStream.Unlock; end else begin - Writeln(TimeStamp, 'Dropping client due to unknown packet: ', ANetState.Socket.PeerAddress); + Writeln(TimeStamp, GetText('UnkPack1'), packetID, GetText('UnkPack2') + ' ', ANetState.Socket.PeerAddress); ANetState.ReceiveQueue.Clear; CEDServerInstance.Disconnect(ANetState.Socket); end; diff --git a/Server/URadarMap.pas b/Server/URadarMap.pas index e772f05..01296e7 100644 --- a/Server/URadarMap.pas +++ b/Server/URadarMap.pas @@ -60,7 +60,7 @@ type implementation uses - UPacket, UPackets, UPacketHandlers, UCEDServer, crc; + UPacket, UPackets, UPacketHandlers, UCEDServer, crc, UStatics; type TMulIndex = packed record @@ -72,6 +72,13 @@ type TileID: Word; Altitude: ShortInt; end; + TOldStaticItem = packed record + Unknown: Cardinal; + TileID: Word; + X, Y: Byte; + Z: ShortInt; + Hue: Word; + end; TStaticItem = packed record TileID: Word; X, Y: Byte; @@ -138,6 +145,7 @@ var radarcol: TFileStream; count, i, item, highestZ: Integer; staticsItems: array of TStaticItem; + oldStaticsItems: array of TOldStaticItem; mapCell: TMapCell; index: TMulIndex; begin @@ -161,21 +169,39 @@ begin AMap.Seek(193, soFromCurrent); FRadarMap[i] := FRadarColors[mapCell.TileID]; AStaIdx.Read(index, SizeOf(TMulIndex)); - if (index.Position < $FFFFFFFF) and (index.Size > 0) then + if (index.Position < $FFFFFFFF) and (index.Size > 0) + and (index.Position + index.Size < AStatics.Size) then begin AStatics.Position := index.Position; - SetLength(staticsItems, index.Size div 7); - AStatics.Read(staticsItems[0], index.Size); - highestZ := mapCell.Altitude; - for item := Low(staticsItems) to High(staticsItems) do + if not UseStaticsOldFormat then begin - if (staticsItems[item].X = 0) and (staticsItems[item].Y = 0) and - (staticsItems[item].Z >= highestZ) then + SetLength(staticsItems, index.Size div 7); + AStatics.Read(staticsItems[0], index.Size); + highestZ := mapCell.Altitude; + for item := Low(staticsItems) to High(staticsItems) do begin - highestZ := staticsItems[item].Z; - FRadarMap[i] := FRadarColors[staticsItems[item].TileID + $4000]; + if (staticsItems[item].X = 0) and (staticsItems[item].Y = 0) and + (staticsItems[item].Z >= highestZ) then + begin + highestZ := staticsItems[item].Z; + FRadarMap[i] := FRadarColors[staticsItems[item].TileID + $4000]; + end; + end; + end else begin + SetLength(oldStaticsItems, index.Size div 11); + AStatics.Read(oldStaticsItems[0], index.Size); + highestZ := mapCell.Altitude; + for item := Low(oldStaticsItems) to High(oldStaticsItems) do + begin + if (oldStaticsItems[item].X = 0) and (oldStaticsItems[item].Y = 0) and + (oldStaticsItems[item].Z >= highestZ) then + begin + highestZ := oldStaticsItems[item].Z; + FRadarMap[i] := FRadarColors[oldStaticsItems[item].TileID + $4000]; + end; end; end; + end; end; diff --git a/Server/cedserver.lpi b/Server/cedserver.lpi index cc732e2..59a1d5d 100644 --- a/Server/cedserver.lpi +++ b/Server/cedserver.lpi @@ -1,29 +1,30 @@ <?xml version="1.0"?> <CONFIG> <ProjectOptions> - <Version Value="7"/> + <Version Value="9"/> <General> <Flags> <MainUnitHasUsesSectionForAllUnits Value="False"/> + <MainUnitHasCreateFormStatements Value="False"/> <LRSInOutputDirectory Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> - <TargetFileExt Value=".exe"/> + <UseAppBundle Value="False"/> + <UseXPManifest Value="True"/> + <Icon Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> - <CurrentMajorRevNr Value="6"/> - <CurrentMinorRevNr Value="1"/> - <CurrentBuildNr Value="209"/> - <ProjectVersion Value="0.6.1.209"/> - <CompanyName Value="AKS DataBasis"/> - <FileDescription Value="CentrED Server"/> - <InternalName Value="CentrED Server"/> - <LegalCopyright Value="Andreas Schneider"/> - <OriginalFilename Value="cedserver.exe"/> - <ProductName Value="CentrED"/> + <AutoIncrementBuild Value="True"/> + <MinorVersionNr Value="7"/> + <RevisionNr Value="7"/> + <BuildNr Value="261"/> + <StringTable CompanyName="www.uoquint.ru" FileDescription="UO CentrED+ Server" InternalName="CentrED+ Server" LegalCopyright="StaticZ" OriginalFilename="cedserver.exe" ProductName="CentrED+ Server" ProductVersion=""/> </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="default" Default="True"/> + </BuildModes> <PublishOptions> <Version Value="2"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> @@ -43,7 +44,7 @@ <PackageName Value="lnetbase"/> </Item2> </RequiredPackages> - <Units Count="16"> + <Units Count="17"> <Unit0> <Filename Value="cedserver.lpr"/> <IsPartOfProject Value="True"/> @@ -124,40 +125,41 @@ <IsPartOfProject Value="True"/> <UnitName Value="UMap"/> </Unit15> + <Unit16> + <Filename Value="language.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="Language"/> + </Unit16> </Units> </ProjectOptions> <CompilerOptions> - <Version Value="8"/> + <Version Value="9"/> <Target> - <Filename Value="../bin/cedserver"/> + <Filename Value="../bin/PEBinaries/cedserver.exe"/> </Target> <SearchPaths> - <IncludeFiles Value="../;../Imaging/"/> - <OtherUnitFiles Value="../;../UOLib/;../MulProvider/;../Imaging/ZLib/"/> + <IncludeFiles Value="..;../obj;../Imaging"/> + <OtherUnitFiles Value="..;../UOLib;../Server;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;../Client"/> <UnitOutputDirectory Value="../obj"/> - <SrcPath Value="../;../UOLib/;../MulProvider/;../Imaging/ZLib/"/> </SearchPaths> <Parsing> <SyntaxOptions> - <CStyleOperator Value="False"/> + <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <CodeGeneration> - <SmartLinkUnit Value="True"/> + <TargetProcessor Value="pentium4"/> + <TargetCPU Value="i386"/> + <TargetOS Value="win32"/> <Optimizations> <OptimizationLevel Value="3"/> </Optimizations> </CodeGeneration> - <Linking> - <Debugging> - <UseLineInfoUnit Value="False"/> - <StripSymbols Value="True"/> - </Debugging> - <LinkSmart Value="True"/> - </Linking> <Other> - <CustomOptions Value="-FE../bin/ --dNoLogging"/> + <CompilerMessages> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CustomOptions Value="-dWindows"/> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> diff --git a/Server/cedserver.lpr b/Server/cedserver.lpr index 5c1b5b6..80fb21c 100644 --- a/Server/cedserver.lpr +++ b/Server/cedserver.lpr @@ -31,44 +31,53 @@ uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} - SysUtils, UConfig, UCEDServer; + SysUtils, UConfig, UCEDServer, LConvEncoding, vinfo, Language; {$I version.inc} -{$IFDEF WINDOWS}{$R cedserver.rc}{$ENDIF} +//{$IFDEF WINDOWS}{$R cedserver.rc}{$ENDIF} + +{$R *.res} + begin Writeln(''); - Writeln('CentrED Server Version ', ProductVersion); - Writeln('Copyright ', Copyright); + Writeln(Format('======= CentrED+ Server [Version: %s Build: %d] =======', + [VersionInfo.GetFileVersionString, VersionInfo.Build])); + Writeln('Copyright: ', Original); + Writeln(' : ', '"CentrED+" version (c) ', Copyright, ' (uoquint.ru)'); + //Writeln(' : ', '!!! pre-release (not stable version) !!!'); + //Writeln('Modified by StaticZ (uoquint.ru)'); //Writeln('================================'); - Writeln(''); {$IFDEF Windows} if FileExists(ConfigFile) then Config := TConfig.Create(ConfigFile) else Config := TConfig.Init(ConfigFile); + LanguageLoad(Config.Language); {$ELSE} if ParamStr(1) = '--init' then Config := TConfig.Init(ConfigFile) else if FileExists(ConfigFile) then Config := TConfig.Create(ConfigFile) else begin - Writeln('No valid config file was found. Use --init to create one.'); + Writeln(UTF8ToCP866('Файл конфигурации не был найден. Запустите програму с параметром --init чтобы создать новый файл конфигурации.')); Halt; end; + LanguageLoad(Config.Language); {$ENDIF} - - Writeln(TimeStamp, 'Initialization started'); + + Writeln(TimeStamp, GetText('xmLoaded') + ' "' + ExtractFileName(ConfigFile) + '"'); + Writeln(TimeStamp, GetText('dfStRead')); Randomize; CEDServerInstance := TCEDServer.Create; - Writeln(TimeStamp, 'Initialization done'); + Writeln(TimeStamp, GetText('dfInited')); CEDServerInstance.Run; - Write(TimeStamp, 'Shutting down ... '); + Write(TimeStamp, GetText('Quieting')); FreeAndNil(CEDServerInstance); Config.Flush; FreeAndNil(Config); - Writeln('done'); + Writeln(GetText('SucsDone')); end. diff --git a/Server/language.pas b/Server/language.pas new file mode 100644 index 0000000..4bba9f0 --- /dev/null +++ b/Server/language.pas @@ -0,0 +1,120 @@ +(* + * CDDL HEADER START + * + * gfgfgfg + *) +unit Language; +{$mode objfpc}{$H+} + +interface + +procedure LanguageLoad(path: string); +function TranslateText(text: string) : string; +function TranslateTextA(text: string) : string; +function GetText(section : string; key: string) : string; +function GetText(key: string) : string; + + + +implementation +uses SysUtils, Classes, IniFiles, LConvEncoding, UConfig; + + +var + LangPath : string; + LangFile : TIniFile; + CodePage : Integer; + WinIsoCP : Integer; + LangAbbr : string; + LangName : string; + +procedure LanguageLoad(path: string); +begin + if (Copy(path, 2, 1) = ':') + then LangPath := path + else LangPath := ExtractFilePath(ParamStr(0)) + path; + + if not FileExists(LangPath) then begin + Writeln(TranslateText('Language files doesn''t exists: "' + LangPath + '"')); + Halt; + end; + + LangFile := TIniFile.Create(LangPath); + LangAbbr := LangFile.ReadString( 'info', 'LangAbbr', ''); + WinIsoCP := LangFile.ReadInteger(' info', 'CodePage', 1250); + CodePage := LangFile.ReadInteger('Server', 'CodePage', 850); + LangName := LangFile.ReadString('info', 'Language', ''); + + Writeln(TimeStamp, GetText('iLangUse') + ' ', TranslateText(LangName)); +end; + +function LanguageGetName() : string; +begin + Result := LangName; +end; + +function TranslateText(text: string) : string; +begin + case CodePage of + 437 : Result := UTF8ToCP437(text); + 850 : Result := UTF8ToCP850(text); + 866 : Result := UTF8ToCP866(text); + 874 : Result := UTF8ToCP874(text); + 932 : Result := UTF8ToCP932(text); + 936 : Result := UTF8ToCP936(text); + 949 : Result := UTF8ToCP949(text); + 950 : Result := UTF8ToCP950(text); + 1250 : Result := UTF8ToCP1250(text); + 1251 : Result := UTF8ToCP1251(text); + 1252 : Result := UTF8ToCP1252(text); + 1253 : Result := UTF8ToCP1253(text); + 1254 : Result := UTF8ToCP1254(text); + 1255 : Result := UTF8ToCP1255(text); + 1256 : Result := UTF8ToCP1256(text); + 1257 : Result := UTF8ToCP1257(text); + 1258 : Result := UTF8ToCP1258(text); + else Result := UTF8ToCP1250(text); + end; +end; + +function TranslateTextA(text: string) : string; +begin + case WinIsoCP of + 437 : Result := TranslateText(CP437ToUTF8(text)); + 850 : Result := TranslateText(CP850ToUTF8(text)); + 866 : Result := TranslateText(CP866ToUTF8(text)); + 874 : Result := TranslateText(CP874ToUTF8(text)); + 932 : Result := TranslateText(CP932ToUTF8(text)); + 936 : Result := TranslateText(CP936ToUTF8(text)); + 949 : Result := TranslateText(CP949ToUTF8(text)); + 950 : Result := TranslateText(CP950ToUTF8(text)); + 1250 : Result := TranslateText(CP1250ToUTF8(text)); + 1251 : Result := TranslateText(CP1251ToUTF8(text)); + 1252 : Result := TranslateText(CP1252ToUTF8(text)); + 1253 : Result := TranslateText(CP1253ToUTF8(text)); + 1254 : Result := TranslateText(CP1254ToUTF8(text)); + 1255 : Result := TranslateText(CP1255ToUTF8(text)); + 1256 : Result := TranslateText(CP1256ToUTF8(text)); + 1257 : Result := TranslateText(CP1257ToUTF8(text)); + 1258 : Result := TranslateText(CP1258ToUTF8(text)); + else Result := TranslateText(CP1250ToUTF8(text)); + end; +end; + +function GetText(section : string; key: string) : string; +var text : string; +begin + text := LangFile.ReadString(section, key, ''); + if (text <> '') + then result := TranslateText(text) + else result := Format('%%%%[%s]%s%%%%', [section, key]); +end; + +function GetText(key: string) : string; +begin + Result := GetText('Server', key); +end; + + +end. + diff --git a/UEnums.pas b/UEnums.pas index c4ef38c..ba4f56d 100644 --- a/UEnums.pas +++ b/UEnums.pas @@ -43,6 +43,7 @@ type TAccessLevel = (alNone = 0, alView = 1, alNormal = 2, + alDeveloper = 3, alAdministrator = 255); TModifyUserStatus = (muInvalidUsername = 0, diff --git a/UOLib/UArt.pas b/UOLib/UArt.pas index 359437b..4f16b6b 100644 --- a/UOLib/UArt.pas +++ b/UOLib/UArt.pas @@ -36,9 +36,9 @@ uses type TArtType = (atLand, atStatic, atLandFlat); TArt = class(TMulBlock) - constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType); overload; - constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AHue: THue; APartialHue: Boolean); overload; - constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AArtColor: Word; AHue: THue; APartialHue: Boolean); overload; + constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; OldFormat: Boolean = False); overload; + constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AHue: THue; APartialHue: Boolean; OldFormat: Boolean = False); overload; + constructor Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AArtColor: Word; AHue: THue; APartialHue: Boolean; OldFormat: Boolean = False); overload; destructor Destroy; override; function Clone: TArt; override; function GetSize: Integer; override; @@ -60,19 +60,19 @@ implementation type PWordArray = ^TWordArray; - TWordArray = array[0..16383] of Word; + TWordArray = array[0..(MaxInt div SizeOf(Word) - 1)] of Word; // а не перебор ли? -constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType); +constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; OldFormat: Boolean = False); begin - Create(AData, AIndex, AArtType, 0, nil, False); + Create(AData, AIndex, AArtType, 0, nil, False, OldFormat); end; -constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AHue: THue; APartialHue: Boolean); +constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AHue: THue; APartialHue: Boolean; OldFormat: Boolean = False); begin - Create(AData, AIndex, AArtType, 0, AHue, APartialHue); + Create(AData, AIndex, AArtType, 0, AHue, APartialHue, OldFormat); end; -constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AArtColor: Word; AHue: THue; APartialHue: Boolean); +constructor TArt.Create(AData: TStream; AIndex: TGenericIndex; AArtType: TArtType; AArtColor: Word; AHue: THue; APartialHue: Boolean; OldFormat: Boolean = False); var i, x, y, start: Integer; iCurrentHeight, iCurrentWidth: Integer; @@ -95,7 +95,7 @@ begin block.Position := 0; if AArtType = atLand then - begin + begin // Lands FGraphic:= TSingleImage.CreateFromParams(44, 44, ifA1R5G5B5); FillWord(FGraphic.Bits^, 44 * 44, AArtColor); for y := 0 to 21 do @@ -111,7 +111,7 @@ begin for i := 0 to 44 * 44 - 1 do PWordArray(FGraphic.Bits)^[i] := PWordArray(FGraphic.Bits)^[i] xor $8000; //invert alpha bit end else if AArtType = atLandFlat then - begin + begin // Lands FGraphic:= TSingleImage.CreateFromParams(44, 44, ifA1R5G5B5); for i := 1 to 22 do begin @@ -138,7 +138,7 @@ begin for i := 0 to 44 * 44 - 1 do PWordArray(FGraphic.Bits)^[i] := PWordArray(FGraphic.Bits)^[i] xor $8000; //invert alpha bit end else if AArtType = atStatic then - begin + begin // Items block.Read(FHeader, SizeOf(LongInt)); block.Read(width, SizeOf(SmallInt)); block.Read(height, SizeOf(SmallInt)); @@ -151,25 +151,46 @@ begin block.Read(offset, SizeOf(Word)); lookup[i] := start + (offset * 2); end; - for iCurrentHeight := 0 to height - 1 do - begin - block.Position := lookup[iCurrentHeight]; - iCurrentWidth := 0; - P := FGraphic.Bits + iCurrentHeight * width * 2; - while (block.Read(offset, SizeOf(Word)) = SizeOf(Word)) and - (block.Read(run, SizeOf(Word)) = SizeOf(Word)) and - (offset + run <> 0) do + if not OldFormat then begin // General Clients + for iCurrentHeight := 0 to height - 1 do begin - inc(iCurrentWidth, offset); - for i := 0 to run - 1 do + block.Position := lookup[iCurrentHeight]; + iCurrentWidth := 0; + P := FGraphic.Bits + iCurrentHeight * width * 2; + while (block.Read(offset, SizeOf(Word)) = SizeOf(Word)) and + (block.Read(run, SizeOf(Word)) = SizeOf(Word)) and + (offset + run <> 0) do begin - block.Read(color, SizeOf(Word)); - P^[iCurrentWidth + i] := color; + inc(iCurrentWidth, offset); + for i := 0 to run - 1 do + begin + block.Read(color, SizeOf(Word)); + P^[iCurrentWidth + i] := color; + end; + inc(iCurrentWidth, run); + end; + end; + end else begin // OldFormat (Pre-Alpha Client) + for iCurrentHeight := 0 to height - 1 do + begin + block.Position := lookup[iCurrentHeight]; + iCurrentWidth := 0; + P := FGraphic.Bits + iCurrentHeight * width * 2; + if (block.Read(offset, SizeOf(Word)) = SizeOf(Word)) and + (block.Read(run, SizeOf(Word)) = SizeOf(Word)) then + begin + inc(iCurrentWidth, offset); + for i := 0 to run - 1 do + begin + block.Read(color, SizeOf(Word)); + if color <> $0000 then + P^[iCurrentWidth + i] := color; + end; + inc(iCurrentWidth, run); end; - inc(iCurrentWidth, run); end; end; - + if AHue <> nil then begin for i := 0 to width * height - 1 do diff --git a/UOLib/ULight.pas b/UOLib/ULight.pas index dc14357..015eba2 100644 --- a/UOLib/ULight.pas +++ b/UOLib/ULight.pas @@ -76,8 +76,8 @@ begin for y := 0 to Height - 1 do for x := 0 to Width - 1 do begin - buffer.Read(color, SizeOf(byte)); - color32.R := color * 8; + buffer.Read(color, SizeOf(Byte)); + color32.R := Byte(color * 8); color32.G := color32.R; color32.B := color32.R; if color > 0 then diff --git a/UOLib/UMap.pas b/UOLib/UMap.pas index a223cd6..7809863 100644 --- a/UOLib/UMap.pas +++ b/UOLib/UMap.pas @@ -46,14 +46,14 @@ type protected FIsGhost: Boolean; FGhostZ: ShortInt; - FGhostID: Word; - function GetTileID: Word; override; + FGhostID: LongWord; + function GetTileID: LongWord; override; function GetZ: ShortInt; override; public property Altitude: ShortInt read GetZ write SetZ; property IsGhost: Boolean read FIsGhost write FIsGhost; property GhostZ: ShortInt read FGhostZ write FGhostZ; - property GhostID: Word write FGhostID; + property GhostID: LongWord write FGhostID; function Clone: TMapCell; override; function GetSize: Integer; override; @@ -114,7 +114,7 @@ begin Create(AOwner, AData, 0, 0); end; -function TMapCell.GetTileID: Word; +function TMapCell.GetTileID: LongWord; begin if FIsGhost then Result := FGhostID diff --git a/UOLib/UStatics.pas b/UOLib/UStatics.pas index 08535ca..aac0895 100644 --- a/UOLib/UStatics.pas +++ b/UOLib/UStatics.pas @@ -42,6 +42,7 @@ type protected { Members } FHue: Word; + FUnknown: Cardinal; // for old pre-alpha clients only { Methods } procedure SetHue(AValue: Word); @@ -82,6 +83,11 @@ type function CompareStaticItems(const AStatic1, AStatic2: TStaticItem): Integer; +var +UseStaticsOldFormat: Boolean; // Использование старого формата pre-Alpha +// Очень не красивое и плозое решение, но делать по уму слишком сложно, так +// как это требует переписывание большой части кода на работу с интерфейсами. + implementation function CompareStaticItems(const AStatic1, AStatic2: TStaticItem): Integer; @@ -100,6 +106,8 @@ begin if AData <> nil then begin + if UseStaticsOldFormat + then AData.Read(FUnknown, SizeOf(Cardinal));; AData.Read(FTileID, SizeOf(SmallInt)); AData.Read(iX, SizeOf(Byte)); AData.Read(iY, SizeOf(Byte)); @@ -128,6 +136,7 @@ end; function TStaticItem.Clone: TStaticItem; begin Result := TStaticItem.Create(nil, nil); + Result.FUnknown:= FUnknown; Result.FTileID := FTileID; Result.FX := FX; Result.FY := FY; @@ -137,7 +146,9 @@ end; function TStaticItem.GetSize: Integer; begin - Result := 7; + if not UseStaticsOldFormat + then Result := 7 + else Result := 11; end; procedure TStaticItem.UpdatePriorities(ATileData: TStaticTiledata; @@ -159,6 +170,8 @@ begin iX := FX mod 8; iY := FY mod 8; + if UseStaticsOldFormat + then AData.Write(FUnknown, SizeOf(Cardinal));; AData.Write(FTileID, SizeOf(SmallInt)); AData.Write(iX, SizeOf(Byte)); AData.Write(iY, SizeOf(Byte)); @@ -171,7 +184,7 @@ end; constructor TStaticBlock.Create(AData: TStream; AIndex: TGenericIndex; AX, AY: Word); var - i: Integer; + i, size: Integer; block: TMemoryStream; begin inherited Create; @@ -179,13 +192,16 @@ begin FY := AY; FItems := TStaticItemList.Create(True); - if (AData <> nil) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then + if (AData <> nil) and (AIndex.Lookup >= 0) and (AIndex.Size > 0) then begin AData.Position := AIndex.Lookup; block := TMemoryStream.Create; block.CopyFrom(AData, AIndex.Size); block.Position := 0; - for i := 1 to (AIndex.Size div 7) do + if not UseStaticsOldFormat + then size := 7 + else size := 11; + for i := 1 to (AIndex.Size div size) do FItems.Add(TStaticItem.Create(Self, block, AX, AY)); block.Free; end; @@ -214,7 +230,9 @@ end; function TStaticBlock.GetSize: Integer; begin - Result := FItems.Count * 7; + if not UseStaticsOldFormat + then Result := FItems.Count * 7 + else Result := FItems.Count * 11; end; procedure TStaticBlock.ReverseWrite(AData: TStream); diff --git a/UOLib/UTexture.pas b/UOLib/UTexture.pas index f03650d..419e039 100644 --- a/UOLib/UTexture.pas +++ b/UOLib/UTexture.pas @@ -30,7 +30,7 @@ unit UTexture; interface uses - Classes, Imaging, ImagingTypes, ImagingClasses, UMulBlock, UGenericIndex; + Classes, Imaging, ImagingTypes, ImagingClasses, UMulBlock, UArt, UGenericIndex; type TTexture = class(TMulBlock) @@ -51,8 +51,19 @@ type property Extra: Integer read FExtra write FExtra; end; + TOldTexture = class(TTexture) + constructor Create(AData: TStream; AIndex: TGenericIndex); overload; + constructor Create(AExtra: Integer); overload; + constructor Create(AId: Cardinal); + private + FArtTile: TArt; + end; + implementation +uses + UGameResources;//, Logging; + constructor TTexture.Create(AData: TStream; AIndex: TGenericIndex); var size: Integer; @@ -132,5 +143,30 @@ begin argbGraphic.Free; end; + +// TOldTexture - перегрузка класса, для работы с текстурами пре альфа клиента + +constructor TOldTexture.Create(AId: Cardinal); +var + extradata: Integer; +begin + FArtTile := ResMan.Art.GetArt($4000 + AId, 0, nil, False); + if (FArtTile.Graphic.Width <= 64) then extradata := 0 else extradata := 1; + inherited Create(extradata); // Клиент использует не правильные текстуры + FArtTile.Graphic.StretchTo(0,0,FArtTile.Graphic.Width,FArtTile.Graphic.Height, + FGraphic, 0,0,FGraphic.Width,FGraphic.Height, rfBilinear ); + //FArtTile.Destroy; // Надо ли удалять тайл? +end; + +constructor TOldTexture.Create(AData: TStream; AIndex: TGenericIndex); +begin + inherited Create(0); +end; + +constructor TOldTexture.Create(AExtra: Integer); +begin + inherited Create(AExtra); +end; + end. diff --git a/UOLib/UTiledata.pas b/UOLib/UTiledata.pas index 5844cac..92f2ece 100644 --- a/UOLib/UTiledata.pas +++ b/UOLib/UTiledata.pas @@ -33,9 +33,14 @@ uses Classes, SysUtils, UMulBlock; const - LandTileDataSize = 26; + LandOldTileDataSize = 26; + LandOldTileGroupSize = 4 + 32 * LandOldTileDataSize; + StaticOldTileDataSize = 37; + StaticOldTileGroupSize = 4 + 32 * StaticOldTileDataSize; + + LandTileDataSize = 30; LandTileGroupSize = 4 + 32 * LandTileDataSize; - StaticTileDataSize = 37; + StaticTileDataSize = 41; StaticTileGroupSize = 4 + 32 * StaticTileDataSize; type @@ -54,6 +59,7 @@ type TTiledata = class(TMulBlock) protected FFlags: TTileDataFlags; + FFlags2 : LongWord; FTileName: string; public property Flags: TTileDataFlags read FFlags write FFlags; @@ -63,7 +69,7 @@ type { TLandTiledata } TLandTiledata = class(TTiledata) - constructor Create(AData: TStream); + constructor Create(AData: TStream); virtual; destructor Destroy; override; function Clone: TLandTiledata; override; function GetSize: Integer; override; @@ -74,10 +80,20 @@ type property TextureID: Word read FTextureID write FTextureID; end; + { TLandOldTiledata } + + TLandOldTiledata = class(TLandTiledata) + constructor Create(AData: TStream); overload; override; + destructor Destroy; overload; override; + function Clone: TLandTiledata; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + end; + { TStaticTiledata } TStaticTiledata = class(TTiledata) - constructor Create(AData: TStream); + constructor Create(AData: TStream); virtual; destructor Destroy; override; function Clone: TStaticTiledata; override; function GetSize: Integer; override; @@ -106,10 +122,19 @@ type property Height: Byte read FHeight write FHeight; end; + { TStaticOldTiledata } + TStaticOldTiledata = class(TStaticTiledata) + constructor Create(AData: TStream); overload; override; + destructor Destroy; overload; override; + function Clone: TStaticTiledata; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + end; + { TLandTileGroup } TLandTileGroup = class(TMulBlock) - constructor Create(AData: TStream); + constructor Create(AData: TStream); virtual; destructor Destroy; override; function Clone: TLandTileGroup; override; function GetSize: Integer; override; @@ -121,10 +146,19 @@ type property Unknown: LongInt read FUnknown write FUnknown; end; + { TLandOldTileGroup } + TLandOldTileGroup = class(TLandTileGroup) + constructor Create(AData: TStream); overload; override; + destructor Destroy; overload; override; + function Clone: TLandTileGroup; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + end; + { TStaticTileGroup } TStaticTileGroup = class(TMulBlock) - constructor Create(AData: TStream); + constructor Create(AData: TStream); virtual; destructor Destroy; override; function Clone: TStaticTileGroup; override; function GetSize: Integer; override; @@ -136,11 +170,22 @@ type property Unknown: LongInt read FUnknown write FUnknown; end; -function GetTileDataOffset(ABlock: Integer): Integer; + { TStaticOldTileGroup } + + TStaticOldTileGroup = class(TStaticTileGroup) + constructor Create(AData: TStream); overload; override; + destructor Destroy; overload; override; + function Clone: TStaticTileGroup; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + end; + + +function GetTileDataOffset(ABlock: Integer; OldFormat: Boolean = False): Integer; implementation -function GetTileDataOffset(ABlock: Integer): Integer; +function GetTileDataOffset(ABlock: Integer; OldFormat: Boolean = False): Integer; var group, tile: Integer; begin @@ -150,14 +195,19 @@ begin group := ABlock div 32; tile := ABlock mod 32; - Result := 512 * LandTileGroupSize + group * StaticTileGroupSize + 4 - + tile * StaticTileDataSize; + if OldFormat + then Result := 512 * LandOldTileGroupSize + group * StaticOldTileGroupSize + + 4 + tile * StaticOldTileDataSize + else Result := 512 * LandTileGroupSize + group * StaticTileGroupSize + + 4 + tile * StaticTileDataSize; end else begin group := ABlock div 32; tile := ABlock mod 32; - Result := group * LandTileGroupSize + 4 + tile * LandTileDataSize; + if OldFormat + then Result := group * LandOldTileGroupSize + 4 + tile * LandOldTileDataSize + else Result := group * LandTileGroupSize + 4 + tile * LandTileDataSize; end; end; @@ -169,6 +219,7 @@ begin if assigned(AData) then begin AData.Read(FFlags, SizeOf(LongWord)); + AData.Read(FFlags2, SizeOf(LongWord)); AData.Read(FTextureID, SizeOf(Word)); AData.Read(PChar(FTileName)^, 20); end; @@ -185,6 +236,7 @@ function TLandTiledata.Clone: TLandTiledata; begin Result := TLandTiledata.Create(nil); Result.FFlags := FFlags; + Result.FFlags2:= FFlags2; Result.FTextureID := FTextureID; Result.FTileName := FTileName; end; @@ -197,6 +249,7 @@ begin for i := Length(FTileName) to 20 do FTileName := FTileName + #0; AData.Write(FFlags, SizeOf(LongWord)); + AData.Write(FFlags2, SizeOf(LongWord)); AData.Write(FTextureID, SizeOf(Word)); AData.Write(PChar(FTileName)^, 20); end; @@ -206,6 +259,53 @@ begin GetSize := LandTileDataSize; end; +{ TLandOldTiledata } + +constructor TLandOldTiledata.Create(AData: TStream); +begin + SetLength(FTileName, 20); + if assigned(AData) then + begin + AData.Read(FFlags, SizeOf(LongWord)); + FFlags2 := 0; + AData.Read(FTextureID, SizeOf(Word)); + AData.Read(PChar(FTileName)^, 20); + end; + FTileName := Trim(FTileName); +end; + +destructor TLandOldTiledata.Destroy; +begin + SetLength(FTileName, 0); + inherited; +end; + +function TLandOldTiledata.Clone: TLandTiledata; +begin + Result := TLandOldTiledata.Create(nil); + Result.FFlags := FFlags; + Result.FFlags2:= FFlags2; + Result.FTextureID := FTextureID; + Result.FTileName := FTileName; +end; + +procedure TLandOldTiledata.Write(AData: TStream); +var + i: Integer; +begin + if Length(FTileName) < 20 then + for i := Length(FTileName) to 20 do + FTileName := FTileName + #0; + AData.Write(FFlags, SizeOf(LongWord)); + AData.Write(FTextureID, SizeOf(Word)); + AData.Write(PChar(FTileName)^, 20); +end; + +function TLandOldTiledata.GetSize: Integer; +begin + GetSize := LandOldTileDataSize; +end; + { TStaticTiledata} constructor TStaticTiledata.Create(AData: TStream); @@ -214,6 +314,7 @@ begin if AData <> nil then begin AData.Read(FFlags, SizeOf(LongWord)); + AData.Read(FFlags2, SizeOf(LongWord)); AData.Read(FWeight, SizeOf(Byte)); AData.Read(FQuality, SizeOf(Byte)); AData.Read(FUnknown1, SizeOf(Word)); @@ -239,6 +340,7 @@ function TStaticTiledata.Clone: TStaticTiledata; begin Result := TStaticTiledata.Create(nil); Result.FFlags := FFlags; + Result.FFlags2:= FFlags2; Result.FWeight := FWeight; Result.FQuality := FQuality; Result.FUnknown1 := FUnknown1; @@ -260,6 +362,7 @@ begin for i := Length(FTileName) to 20 do FTileName := FTileName + #0; AData.Write(FFlags, SizeOf(LongWord)); + AData.Write(FFlags2, SizeOf(LongWord)); AData.Write(FWeight, SizeOf(Byte)); AData.Write(FQuality, SizeOf(Byte)); AData.Write(FUnknown1, SizeOf(Word)); @@ -278,6 +381,80 @@ begin GetSize := StaticTileDataSize; end; +{ TStaticOldTiledata } + +constructor TStaticOldTiledata.Create(AData: TStream); +begin + SetLength(FTileName, 20); + if AData <> nil then + begin + AData.Read(FFlags, SizeOf(LongWord)); + FFlags2 := 0; + AData.Read(FWeight, SizeOf(Byte)); + AData.Read(FQuality, SizeOf(Byte)); + AData.Read(FUnknown1, SizeOf(Word)); + AData.Read(FUnknown2, SizeOf(Byte)); + AData.Read(FQuantity, SizeOf(Byte)); + AData.Read(FAnimID, SizeOf(Word)); + AData.Read(FUnknown3, SizeOf(Byte)); + AData.Read(FHue, SizeOf(Byte)); + AData.Read(FUnknown4, SizeOf(Word)); + AData.Read(FHeight, SizeOf(Byte)); + AData.Read(PChar(FTileName)^, 20); + end; + FTileName := Trim(FTileName); +end; + +destructor TStaticOldTiledata.Destroy; +begin + SetLength(FTileName, 0); + inherited; +end; + +function TStaticOldTiledata.Clone: TStaticTiledata; +begin + Result := TStaticOldTiledata.Create(nil); + Result.FFlags := FFlags; + Result.FFlags2:= FFlags2; + Result.FWeight := FWeight; + Result.FQuality := FQuality; + Result.FUnknown1 := FUnknown1; + Result.FUnknown2 := FUnknown2; + Result.FQuantity := FQuantity; + Result.FAnimID := FAnimID; + Result.FUnknown3 := FUnknown3; + Result.FHue := FHue; + Result.FUnknown4 := FUnknown4; + Result.FHeight := FHeight; + Result.FTileName := FTileName; +end; + +procedure TStaticOldTiledata.Write(AData: TStream); +var + i: Integer; +begin + if Length(FTileName) < 20 then + for i := Length(FTileName) to 20 do + FTileName := FTileName + #0; + AData.Write(FFlags, SizeOf(LongWord)); + AData.Write(FWeight, SizeOf(Byte)); + AData.Write(FQuality, SizeOf(Byte)); + AData.Write(FUnknown1, SizeOf(Word)); + AData.Write(FUnknown2, SizeOf(Byte)); + AData.Write(FQuantity, SizeOf(Byte)); + AData.Write(FAnimID, SizeOf(Word)); + AData.Write(FUnknown3, SizeOf(Byte)); + AData.Write(FHue, SizeOf(Byte)); + AData.Write(FUnknown4, SizeOf(Word)); + AData.Write(FHeight, SizeOf(Byte)); + AData.Write(PChar(FTileName)^, 20); +end; + +function TStaticOldTiledata.GetSize: Integer; +begin + GetSize := StaticOldTileDataSize; +end; + { TLandTileGroup } constructor TLandTileGroup.Create(AData: TStream); @@ -325,6 +502,53 @@ begin GetSize := LandTileGroupSize; end; +{ TLandOldTileGroup } + +constructor TLandOldTileGroup.Create(AData: TStream); +var + i: Integer; +begin + if assigned(AData) then + begin + AData.Read(FUnknown, SizeOf(LongInt)); + end; + for i := 0 to 31 do + LandTileData[i] := TLandOldTiledata.Create(AData); +end; + +destructor TLandOldTileGroup.Destroy; +var + i: Integer; +begin + for i := 0 to 31 do + LandTileData[i].Free; + inherited; +end; + +function TLandOldTileGroup.Clone: TLandTileGroup; +var + i: Integer; +begin + Result := TLandOldTileGroup.Create(nil); + Result.FUnknown := FUnknown; + for i := 0 to 31 do + Result.LandTileData[i] := LandTileData[i].Clone; +end; + +procedure TLandOldTileGroup.Write(AData: TStream); +var + i: Integer; +begin + AData.Write(FUnknown, SizeOf(LongInt)); + for i := 0 to 31 do + LandTileData[i].Write(AData); +end; + +function TLandOldTileGroup.GetSize: Integer; +begin + GetSize := LandOldTileGroupSize; +end; + { TStaticTileGroup } constructor TStaticTileGroup.Create(AData: TStream); @@ -372,5 +596,52 @@ begin GetSize := StaticTileGroupSize; end; +{ TStaticOldTileGroup } + +constructor TStaticOldTileGroup.Create(AData: TStream); +var + i: Integer; +begin + if assigned(AData) then + begin + AData.Read(FUnknown, SizeOf(LongInt)); + end; + for i := 0 to 31 do + StaticTileData[i] := TStaticOldTiledata.Create(AData); +end; + +destructor TStaticOldTileGroup.Destroy; +var + i: Integer; +begin + for i := 0 to 31 do + StaticTileData[i].Free; + inherited; +end; + +function TStaticOldTileGroup.Clone: TStaticTileGroup; +var + i: Integer; +begin + Result := TStaticOldTileGroup.Create(nil); + Result.FUnknown := FUnknown; + for i := 0 to 31 do + Result.StaticTileData[i] := StaticTileData[i].Clone; +end; + +procedure TStaticOldTileGroup.Write(AData: TStream); +var + i: Integer; +begin + AData.Write(FUnknown, SizeOf(LongInt)); + for i := 0 to 31 do + StaticTileData[i].Write(AData); +end; + +function TStaticOldTileGroup.GetSize: Integer; +begin + GetSize := StaticOldTileGroupSize; +end; + end. diff --git a/UOLib/UUopFile.pas b/UOLib/UUopFile.pas new file mode 100644 index 0000000..197c09d --- /dev/null +++ b/UOLib/UUopFile.pas @@ -0,0 +1,103 @@ +(* + * CentrEd+ (c) 2013 by StaticZ <uoquint.ru> + * Base on Wyatt algoritm published on www.ruosi.org + *) +unit UUopFile; + +{$mode objfpc}{$H+} + +interface + +uses + SysUtils, Classes, Graphics, UMulBlock; + +function HashFileName(string s) : QWord; + +function UopContainer() + +type + + TUopHeader = packed record; + Format: DWord; + Version: DWord; + Signature: DWord; + Offset: QWord; + Capacity: DWord; + Count: DWord; + end; + + TUopIndex = packed record; + Offset: DWord; + Length: DWord; + Uncomp: DWord; + Append: DWord; + end; + +implementation + +{ THue } + +function HashFileName(string s) : QWord; +var + i, stl, eax, ecx, edx, ebx, esi, edi : DWord; +begin + i := 0; stl := Length(s); + eax := 0; ebx := $DEADBEEF + stl; + ecx := 0; edi := $DEADBEEF + stl; + edx := 0; esi := $DEADBEEF + stl; + while i < stl do begin + edi := (uint)((ord(s[i+ 7])shl 24)or(ord(s[i+ 6])shl 16)or(ord(s[i+ 5])shl 8)or ord(s[i+ 4]))+edi; + esi := (uint)((ord(s[i+11])shl 24)or(ord(s[i+10])shl 16)or(ord(s[i+ 9])shl 8)or ord(s[i+ 8]))+esi; + edx := (uint)((ord(s[i+ 3])shl 24)or(ord(s[i+ 2])shl 16)or(ord(s[i+ 1])shl 8)or ord(s[i ]))-esi; + + edx := (edx + ebx)xor(esi shr 28)xor(esi shl 4); + inc(esi, edi); + edi := (edi - edx)xor(edx shr 26)xor(edx shl 6); + inc(edx, esi); + esi := (esi - edi)xor(edi shr 24)xor(edi shl 8); + inc(edi, edx); + ebx := (edx - esi)xor(esi shr 16)xor(esi shl 16); + inc(esi, edi); + edi := (edi - ebx)xor(ebx shr 13)xor(ebx shl 19); + inc(ebx, esi); + esi := (esi - edi)xor(edi shr 28)xor(edi shl 4); + inc(edi, ebx); + + inc(i, 12); + end; + + if (stl - i) > 0 then begin + if (stl - i) <= 12 then inc(esi, DWord(ord(s[i+11])shl 24)); + if (stl - i) <= 11 then inc(esi, DWord(ord(s[i+10])shl 16)); + if (stl - i) <= 10 then inc(esi, DWord(ord(s[i+ 9])shl 8)); + if (stl - i) <= 9 then inc(esi, DWord(ord(s[i+ 8]) )); + + if (stl - i) <= 8 then inc(edi, DWord(ord(s[i+ 7])shl 24)); + if (stl - i) <= 7 then inc(edi, DWord(ord(s[i+ 6])shl 16)); + if (stl - i) <= 6 then inc(edi, DWord(ord(s[i+ 5])shl 8)); + if (stl - i) <= 5 then inc(edi, DWord(ord(s[i+ 4]) )); + + if (stl - i) <= 4 then inc(ebx, DWord(ord(s[i+ 3])shl 24)); + if (stl - i) <= 3 then inc(ebx, DWord(ord(s[i+ 2])shl 16)); + if (stl - i) <= 2 then inc(ebx, DWord(ord(s[i+ 1])shl 8)); + if (stl - i) <= 1 then inc(ebx, DWord(ord(s[i+ 0]) )); + + esi := (esi xor edi) - ((edi shr 18)xor(edi shl 14)); + ecx := (esi xor ebx) - ((esi shr 21)xor(esi shl 11)); + edi := (edi xor ecx) - ((ecx shr 7)xor(ecx shl 25)); + esi := (esi xor edi) - ((edi shr 16)xor(edi shl 16)); + edx := (esi xor ecx) - ((esi shr 28)xor(esi shl 4)); + edi := (edi xor edx) - ((edx shr 18)xor(edx shl 14)); + eax := (esi xor edi) - ((edi shr 8)xor(edi shl 24)); + + Result := (QWord(edi) shl 32) or eax; + end else begin + Result := (QWord(esi) shl 32) or eax; + end; + +end; + + + +end. + diff --git a/UOLib/UWorldItem.pas b/UOLib/UWorldItem.pas index 829535c..ab8a194 100644 --- a/UOLib/UWorldItem.pas +++ b/UOLib/UWorldItem.pas @@ -41,7 +41,7 @@ type constructor Create(AOwner: TWorldBlock); protected FOwner: TWorldBlock; - FTileID: Word; + FTileID: LongWord; FX: Word; FY: Word; FZ: ShortInt; @@ -52,12 +52,12 @@ type FPriorityBonus: ShortInt; FPrioritySolver: Integer; procedure DoChanged; - function GetTileID: Word; virtual; + function GetTileID: LongWord; virtual; function GetZ: ShortInt; virtual; procedure SetLocked(ALocked: Boolean); procedure SetOwner(AOwner: TWorldBlock); procedure SetSelected(ASelected: Boolean); - procedure SetTileID(AValue: Word); + procedure SetTileID(AValue: LongWord); procedure SetX(AValue: Word); procedure SetY(AValue: Word); procedure SetZ(AValue: ShortInt); @@ -66,7 +66,7 @@ type procedure Delete; property Owner: TWorldBlock read FOwner write SetOwner; - property TileID: Word read GetTileID write SetTileID; + property TileID: LongWord read GetTileID write SetTileID; property X: Word read FX write SetX; property Y: Word read FY write SetY; property Z: ShortInt read GetZ write SetZ; @@ -77,7 +77,7 @@ type property PriorityBonus: ShortInt read FPriorityBonus write FPriorityBonus; property PrioritySolver: Integer read FPrioritySolver write FPrioritySolver; - property RawTileID: Word read FTileID; + property RawTileID: LongWord read FTileID; property RawZ: ShortInt read FZ; end; @@ -151,7 +151,7 @@ begin FOwner.Changed := True; end; -function TWorldItem.GetTileID: Word; +function TWorldItem.GetTileID: LongWord; begin Result := FTileID; end; @@ -211,7 +211,7 @@ begin FSelected := ASelected; end; -procedure TWorldItem.SetTileID(AValue: Word); +procedure TWorldItem.SetTileID(AValue: LongWord); begin if FTileID = AValue then Exit; diff --git a/version.inc b/version.inc index 916c4ff..90c172e 100644 --- a/version.inc +++ b/version.inc @@ -1,5 +1,645 @@ const - ProductVersion = '0.6.1'; - ProtocolVersion = 6; - Revision = '209'; - Copyright = '2009 Andreas Schneider'; + //ProductVersion = '0.7.2'; + ProtocolVersion = 8; + Revision = '58'; + Copyright = '2013 StaticZ'; + Original = '"UO CentrED" ver 0.6.1 (c) 2009 Andreas Schneider'; + + baner_u: array[0..3141] of byte = ( //*.bmp 256 rle + $42, $4D, $46, $0C, $00, $00, $00, $00, $00, $00, $76, $00, $00, $00, $28, $00, + $00, $00, $89, $00, $00, $00, $2A, $00, $00, $00, $01, $00, $04, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $62, $03, $00, $00, $62, $03, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $04, $04, $04, $00, $83, $84, $84, $00, $C8, $C8, + $C8, $00, $47, $48, $48, $00, $65, $66, $65, $00, $A8, $A8, $A8, $00, $EA, $E9, + $EA, $00, $96, $97, $96, $00, $5A, $59, $5A, $00, $2C, $2E, $2C, $00, $D8, $D8, + $D8, $00, $77, $78, $78, $00, $B7, $B8, $B8, $00, $F5, $F4, $F5, $00, $3B, $3D, + $3C, $00, $8C, $8C, $8C, $00, $D6, $D6, $DD, $D6, $DD, $DD, $6D, $6D, $DD, $6D, + $D6, $DD, $D6, $DD, $D6, $DD, $66, $6D, $D6, $D6, $D6, $AD, $66, $A6, $D6, $C6, + $6D, $6A, $DD, $66, $66, $66, $A6, $D6, $66, $6D, $A2, $6D, $6D, $D6, $66, $DD, + $A6, $DD, $6A, $D6, $DD, $6D, $66, $D6, $66, $6D, $66, $6D, $66, $66, $DA, $C6, + $DD, $A6, $DD, $66, $6D, $DA, $DD, $6D, $6D, $6D, $60, $00, $6A, $FF, $D6, $DD, + $6D, $6D, $D6, $D6, $D6, $D6, $D6, $D6, $6A, $C7, $BB, $F5, $26, $66, $C2, $AD, + $6C, $A6, $DC, $26, $D6, $C6, $D6, $22, $DD, $DC, $66, $6C, $CD, $D6, $C6, $D6, + $2C, $DD, $C2, $2D, $D6, $DC, $62, $66, $C5, $D6, $22, $AD, $6D, $D2, $AA, $D6, + $CC, $DD, $C2, $2D, $62, $CD, $62, $2A, $6A, $22, $D6, $22, $2D, $6C, $D6, $DA, + $2D, $DD, $C0, $00, $6A, $FF, $6D, $D6, $D6, $DD, $6D, $6D, $6D, $6D, $6D, $D6, + $54, $44, $44, $44, $41, $AD, $2C, $2D, $6C, $C6, $DC, $C2, $DD, $52, $DD, $CA, + $2D, $65, $AD, $DC, $C6, $D6, $CD, $6D, $5C, $6D, $22, $CD, $6D, $DA, $C2, $DD, + $25, $DD, $A5, $2D, $D6, $DA, $2C, $DD, $CC, $D6, $D5, $2D, $65, $CD, $62, $2C, + $66, $5C, $6D, $C2, $26, $DD, $6D, $DD, $6D, $6D, $60, $00, $6A, $FF, $DD, $6D, + $6D, $D6, $D6, $DD, $6D, $DD, $D6, $AB, $44, $44, $44, $44, $44, $4C, $6D, $6D, + $6D, $D6, $D6, $D6, $D6, $66, $D6, $D6, $DD, $6A, $D6, $DC, $DD, $6D, $26, $D6, + $D6, $D6, $D6, $D6, $DD, $66, $2D, $6D, $DD, $6D, $D6, $DD, $6D, $66, $66, $6D, + $CD, $6D, $66, $D6, $DD, $6D, $6D, $6D, $6D, $66, $DD, $6D, $26, $DD, $6D, $66, + $D6, $D6, $D0, $00, $6A, $FF, $D6, $D6, $D6, $D6, $DD, $6D, $DD, $DD, $DA, $B4, + $44, $4B, $F1, $44, $44, $44, $56, $66, $D6, $66, $6D, $66, $66, $66, $6D, $6D, + $D6, $66, $66, $DD, $D6, $66, $66, $66, $66, $66, $DD, $A2, $2A, $DD, $6D, $6D, + $A2, $22, $66, $D6, $D6, $66, $66, $66, $66, $6D, $66, $66, $D6, $66, $66, $6D, + $D6, $DD, $DA, $22, $6D, $66, $66, $66, $66, $66, $D0, $00, $6A, $FF, $D6, $DD, + $6D, $6D, $6D, $DD, $DD, $DD, $DF, $44, $47, $6D, $DD, $DC, $44, $4F, $D7, $93, + $DB, $99, $ED, $A9, $99, $99, $9D, $6D, $6B, $99, $97, $D6, $DA, $99, $99, $99, + $99, $92, $B9, $99, $99, $91, $6D, $C3, $99, $99, $98, $2D, $68, $99, $99, $99, + $99, $FC, $99, $92, $D3, $99, $99, $9C, $D6, $DF, $E9, $99, $9F, $59, $99, $99, + $99, $99, $D0, $00, $6A, $FF, $6D, $D6, $D6, $DD, $DD, $DD, $DD, $DD, $24, $44, + $5D, $DD, $DD, $DD, $DB, $4B, $DD, $9E, $67, $99, $96, $C9, $99, $99, $96, $6D, + $DF, $99, $91, $DD, $66, $99, $99, $99, $99, $95, $49, $99, $99, $99, $E6, $59, + $99, $99, $99, $95, $D4, $99, $99, $99, $99, $B2, $99, $9C, $69, $99, $99, $95, + $D6, $89, $99, $99, $9B, $C9, $99, $99, $99, $99, $60, $00, $6A, $FF, $DD, $6D, + $6D, $DD, $DD, $DD, $D6, $C5, $44, $44, $DD, $DD, $DD, $DD, $DA, $44, $DD, $59, + $65, $99, $9A, $59, $99, $99, $9A, $DD, $67, $99, $9B, $6D, $6D, $E9, $99, $9E, + $EE, $E5, $B9, $93, $39, $99, $97, $29, $93, $8E, $99, $93, $DB, $99, $99, $EE, + $EE, $B6, $99, $97, $69, $99, $99, $97, $D7, $99, $99, $99, $98, $29, $99, $9E, + $EE, $EE, $A0, $00, $6A, $FF, $D6, $DD, $DD, $DD, $DD, $D7, $E9, $9E, $44, $4B, + $DD, $DD, $57, $DD, $DD, $B4, $DD, $69, $AC, $99, $92, $F9, $99, $99, $9C, $D6, + $DC, $99, $98, $DD, $D6, $89, $99, $26, $DD, $DD, $C2, $6D, $DC, $99, $93, $A5, + $66, $D6, $E9, $99, $2F, $99, $91, $DD, $6D, $6D, $99, $9F, $29, $99, $99, $91, + $6E, $99, $99, $5A, $25, $A9, $99, $9D, $DD, $6D, $D0, $00, $6A, $FF, $D6, $D6, + $DD, $DD, $D5, $FC, $AD, $65, $44, $41, $DD, $DD, $44, $AD, $DD, $54, $AD, $DE, + $C2, $99, $95, $49, $98, $99, $95, $D6, $D2, $99, $93, $D6, $D6, $49, $99, $7A, + $A2, $A6, $66, $D6, $78, $99, $9E, $6D, $6D, $CB, $99, $99, $C7, $99, $94, $2A, + $A2, $6D, $39, $9B, $59, $99, $39, $9B, $69, $99, $97, $D6, $D6, $69, $99, $92, + $A2, $AA, $60, $00, $6A, $FF, $D6, $DD, $DD, $DD, $6D, $DD, $DD, $D5, $44, $4B, + $DD, $DD, $44, $2D, $DD, $C4, $AD, $D4, $56, $99, $95, $89, $9B, $99, $97, $DD, + $DA, $99, $99, $DD, $6D, $B9, $99, $99, $99, $95, $66, $B9, $99, $99, $98, $DD, + $5E, $99, $99, $99, $AC, $99, $99, $99, $99, $B6, $89, $94, $79, $93, $89, $98, + $A9, $99, $9C, $D6, $DD, $DE, $99, $99, $99, $99, $A0, $00, $6A, $FF, $6D, $DD, + $DD, $DD, $DD, $DD, $DD, $D1, $44, $44, $DD, $DD, $B4, $5D, $DD, $24, $2D, $D7, + $76, $99, $9F, $E9, $95, $99, $91, $6D, $66, $99, $99, $66, $D6, $F9, $99, $99, + $99, $9F, $D4, $99, $99, $99, $9C, $D5, $99, $99, $99, $9B, $62, $99, $99, $99, + $99, $86, $49, $93, $B9, $94, $B9, $93, $69, $99, $92, $6D, $D6, $D3, $99, $99, + $99, $99, $20, $00, $6A, $FF, $DD, $DD, $DD, $DD, $DD, $67, $48, $34, $44, $44, + $DD, $DD, $14, $7D, $DD, $A4, $CD, $D7, $1D, $E9, $9B, $99, $9C, $39, $9B, $D6, + $DD, $E9, $99, $AD, $DD, $79, $99, $E4, $44, $85, $69, $99, $99, $EB, $2D, $64, + $99, $99, $94, $56, $DA, $99, $99, $44, $84, $BD, $19, $9E, $49, $91, $19, $99, + $D3, $99, $94, $DD, $6D, $D4, $99, $93, $44, $44, $20, $00, $6A, $FF, $6D, $DD, + $DD, $DD, $A4, $99, $9E, $98, $44, $44, $6D, $DD, $74, $FD, $DD, $64, $5D, $D4, + $B6, $89, $9E, $99, $9A, $89, $94, $A2, $2C, $E9, $99, $7C, $22, $59, $99, $46, + $D6, $DD, $A9, $99, $9C, $D6, $DD, $D4, $99, $9B, $66, $DD, $D6, $99, $99, $66, + $D6, $DD, $79, $99, $E9, $97, $79, $99, $61, $99, $99, $C6, $D6, $6B, $99, $97, + $6D, $6D, $D0, $00, $6A, $FF, $DD, $DD, $DD, $D7, $99, $45, $AD, $D5, $44, $44, + $AD, $DD, $54, $1D, $DD, $D4, $7D, $DE, $4D, $49, $99, $99, $96, $B9, $93, $C9, + $99, $99, $99, $99, $9E, $29, $99, $E7, $F7, $F7, $6E, $99, $9B, $55, $18, $6F, + $99, $93, $55, $F4, $CD, $E9, $99, $1F, $7F, $72, $59, $99, $99, $95, $59, $99, + $AA, $E9, $99, $93, $B4, $51, $99, $98, $F7, $F7, $50, $00, $6A, $FF, $DD, $DD, + $DD, $F9, $97, $DD, $DD, $DA, $44, $44, $2D, $DD, $54, $4D, $DD, $D4, $1D, $69, + $36, $B9, $99, $99, $ED, $B9, $9E, $29, $99, $99, $99, $99, $99, $A9, $99, $99, + $99, $99, $A7, $99, $99, $99, $99, $DA, $E9, $99, $99, $99, $56, $39, $99, $99, + $99, $95, $C9, $99, $99, $92, $29, $99, $CD, $59, $99, $99, $99, $15, $99, $99, + $99, $99, $30, $00, $6A, $FF, $DD, $DD, $D7, $9E, $AD, $DD, $DD, $DD, $B4, $44, + $CD, $DD, $24, $4D, $DD, $DB, $BD, $79, $ED, $F9, $99, $99, $8D, $79, $99, $A9, + $99, $99, $99, $99, $99, $A9, $99, $99, $99, $99, $2D, $79, $99, $99, $99, $AD, + $C8, $99, $99, $99, $7D, $49, $99, $99, $99, $9F, $29, $99, $99, $9A, $A9, $99, + $5D, $62, $39, $99, $99, $BC, $99, $99, $99, $99, $E0, $00, $6A, $FF, $DD, $DD, + $A9, $3D, $DD, $D5, $89, $93, $F4, $44, $1C, $5C, $74, $45, $C5, $CB, $42, $77, + $76, $2F, $7F, $77, $C6, $27, $7F, $67, $77, $77, $77, $77, $F7, $67, $F7, $7F, + $77, $77, $A6, $DA, $51, $4B, $15, $6D, $6D, $57, $B4, $B7, $A6, $C7, $77, $77, + $77, $7C, $67, $77, $77, $7D, $67, $77, $2D, $DD, $6C, $7B, $B1, $CA, $77, $77, + $77, $7F, $70, $00, $6A, $FF, $DD, $DD, $89, $2D, $DD, $B9, $93, $BC, $21, $44, + $44, $44, $44, $44, $44, $44, $46, $DD, $6D, $DD, $DD, $6D, $6D, $D6, $DD, $6D, + $D6, $DD, $6D, $D6, $DD, $6D, $DD, $6D, $D6, $D6, $DD, $6D, $D6, $DD, $6D, $D6, + $D6, $D6, $D6, $DD, $6D, $6D, $D6, $DD, $6D, $6D, $D6, $DD, $6D, $D6, $DD, $6D, + $D6, $D6, $DD, $6D, $D6, $DD, $6D, $D6, $DD, $6D, $D0, $00, $6A, $FF, $DD, $D5, + $94, $DD, $D3, $9E, $CD, $DD, $DD, $B4, $44, $44, $44, $44, $44, $44, $CD, $DD, + $D6, $D6, $D6, $D6, $DD, $6D, $D6, $DD, $6D, $D6, $DD, $6D, $D6, $D6, $D6, $DD, + $6D, $6D, $D6, $DD, $6D, $D6, $DD, $6D, $DD, $DD, $DD, $D6, $DD, $DD, $6D, $D6, + $D6, $DD, $6D, $D6, $DD, $6D, $D6, $DD, $6D, $6D, $D6, $DD, $6D, $D6, $DD, $6D, + $D6, $DD, $60, $00, $6A, $FF, $DD, $D8, $96, $DD, $F9, $36, $DD, $DD, $DD, $D7, + $44, $44, $44, $44, $44, $BE, $2D, $DD, $D6, $DD, $6D, $88, $88, $88, $88, $88, + $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, + $8E, $99, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, $88, + $88, $88, $88, $88, $88, $88, $88, $88, $88, $8C, $D0, $00, $6A, $FF, $DD, $A9, + $FD, $D6, $9E, $6D, $DD, $DD, $DD, $DD, $24, $44, $44, $44, $47, $6E, $CD, $DD, + $D6, $D6, $DD, $6D, $D6, $DD, $6D, $66, $D6, $D6, $D6, $D6, $DD, $6D, $DD, $D6, + $D6, $DD, $D6, $D6, $DD, $D6, $DD, $6D, $6D, $C2, $DD, $6D, $D6, $D6, $D6, $D6, + $DD, $D6, $D6, $D6, $DD, $6D, $6D, $D6, $DD, $DD, $6D, $D6, $D6, $D6, $D6, $DD, + $D6, $D6, $D0, $00, $6A, $FF, $DD, $59, $2D, $DB, $97, $DD, $DD, $DD, $D6, $DD, + $DD, $B5, $71, $88, $DD, $D9, $CD, $DD, $6D, $D6, $D6, $DD, $6D, $D6, $DD, $DD, + $DD, $6D, $DD, $DD, $6D, $DD, $6A, $D6, $DD, $DA, $6D, $6D, $D6, $A6, $D6, $DD, + $D6, $C2, $D6, $DA, $6D, $6D, $DD, $DD, $6D, $6D, $DD, $6D, $D6, $D6, $AD, $6D, + $6D, $A6, $DD, $6D, $DD, $D6, $DD, $DA, $6D, $DD, $60, $00, $6A, $FF, $DD, $1E, + $DD, $DE, $3D, $DD, $2D, $DD, $DD, $6D, $DD, $CD, $D6, $9B, $DD, $29, $2D, $DD, + $DD, $6D, $DD, $65, $56, $ED, $D6, $8A, $C1, $D6, $63, $DB, $26, $D6, $70, $DD, + $D6, $F5, $B8, $CD, $2B, $5F, $C6, $DF, $BB, $72, $DD, $F5, $B8, $C6, $25, $45, + $CD, $A4, $CD, $55, $6D, $C7, $51, $2D, $6A, $0C, $D6, $65, $15, $CD, $D6, $F5, + $B8, $5D, $D0, $00, $6A, $FF, $DD, $B4, $DD, $69, $FD, $D5, $CD, $DD, $DD, $DD, + $DD, $DD, $DB, $95, $DD, $79, $6D, $DD, $66, $D6, $D6, $D5, $F2, $1A, $DD, $75, + $75, $6D, $2B, $A7, $5D, $6D, $A7, $D6, $D6, $C6, $D1, $6D, $FD, $6D, $7D, $C2, + $D6, $12, $D6, $C6, $D1, $6D, $D6, $7D, $6D, $DF, $DD, $22, $DD, $FD, $6D, $6D, + $D6, $F6, $6D, $D6, $C6, $D6, $D6, $C6, $D1, $DD, $60, $00, $6A, $FF, $DD, $4B, + $DD, $29, $5D, $D4, $2D, $DD, $DD, $DD, $DD, $DD, $29, $3D, $DD, $83, $DD, $DD, + $DD, $D6, $D6, $D7, $51, $AC, $DA, $C7, $75, $DD, $76, $BC, $56, $DD, $6D, $6D, + $6D, $C6, $DF, $DD, $5D, $D6, $C6, $C6, $D6, $C2, $DD, $C6, $DF, $DD, $6D, $FD, + $6D, $67, $6D, $2A, $D6, $76, $DD, $6D, $6D, $D6, $D6, $D6, $C6, $DD, $6D, $C6, + $DF, $D6, $D0, $00, $6A, $FF, $DD, $B1, $DD, $59, $AD, $DE, $FD, $DD, $DD, $DD, + $DD, $DA, $39, $CD, $DC, $9F, $DD, $DD, $6D, $6D, $DD, $D7, $AF, $D7, $DC, $25, + $CC, $2D, $7D, $BD, $7D, $D6, $D6, $DD, $DD, $5D, $DF, $6D, $7D, $DD, $FD, $76, + $DD, $52, $DD, $5D, $DF, $6D, $6D, $FD, $DD, $DF, $DD, $22, $DD, $FD, $D6, $DD, + $6D, $6D, $6D, $D6, $B6, $D6, $DD, $5D, $DF, $6D, $D0, $00, $6A, $FF, $DD, $7F, + $DD, $59, $6D, $DE, $8D, $DD, $DD, $DD, $DD, $5E, $94, $DD, $D3, $9A, $DD, $DD, + $D6, $DD, $6D, $51, $6D, $24, $64, $26, $D5, $FA, $4A, $6A, $B2, $D6, $DD, $6D, + $6C, $5D, $24, $DD, $C5, $AC, $7D, $A1, $A2, $85, $6C, $5D, $24, $DD, $65, $B6, + $D6, $A4, $1A, $B6, $6A, $45, $C2, $D6, $DD, $D6, $DD, $6C, $5B, $27, $DC, $5D, + $24, $DD, $60, $00, $6A, $FF, $DD, $21, $DD, $C9, $CD, $D4, $9A, $DD, $D6, $DA, + $78, $99, $BD, $DD, $79, $BD, $DD, $DD, $6D, $D6, $D6, $6A, $D6, $6A, $6A, $AD, + $DA, $A6, $A6, $D6, $AA, $DD, $D6, $DD, $DA, $66, $6A, $D6, $DA, $52, $D6, $D6, + $C2, $6A, $DA, $66, $6A, $D6, $6A, $AD, $DD, $6A, $6C, $6D, $66, $BA, $AA, $DD, + $D6, $D6, $D6, $DA, $66, $A6, $DA, $66, $6A, $6D, $60, $00, $6A, $FF, $DD, $D4, + $DD, $69, $FD, $D5, $93, $DD, $D2, $39, $99, $E5, $DD, $D6, $93, $DD, $DD, $DD, + $6D, $6D, $DD, $6D, $6D, $6D, $6D, $DD, $6D, $6D, $6D, $6D, $DD, $6D, $6D, $6D, + $6D, $DD, $6D, $6D, $6D, $6D, $DD, $6D, $6D, $6D, $6D, $DD, $6D, $6D, $6D, $56, + $D6, $DD, $D6, $DD, $6D, $7D, $6D, $6D, $6D, $6D, $DD, $6D, $6D, $6D, $6D, $DD, + $6D, $D6, $D0, $00, $6A, $FF, $DD, $D1, $DD, $D3, $8D, $DD, $89, $7D, $DD, $D6, + $CA, $DD, $DD, $2E, $9C, $DD, $DD, $D6, $DD, $D6, $D6, $D6, $DD, $D6, $D6, $D6, + $D6, $DD, $D6, $D6, $D6, $D6, $DD, $D6, $D6, $D6, $D6, $DD, $D6, $D6, $D6, $D6, + $DD, $D6, $D6, $D6, $D6, $DD, $D6, $B6, $DD, $6D, $6D, $D6, $D6, $D6, $D6, $DD, + $D6, $D6, $D6, $D6, $DD, $D6, $D6, $D6, $D6, $DD, $60, $00, $6A, $FF, $6D, $DA, + $AD, $D1, $92, $DD, $A9, $9B, $DD, $DD, $DD, $DD, $D7, $99, $5D, $DD, $DD, $DD, + $6D, $6D, $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, + $DD, $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, $DD, + $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, $DD, $D6, $DD, $6D, $6D, $DD, $D6, + $D6, $D6, $D0, $00, $6A, $FF, $DD, $DD, $AD, $D6, $9E, $DD, $D5, $99, $EC, $DD, + $DD, $DC, $49, $95, $DD, $DD, $DD, $D6, $D6, $DD, $6D, $D6, $DD, $6D, $6D, $6D, + $D6, $DD, $6D, $6D, $6D, $D6, $DD, $6D, $6D, $6D, $D6, $DD, $6D, $6D, $6D, $D6, + $DD, $6D, $6D, $6D, $D6, $DD, $6D, $6D, $6D, $D6, $DD, $6D, $6D, $6D, $D6, $DD, + $6D, $6D, $6D, $D6, $DD, $6D, $6D, $6D, $DD, $D6, $D0, $00, $6A, $FF, $D6, $DD, + $DD, $DD, $19, $BD, $DD, $68, $99, $93, $B3, $99, $98, $AD, $DD, $DD, $DD, $6D, + $DD, $D6, $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, + $D6, $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, $D6, + $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, $D6, $DD, $6D, $D6, $DD, $D6, $DD, + $6D, $6D, $D0, $00, $6A, $FF, $6D, $DD, $DD, $DD, $D3, $95, $DD, $DD, $CB, $89, + $99, $31, $2D, $DD, $DD, $DD, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, + $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, + $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, + $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $60, $00, $6A, $FF, $DD, $6D, + $DD, $DD, $D6, $E9, $46, $DD, $DD, $DD, $DD, $DD, $DD, $DD, $DD, $DD, $D6, $D6, + $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, + $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, + $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, + $D6, $D6, $D0, $00, $6A, $FF, $D6, $D6, $DD, $DD, $DD, $63, $9E, $5D, $DD, $DD, + $DD, $DD, $DD, $DD, $DD, $DD, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, + $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, + $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, + $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D0, $00, $6A, $FF, $D6, $DD, + $6D, $DD, $DD, $DD, $19, $98, $7A, $DD, $DD, $DA, $55, $DD, $DD, $DD, $6D, $6D, + $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, + $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, + $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, + $6D, $6D, $60, $00, $6A, $FF, $6D, $D6, $D6, $DD, $DD, $DD, $D2, $49, $99, $EE, + $33, $EB, $6D, $DD, $DD, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, + $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, + $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, + $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $6D, $D0, $00, $6A, $FF, $DD, $6D, + $D6, $DD, $DD, $DD, $DD, $DD, $57, $1B, $52, $DD, $DD, $DD, $6D, $D6, $DD, $DD, + $6D, $DD, $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, + $DD, $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, $DD, + $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, $DD, $D6, $DD, $DD, $6D, $DD, $D6, + $DD, $DD, $60, $00, $6A, $FF, $D6, $DD, $6D, $D6, $DD, $DD, $DD, $DD, $DD, $DD, + $DD, $DD, $DD, $6D, $DD, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, + $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, + $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, + $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $D0, $00, $6A, $FF, $D6, $D6, + $DD, $6D, $6D, $DD, $DD, $DD, $DD, $DD, $DD, $DD, $6D, $D6, $D6, $DD, $6D, $6D, + $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, + $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, + $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, $6D, $6D, $D6, $D6, $DD, + $6D, $6D, $D0, $00, $6A, $FF + ); + + baner_h: array[0..6957] of byte = ( //*.bmp 256 rle + $42, $4D, $2E, $1B, $00, $00, $00, $00, $00, $00, $36, $04, $00, $00, $28, $00, + $00, $00, $89, $00, $00, $00, $2A, $00, $00, $00, $01, $00, $08, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $62, $03, $00, $00, $62, $03, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $04, $04, $04, $00, $CC, $88, $55, $00, $8F, $98, + $A8, $00, $DA, $CC, $C4, $00, $B9, $C7, $DE, $00, $3B, $5B, $88, $00, $44, $8E, + $FC, $00, $EC, $B6, $2C, $00, $EA, $E9, $E8, $00, $D4, $57, $06, $00, $5C, $59, + $5B, $00, $C2, $B4, $AA, $00, $BC, $8D, $6D, $00, $F3, $E6, $BB, $00, $CC, $A4, + $8A, $00, $B5, $B9, $BE, $00, $F4, $F2, $F4, $00, $2D, $7E, $FB, $00, $AD, $74, + $4F, $00, $E4, $C8, $70, $00, $37, $36, $37, $00, $7F, $AF, $F9, $00, $D8, $74, + $2E, $00, $24, $46, $7C, $00, $5E, $76, $9A, $00, $72, $71, $71, $00, $93, $8F, + $8E, $00, $A4, $5B, $2D, $00, $D6, $A0, $2C, $00, $FC, $D7, $34, $00, $DC, $DA, + $DA, $00, $FB, $DF, $76, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $10, $10, $10, $10, $10, $10, $10, $10, $08, $10, + $10, $10, $10, $10, $08, $10, $10, $10, $10, $08, $08, $08, $10, $10, $10, $10, + $10, $08, $10, $08, $08, $08, $10, $10, $08, $10, $08, $10, $10, $08, $08, $10, + $10, $08, $10, $10, $08, $1E, $0F, $10, $10, $08, $10, $1E, $10, $10, $08, $10, + $08, $10, $10, $08, $08, $10, $08, $10, $08, $10, $10, $08, $08, $0F, $08, $10, + $08, $10, $10, $08, $10, $08, $10, $10, $08, $08, $10, $10, $10, $08, $08, $10, + $10, $10, $10, $10, $10, $08, $08, $10, $10, $10, $08, $10, $08, $10, $08, $10, + $10, $08, $10, $08, $10, $10, $08, $03, $04, $10, $10, $08, $08, $08, $10, $10, + $08, $08, $10, $10, $10, $08, $08, $10, $08, $08, $08, $10, $10, $10, $08, $FF, + $A4, $FF, $10, $10, $08, $10, $08, $10, $08, $10, $10, $10, $08, $10, $08, $10, + $10, $10, $08, $08, $03, $0B, $0C, $12, $12, $0C, $0B, $0D, $08, $10, $10, $0F, + $03, $08, $08, $10, $0F, $1E, $10, $10, $0F, $1E, $1E, $10, $08, $0B, $1E, $10, + $10, $08, $02, $10, $08, $10, $03, $1E, $08, $10, $03, $1E, $0F, $10, $08, $1E, + $0B, $08, $10, $08, $0F, $0F, $10, $10, $03, $03, $03, $10, $08, $10, $10, $1E, + $03, $0F, $08, $10, $0F, $03, $03, $10, $08, $0F, $0B, $10, $10, $08, $10, $10, + $0F, $03, $08, $08, $08, $0F, $0F, $10, $10, $0F, $03, $0F, $10, $10, $0F, $0F, + $10, $08, $1E, $03, $0F, $10, $08, $0F, $03, $08, $10, $1E, $03, $0B, $08, $10, + $10, $0B, $10, $10, $10, $03, $1E, $08, $10, $10, $0B, $FF, $A4, $FF, $10, $08, + $10, $10, $10, $10, $10, $10, $08, $10, $10, $10, $10, $10, $08, $10, $1E, $12, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, $08, $08, $0B, $0B, $03, $10, $08, + $0F, $0F, $08, $10, $0B, $0B, $0F, $10, $10, $0F, $03, $08, $10, $1E, $1E, $0F, + $10, $10, $0F, $1E, $10, $08, $10, $0B, $0F, $10, $10, $08, $03, $10, $08, $10, + $0B, $0F, $10, $08, $03, $1E, $0B, $08, $10, $10, $10, $10, $0B, $03, $10, $10, + $1E, $0F, $03, $10, $10, $0B, $0F, $08, $10, $10, $08, $10, $03, $1E, $03, $10, + $08, $0B, $0F, $10, $10, $08, $0B, $0F, $10, $08, $0B, $0F, $08, $10, $1E, $03, + $0B, $10, $10, $0B, $0B, $0F, $10, $1E, $0F, $0B, $10, $08, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $FF, $A4, $FF, $10, $10, $10, $08, $10, $10, + $08, $10, $10, $10, $08, $10, $10, $08, $10, $0B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $1B, $12, $03, $08, $1E, $08, $10, $08, $08, $08, $08, $10, + $08, $1E, $08, $10, $08, $08, $1E, $10, $08, $08, $08, $08, $08, $10, $03, $1E, + $10, $08, $10, $0B, $08, $10, $10, $08, $03, $10, $10, $10, $08, $1E, $10, $10, + $10, $1E, $08, $10, $10, $08, $10, $08, $0F, $1E, $10, $08, $10, $1E, $08, $10, + $10, $08, $1E, $10, $08, $10, $10, $10, $10, $1E, $08, $10, $10, $0F, $1E, $10, + $10, $08, $1E, $10, $10, $10, $08, $1E, $10, $10, $10, $1E, $08, $08, $10, $10, + $1E, $10, $10, $10, $08, $0F, $08, $10, $10, $10, $08, $10, $10, $10, $10, $10, + $08, $10, $10, $FF, $A4, $FF, $10, $08, $10, $10, $08, $10, $10, $10, $08, $10, + $08, $10, $08, $10, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $03, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $08, $10, $10, $10, $10, $10, $08, $10, $10, $08, + $10, $08, $10, $10, $08, $08, $10, $08, $10, $08, $10, $10, $10, $08, $10, $08, + $10, $10, $10, $10, $08, $10, $10, $10, $10, $08, $08, $10, $08, $10, $10, $10, + $10, $10, $08, $10, $08, $10, $08, $08, $08, $08, $08, $10, $10, $10, $08, $10, + $08, $10, $10, $08, $10, $08, $08, $10, $10, $10, $08, $10, $10, $08, $10, $10, + $10, $10, $10, $08, $10, $08, $10, $08, $10, $08, $08, $08, $10, $10, $08, $FF, + $A4, $FF, $10, $10, $08, $10, $10, $08, $10, $08, $10, $10, $10, $10, $10, $03, + $1B, $1B, $1B, $1B, $0C, $08, $10, $10, $10, $03, $12, $1B, $1B, $1B, $0C, $08, + $0C, $12, $0C, $10, $0E, $12, $12, $12, $10, $10, $12, $12, $12, $12, $12, $12, + $03, $10, $10, $08, $0D, $12, $12, $12, $12, $10, $10, $08, $10, $03, $12, $12, + $12, $12, $12, $12, $12, $12, $12, $1E, $0B, $01, $12, $1B, $1B, $1B, $01, $0E, + $08, $10, $08, $0E, $12, $12, $1B, $1B, $12, $01, $0B, $10, $08, $1E, $12, $12, + $12, $12, $12, $12, $12, $12, $12, $0B, $03, $12, $12, $12, $03, $08, $0E, $12, + $12, $12, $12, $12, $0E, $10, $08, $10, $1E, $0E, $12, $1B, $1B, $1B, $0C, $0D, + $0E, $12, $12, $12, $12, $12, $12, $12, $12, $01, $10, $FF, $A4, $FF, $08, $10, + $10, $10, $08, $10, $10, $10, $10, $08, $10, $10, $08, $12, $1B, $1B, $1B, $03, + $10, $10, $10, $10, $10, $10, $10, $0B, $1B, $1B, $0C, $10, $1E, $1B, $16, $08, + $0E, $1B, $1B, $1B, $1E, $08, $1B, $1B, $1B, $1B, $1B, $1B, $0B, $10, $10, $10, + $08, $1B, $1B, $1B, $1B, $1E, $10, $10, $10, $0B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $0B, $0C, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $12, $03, $10, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, $10, $08, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $0E, $03, $1B, $1B, $1B, $0B, $08, $12, $1B, $1B, $1B, $1B, $1B, + $0C, $10, $10, $03, $12, $1B, $1B, $1B, $1B, $1B, $1B, $03, $0C, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $08, $FF, $A4, $FF, $10, $10, $10, $08, $10, $10, + $08, $10, $10, $10, $10, $10, $0B, $1B, $1B, $1B, $0C, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $0C, $1B, $12, $10, $10, $0C, $1B, $10, $0E, $1B, $1B, $1B, + $03, $03, $1B, $1B, $1B, $1B, $1B, $1B, $0E, $10, $08, $10, $08, $1B, $1B, $1B, + $1B, $03, $10, $10, $10, $03, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0B, + $0C, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, $10, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $0B, $10, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, + $08, $1B, $1B, $1B, $0E, $10, $12, $1B, $1B, $1B, $1B, $1B, $12, $10, $08, $12, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0B, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $08, $FF, $A4, $FF, $10, $08, $10, $10, $10, $10, $10, $10, $10, $08, + $04, $06, $1B, $1B, $1B, $1B, $0B, $10, $10, $10, $10, $0B, $08, $10, $10, $10, + $08, $1B, $1B, $10, $10, $1E, $1B, $08, $03, $1B, $1B, $1B, $0B, $03, $1B, $1B, + $1B, $1B, $1B, $1B, $0E, $10, $10, $10, $10, $12, $1B, $1B, $1B, $0B, $10, $10, + $10, $1E, $1B, $1B, $1B, $1B, $0B, $03, $03, $03, $03, $1E, $0B, $0C, $03, $03, + $1E, $0B, $1B, $1B, $1B, $1B, $08, $0C, $0E, $03, $0D, $03, $0C, $1B, $1B, $1B, + $01, $10, $12, $1B, $1B, $1B, $0E, $03, $03, $03, $03, $03, $10, $1B, $1B, $1B, + $0C, $08, $1B, $1B, $1B, $1B, $1B, $1B, $12, $08, $0B, $1B, $1B, $1B, $1B, $1B, + $0C, $0E, $0C, $0B, $0B, $1B, $1B, $1B, $12, $03, $03, $03, $03, $03, $08, $FF, + $A4, $FF, $10, $10, $10, $08, $10, $08, $10, $10, $15, $15, $15, $15, $1B, $1B, + $1B, $1B, $03, $10, $10, $10, $0B, $1B, $12, $10, $10, $10, $10, $12, $1B, $10, + $10, $10, $1B, $1E, $03, $1B, $1B, $1B, $0B, $0E, $1B, $1B, $1B, $1B, $1B, $1B, + $0C, $10, $08, $10, $10, $12, $1B, $1B, $1B, $0B, $10, $08, $10, $08, $1B, $1B, + $1B, $1B, $1E, $08, $10, $10, $10, $10, $08, $10, $08, $10, $08, $03, $1B, $1B, + $1B, $1B, $0B, $10, $10, $10, $08, $08, $0E, $1B, $1B, $1B, $1B, $08, $12, $1B, + $1B, $1B, $0B, $08, $10, $10, $10, $08, $10, $12, $1B, $1B, $01, $1E, $1B, $1B, + $1B, $12, $1B, $1B, $1B, $10, $0C, $1B, $1B, $1B, $1B, $03, $10, $10, $08, $10, + $0B, $1B, $1B, $1B, $12, $10, $10, $10, $10, $08, $10, $FF, $A4, $FF, $08, $10, + $10, $10, $10, $10, $08, $15, $1E, $08, $0D, $13, $1B, $1B, $1B, $1B, $0B, $10, + $10, $10, $0B, $1B, $1B, $10, $10, $10, $10, $0C, $1B, $08, $10, $10, $1B, $03, + $1E, $1B, $1B, $1B, $0E, $0E, $1B, $1B, $12, $12, $1B, $1B, $01, $08, $10, $10, + $08, $0C, $1B, $1B, $1B, $0E, $10, $10, $08, $10, $1B, $1B, $1B, $1B, $12, $01, + $12, $0C, $12, $03, $10, $08, $1E, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1E, $10, + $10, $03, $0C, $1B, $1B, $1B, $1B, $1B, $12, $10, $0C, $1B, $1B, $1B, $12, $01, + $12, $01, $12, $0B, $08, $12, $1B, $1B, $12, $03, $1B, $1B, $1B, $0C, $1B, $1B, + $1B, $08, $0C, $1B, $1B, $1B, $12, $08, $10, $08, $10, $10, $03, $1B, $1B, $1B, + $1B, $01, $01, $12, $0C, $01, $08, $FF, $A4, $FF, $10, $10, $08, $10, $10, $08, + $08, $0D, $1D, $1D, $07, $1C, $1B, $1B, $1B, $1B, $0B, $10, $10, $10, $03, $1B, + $1B, $1E, $10, $10, $10, $0C, $1B, $1E, $10, $10, $0C, $0B, $10, $1B, $1B, $1B, + $0C, $0C, $1B, $1B, $01, $12, $1B, $1B, $12, $10, $08, $10, $10, $0E, $1B, $1B, + $1B, $0C, $10, $10, $10, $10, $12, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0E, + $10, $03, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $10, $10, $0C, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $0C, $10, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, + $10, $0C, $1B, $1B, $12, $0B, $1B, $1B, $1B, $0E, $1B, $1B, $1B, $1E, $01, $1B, + $1B, $1B, $0C, $08, $10, $10, $10, $10, $0D, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1E, $FF, $A4, $FF, $10, $08, $10, $08, $08, $08, $1D, $1D, $1D, $1D, + $1D, $1C, $1B, $1B, $1B, $1B, $0E, $10, $10, $10, $03, $1B, $1B, $0D, $10, $10, + $10, $0E, $1B, $0D, $10, $10, $0E, $0E, $10, $12, $1B, $1B, $0C, $12, $1B, $1B, + $0E, $0C, $1B, $1B, $1B, $10, $10, $10, $10, $0E, $1B, $1B, $1B, $0C, $08, $10, + $10, $08, $0C, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0E, $08, $12, $1B, $1B, + $1B, $1B, $1B, $1B, $12, $1E, $10, $03, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0C, + $08, $10, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $12, $10, $0C, $1B, $1B, + $1B, $0E, $1B, $1B, $12, $0B, $1B, $1B, $1B, $03, $0E, $1B, $1B, $1B, $1B, $08, + $10, $10, $08, $10, $08, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $03, $FF, + $A4, $FF, $10, $10, $10, $10, $0D, $1D, $1D, $1D, $1D, $1D, $1D, $1C, $1B, $1B, + $1B, $1B, $0C, $10, $10, $10, $08, $1B, $1B, $0B, $10, $10, $10, $0B, $1B, $0B, + $10, $10, $0C, $0C, $10, $12, $1B, $1B, $12, $1B, $1B, $1B, $0B, $0E, $1B, $1B, + $1B, $08, $10, $10, $10, $0B, $1B, $1B, $1B, $12, $10, $10, $10, $10, $0C, $1B, + $1B, $1B, $0C, $03, $03, $03, $03, $1E, $08, $1B, $1B, $1B, $1B, $12, $0E, $03, + $10, $08, $10, $03, $1B, $1B, $1B, $1B, $01, $0B, $1E, $10, $10, $10, $0B, $1B, + $1B, $1B, $12, $03, $03, $03, $03, $03, $10, $0E, $1B, $1B, $1B, $01, $1B, $1B, + $01, $03, $1B, $1B, $1B, $0B, $03, $1B, $1B, $1B, $1B, $0B, $10, $10, $10, $10, + $08, $1B, $1B, $1B, $1B, $0E, $03, $03, $03, $03, $1E, $FF, $A4, $FF, $08, $10, + $10, $0D, $1D, $1D, $07, $1D, $1D, $1D, $1D, $1F, $1B, $1B, $1B, $1B, $0C, $10, + $10, $10, $10, $1B, $1B, $0B, $10, $10, $10, $03, $1B, $0E, $10, $10, $12, $0C, + $10, $01, $1B, $1B, $1B, $1B, $1B, $1B, $0B, $0B, $1B, $1B, $1B, $1E, $0C, $0C, + $0C, $12, $1B, $1B, $1B, $1B, $0C, $0C, $0C, $0B, $0E, $1B, $1B, $1B, $0C, $10, + $10, $08, $08, $10, $08, $1B, $1B, $1B, $1B, $0B, $10, $10, $10, $1E, $1E, $03, + $1B, $1B, $1B, $1B, $08, $08, $10, $10, $03, $10, $03, $1B, $1B, $1B, $1B, $10, + $08, $10, $10, $10, $10, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $0C, $08, $1B, $1B, + $1B, $0E, $08, $12, $1B, $1B, $1B, $1B, $0B, $10, $08, $03, $10, $12, $1B, $1B, + $1B, $03, $10, $10, $08, $10, $10, $FF, $A4, $FF, $10, $08, $0D, $1D, $1D, $1D, + $1D, $1D, $1F, $0D, $0F, $18, $1B, $1B, $1B, $1B, $12, $10, $10, $10, $10, $1B, + $1B, $0E, $10, $10, $10, $1E, $1B, $0E, $10, $10, $1B, $12, $10, $0C, $1B, $1B, + $1B, $1B, $1B, $1B, $1E, $0B, $1B, $1B, $1B, $03, $12, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $1B, $0C, $0B, $1B, $1B, $1B, $1B, $12, $1B, $12, $12, $12, + $1E, $0C, $1B, $1B, $1B, $1B, $01, $12, $12, $1B, $03, $08, $1B, $1B, $1B, $1B, + $1B, $0C, $12, $1B, $1B, $10, $03, $1B, $1B, $1B, $1B, $12, $12, $1B, $12, $1B, + $03, $03, $1B, $1B, $1B, $1B, $1B, $1B, $0E, $08, $1B, $1B, $1B, $0E, $08, $0B, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1E, $0C, $1B, $1B, $1B, $1B, $12, $1B, + $12, $12, $0C, $FF, $A4, $FF, $10, $10, $1F, $1D, $1D, $1D, $1D, $0D, $02, $05, + $17, $17, $1B, $1B, $1B, $1B, $1B, $10, $10, $10, $10, $12, $1B, $0C, $10, $10, + $10, $08, $1B, $0C, $10, $03, $1B, $12, $08, $0E, $1B, $1B, $1B, $1B, $1B, $1B, + $08, $03, $1B, $1B, $1B, $0B, $01, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $12, $0B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $03, $1E, $1B, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $0B, $10, $0B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $08, $08, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0B, $03, $1B, $1B, + $1B, $1B, $1B, $1B, $0B, $10, $1B, $1B, $1B, $0C, $10, $10, $0E, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $03, $0C, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $12, $FF, + $A4, $FF, $10, $0D, $1D, $1D, $1D, $1D, $08, $02, $17, $17, $17, $17, $14, $1B, + $1B, $1B, $1B, $08, $10, $10, $10, $01, $1B, $12, $10, $10, $10, $10, $1B, $12, + $10, $0C, $1B, $1B, $10, $0B, $1B, $1B, $1B, $1B, $1B, $1B, $10, $1E, $1B, $1B, + $1B, $0B, $0C, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $12, $03, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $03, $10, $0D, $0C, $1B, $1B, $1B, $1B, + $1B, $1B, $0E, $10, $08, $03, $12, $1B, $1B, $1B, $1B, $1B, $1B, $1E, $10, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0E, $1E, $1B, $1B, $1B, $1B, $1B, $1B, + $03, $08, $12, $1B, $1B, $0C, $08, $10, $08, $03, $12, $1B, $1B, $1B, $1B, $1B, + $0B, $0E, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $FF, $A4, $FF, $10, $1D, + $1D, $1D, $1D, $1E, $02, $17, $17, $17, $17, $17, $17, $1B, $1B, $1B, $1B, $12, + $12, $12, $12, $1B, $1B, $1B, $12, $12, $12, $12, $1B, $1B, $0E, $01, $1E, $03, + $10, $08, $03, $0D, $03, $0D, $03, $0D, $10, $10, $03, $0D, $03, $08, $0D, $1E, + $03, $0D, $03, $0D, $03, $0D, $03, $03, $03, $0D, $08, $03, $0D, $03, $0D, $03, + $0D, $03, $0D, $03, $08, $10, $08, $10, $0D, $03, $0B, $0B, $0B, $0D, $08, $10, + $10, $10, $08, $0D, $03, $0B, $0B, $03, $1E, $08, $10, $03, $0D, $03, $03, $03, + $03, $0D, $03, $03, $08, $08, $03, $0D, $03, $03, $0D, $03, $08, $10, $0D, $03, + $03, $0D, $08, $10, $10, $10, $08, $08, $03, $0E, $0B, $0D, $08, $1E, $03, $03, + $03, $03, $0D, $03, $03, $03, $0D, $FF, $A4, $FF, $0D, $1D, $1D, $1D, $0D, $02, + $17, $17, $17, $17, $17, $02, $03, $0F, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $03, $09, $10, $10, $08, $10, $10, $08, + $10, $10, $08, $10, $08, $10, $10, $08, $10, $08, $10, $10, $08, $10, $10, $08, + $10, $10, $08, $10, $10, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $08, + $10, $10, $10, $10, $10, $10, $10, $10, $08, $10, $10, $10, $10, $08, $10, $10, + $08, $10, $10, $10, $08, $10, $10, $08, $10, $10, $10, $10, $10, $10, $10, $10, + $08, $10, $10, $08, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $08, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $08, $FF, $A4, $FF, $0D, $1D, $1D, $1F, $03, $17, $17, $17, $17, $02, + $03, $0E, $09, $09, $16, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, + $1B, $1B, $1B, $11, $0D, $09, $1E, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $14, $14, $14, $0A, $0A, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, + $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0B, $10, $FF, + $A4, $FF, $1F, $1D, $1D, $1E, $05, $17, $17, $17, $02, $0B, $09, $09, $09, $09, + $0B, $03, $16, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $0A, $11, $11, + $08, $09, $13, $10, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $08, $10, $10, $08, $10, $10, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $08, $10, $10, $10, $10, $08, $10, $10, $10, $10, $10, + $10, $10, $08, $10, $10, $10, $10, $10, $0B, $03, $10, $10, $10, $10, $10, $10, + $08, $10, $10, $10, $08, $10, $10, $10, $10, $10, $08, $10, $10, $08, $10, $08, + $10, $08, $10, $08, $10, $10, $10, $10, $10, $10, $10, $08, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $10, $FF, $A4, $FF, $1D, $1D, + $1F, $0F, $17, $17, $17, $18, $0B, $09, $09, $09, $09, $03, $10, $10, $1E, $0C, + $1B, $1B, $1B, $1B, $1B, $1B, $1B, $1B, $19, $11, $11, $11, $1E, $09, $0E, $08, + $10, $08, $10, $10, $10, $10, $08, $10, $10, $08, $10, $10, $10, $10, $08, $10, + $10, $10, $10, $08, $10, $10, $10, $10, $10, $08, $10, $10, $08, $10, $10, $08, + $08, $10, $10, $10, $08, $1E, $08, $10, $08, $10, $10, $08, $1E, $08, $10, $10, + $10, $10, $10, $10, $0B, $1E, $08, $10, $08, $1E, $08, $10, $10, $08, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $10, $10, $10, $10, $10, $10, $08, $1E, $08, + $10, $08, $10, $10, $1E, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, + $08, $1E, $10, $10, $10, $08, $10, $FF, $A4, $FF, $1D, $1D, $0D, $1A, $17, $17, + $17, $0F, $16, $09, $09, $09, $0B, $10, $10, $08, $10, $10, $08, $0B, $19, $16, + $16, $1C, $07, $0D, $11, $11, $11, $06, $03, $09, $01, $10, $10, $10, $10, $08, + $10, $08, $10, $10, $08, $0B, $02, $10, $14, $10, $10, $10, $0A, $1E, $0F, $1A, + $10, $08, $08, $14, $10, $1A, $0F, $10, $10, $10, $1A, $00, $10, $10, $08, $10, + $1A, $0B, $19, $0A, $0B, $10, $03, $19, $0B, $1A, $0B, $10, $08, $1A, $19, $19, + $1A, $03, $10, $10, $1A, $0B, $19, $0A, $0B, $10, $03, $0B, $0A, $0B, $0B, $10, + $1E, $0A, $03, $10, $02, $0E, $10, $10, $0F, $1A, $0B, $1A, $03, $08, $10, $03, + $00, $0B, $10, $10, $08, $0B, $19, $0B, $0F, $10, $10, $08, $1A, $0B, $19, $0A, + $0F, $10, $10, $FF, $A4, $FF, $1D, $1D, $1E, $05, $17, $17, $05, $0B, $09, $09, + $09, $16, $1E, $10, $10, $10, $10, $10, $08, $08, $03, $1D, $1D, $1D, $1D, $0D, + $11, $11, $11, $15, $0B, $09, $01, $10, $10, $10, $08, $10, $10, $10, $10, $08, + $10, $0B, $1A, $0F, $1A, $1E, $10, $10, $02, $0E, $02, $0B, $08, $10, $03, $1A, + $1E, $1A, $0B, $08, $10, $10, $03, $02, $10, $08, $10, $10, $0B, $10, $10, $1A, + $08, $10, $1A, $08, $10, $08, $1A, $10, $0F, $03, $08, $10, $1A, $03, $10, $10, + $0B, $10, $08, $1A, $08, $10, $08, $10, $1A, $10, $10, $10, $10, $1A, $10, $10, + $03, $1E, $08, $10, $1A, $10, $10, $10, $08, $10, $10, $08, $1A, $1E, $10, $10, + $10, $10, $0B, $10, $08, $10, $08, $10, $0B, $10, $10, $19, $10, $10, $10, $FF, + $A4, $FF, $1D, $1D, $1E, $17, $17, $17, $02, $01, $09, $09, $09, $0E, $15, $08, + $08, $10, $08, $10, $10, $10, $0D, $1D, $1D, $1D, $13, $04, $11, $11, $11, $15, + $0C, $09, $01, $10, $10, $10, $10, $08, $10, $10, $08, $10, $10, $02, $0E, $1A, + $1E, $0F, $10, $1E, $0B, $02, $1A, $02, $10, $10, $0E, $1E, $19, $03, $02, $10, + $10, $10, $08, $10, $08, $10, $10, $10, $0B, $10, $08, $1A, $10, $10, $0B, $10, + $10, $10, $0B, $10, $0B, $10, $10, $10, $0B, $03, $10, $10, $0B, $10, $10, $1A, + $10, $10, $10, $10, $1A, $10, $08, $10, $08, $1A, $10, $10, $03, $1E, $10, $10, + $1A, $10, $10, $10, $10, $10, $10, $10, $10, $10, $08, $10, $08, $10, $0B, $10, + $10, $10, $10, $10, $0B, $08, $10, $1A, $10, $08, $10, $FF, $A4, $FF, $1D, $1D, + $04, $17, $17, $17, $02, $01, $09, $09, $09, $0B, $06, $08, $10, $10, $10, $10, + $10, $0D, $1D, $1D, $1D, $1D, $0D, $06, $11, $11, $11, $08, $16, $09, $0C, $10, + $10, $10, $08, $10, $10, $08, $10, $10, $10, $1A, $1E, $1A, $08, $1A, $10, $0B, + $03, $0B, $0F, $0F, $1E, $08, $02, $10, $19, $08, $1A, $10, $10, $08, $10, $10, + $10, $10, $10, $08, $0F, $10, $10, $1A, $10, $10, $02, $10, $08, $10, $1A, $10, + $1A, $10, $08, $10, $02, $0D, $08, $10, $0B, $10, $10, $1A, $10, $10, $08, $10, + $1A, $10, $10, $10, $10, $1A, $08, $10, $03, $03, $10, $10, $1A, $10, $08, $10, + $08, $10, $08, $10, $10, $08, $10, $10, $10, $10, $19, $08, $10, $10, $10, $10, + $0B, $10, $10, $1A, $10, $10, $10, $FF, $A4, $FF, $1F, $1F, $0F, $17, $17, $17, + $02, $01, $09, $09, $09, $03, $11, $06, $08, $10, $08, $08, $0D, $1D, $1D, $1D, + $1D, $0D, $15, $11, $11, $11, $06, $03, $09, $09, $0E, $10, $10, $10, $10, $10, + $08, $10, $10, $10, $0B, $1A, $08, $10, $03, $19, $1E, $19, $0F, $10, $08, $0E, + $1A, $1E, $19, $03, $10, $08, $19, $03, $10, $10, $10, $10, $08, $10, $08, $03, + $0E, $10, $03, $0A, $10, $10, $0B, $0B, $1E, $0F, $1A, $10, $1E, $1A, $1E, $03, + $0A, $02, $10, $0F, $0B, $08, $03, $0A, $10, $10, $08, $0B, $19, $10, $10, $08, + $08, $0A, $1A, $1E, $19, $08, $08, $03, $0A, $0B, $0B, $03, $10, $10, $10, $10, + $08, $10, $10, $10, $08, $0F, $0E, $19, $03, $1A, $10, $0F, $0B, $08, $03, $0A, + $10, $10, $08, $FF, $A4, $FF, $1F, $1D, $04, $17, $17, $17, $02, $16, $09, $09, + $09, $03, $11, $11, $15, $10, $0D, $1F, $1D, $1D, $1D, $1D, $0D, $15, $11, $11, + $11, $11, $04, $16, $09, $09, $0D, $08, $08, $10, $10, $08, $10, $10, $10, $08, + $1E, $1E, $10, $08, $08, $1E, $08, $1E, $1E, $10, $10, $1E, $1E, $08, $1E, $08, + $08, $08, $1E, $08, $08, $10, $10, $08, $10, $10, $10, $1E, $08, $08, $08, $1E, + $08, $10, $10, $1E, $0B, $03, $10, $10, $08, $08, $0B, $03, $08, $1E, $10, $1E, + $08, $08, $08, $1E, $08, $10, $08, $1E, $1E, $10, $10, $10, $08, $1E, $08, $0F, + $08, $10, $10, $08, $1A, $03, $1E, $08, $08, $10, $10, $08, $10, $10, $10, $08, + $10, $1E, $08, $08, $1E, $08, $10, $1E, $08, $08, $08, $1E, $10, $10, $10, $FF, + $A4, $FF, $0D, $1D, $1E, $17, $17, $17, $02, $01, $09, $09, $09, $0E, $06, $11, + $11, $06, $04, $08, $0D, $0D, $08, $04, $06, $11, $11, $11, $11, $15, $03, $09, + $09, $09, $10, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $0E, $10, $10, $08, $10, $10, $08, $10, $10, $10, $08, $10, + $1A, $10, $10, $08, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, + $10, $10, $08, $10, $10, $10, $08, $10, $08, $10, $08, $FF, $A4, $FF, $08, $1D, + $08, $17, $17, $17, $05, $03, $09, $09, $09, $16, $04, $11, $11, $11, $11, $11, + $11, $06, $11, $11, $11, $11, $11, $11, $06, $1E, $09, $09, $09, $01, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $19, $10, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $10, $10, $FF, $A4, $FF, $10, $1F, $0D, $18, $17, $17, + $17, $0F, $09, $09, $09, $09, $03, $06, $11, $11, $11, $11, $11, $11, $11, $11, + $11, $11, $11, $15, $1E, $16, $09, $09, $09, $1E, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $08, $10, $FF, $A4, $FF, $10, $08, $1F, $0F, $17, $17, $17, $02, $01, $09, + $09, $09, $09, $03, $06, $11, $11, $11, $11, $11, $11, $11, $11, $11, $15, $1E, + $16, $09, $09, $09, $01, $10, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $10, $10, $FF, + $A4, $FF, $10, $08, $1F, $1E, $17, $17, $17, $05, $1E, $16, $09, $09, $09, $16, + $03, $15, $06, $11, $11, $11, $11, $06, $15, $1E, $0E, $09, $09, $09, $09, $09, + $08, $08, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $08, $FF, $A4, $FF, $10, $10, + $08, $0D, $02, $17, $17, $17, $18, $03, $09, $09, $09, $09, $09, $01, $03, $1E, + $04, $04, $08, $0F, $01, $09, $09, $09, $09, $09, $09, $0D, $08, $10, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $FF, $A4, $FF, $10, $08, $10, $08, $1E, $17, + $17, $17, $17, $0F, $0B, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, + $09, $09, $09, $09, $09, $09, $0B, $10, $08, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, + $10, $10, $10, $FF, $A4, $FF, $10, $10, $10, $10, $08, $0F, $17, $17, $17, $17, + $0F, $0B, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, + $16, $03, $08, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, + $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $10, $10, $08, $10, $FF, + $A4, $FF, $10, $08, $10, $08, $10, $08, $02, $17, $17, $17, $17, $02, $1E, $16, + $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $09, $0E, $08, $10, $10, $08, + $10, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $10, $FF, $A4, $FF, $10, $10, + $10, $10, $10, $10, $08, $02, $17, $17, $17, $17, $18, $04, $1E, $0C, $16, $09, + $09, $09, $09, $09, $01, $0B, $08, $04, $08, $08, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $08, $FF, $A4, $FF, $10, $08, $10, $08, $10, $08, + $10, $08, $0F, $05, $17, $17, $17, $17, $18, $0F, $04, $08, $1E, $1E, $08, $1E, + $04, $02, $02, $10, $10, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, $08, $10, + $08, $10, $10, $FF, $A4, $FF, $10, $10, $10, $10, $10, $10, $10, $10, $10, $08, + $02, $05, $17, $17, $17, $17, $17, $17, $05, $05, $17, $05, $02, $08, $10, $10, + $08, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, + $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $FF, + $A4, $FF, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $08, $04, $02, + $18, $18, $18, $18, $18, $0F, $04, $08, $08, $10, $10, $08, $10, $10, $08, $10, + $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, + $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, + $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, + $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, + $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, + $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $10, + $10, $08, $10, $10, $08, $10, $10, $08, $10, $10, $08, $FF, $A4, $FF + ); + diff --git a/vinfo.pas b/vinfo.pas new file mode 100644 index 0000000..9619ee3 --- /dev/null +++ b/vinfo.pas @@ -0,0 +1,128 @@ +unit vinfo; + +{$mode objfpc} + +interface + +uses + Classes, SysUtils, resource, versiontypes, versionresource; + +type + TVersionPrecision = 1..4; + + { TVersionInfo } + + TVersionInfo = class + private + FVersResource: TVersionResource; + function GetBuild: Integer; + function GetFixedInfo: TVersionFixedInfo; + function GetStringFileInfo: TVersionStringFileInfo; + function GetVarFileInfo: TVersionVarFileInfo; + public + constructor Create; + destructor Destroy; override; + + procedure Load(Instance: THandle); + property FixedInfo: TVersionFixedInfo read GetFixedInfo; + property StringFileInfo: TVersionStringFileInfo read GetStringFileInfo; + property VarFileInfo: TVersionVarFileInfo read GetVarFileInfo; + + property Build: Integer read GetBuild; + + //Helper functions + function GetFileVersionString: String; + function GetProductVersionString(AMinPrecision: TVersionPrecision = 2): String; + end; + +var + VersionInfo: TVersionInfo; + +implementation + +{ TVersionInfo } + +function TVersionInfo.GetBuild: Integer; +begin + Result := Integer(FixedInfo.FileVersion[3]); +end; + +function TVersionInfo.GetFixedInfo: TVersionFixedInfo; +begin + Result := FVersResource.FixedInfo; +end; + +function TVersionInfo.GetStringFileInfo: TVersionStringFileInfo; +begin + Result := FVersResource.StringFileInfo; +end; + +function TVersionInfo.GetVarFileInfo: TVersionVarFileInfo; +begin + Result := FVersResource.VarFileInfo; +end; + +constructor TVersionInfo.Create; +begin + inherited Create; + FVersResource := TVersionResource.Create; +end; + +destructor TVersionInfo.Destroy; +begin + FVersResource.Free; + inherited Destroy; +end; + +procedure TVersionInfo.Load(Instance: THandle); +var + Stream: TResourceStream; +begin + Stream := TResourceStream.CreateFromID(Instance, 1, PChar(RT_VERSION)); + try + FVersResource.SetCustomRawDataStream(Stream); + // access some property to load from the stream + FVersResource.FixedInfo; + // clear the stream + FVersResource.SetCustomRawDataStream(nil); + finally + Stream.Free; + end; +end; + +function TVersionInfo.GetProductVersionString(AMinPrecision: TVersionPrecision = 2): String; +var + productVersion: TFileProductVersion; + lastVersion, i: Integer; +begin + productVersion := FixedInfo.ProductVersion; + lastVersion := 3; + while (lastVersion >= AMinPrecision) and (productVersion[lastVersion] = 0) do + dec(lastVersion); + + Result := ''; + for i := 0 to lastVersion do + begin + Result := Result + IntToStr(productVersion[i]); + if i < lastVersion then + Result := Result + '.'; + end; +end; + +function TVersionInfo.GetFileVersionString: String; +var + fileVersion: TFileProductVersion; +begin + fileVersion := FixedInfo.FileVersion; + Result := Format('%d.%d.%d', [fileVersion[0], fileVersion[1], fileVersion[2]]); +end; + +initialization + VersionInfo := TVersionInfo.Create; + VersionInfo.Load(HINSTANCE); + +finalization + VersionInfo.Free; + +end. +