├── .gitignore ├── ImageOverview ├── project1.lpi ├── project1.lpr ├── unit1.lfm ├── unit1.pas ├── unit2.lfm ├── unit2.pas └── uvectormath.inc ├── OpponentOverview ├── project1.lpi ├── project1.lpr ├── unit1.lfm ├── unit1.pas └── uvectormath.inc ├── Readme.md ├── bin ├── Animation_Editor ├── Animation_Editor.exe ├── Opponent_overview ├── Opponent_overview.exe ├── config_td ├── config_td.exe ├── ctd.version ├── ctd_launcher ├── ctd_launcher.exe ├── ctd_server ├── ctd_server.exe ├── ctd_updater ├── ctd_updater.exe ├── image_overview └── image_overview.exe ├── client ├── HandleUpdateMapProperty.inc ├── apptype.inc ├── config_td.ico ├── config_td.lpi ├── config_td.lpr ├── globalsettings.inc ├── ubuilding_stage_frame.lfm ├── ubuilding_stage_frame.pas ├── uchunkmanager.inc ├── ucolorselectbox.pas ├── uctd.pas ├── uctd_maptext.pas ├── uctd_splashhintmanager.pas ├── ueventer.inc ├── uhero_level_frame.lfm ├── uhero_level_frame.pas ├── ulogger.inc ├── unit1.lfm ├── unit1.pas ├── unit10.lfm ├── unit10.pas ├── unit11.lfm ├── unit11.pas ├── unit12.lfm ├── unit12.pas ├── unit13.lfm ├── unit13.pas ├── unit14.lfm ├── unit14.pas ├── unit15.lfm ├── unit15.pas ├── unit16.lfm ├── unit16.pas ├── unit17.lfm ├── unit17.pas ├── unit18.lfm ├── unit18.pas ├── unit19.lfm ├── unit19.pas ├── unit2.lfm ├── unit2.pas ├── unit20.lfm ├── unit20.pas ├── unit3.lfm ├── unit3.pas ├── unit4.lfm ├── unit4.pas ├── unit5.lfm ├── unit5.pas ├── unit6.lfm ├── unit6.pas ├── unit7.lfm ├── unit7.pas ├── unit8.lfm ├── unit8.pas ├── unit9.lfm ├── unit9.pas ├── updater_settings.inc ├── uplayer_info_frame.lfm ├── uplayer_info_frame.pas ├── usplashmarkmanager.pas ├── uvectormath.inc ├── uwave_frame.lfm ├── uwave_frame.pas ├── uwave_oppenent_frame.lfm └── uwave_oppenent_frame.pas ├── documentation ├── FAQ.md ├── Readme.md ├── buildingguide.md ├── clean_and_check_map.md ├── cmd_commands.md ├── controls.md ├── filefolders.md ├── heroguide.md ├── images │ ├── BuildingSettings.png │ ├── Hero_Settings.png │ ├── OpenBuilding.png │ ├── OpenHeros.png │ ├── OpenOpponent.png │ ├── OpponentSettings.png │ ├── ctd_launcher_preview.png │ ├── demo_map_add_buildings.png │ ├── demo_map_add_opponents.png │ ├── demo_map_check_result.png │ ├── demo_map_cleanup_opponents.png │ ├── demo_map_continue_gaming.png │ ├── demo_map_create.png │ ├── demo_map_first_testrun.png │ ├── demo_map_first_wave.png │ ├── demo_map_general.png │ ├── demo_map_general2.png │ ├── demo_map_mapguide_result.png │ ├── demo_map_remove_buildings.png │ ├── demo_map_restart_last_wave.png │ ├── demo_map_save_and_check.png │ ├── demo_map_set_background.png │ ├── demo_map_set_building_waves.png │ ├── demo_map_terrain1.png │ ├── demo_map_terrain2.png │ ├── demo_map_texture_editor.png │ ├── demo_map_wave_by_ai.png │ ├── demo_map_waypoint_editing.png │ ├── folder_preview.png │ ├── game_started.png │ ├── host_game.png │ ├── in_game.png │ ├── preview_classic_pixelart.png │ ├── preview_color.png │ ├── preview_comic.png │ ├── preview_minitd.png │ ├── select_G1_map.png │ ├── select_difficulty.png │ └── select_map.png ├── ingame.md ├── mapguide.md ├── opponentguide.md ├── quickstart.md ├── validate_map.md └── waveguide.md ├── help ├── General.html ├── Keyboard_Shortcuts.html └── index.txt ├── launcher ├── ctd_launcher.ico ├── ctd_launcher.lpi ├── ctd_launcher.lpr ├── ctd_launcher.lrs ├── ctd_updater │ ├── ctd_updater.lpi │ ├── ctd_updater.lpr │ ├── unit1.lfm │ └── unit1.pas ├── launcher.rc ├── uJSON.pas ├── ulauncher.pas ├── uncommenter.pas ├── unit1.lfm ├── unit1.pas ├── unit2.lfm ├── unit2.pas ├── unit3.lfm ├── unit3.pas ├── unit4.lfm ├── unit4.pas ├── unit5.lfm ├── unit5.pas └── usynapsedownloader.pas ├── license.md ├── server ├── apptype.inc ├── ctd_server.ico ├── ctd_server.lpi ├── ctd_server.lpr ├── uchunkmanager.inc ├── uctd_spawnmodule.pas ├── uctdserver.pas ├── ulogger.inc └── uvectormath.inc ├── textures ├── BTN_host_game_n.png ├── BTN_host_game_s.png ├── BTN_join_game_n.png ├── BTN_join_game_s.png ├── BTN_load_game_n.png ├── BTN_load_game_s.png ├── BTN_load_map_n.png ├── BTN_load_map_s.png ├── BTN_new_map_n.png ├── BTN_new_map_s.png ├── build_in_progress.png ├── buykachel.png ├── coins.png ├── coins_dark.png ├── dc1.png ├── dc2.png ├── dc3.png ├── dc4.png ├── first.png ├── firsts.png ├── heart.png ├── heart_dark.png ├── host_join_back.png ├── last.png ├── lasts.png ├── level_up.png ├── load_map_back.png ├── maxdistance.png ├── maxdistances.png ├── mindistance.png ├── mindistances.png ├── playerstartpoint.png ├── prefer_air.png ├── prefer_airs.png ├── random.png ├── randoms.png ├── select.png ├── sell.png ├── splashmark.png ├── stars0.bmp ├── stars1.bmp ├── stars2.bmp ├── stars3.bmp ├── stars4.bmp ├── stars5.bmp ├── stars6.bmp ├── stars7.bmp ├── stars8.bmp ├── stars9.bmp ├── strongest.png ├── strongests.png ├── tab_down.png ├── tab_left.png ├── tab_right.png ├── tab_up.png ├── targets.png ├── targets_dark.png ├── wave.png ├── wave_dark.png ├── weakest.png └── weakests.png └── units ├── uchunkmanager.pas ├── ucrc.pas ├── uctd_building.pas ├── uctd_bullet.pas ├── uctd_common.pas ├── uctd_hero.pas ├── uctd_map.pas ├── uctd_mapobject.pas ├── uctd_messages.pas ├── uctd_opp.pas ├── udomxml.pas ├── ueventer.pas ├── ufifo.pas ├── ugraphics.pas ├── uip.pas ├── ulogger.pas ├── uopengl_animation.pas ├── uopengl_ascii_font.pas ├── uopengl_ascii_font.ressource ├── uopengl_font_common.pas ├── uopengl_graphikengine.pas ├── uopengl_spriteengine.pas ├── uopengl_truetype_font.pas ├── uopengl_widgetset.pas └── uvectormath.pas /.gitignore: -------------------------------------------------------------------------------- 1 | server/ctd_server.lps 2 | share/ 3 | logs/ 4 | settings.ini 5 | savegames/ 6 | -------------------------------------------------------------------------------- /ImageOverview/project1.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | <ResourceType Value="res"/> 13 | <UseXPManifest Value="True"/> 14 | </General> 15 | <i18n> 16 | <EnableI18N LFM="False"/> 17 | </i18n> 18 | <BuildModes Count="1"> 19 | <Item1 Name="Default" Default="True"/> 20 | </BuildModes> 21 | <PublishOptions> 22 | <Version Value="2"/> 23 | </PublishOptions> 24 | <RunParams> 25 | <local> 26 | <CommandLineParams Value="\sda5\sda5\Temp\ConfigTD_Data_git\graphics\units"/> 27 | </local> 28 | <FormatVersion Value="2"/> 29 | <Modes Count="1"> 30 | <Mode0 Name="default"> 31 | <local> 32 | <CommandLineParams Value="\sda5\sda5\Temp\ConfigTD_Data_git\graphics\units"/> 33 | </local> 34 | </Mode0> 35 | </Modes> 36 | </RunParams> 37 | <RequiredPackages Count="2"> 38 | <Item1> 39 | <PackageName Value="LazOpenGLContext"/> 40 | </Item1> 41 | <Item2> 42 | <PackageName Value="LCL"/> 43 | </Item2> 44 | </RequiredPackages> 45 | <Units Count="7"> 46 | <Unit0> 47 | <Filename Value="project1.lpr"/> 48 | <IsPartOfProject Value="True"/> 49 | </Unit0> 50 | <Unit1> 51 | <Filename Value="unit1.pas"/> 52 | <IsPartOfProject Value="True"/> 53 | <ComponentName Value="Form1"/> 54 | <HasResources Value="True"/> 55 | <ResourceBaseClass Value="Form"/> 56 | <UnitName Value="Unit1"/> 57 | </Unit1> 58 | <Unit2> 59 | <Filename Value="..\..\Sample\Graphik\ugraphics.pas"/> 60 | <IsPartOfProject Value="True"/> 61 | </Unit2> 62 | <Unit3> 63 | <Filename Value="..\..\Sample\DatenSteuerung\uvectormath.pas"/> 64 | <IsPartOfProject Value="True"/> 65 | </Unit3> 66 | <Unit4> 67 | <Filename Value="uvectormath.inc"/> 68 | <IsPartOfProject Value="True"/> 69 | </Unit4> 70 | <Unit5> 71 | <Filename Value="..\..\Sample\OpenGL\uopengl_animation.pas"/> 72 | <IsPartOfProject Value="True"/> 73 | </Unit5> 74 | <Unit6> 75 | <Filename Value="unit2.pas"/> 76 | <IsPartOfProject Value="True"/> 77 | <ComponentName Value="Form2"/> 78 | <HasResources Value="True"/> 79 | <ResourceBaseClass Value="Form"/> 80 | <UnitName Value="Unit2"/> 81 | </Unit6> 82 | </Units> 83 | </ProjectOptions> 84 | <CompilerOptions> 85 | <Version Value="11"/> 86 | <PathDelim Value="\"/> 87 | <Target> 88 | <Filename Value="..\image_overview"/> 89 | </Target> 90 | <SearchPaths> 91 | <IncludeFiles Value="$(ProjOutDir)"/> 92 | <OtherUnitFiles Value="..\..\Sample\OpenGL;..\..\Sample\Graphik;..\..\Sample\DatenSteuerung;..\units"/> 93 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 94 | </SearchPaths> 95 | <Linking> 96 | <Options> 97 | <Win32> 98 | <GraphicApplication Value="True"/> 99 | </Win32> 100 | </Options> 101 | </Linking> 102 | </CompilerOptions> 103 | <Debugging> 104 | <Exceptions Count="3"> 105 | <Item1> 106 | <Name Value="EAbort"/> 107 | </Item1> 108 | <Item2> 109 | <Name Value="ECodetoolError"/> 110 | </Item2> 111 | <Item3> 112 | <Name Value="EFOpenError"/> 113 | </Item3> 114 | </Exceptions> 115 | </Debugging> 116 | </CONFIG> 117 | -------------------------------------------------------------------------------- /ImageOverview/project1.lpr: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | program project1; 16 | 17 | {$mode objfpc}{$H+} 18 | 19 | uses 20 | {$IFDEF UNIX}{$IFDEF UseCThreads} 21 | cthreads, 22 | {$ENDIF}{$ENDIF} 23 | Interfaces, // this includes the LCL widgetset 24 | Forms, lazopenglcontext, Unit1, ugraphics, uvectormath, uopengl_animation, 25 | unit2 26 | { you can add units after this }; 27 | 28 | {$R *.res} 29 | 30 | begin 31 | RequireDerivedFormResource := True; 32 | Application.Initialize; 33 | Application.CreateForm(TForm1, Form1); 34 | Application.CreateForm(TForm2, Form2); 35 | Application.Run; 36 | end. 37 | 38 | -------------------------------------------------------------------------------- /ImageOverview/unit1.lfm: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 347 3 | Height = 504 4 | Top = 107 5 | Width = 512 6 | Caption = 'Form1' 7 | ClientHeight = 504 8 | ClientWidth = 512 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnActivate = FormActivate 12 | OnCreate = FormCreate 13 | object Button1: TButton 14 | Left = 8 15 | Height = 25 16 | Top = 8 17 | Width = 496 18 | Anchors = [akTop, akLeft, akRight] 19 | Caption = 'Scan folder' 20 | TabOrder = 0 21 | OnClick = Button1Click 22 | end 23 | object ListBox1: TListBox 24 | Left = 8 25 | Height = 367 26 | Top = 64 27 | Width = 496 28 | Anchors = [akTop, akLeft, akRight, akBottom] 29 | Items.Strings = ( 30 | 'a' 31 | 'b' 32 | 'c' 33 | ) 34 | ItemHeight = 40 35 | ScrollWidth = 492 36 | Style = lbOwnerDrawFixed 37 | TabOrder = 1 38 | OnClick = ListBox1Click 39 | OnDblClick = ListBox1DblClick 40 | OnDrawItem = ListBox1DrawItem 41 | end 42 | object Edit1: TEdit 43 | Left = 8 44 | Height = 26 45 | Top = 434 46 | Width = 344 47 | Anchors = [akLeft, akRight, akBottom] 48 | ReadOnly = True 49 | TabOrder = 2 50 | Text = 'Edit1' 51 | end 52 | object Button2: TButton 53 | Left = 8 54 | Height = 25 55 | Top = 471 56 | Width = 496 57 | Anchors = [akLeft, akRight, akBottom] 58 | Caption = 'Close' 59 | TabOrder = 3 60 | OnClick = Button2Click 61 | end 62 | object ProgressBar1: TProgressBar 63 | Left = 8 64 | Height = 20 65 | Top = 40 66 | Width = 496 67 | Anchors = [akTop, akLeft, akRight] 68 | TabOrder = 4 69 | Visible = False 70 | end 71 | object Button3: TButton 72 | Left = 360 73 | Height = 25 74 | Top = 435 75 | Width = 144 76 | Anchors = [akRight, akBottom] 77 | Caption = 'Filename to clipboard' 78 | TabOrder = 5 79 | OnClick = Button3Click 80 | end 81 | object SelectDirectoryDialog1: TSelectDirectoryDialog 82 | Left = 80 83 | Top = 56 84 | end 85 | end 86 | -------------------------------------------------------------------------------- /ImageOverview/unit2.lfm: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 347 3 | Height = 422 4 | Top = 107 5 | Width = 529 6 | BorderStyle = bsDialog 7 | Caption = 'Form2' 8 | ClientHeight = 422 9 | ClientWidth = 529 10 | Position = poScreenCenter 11 | LCLVersion = '3.99.0.0' 12 | OnCreate = FormCreate 13 | OnDestroy = FormDestroy 14 | OnHide = FormHide 15 | object Button1: TButton 16 | Left = 8 17 | Height = 25 18 | Top = 384 19 | Width = 512 20 | Anchors = [akLeft, akRight, akBottom] 21 | Caption = 'OK' 22 | ModalResult = 1 23 | TabOrder = 0 24 | end 25 | object OpenGLControl1: TOpenGLControl 26 | Left = 8 27 | Height = 344 28 | Top = 8 29 | Width = 512 30 | Anchors = [akTop, akLeft, akRight, akBottom] 31 | OnMakeCurrent = OpenGLControl1MakeCurrent 32 | OnPaint = OpenGLControl1Paint 33 | OnResize = OpenGLControl1Resize 34 | end 35 | object ScrollBar1: TScrollBar 36 | Left = 8 37 | Height = 14 38 | Top = 360 39 | Width = 512 40 | Anchors = [akLeft, akRight, akBottom] 41 | Max = 360 42 | PageSize = 0 43 | TabOrder = 2 44 | end 45 | object Image1: TImage 46 | Left = 8 47 | Height = 344 48 | Top = 8 49 | Width = 512 50 | Anchors = [akTop, akLeft, akRight, akBottom] 51 | AutoSize = True 52 | end 53 | object Timer1: TTimer 54 | Enabled = False 55 | Interval = 25 56 | OnTimer = Timer1Timer 57 | Left = 24 58 | Top = 24 59 | end 60 | end 61 | -------------------------------------------------------------------------------- /ImageOverview/uvectormath.inc: -------------------------------------------------------------------------------- 1 | // Mit diesem Schalter kann das Überladen der Standard Operatoren Aktiviert 2 | // werden ( Achtung das kann nicht jeder FPC Compiler ) 3 | 4 | {$DEFINE UseOperandOverloading} 5 | 6 | TBaseType = Single; // Alle Komponenten bestehen aus BaseType, zur Nutzung von OpenGL ist Single zwingend !! 7 | -------------------------------------------------------------------------------- /OpponentOverview/project1.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="12"/> 5 | <General> 6 | <Flags> 7 | <CompatibilityMode Value="True"/> 8 | </Flags> 9 | <SessionStorage Value="InProjectDir"/> 10 | <Title Value="project1"/> 11 | <ResourceType Value="res"/> 12 | <UseXPManifest Value="True"/> 13 | </General> 14 | <i18n> 15 | <EnableI18N LFM="False"/> 16 | </i18n> 17 | <BuildModes Count="1"> 18 | <Item1 Name="Default" Default="True"/> 19 | </BuildModes> 20 | <PublishOptions> 21 | <Version Value="2"/> 22 | </PublishOptions> 23 | <RunParams> 24 | <FormatVersion Value="2"/> 25 | <Modes Count="1"> 26 | <Mode0 Name="default"/> 27 | </Modes> 28 | </RunParams> 29 | <RequiredPackages Count="1"> 30 | <Item1> 31 | <PackageName Value="LCL"/> 32 | </Item1> 33 | </RequiredPackages> 34 | <Units Count="6"> 35 | <Unit0> 36 | <Filename Value="project1.lpr"/> 37 | <IsPartOfProject Value="True"/> 38 | </Unit0> 39 | <Unit1> 40 | <Filename Value="unit1.pas"/> 41 | <IsPartOfProject Value="True"/> 42 | <ComponentName Value="Form1"/> 43 | <HasResources Value="True"/> 44 | <ResourceBaseClass Value="Form"/> 45 | <UnitName Value="Unit1"/> 46 | </Unit1> 47 | <Unit2> 48 | <Filename Value="../../Sample/Graphik/ugraphics.pas"/> 49 | <IsPartOfProject Value="True"/> 50 | </Unit2> 51 | <Unit3> 52 | <Filename Value="../../Sample/DatenSteuerung/uvectormath.pas"/> 53 | <IsPartOfProject Value="True"/> 54 | </Unit3> 55 | <Unit4> 56 | <Filename Value="uvectormath.inc"/> 57 | <IsPartOfProject Value="True"/> 58 | </Unit4> 59 | <Unit5> 60 | <Filename Value="../../Sample/OpenGL/uopengl_animation.pas"/> 61 | <IsPartOfProject Value="True"/> 62 | </Unit5> 63 | </Units> 64 | </ProjectOptions> 65 | <CompilerOptions> 66 | <Version Value="11"/> 67 | <Target> 68 | <Filename Value="../Opponent_overview"/> 69 | </Target> 70 | <SearchPaths> 71 | <IncludeFiles Value="$(ProjOutDir)"/> 72 | <OtherUnitFiles Value="../../Sample/OpenGL;../../Sample/Graphik;../../Sample/DatenSteuerung;../units"/> 73 | <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> 74 | </SearchPaths> 75 | <Linking> 76 | <Options> 77 | <Win32> 78 | <GraphicApplication Value="True"/> 79 | </Win32> 80 | </Options> 81 | </Linking> 82 | </CompilerOptions> 83 | <Debugging> 84 | <Exceptions Count="3"> 85 | <Item1> 86 | <Name Value="EAbort"/> 87 | </Item1> 88 | <Item2> 89 | <Name Value="ECodetoolError"/> 90 | </Item2> 91 | <Item3> 92 | <Name Value="EFOpenError"/> 93 | </Item3> 94 | </Exceptions> 95 | </Debugging> 96 | </CONFIG> 97 | -------------------------------------------------------------------------------- /OpponentOverview/project1.lpr: -------------------------------------------------------------------------------- 1 | program project1; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | uses 6 | {$IFDEF UNIX}{$IFDEF UseCThreads} 7 | cthreads, 8 | {$ENDIF}{$ENDIF} 9 | Interfaces, // this includes the LCL widgetset 10 | Forms, Unit1, ugraphics, uvectormath, uopengl_animation 11 | { you can add units after this }; 12 | 13 | {$R *.res} 14 | 15 | begin 16 | RequireDerivedFormResource:=True; 17 | Application.Initialize; 18 | Application.CreateForm(TForm1, Form1); 19 | Application.Run; 20 | end. 21 | 22 | -------------------------------------------------------------------------------- /OpponentOverview/uvectormath.inc: -------------------------------------------------------------------------------- 1 | // Mit diesem Schalter kann das Überladen der Standard Operatoren Aktiviert 2 | // werden ( Achtung das kann nicht jeder FPC Compiler ) 3 | 4 | {$DEFINE UseOperandOverloading} 5 | 6 | TBaseType = Single; // Alle Komponenten bestehen aus BaseType, zur Nutzung von OpenGL ist Single zwingend !! 7 | 8 | -------------------------------------------------------------------------------- /bin/Animation_Editor: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/Animation_Editor -------------------------------------------------------------------------------- /bin/Animation_Editor.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/Animation_Editor.exe -------------------------------------------------------------------------------- /bin/Opponent_overview: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/Opponent_overview -------------------------------------------------------------------------------- /bin/Opponent_overview.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/Opponent_overview.exe -------------------------------------------------------------------------------- /bin/config_td: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/config_td -------------------------------------------------------------------------------- /bin/config_td.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/config_td.exe -------------------------------------------------------------------------------- /bin/ctd_launcher: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_launcher -------------------------------------------------------------------------------- /bin/ctd_launcher.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_launcher.exe -------------------------------------------------------------------------------- /bin/ctd_server: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_server -------------------------------------------------------------------------------- /bin/ctd_server.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_server.exe -------------------------------------------------------------------------------- /bin/ctd_updater: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_updater -------------------------------------------------------------------------------- /bin/ctd_updater.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/ctd_updater.exe -------------------------------------------------------------------------------- /bin/image_overview: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/image_overview -------------------------------------------------------------------------------- /bin/image_overview.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/bin/image_overview.exe -------------------------------------------------------------------------------- /client/apptype.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | (* 16 | * Zur Unterscheidung ob Server oder Client 17 | * Da die IDE hier durcheinander kommt ist dieses Define gesetzt unter 18 | * Projekt -> Projekteinstellungen -> Compilereinstellungen -> Benutzerdefinierte Einstellungen 19 | * -dClient 20 | *) 21 | {.$define Client} 22 | 23 | (* 24 | * Wenn dieser Switch gesetzt ist, dann wird die sehr Hochfrequente Lognachricht 25 | * UpdateMoveables nicht im Trace geloggt. 26 | * 27 | * Ignoriert werden : 28 | * 29 | * - miHeartBeat 30 | * - miUpdateMoveables 31 | *) 32 | {$DEFINE DoNotLog_CyclicMessages} 33 | 34 | {$DEFINE DebuggMode} 35 | 36 | // Wenn Aktiviert, dann kann mittels Parameter -d abgekürzt diverses Debugg Zeug realisiert werden 37 | {$DEFINE AUTOMODE} 38 | 39 | 40 | {$I globalsettings.inc} 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /client/config_td.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/client/config_td.ico -------------------------------------------------------------------------------- /client/config_td.lpr: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Program config_td; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Uses 20 | {$IFDEF UNIX} 21 | cmem, 22 | {$ENDIF} 23 | Interfaces, // this includes the LCL widgetset 24 | Forms, 25 | crt, // for Delay 26 | Unit1, unit2, unit3, unit4, unit5, unit6, unit7, unit8, Unit9, unit10, unit11, 27 | unit12, unit13, unit14, unit15, unit16, unit17, Unit18, Unit19, 28 | UniqueInstanceRaw, uctd_common, unit20, uopengl_font_common; 29 | 30 | {$R *.res} 31 | 32 | (* 33 | * As we want to configure the use of Unique Instance, we need to do all the stuff by Hand.. 34 | *) 35 | Var 36 | IgnoreInstance, ReStart: Boolean; 37 | i: Integer; 38 | startTime: int64; 39 | Begin 40 | IgnoreInstance := false; 41 | ReStart := false; 42 | For i := 1 To ParamCount Do Begin 43 | Case ParamStr(i) Of 44 | '-d': IgnoreInstance := true; 45 | '-r': ReStart := true; 46 | End; 47 | End; 48 | If ReStart Then Begin 49 | startTime := GetTick; 50 | (* 51 | * In case of a restart wait max 10s for the old application to close. 52 | * If it closes or is closed, start as normal, otherwise skip restarting and close 53 | *) 54 | While InstanceRunning('Config_TD_Client', false, false) Do Begin 55 | If (startTime + 10 * 1000 < GetTick) Then Begin 56 | exit; 57 | End; 58 | delay(100); 59 | End; 60 | End; 61 | If IgnoreInstance Or Not InstanceRunning('Config_TD_Client', false, true) Then Begin 62 | RequireDerivedFormResource := True; 63 | Application.Scaled:=True; 64 | Application.Initialize; 65 | Application.CreateForm(TForm1, Form1); 66 | Application.CreateForm(TForm2, Form2); 67 | Application.CreateForm(TForm3, Form3); 68 | Application.CreateForm(TForm4, Form4); 69 | Application.CreateForm(TForm5, Form5); 70 | Application.CreateForm(TForm10, Form10); 71 | Application.CreateForm(TForm11, Form11); 72 | Application.CreateForm(TForm13, Form13); 73 | Application.CreateForm(TForm6, Form6); 74 | Application.CreateForm(TForm14, Form14); 75 | Application.CreateForm(TForm7, Form7); 76 | Application.CreateForm(TForm15, Form15); 77 | Application.CreateForm(TForm16, Form16); 78 | Application.CreateForm(TForm12, Form12); 79 | Application.CreateForm(TForm17, Form17); 80 | Application.CreateForm(TForm8, Form8); 81 | Application.CreateForm(TForm9, Form9); 82 | Application.CreateForm(TForm18, Form18); 83 | Application.CreateForm(TForm19, Form19); 84 | Application.CreateForm(TForm20, Form20); 85 | Application.Run; 86 | End; 87 | 88 | End. 89 | 90 | -------------------------------------------------------------------------------- /client/globalsettings.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | (* 16 | * Ist dieser Switch gesetzt, dann werden WinXP inkompatible routinen durch "einfachere" ersetzt 17 | * 18 | * z.B.: GetTickCount64 durch die 32-Bit variante 19 | * 20 | * ! ACHTUNG ! 21 | * Client und Server müssen bei Änderung beide neu kompiliert werden. 22 | *) 23 | {.$DEFINE WinXPMode} 24 | 25 | -------------------------------------------------------------------------------- /client/uchunkmanager.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {.$DEFINE UseLogger} // wenn Aktiv, dann nutzt der Chunkmanager die Logger Routinen 17 | 18 | {.$DEFINE UseMagicHeader} // Wenn Aktiviert, dann wird jedem Chunk eine Kennung vorangestellt, diese prüft dann zusätzlich noch einmal ob die Daten stimmen 19 | 20 | -------------------------------------------------------------------------------- /client/ucolorselectbox.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit ucolorselectbox; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, ExtCtrls, Graphics, Dialogs; 23 | 24 | Type 25 | 26 | { TColorSelectBox } 27 | 28 | TColorSelectBox = Class(TPaintBox) 29 | private 30 | fSelected: TColor; 31 | fDialog: TColorDialog; 32 | Procedure SetSelected(AValue: TColor); 33 | Procedure SelPaint(Sender: TObject); 34 | Procedure SelColor(Sender: TObject); 35 | public 36 | Property Selected: TColor read fSelected write SetSelected; 37 | Constructor Create(AOwner: TComponent); override; 38 | Destructor destroy; override; 39 | End; 40 | 41 | Implementation 42 | 43 | { TColorSelectDialog } 44 | 45 | Constructor TColorSelectBox.Create(AOwner: TComponent); 46 | Begin 47 | Inherited create(AOwner); 48 | OnPaint := @SelPaint; 49 | OnClick := @SelColor; 50 | Selected := clBlack; 51 | fDialog := TColorDialog.Create(self); 52 | End; 53 | 54 | Destructor TColorSelectBox.destroy; 55 | Begin 56 | fDialog.Free; 57 | Inherited destroy; 58 | End; 59 | 60 | Procedure TColorSelectBox.SetSelected(AValue: TColor); 61 | Begin 62 | If fSelected = AValue Then Exit; 63 | fSelected := AValue; 64 | Invalidate; 65 | End; 66 | 67 | Procedure TColorSelectBox.SelPaint(Sender: TObject); 68 | Begin 69 | Canvas.Brush.Color := fSelected; 70 | Canvas.Pen.Color := clblack; 71 | Canvas.Rectangle(0, 0, Width - 1, Height - 1); 72 | End; 73 | 74 | Procedure TColorSelectBox.SelColor(Sender: TObject); 75 | Begin 76 | fDialog.Color := fSelected; 77 | If fDialog.Execute Then Begin 78 | fSelected := fDialog.Color; 79 | Invalidate; 80 | End; 81 | End; 82 | 83 | End. 84 | 85 | -------------------------------------------------------------------------------- /client/uctd_splashhintmanager.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit uctd_splashhintmanager; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | {$I globalsettings.inc} 20 | 21 | Interface 22 | 23 | Uses 24 | Classes, SysUtils, 25 | uvectormath, 26 | uctd_common 27 | ; 28 | 29 | Type 30 | 31 | TSplashItem = Record 32 | Text: String; 33 | TimeStamp: int64; 34 | Delay: integer; 35 | Color: TVector3; 36 | End; 37 | 38 | { TSplashHintManager } 39 | 40 | TSplashHintManager = Class 41 | private 42 | fSplashItems: Array Of TSplashItem; 43 | FPausing: Boolean; 44 | fPauseTime: int64; 45 | public 46 | Position: TPoint; 47 | Constructor create; virtual; 48 | Destructor Destroy; override; 49 | Procedure Render(); 50 | Procedure AddText(Const Text: String; Delay: integer = DefaultSplashHintDelay); overload; 51 | Procedure AddText(Const Text: String; Color: TVector3); overload; 52 | Procedure AddText(Const Text: String; Delay: integer; Color: TVector3); overload; 53 | Procedure Pause(Value: Boolean); 54 | End; 55 | 56 | Implementation 57 | 58 | Uses 59 | LCLIntf, dglOpenGL, 60 | uOpenGL_ASCII_Font; 61 | 62 | { TSplashHintManager } 63 | 64 | Constructor TSplashHintManager.create; 65 | Begin 66 | Inherited create; 67 | Position := point(0, 0); 68 | fSplashItems := Nil; 69 | FPausing := false; 70 | End; 71 | 72 | Destructor TSplashHintManager.Destroy; 73 | Begin 74 | setlength(fSplashItems, 0); 75 | End; 76 | 77 | Procedure TSplashHintManager.Render; 78 | Var 79 | fs, ah: Single; 80 | i, j: Integer; 81 | n: int64; 82 | Begin 83 | fs := OpenGL_ASCII_Font.Size; 84 | OpenGL_ASCII_Font.Size := OpenGL_ASCII_Font.Size * 2; 85 | glBindTexture(GL_TEXTURE_2D, 0); 86 | n := GetTick; 87 | // Löschen Aller Einträge Älter als 88 | For i := high(fSplashItems) Downto 0 Do Begin 89 | If fSplashItems[i].TimeStamp + fSplashItems[i].Delay < n Then Begin 90 | For j := i To high(fSplashItems) - 1 Do 91 | fSplashItems[j] := fSplashItems[j + 1]; 92 | setlength(fSplashItems, high(fSplashItems)); 93 | End; 94 | End; 95 | // Rendert Alle Texte Oberhalb von Position(x,y), letzter = Jüngster 96 | ah := 0; 97 | glTranslatef(0, 0, ctd_Tipp_Layer + ctd_EPSILON); 98 | For i := high(fSplashItems) Downto 0 Do Begin 99 | ah := ah + OpenGL_ASCII_Font.TextHeight(fSplashItems[i].Text); 100 | OpenGL_ASCII_Font.Colorv3 := fSplashItems[i].Color; 101 | OpenGL_ASCII_Font.Textout(Position.x, position.y - round(ah), fSplashItems[i].Text); 102 | End; 103 | OpenGL_ASCII_Font.Size := fs; 104 | End; 105 | 106 | Procedure TSplashHintManager.AddText(Const Text: String; Delay: integer); 107 | Begin 108 | AddText(text, delay, DefaultSplashHintColor); 109 | End; 110 | 111 | Procedure TSplashHintManager.AddText(Const Text: String; Color: TVector3); 112 | Begin 113 | AddText(text, DefaultSplashHintDelay, Color); 114 | End; 115 | 116 | Procedure TSplashHintManager.AddText(Const Text: String; Delay: integer; 117 | Color: TVector3); 118 | Begin 119 | // log('TSplashHintManager.AddText : ' + Text, llTrace); 120 | setlength(fSplashItems, high(fSplashItems) + 2); 121 | fSplashItems[high(fSplashItems)].Text := text; 122 | fSplashItems[high(fSplashItems)].TimeStamp := GetTick; 123 | fSplashItems[high(fSplashItems)].Delay := Delay; 124 | fSplashItems[high(fSplashItems)].Color := Color; 125 | // logleave; 126 | End; 127 | 128 | Procedure TSplashHintManager.Pause(Value: Boolean); 129 | Var 130 | delta: Int64; 131 | i: integer; 132 | Begin 133 | If FPausing Then Begin 134 | If Not value Then Begin 135 | delta := GetTick - fPauseTime; 136 | For i := 0 To high(fSplashItems) Do Begin // Entsprechend die Zeiten verschieben 137 | fSplashItems[i].TimeStamp := fSplashItems[i].TimeStamp + delta; 138 | End; 139 | End; 140 | End 141 | Else Begin 142 | If value Then Begin 143 | fPauseTime := GetTick; 144 | End; 145 | End; 146 | FPausing := value; 147 | End; 148 | 149 | End. 150 | 151 | -------------------------------------------------------------------------------- /client/ueventer.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | // Hier wird der Uses Teil voll Fertig gemacht (damit alle notwendigen Units für TOwnerClass zur Verfügung gestellt werden können) 17 | , OpenGLContext; 18 | 19 | // Die Klasse welche die zu Kapernden Methoden bereit stellt 20 | 21 | Type 22 | TOwnerClass = TOpenGLControl; 23 | 24 | {$define KeyEvents} 25 | 26 | -------------------------------------------------------------------------------- /client/ulogger.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {$define USELCL} 17 | 18 | -------------------------------------------------------------------------------- /client/unit11.lfm: -------------------------------------------------------------------------------- 1 | object Form11: TForm11 2 | Left = 330 3 | Height = 317 4 | Top = 107 5 | Width = 286 6 | Caption = 'New Game' 7 | ClientHeight = 317 8 | ClientWidth = 286 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnCreate = FormCreate 12 | OnShow = FormShow 13 | object Button1: TButton 14 | Left = 8 15 | Height = 25 16 | Top = 232 17 | Width = 75 18 | Caption = '&1. Easy' 19 | TabOrder = 0 20 | OnClick = Button1Click 21 | end 22 | object Button2: TButton 23 | Left = 104 24 | Height = 25 25 | Top = 232 26 | Width = 75 27 | Caption = '&2. Normal' 28 | TabOrder = 1 29 | OnClick = Button2Click 30 | end 31 | object Button3: TButton 32 | Left = 200 33 | Height = 25 34 | Top = 232 35 | Width = 75 36 | Caption = '&3. Hard' 37 | TabOrder = 2 38 | OnClick = Button3Click 39 | end 40 | object Label1: TLabel 41 | Left = 8 42 | Height = 16 43 | Top = 184 44 | Width = 110 45 | Caption = 'Lives to play with :' 46 | end 47 | object Label2: TLabel 48 | Left = 32 49 | Height = 16 50 | Top = 208 51 | Width = 41 52 | Caption = 'Label2' 53 | end 54 | object Label3: TLabel 55 | Left = 128 56 | Height = 16 57 | Top = 211 58 | Width = 41 59 | Caption = 'Label3' 60 | end 61 | object Label4: TLabel 62 | Left = 224 63 | Height = 16 64 | Top = 211 65 | Width = 41 66 | Caption = 'Label4' 67 | end 68 | object Button4: TButton 69 | Left = 8 70 | Height = 25 71 | Top = 280 72 | Width = 267 73 | Cancel = True 74 | Caption = '&Abort' 75 | TabOrder = 3 76 | OnClick = Button4Click 77 | end 78 | object ListBox1: TListBox 79 | Left = 8 80 | Height = 136 81 | Top = 32 82 | Width = 232 83 | ItemHeight = 0 84 | ScrollWidth = 230 85 | TabOrder = 4 86 | TopIndex = -1 87 | end 88 | object Label6: TLabel 89 | Left = 8 90 | Height = 16 91 | Top = 8 92 | Width = 47 93 | Caption = 'Players:' 94 | end 95 | object Button5: TButton 96 | Left = 248 97 | Height = 66 98 | Top = 32 99 | Width = 27 100 | Caption = '/\' 101 | TabOrder = 5 102 | OnClick = Button5Click 103 | end 104 | object Button6: TButton 105 | Left = 248 106 | Height = 66 107 | Top = 102 108 | Width = 27 109 | Caption = '\/' 110 | TabOrder = 6 111 | OnClick = Button6Click 112 | end 113 | end 114 | -------------------------------------------------------------------------------- /client/unit11.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit unit11; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; 23 | 24 | Type 25 | 26 | { TForm11 } 27 | 28 | TForm11 = Class(TForm) 29 | Button1: TButton; 30 | Button2: TButton; 31 | Button3: TButton; 32 | Button4: TButton; 33 | Button5: TButton; 34 | Button6: TButton; 35 | Label1: TLabel; 36 | Label2: TLabel; 37 | Label3: TLabel; 38 | Label4: TLabel; 39 | Label6: TLabel; 40 | ListBox1: TListBox; 41 | Procedure Button1Click(Sender: TObject); 42 | Procedure Button2Click(Sender: TObject); 43 | Procedure Button3Click(Sender: TObject); 44 | Procedure Button4Click(Sender: TObject); 45 | Procedure Button5Click(Sender: TObject); 46 | Procedure Button6Click(Sender: TObject); 47 | Procedure FormCreate(Sender: TObject); 48 | Procedure FormShow(Sender: TObject); 49 | private 50 | { private declarations } 51 | Procedure SelectDifficulty(index: integer); 52 | public 53 | { public declarations } 54 | End; 55 | 56 | Var 57 | Form11: TForm11; 58 | form11Difficulty: integer = -1; 59 | 60 | Implementation 61 | 62 | Uses uctd, uctd_common, math; 63 | 64 | {$R *.lfm} 65 | 66 | Var 67 | Form11ShowOnce: Boolean = false; 68 | 69 | { TForm11 } 70 | 71 | Procedure TForm11.FormCreate(Sender: TObject); 72 | Begin 73 | setValue('AskDifficultyForm', 'Left', inttostr(left)); 74 | setValue('AskDifficultyForm', 'Top', inttostr(top)); 75 | Constraints.MinHeight := Height; 76 | Constraints.MaxHeight := Height; 77 | Constraints.MinWidth := Width; 78 | Constraints.MaxWidth := Width; 79 | caption := 'Start new round..'; 80 | End; 81 | 82 | Procedure TForm11.Button1Click(Sender: TObject); 83 | Begin 84 | SelectDifficulty(0); 85 | End; 86 | 87 | Procedure TForm11.Button2Click(Sender: TObject); 88 | Begin 89 | SelectDifficulty(1); 90 | End; 91 | 92 | Procedure TForm11.Button3Click(Sender: TObject); 93 | Begin 94 | SelectDifficulty(2); 95 | End; 96 | 97 | Procedure TForm11.Button4Click(Sender: TObject); 98 | Begin 99 | ModalResult := mrCancel; 100 | End; 101 | 102 | Procedure TForm11.Button5Click(Sender: TObject); 103 | Begin 104 | // Player 1 Up 105 | If listbox1.ItemIndex = -1 Then Begin 106 | showmessage('Error, no player selected.'); 107 | exit; 108 | End; 109 | ctd.ChangePlayerPos(listbox1.ItemIndex, true); 110 | listbox1.ItemIndex := max(0, listbox1.ItemIndex - 1); 111 | End; 112 | 113 | Procedure TForm11.Button6Click(Sender: TObject); 114 | Begin 115 | // Player 1 Down 116 | If listbox1.ItemIndex = -1 Then Begin 117 | showmessage('Error, no player selected.'); 118 | exit; 119 | End; 120 | ctd.ChangePlayerPos(listbox1.ItemIndex, false); 121 | listbox1.ItemIndex := min(listbox1.ItemIndex + 1, listbox1.Items.Count - 1); 122 | End; 123 | 124 | Procedure TForm11.FormShow(Sender: TObject); 125 | Begin 126 | If Not Form11ShowOnce Then Begin 127 | Form11ShowOnce := true; 128 | left := strtoint(GetValue('AskDifficultyForm', 'Left', inttostr(left))); 129 | top := strtoint(GetValue('AskDifficultyForm', 'Top', inttostr(top))); 130 | FixFormPosition(form11); 131 | End; 132 | End; 133 | 134 | Procedure TForm11.SelectDifficulty(index: integer); 135 | Begin 136 | If ctd.Map.Lives[index] <= 0 Then Begin 137 | logshow('This map has no definition for the selected difficulty. Please choose other difficulty', llWarning); 138 | exit; 139 | End; 140 | form11Difficulty := index; 141 | ModalResult := mrOK; 142 | End; 143 | 144 | End. 145 | 146 | -------------------------------------------------------------------------------- /client/unit12.lfm: -------------------------------------------------------------------------------- 1 | object Form12: TForm12 2 | Left = 331 3 | Height = 298 4 | Top = 121 5 | Width = 512 6 | Caption = 'Form12' 7 | ClientHeight = 298 8 | ClientWidth = 512 9 | FormStyle = fsStayOnTop 10 | OnCreate = FormCreate 11 | Position = poScreenCenter 12 | LCLVersion = '2.3.0.0' 13 | object Button1: TButton 14 | Left = 8 15 | Height = 25 16 | Top = 8 17 | Width = 504 18 | Anchors = [akTop, akLeft, akRight] 19 | Caption = '&Refresh' 20 | OnClick = Button1Click 21 | TabOrder = 0 22 | end 23 | object Panel1: TPanel 24 | Left = 8 25 | Height = 250 26 | Top = 40 27 | Width = 504 28 | Anchors = [akTop, akLeft, akRight, akBottom] 29 | BevelOuter = bvLowered 30 | Caption = 'Panel1' 31 | ClientHeight = 250 32 | ClientWidth = 504 33 | TabOrder = 1 34 | object ScrollBar1: TScrollBar 35 | Left = 482 36 | Height = 232 37 | Top = 8 38 | Width = 14 39 | Anchors = [akTop, akRight, akBottom] 40 | Kind = sbVertical 41 | PageSize = 0 42 | TabOrder = 0 43 | end 44 | inline PlayerInfoFrame1: TPlayerInfoFrame 45 | Left = 8 46 | Top = 8 47 | TabOrder = 1 48 | inherited Label1: TLabel 49 | Height = 15 50 | Width = 62 51 | end 52 | inherited Label2: TLabel 53 | Height = 15 54 | Width = 34 55 | end 56 | inherited Label3: TLabel 57 | Height = 15 58 | Width = 26 59 | end 60 | inherited Label4: TLabel 61 | Height = 15 62 | Width = 34 63 | end 64 | inherited Label5: TLabel 65 | Height = 15 66 | Width = 26 67 | end 68 | inherited Label6: TLabel 69 | Height = 15 70 | Width = 34 71 | end 72 | inherited Label7: TLabel 73 | Height = 15 74 | Width = 21 75 | end 76 | inherited Label8: TLabel 77 | Height = 15 78 | Width = 34 79 | end 80 | inherited Label9: TLabel 81 | Height = 15 82 | Width = 26 83 | end 84 | inherited ComboBox1: TComboBox 85 | Height = 23 86 | ItemHeight = 15 87 | end 88 | end 89 | end 90 | end 91 | -------------------------------------------------------------------------------- /client/unit12.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit unit12; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 23 | ExtCtrls, uplayer_info_frame; 24 | 25 | Type 26 | 27 | { TForm12 } 28 | 29 | TForm12 = Class(TForm) 30 | Button1: TButton; 31 | Panel1: TPanel; 32 | PlayerInfoFrame1: TPlayerInfoFrame; 33 | ScrollBar1: TScrollBar; 34 | Procedure Button1Click(Sender: TObject); 35 | Procedure FormCreate(Sender: TObject); 36 | private 37 | { private declarations } 38 | Procedure CashTransferCallback(Sender: TObject; DestPlayer, Count: integer); 39 | public 40 | { public declarations } 41 | Procedure RecreateFrames; 42 | Procedure RefreshInfos; 43 | End; 44 | 45 | Var 46 | Form12: TForm12; 47 | 48 | Implementation 49 | 50 | {$R *.lfm} 51 | 52 | Uses uctd; 53 | 54 | { TForm12 } 55 | 56 | Procedure TForm12.Button1Click(Sender: TObject); 57 | Begin 58 | RefreshInfos; 59 | End; 60 | 61 | Procedure TForm12.FormCreate(Sender: TObject); 62 | Begin 63 | panel1.Caption := ''; 64 | caption := 'Player stats'; 65 | End; 66 | 67 | Procedure TForm12.CashTransferCallback(Sender: TObject; DestPlayer, 68 | Count: integer); 69 | Begin 70 | ctd.TransferCash(DestPlayer, Count); 71 | End; 72 | 73 | Procedure TForm12.RecreateFrames; 74 | Var 75 | j, i: Integer; 76 | f: TPlayerInfoFrame; 77 | Begin 78 | j := 0; 79 | For i := panel1.ComponentCount - 1 Downto 0 Do Begin 80 | // Wenn die Spielerzahl sich nicht ändert, aber die Position des Spielers, dann muss die "Gui" mit angepasst werden. 81 | If Panel1.Components[i] Is TPlayerInfoFrame Then Begin 82 | f := Panel1.Components[i] As TPlayerInfoFrame; 83 | f.Button1.Visible := Not (i = ctd.PlayerIndex); 84 | f.ComboBox1.Visible := Not (i = ctd.PlayerIndex); 85 | f.Label9.Visible := Not (i = ctd.PlayerIndex); 86 | inc(j); 87 | End; 88 | End; 89 | If ctd.PlayerCount = j Then exit; 90 | // Die Anzahl stimmt wohl nicht, also alles einfach neu initialisieren... 91 | For i := panel1.ComponentCount - 1 Downto 0 Do Begin 92 | If Panel1.Components[i] Is TPlayerInfoFrame Then 93 | Panel1.Components[i].Free; 94 | End; 95 | If ctd.PlayerCount = 0 Then exit; // Nil Pointer AV, unten verhinden, auch wenn das eigentlich unmöglich ist .. 96 | ScrollBar1.Position := 0; 97 | For i := 0 To ctd.PlayerCount - 1 Do Begin 98 | f := TPlayerInfoFrame.Create(Panel1, i = 0); 99 | f.Name := 'PlayerInfoFrame' + inttostr(i + 1); 100 | f.Parent := Panel1; 101 | f.left := 8; 102 | f.top := (f.Height + 10) * i + 8; 103 | f.tag := i + 1; // zur Ausgrenzung des 0 Tags 104 | f.CashTransferCallback := @CashTransferCallback; 105 | // Der Spieler kann sich selbst kein Geld senden 106 | If i = ctd.PlayerIndex Then Begin 107 | f.Button1.Visible := false; 108 | f.ComboBox1.Visible := false; 109 | f.Label9.Visible := false; 110 | End; 111 | End; 112 | ScrollBar1.Max := (ctd.PlayerCount - 1) * (f.Height + 10); 113 | ScrollBar1.Visible := ScrollBar1.Max <> ScrollBar1.Min; 114 | End; 115 | 116 | Procedure TForm12.RefreshInfos; 117 | Var 118 | i: integer; 119 | f: TPlayerInfoFrame; 120 | cl: TPlayerInfos; 121 | Begin 122 | For i := 0 To panel1.ComponentCount - 1 Do Begin 123 | If panel1.Components[i] Is TPlayerInfoFrame Then Begin 124 | f := TPlayerInfoFrame(panel1.Components[i]); 125 | cl := ctd.Player[panel1.Components[i].Tag - 1]; 126 | f.Label2.caption := cl.Name; 127 | f.Label4.caption := inttostr(cl.Cash); 128 | f.Label6.caption := inttostr(cl.Lives); 129 | f.Label8.caption := inttostr(cl.Kills); 130 | End; 131 | End; 132 | End; 133 | 134 | End. 135 | 136 | -------------------------------------------------------------------------------- /client/unit13.lfm: -------------------------------------------------------------------------------- 1 | object Form13: TForm13 2 | Left = 329 3 | Height = 241 4 | Top = 121 5 | Width = 320 6 | Caption = 'Form13' 7 | ClientHeight = 241 8 | ClientWidth = 320 9 | FormStyle = fsStayOnTop 10 | Position = poScreenCenter 11 | LCLVersion = '3.99.0.0' 12 | OnCloseQuery = FormCloseQuery 13 | OnCreate = FormCreate 14 | OnShow = FormShow 15 | object Memo1: TMemo 16 | Left = 8 17 | Height = 192 18 | Top = 8 19 | Width = 304 20 | Anchors = [akTop, akLeft, akRight, akBottom] 21 | Lines.Strings = ( 22 | 'Memo1' 23 | ) 24 | PopupMenu = PopupMenu1 25 | ReadOnly = True 26 | ScrollBars = ssAutoBoth 27 | TabOrder = 0 28 | end 29 | object Edit1: TEdit 30 | Left = 8 31 | Height = 26 32 | Top = 206 33 | Width = 304 34 | Anchors = [akLeft, akRight, akBottom] 35 | TabOrder = 1 36 | Text = 'Edit1' 37 | OnKeyPress = Edit1KeyPress 38 | OnKeyUp = Edit1KeyUp 39 | end 40 | object PopupMenu1: TPopupMenu 41 | Left = 78 42 | Top = 42 43 | object MenuItem5: TMenuItem 44 | Caption = 'Show all air levels' 45 | OnClick = MenuItem5Click 46 | end 47 | object MenuItem4: TMenuItem 48 | Caption = 'Show all boss levels' 49 | OnClick = MenuItem4Click 50 | end 51 | object MenuItem2: TMenuItem 52 | Caption = 'Show all bonus levels' 53 | OnClick = MenuItem2Click 54 | end 55 | object MenuItem3: TMenuItem 56 | Caption = '-' 57 | end 58 | object MenuItem6: TMenuItem 59 | Caption = 'Show all ping times' 60 | OnClick = MenuItem6Click 61 | end 62 | object MenuItem1: TMenuItem 63 | Caption = 'Clear' 64 | OnClick = MenuItem1Click 65 | end 66 | object MenuItem7: TMenuItem 67 | Caption = '-' 68 | end 69 | object MenuItem8: TMenuItem 70 | Caption = 'Show commands' 71 | OnClick = MenuItem8Click 72 | end 73 | end 74 | end 75 | -------------------------------------------------------------------------------- /client/unit14.lfm: -------------------------------------------------------------------------------- 1 | object Form14: TForm14 2 | Left = 353 3 | Height = 331 4 | Top = 112 5 | Width = 567 6 | Caption = 'Form14' 7 | ClientHeight = 331 8 | ClientWidth = 567 9 | FormStyle = fsStayOnTop 10 | Position = poScreenCenter 11 | LCLVersion = '3.99.0.0' 12 | OnCloseQuery = FormCloseQuery 13 | OnCreate = FormCreate 14 | OnHide = FormHide 15 | OnShow = FormShow 16 | object Label1: TLabel 17 | Left = 8 18 | Height = 16 19 | Top = 8 20 | Width = 41 21 | Caption = 'Label1' 22 | end 23 | object Label2: TLabel 24 | Left = 8 25 | Height = 16 26 | Top = 32 27 | Width = 40 28 | Caption = 'Global' 29 | end 30 | object ListBox1: TListBox 31 | Left = 8 32 | Height = 140 33 | Top = 56 34 | Width = 250 35 | Anchors = [akTop, akLeft, akBottom] 36 | ItemHeight = 0 37 | MultiSelect = True 38 | ScrollWidth = 198 39 | Style = lbOwnerDrawFixed 40 | TabOrder = 0 41 | TopIndex = -1 42 | OnDblClick = ListBox1DblClick 43 | OnDrawItem = ListBox1DrawItem 44 | end 45 | object Label3: TLabel 46 | Left = 307 47 | Height = 16 48 | Top = 32 49 | Width = 75 50 | Caption = 'Current map' 51 | end 52 | object ListBox2: TListBox 53 | Left = 307 54 | Height = 140 55 | Top = 56 56 | Width = 250 57 | Anchors = [akTop, akLeft, akBottom] 58 | ItemHeight = 0 59 | ScrollWidth = 198 60 | Style = lbOwnerDrawFixed 61 | TabOrder = 3 62 | TopIndex = -1 63 | OnDblClick = ListBox2DblClick 64 | OnDrawItem = ListBox1DrawItem 65 | end 66 | object Button1: TButton 67 | Left = 202 68 | Height = 25 69 | Top = 254 70 | Width = 56 71 | Anchors = [akLeft, akBottom] 72 | Caption = 'Create' 73 | TabOrder = 7 74 | OnClick = Button1Click 75 | end 76 | object Label4: TLabel 77 | Left = 10 78 | Height = 16 79 | Top = 240 80 | Width = 35 81 | Anchors = [akLeft, akBottom] 82 | Caption = 'Name' 83 | end 84 | object Edit1: TEdit 85 | Left = 10 86 | Height = 26 87 | Top = 254 88 | Width = 184 89 | Anchors = [akLeft, akBottom] 90 | TabOrder = 6 91 | Text = 'Edit1' 92 | OnKeyPress = Edit1KeyPress 93 | end 94 | object Button3: TButton 95 | Left = 8 96 | Height = 25 97 | Top = 295 98 | Width = 549 99 | Anchors = [akLeft, akBottom] 100 | Caption = 'Exit' 101 | TabOrder = 8 102 | OnClick = Button3Click 103 | end 104 | object Button4: TButton 105 | Left = 10 106 | Height = 25 107 | Top = 206 108 | Width = 248 109 | Anchors = [akLeft, akBottom] 110 | Caption = 'Edit' 111 | TabOrder = 4 112 | OnClick = Button4Click 113 | end 114 | object Button5: TButton 115 | Left = 307 116 | Height = 25 117 | Top = 206 118 | Width = 250 119 | Anchors = [akLeft, akBottom] 120 | Caption = 'Edit' 121 | TabOrder = 5 122 | OnClick = Button5Click 123 | end 124 | object Button6: TButton 125 | Left = 264 126 | Height = 65 127 | Top = 56 128 | Width = 35 129 | Caption = '=>' 130 | TabOrder = 1 131 | OnClick = Button6Click 132 | end 133 | object Button7: TButton 134 | Left = 264 135 | Height = 65 136 | Top = 131 137 | Width = 35 138 | Caption = '<=' 139 | TabOrder = 2 140 | OnClick = Button7Click 141 | end 142 | object Button2: TButton 143 | Left = 307 144 | Height = 25 145 | Top = 239 146 | Width = 250 147 | Anchors = [akLeft, akBottom] 148 | Caption = 'Delete' 149 | TabOrder = 9 150 | OnClick = Button2Click 151 | end 152 | end 153 | -------------------------------------------------------------------------------- /client/unit15.lfm: -------------------------------------------------------------------------------- 1 | object Form15: TForm15 2 | Left = 329 3 | Height = 106 4 | Top = 122 5 | Width = 282 6 | BorderIcons = [biSystemMenu] 7 | Caption = 'Form15' 8 | ClientHeight = 106 9 | ClientWidth = 282 10 | OnCreate = FormCreate 11 | Position = poScreenCenter 12 | LCLVersion = '2.3.0.0' 13 | object RadioButton1: TRadioButton 14 | Left = 8 15 | Height = 22 16 | Top = 8 17 | Width = 83 18 | Caption = 'Overwrite' 19 | TabOrder = 0 20 | end 21 | object RadioButton2: TRadioButton 22 | Left = 8 23 | Height = 22 24 | Top = 40 25 | Width = 71 26 | Caption = 'Copy as' 27 | Checked = True 28 | TabOrder = 1 29 | TabStop = True 30 | end 31 | object Edit1: TEdit 32 | Left = 104 33 | Height = 25 34 | Top = 36 35 | Width = 168 36 | OnKeyPress = Edit1KeyPress 37 | TabOrder = 2 38 | Text = 'Edit1' 39 | end 40 | object Button1: TButton 41 | Left = 8 42 | Height = 25 43 | Top = 72 44 | Width = 75 45 | Cancel = True 46 | Caption = '&Cancel' 47 | ModalResult = 2 48 | TabOrder = 3 49 | end 50 | object Button2: TButton 51 | Left = 197 52 | Height = 25 53 | Top = 72 54 | Width = 75 55 | Caption = '&OK' 56 | Default = True 57 | OnClick = Button2Click 58 | TabOrder = 4 59 | end 60 | end 61 | -------------------------------------------------------------------------------- /client/unit15.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit unit15; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; 23 | 24 | Type 25 | 26 | { TForm15 } 27 | 28 | TForm15 = Class(TForm) 29 | Button1: TButton; 30 | Button2: TButton; 31 | Edit1: TEdit; 32 | RadioButton1: TRadioButton; 33 | RadioButton2: TRadioButton; 34 | Procedure Button2Click(Sender: TObject); 35 | Procedure Edit1KeyPress(Sender: TObject; Var Key: char); 36 | Procedure FormCreate(Sender: TObject); 37 | private 38 | { private declarations } 39 | public 40 | { public declarations } 41 | comparer: String; 42 | Direction: integer; // 0 Local -> Map, 1 Map -> Local 43 | End; 44 | 45 | Var 46 | Form15: TForm15; 47 | 48 | Implementation 49 | 50 | {$R *.lfm} 51 | 52 | Uses unit14, uctd_common; 53 | 54 | { TForm15 } 55 | 56 | Procedure TForm15.FormCreate(Sender: TObject); 57 | Begin 58 | caption := 'Please choose'; 59 | Tform(self).Constraints.MaxHeight := Tform(self).Height; 60 | Tform(self).Constraints.MinHeight := Tform(self).Height; 61 | Tform(self).Constraints.Maxwidth := Tform(self).width; 62 | Tform(self).Constraints.Minwidth := Tform(self).width; 63 | End; 64 | 65 | Procedure TForm15.Button2Click(Sender: TObject); 66 | Var 67 | b: Boolean; 68 | i: Integer; 69 | Begin 70 | b := LowerCase(trim(Edit1.Text)) <> comparer; 71 | If Direction = 0 Then Begin 72 | For i := 0 To Form14.ListBox2.Items.Count - 1 Do Begin 73 | If LowerCase(trim(Edit1.Text)) = LowerCase(trim(Form14.ListBox2.Items[i])) Then Begin 74 | b := true; 75 | break; 76 | End; 77 | End; 78 | End; 79 | If Direction = 1 Then Begin 80 | For i := 0 To Form14.ListBox1.Items.Count - 1 Do Begin 81 | If LowerCase(trim(Edit1.Text)) = LowerCase(trim(Form14.ListBox1.Items[i])) Then Begin 82 | b := true; 83 | break; 84 | End; 85 | End; 86 | End; 87 | If b Then Begin 88 | ModalResult := mrOK; 89 | End 90 | Else Begin 91 | logshow(Edit1.Text + ' is already used.', llWarning); 92 | End; 93 | End; 94 | 95 | Procedure TForm15.Edit1KeyPress(Sender: TObject; Var Key: char); 96 | Begin 97 | If key = #13 Then Button2.Click; 98 | End; 99 | 100 | End. 101 | 102 | -------------------------------------------------------------------------------- /client/unit16.lfm: -------------------------------------------------------------------------------- 1 | object Form16: TForm16 2 | Left = 329 3 | Height = 323 4 | Top = 122 5 | Width = 455 6 | Caption = 'Form16' 7 | ClientHeight = 323 8 | ClientWidth = 455 9 | OnCreate = FormCreate 10 | Position = poScreenCenter 11 | LCLVersion = '2.1.0.0' 12 | object ListBox1: TListBox 13 | Left = 8 14 | Height = 200 15 | Top = 8 16 | Width = 440 17 | Anchors = [akTop, akLeft, akRight, akBottom] 18 | ItemHeight = 0 19 | OnClick = ListBox1Click 20 | OnDblClick = ListBox1DblClick 21 | PopupMenu = PopupMenu1 22 | ScrollWidth = 438 23 | TabOrder = 0 24 | TopIndex = -1 25 | end 26 | object Edit1: TEdit 27 | Left = 8 28 | Height = 25 29 | Top = 216 30 | Width = 440 31 | Anchors = [akLeft, akRight, akBottom] 32 | OnKeyPress = Edit1KeyPress 33 | TabOrder = 1 34 | Text = 'Edit1' 35 | end 36 | object Button1: TButton 37 | Left = 8 38 | Height = 25 39 | Top = 248 40 | Width = 440 41 | Anchors = [akLeft, akRight, akBottom] 42 | Caption = 'Save' 43 | ModalResult = 1 44 | TabOrder = 2 45 | end 46 | object Button2: TButton 47 | Left = 8 48 | Height = 25 49 | Top = 288 50 | Width = 440 51 | Anchors = [akLeft, akRight, akBottom] 52 | Caption = 'Cancel' 53 | ModalResult = 2 54 | TabOrder = 3 55 | end 56 | object CheckBox1: TCheckBox 57 | Left = 8 58 | Height = 22 59 | Top = 216 60 | Width = 157 61 | Anchors = [akLeft, akRight, akBottom] 62 | Caption = 'Show auto savegames' 63 | OnChange = CheckBox1Change 64 | TabOrder = 4 65 | end 66 | object PopupMenu1: TPopupMenu 67 | Left = 40 68 | Top = 32 69 | object MenuItem1: TMenuItem 70 | Caption = 'Delete savegame' 71 | OnClick = MenuItem1Click 72 | end 73 | object MenuItem2: TMenuItem 74 | Caption = 'Delete all' 75 | OnClick = MenuItem2Click 76 | end 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /client/unit16.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit unit16; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 23 | Menus; 24 | 25 | Type 26 | 27 | TGameList = Record 28 | name: String; 29 | bakup: Byte; 30 | End; 31 | 32 | { TForm16 } 33 | 34 | TForm16 = Class(TForm) 35 | Button1: TButton; 36 | Button2: TButton; 37 | CheckBox1: TCheckBox; 38 | Edit1: TEdit; 39 | ListBox1: TListBox; 40 | MenuItem1: TMenuItem; 41 | MenuItem2: TMenuItem; 42 | PopupMenu1: TPopupMenu; 43 | Procedure Button1Click(Sender: TObject); 44 | Procedure CheckBox1Change(Sender: TObject); 45 | Procedure Edit1KeyPress(Sender: TObject; Var Key: char); 46 | Procedure FormCreate(Sender: TObject); 47 | Procedure ListBox1Click(Sender: TObject); 48 | Procedure ListBox1DblClick(Sender: TObject); 49 | Procedure MenuItem1Click(Sender: TObject); 50 | Procedure MenuItem2Click(Sender: TObject); 51 | private 52 | { private declarations } 53 | fList: Array Of TGameList; 54 | public 55 | { public declarations } 56 | Procedure LoadList(Const Stream: TStream); 57 | End; 58 | 59 | Var 60 | Form16: TForm16; 61 | 62 | Implementation 63 | 64 | {$R *.lfm} 65 | 66 | Uses LazFileUtils, uctd, uctd_common; 67 | 68 | { TForm16 } 69 | 70 | Procedure TForm16.FormCreate(Sender: TObject); 71 | Begin 72 | 73 | End; 74 | 75 | Procedure TForm16.ListBox1Click(Sender: TObject); 76 | Begin 77 | If Button1.caption = 'Save' Then Begin 78 | edit1.text := ExtractFileNameWithoutExt(RemoveTimestampInfoFromFilename(ListBox1.Items[ListBox1.ItemIndex])); 79 | End; 80 | End; 81 | 82 | Procedure TForm16.ListBox1DblClick(Sender: TObject); 83 | Begin 84 | If Button1.caption = 'Load' Then Begin 85 | Button1.Click; 86 | End; 87 | End; 88 | 89 | Procedure TForm16.MenuItem1Click(Sender: TObject); 90 | Var 91 | s: String; 92 | i: Integer; 93 | Begin 94 | // Delete Savegame 95 | If ListBox1.ItemIndex <> -1 Then Begin 96 | s := ExtractFileNameWithoutExt(RemoveTimestampInfoFromFilename(ListBox1.Items[ListBox1.ItemIndex])); 97 | ctd.DelSaveGame(s); 98 | For i := ListBox1.ItemIndex To high(fList) - 1 Do Begin 99 | fList[i] := fList[i + 1]; 100 | End; 101 | setlength(fList, high(fList)); 102 | ListBox1.Items.Delete(ListBox1.ItemIndex); 103 | End; 104 | End; 105 | 106 | Procedure TForm16.MenuItem2Click(Sender: TObject); 107 | Begin 108 | // Delete All Savegames 109 | ctd.DelAllSaveGames(); 110 | ListBox1.Items.Clear; 111 | setlength(fList, 0); 112 | End; 113 | 114 | Procedure TForm16.LoadList(Const Stream: TStream); 115 | Var 116 | j, i: integer; 117 | Begin 118 | i := 0; 119 | Stream.Read(i, sizeof(i)); 120 | setlength(fList, i); 121 | For j := 0 To i - 1 Do Begin 122 | fList[j].name := Stream.ReadAnsiString; 123 | End; 124 | For j := 0 To i - 1 Do Begin 125 | fList[j].bakup := 0; 126 | stream.Read(fList[j].bakup, SizeOf(fList[j].bakup)); 127 | End; 128 | End; 129 | 130 | Procedure TForm16.Edit1KeyPress(Sender: TObject; Var Key: char); 131 | Begin 132 | If key = #13 Then Button1.Click; 133 | End; 134 | 135 | Procedure TForm16.Button1Click(Sender: TObject); 136 | Begin 137 | If Edit1.Visible Then Begin 138 | Edit1.Text := trim(Edit1.Text); 139 | If trim(edit1.text) = '' Then Begin 140 | exit; 141 | End; 142 | End; 143 | ModalResult := mrOK; 144 | End; 145 | 146 | Procedure TForm16.CheckBox1Change(Sender: TObject); 147 | Var 148 | i: Integer; 149 | Begin 150 | // Aktualisieren der Listbox 151 | ListBox1.Clear; 152 | For i := 0 To high(fList) Do Begin 153 | If CheckBox1.Checked Then Begin 154 | ListBox1.Items.Add(fList[i].name); 155 | End 156 | Else Begin 157 | If fList[i].bakup = 0 Then Begin 158 | ListBox1.Items.Add(fList[i].name); 159 | End; 160 | End; 161 | End; 162 | End; 163 | 164 | End. 165 | 166 | -------------------------------------------------------------------------------- /client/unit17.lfm: -------------------------------------------------------------------------------- 1 | object Form17: TForm17 2 | Left = 330 3 | Height = 377 4 | Top = 121 5 | Width = 545 6 | Caption = 'Form17' 7 | ClientHeight = 377 8 | ClientWidth = 545 9 | Position = poScreenCenter 10 | LCLVersion = '3.99.0.0' 11 | OnCreate = FormCreate 12 | OnDestroy = FormDestroy 13 | object Button1: TButton 14 | Left = 168 15 | Height = 25 16 | Top = 341 17 | Width = 368 18 | Cancel = True 19 | Caption = 'Close' 20 | TabOrder = 0 21 | OnClick = Button1Click 22 | end 23 | object Image1: TImage 24 | Left = 8 25 | Height = 90 26 | Top = 72 27 | Width = 90 28 | Center = True 29 | Stretch = True 30 | end 31 | object Label1: TLabel 32 | Left = 8 33 | Height = 16 34 | Top = 48 35 | Width = 74 36 | Caption = 'Mappreview' 37 | ParentColor = False 38 | end 39 | object GroupBox1: TGroupBox 40 | Left = 112 41 | Height = 195 42 | Top = 8 43 | Width = 424 44 | Caption = ' Overlay textures ' 45 | ClientHeight = 178 46 | ClientWidth = 422 47 | TabOrder = 1 48 | object Image2: TImage 49 | Left = 8 50 | Height = 90 51 | Top = 48 52 | Width = 90 53 | Center = True 54 | Stretch = True 55 | end 56 | object Label2: TLabel 57 | Left = 8 58 | Height = 32 59 | Top = 8 60 | Width = 81 61 | Caption = 'Not walkable'#10'not buildable' 62 | ParentColor = False 63 | end 64 | object Image3: TImage 65 | Left = 112 66 | Height = 90 67 | Top = 48 68 | Width = 90 69 | Center = True 70 | Stretch = True 71 | end 72 | object Label3: TLabel 73 | Left = 112 74 | Height = 16 75 | Top = 8 76 | Width = 56 77 | Caption = 'Walkable' 78 | ParentColor = False 79 | end 80 | object Image4: TImage 81 | Left = 216 82 | Height = 90 83 | Top = 48 84 | Width = 90 85 | Center = True 86 | Stretch = True 87 | end 88 | object Label4: TLabel 89 | Left = 216 90 | Height = 16 91 | Top = 8 92 | Width = 58 93 | Caption = 'Buildable' 94 | ParentColor = False 95 | end 96 | object Image5: TImage 97 | Left = 320 98 | Height = 90 99 | Top = 48 100 | Width = 90 101 | Center = True 102 | Stretch = True 103 | end 104 | object Label5: TLabel 105 | Left = 320 106 | Height = 32 107 | Top = 8 108 | Width = 67 109 | Caption = 'Walkable +'#10'Buildable' 110 | ParentColor = False 111 | end 112 | object Button2: TButton 113 | Left = 8 114 | Height = 25 115 | Top = 144 116 | Width = 90 117 | Caption = '&1. Load' 118 | TabOrder = 0 119 | OnClick = Button2Click 120 | end 121 | object Button3: TButton 122 | Left = 112 123 | Height = 25 124 | Top = 144 125 | Width = 90 126 | Caption = '&2. Load' 127 | TabOrder = 1 128 | OnClick = Button3Click 129 | end 130 | object Button4: TButton 131 | Left = 216 132 | Height = 25 133 | Top = 144 134 | Width = 90 135 | Caption = '&3. Load' 136 | TabOrder = 2 137 | OnClick = Button4Click 138 | end 139 | object Button5: TButton 140 | Left = 320 141 | Height = 25 142 | Top = 144 143 | Width = 90 144 | Caption = '&4. Load' 145 | TabOrder = 3 146 | OnClick = Button5Click 147 | end 148 | end 149 | object Button6: TButton 150 | Left = 168 151 | Height = 25 152 | Top = 248 153 | Width = 368 154 | Caption = 'Create &texture' 155 | TabOrder = 2 156 | OnClick = Button6Click 157 | end 158 | object Label6: TLabel 159 | Left = 168 160 | Height = 16 161 | Top = 216 162 | Width = 47 163 | Caption = 'Upscale' 164 | ParentColor = False 165 | end 166 | object Edit1: TEdit 167 | Left = 240 168 | Height = 26 169 | Top = 216 170 | Width = 80 171 | TabOrder = 3 172 | Text = 'Edit1' 173 | end 174 | object Label7: TLabel 175 | Left = 352 176 | Height = 16 177 | Top = 216 178 | Width = 66 179 | Caption = 'Smoothing' 180 | ParentColor = False 181 | end 182 | object Edit2: TEdit 183 | Left = 440 184 | Height = 26 185 | Top = 216 186 | Width = 80 187 | TabOrder = 4 188 | Text = 'Edit2' 189 | end 190 | object Image6: TImage 191 | Left = 8 192 | Height = 150 193 | Top = 216 194 | Width = 150 195 | Center = True 196 | Stretch = True 197 | end 198 | object Button7: TButton 199 | Left = 168 200 | Height = 25 201 | Top = 280 202 | Width = 368 203 | Caption = '&Save texture' 204 | TabOrder = 5 205 | OnClick = Button7Click 206 | end 207 | object OpenPictureDialog1: TOpenPictureDialog 208 | Filter = 'Graphic (*.png;*.bmp;*.jpg)|*.png;*.bmp;*.jpg|Portable Network Graphic (*.png)|*.png|Bitmaps (*.bmp)|*.bmp|Joint Picture Expert Group |*.jpg|All files (*)|*|' 209 | Left = 248 210 | Top = 88 211 | end 212 | object SaveDialog1: TSaveDialog 213 | DefaultExt = '.jpg' 214 | Filter = 'JPG|*.jpg|PNG|*.png' 215 | Left = 184 216 | Top = 264 217 | end 218 | end 219 | -------------------------------------------------------------------------------- /client/unit18.lfm: -------------------------------------------------------------------------------- 1 | object Form18: TForm18 2 | Left = 332 3 | Height = 114 4 | Top = 121 5 | Width = 412 6 | BorderStyle = bsDialog 7 | Caption = 'Form18' 8 | ClientHeight = 114 9 | ClientWidth = 412 10 | FormStyle = fsStayOnTop 11 | OnCreate = FormCreate 12 | Position = poScreenCenter 13 | LCLVersion = '2.3.0.0' 14 | object Label1: TLabel 15 | Left = 8 16 | Height = 48 17 | Top = 8 18 | Width = 396 19 | Caption = 'Download and start update.'#10#10'Depending on your internet connection this could take some time.'#10'Please wait until the process is finished.' 20 | end 21 | object ProgressBar1: TProgressBar 22 | Left = 8 23 | Height = 20 24 | Top = 82 25 | Width = 392 26 | TabOrder = 0 27 | end 28 | object Timer1: TTimer 29 | Enabled = False 30 | Interval = 100 31 | OnTimer = Timer1Timer 32 | Left = 255 33 | Top = 36 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /client/unit18.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit Unit18; 16 | 17 | {$MODE ObjFPC}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls, 23 | ExtCtrls; 24 | 25 | Type 26 | 27 | { TForm18 } 28 | 29 | TForm18 = Class(TForm) 30 | Label1: TLabel; 31 | ProgressBar1: TProgressBar; 32 | Timer1: TTimer; 33 | Procedure FormCreate(Sender: TObject); 34 | Procedure Timer1Timer(Sender: TObject); 35 | private 36 | 37 | public 38 | 39 | End; 40 | 41 | Var 42 | Form18: TForm18; 43 | 44 | Implementation 45 | 46 | {$R *.lfm} 47 | 48 | { TForm18 } 49 | 50 | Procedure TForm18.FormCreate(Sender: TObject); 51 | Begin 52 | caption := 'Information'; 53 | End; 54 | 55 | Procedure TForm18.Timer1Timer(Sender: TObject); 56 | Begin 57 | ProgressBar1.Position := (ProgressBar1.Position + 1) Mod 100; 58 | End; 59 | 60 | End. 61 | 62 | -------------------------------------------------------------------------------- /client/unit19.lfm: -------------------------------------------------------------------------------- 1 | object Form19: TForm19 2 | Left = 790 3 | Height = 658 4 | Top = 112 5 | Width = 417 6 | Caption = 'Form19' 7 | ClientHeight = 658 8 | ClientWidth = 417 9 | Position = poScreenCenter 10 | LCLVersion = '3.99.0.0' 11 | OnCloseQuery = FormCloseQuery 12 | OnCreate = FormCreate 13 | OnDestroy = FormDestroy 14 | object Button3: TButton 15 | Left = 16 16 | Height = 25 17 | Top = 624 18 | Width = 75 19 | Caption = 'Cancel' 20 | TabOrder = 0 21 | OnClick = Button3Click 22 | end 23 | object Button2: TButton 24 | Left = 328 25 | Height = 25 26 | Top = 624 27 | Width = 75 28 | Caption = 'OK' 29 | TabOrder = 1 30 | OnClick = Button2Click 31 | end 32 | object Label1: TLabel 33 | Left = 16 34 | Height = 16 35 | Top = 16 36 | Width = 35 37 | Caption = 'Name' 38 | end 39 | object Label4: TLabel 40 | Left = 16 41 | Height = 16 42 | Top = 136 43 | Width = 38 44 | Caption = 'Levels' 45 | end 46 | object Edit4: TEdit 47 | Left = 80 48 | Height = 26 49 | Top = 128 50 | Width = 80 51 | TabOrder = 2 52 | Text = 'Edit4' 53 | end 54 | object Button5: TButton 55 | Left = 168 56 | Height = 21 57 | Top = 131 58 | Width = 24 59 | Caption = 'set' 60 | TabOrder = 3 61 | OnClick = Button5Click 62 | end 63 | object PageControl1: TPageControl 64 | Left = 8 65 | Height = 448 66 | Top = 168 67 | Width = 402 68 | ActivePage = TabSheet1 69 | TabIndex = 0 70 | TabOrder = 4 71 | object TabSheet1: TTabSheet 72 | Caption = 'TabSheet1' 73 | ClientHeight = 414 74 | ClientWidth = 396 75 | object Label6: TLabel 76 | Left = 8 77 | Height = 80 78 | Top = 16 79 | Width = 240 80 | Caption = 'Alles was hier stünde, wird'#10'durch '#10#10'THero_Level'#10#10'geregelt. Bei Änderungen ist das Frame '#10'direkt zu editieren !' 81 | Font.Color = clRed 82 | ParentFont = False 83 | end 84 | end 85 | end 86 | object Image1: TImage 87 | Left = 320 88 | Height = 90 89 | Top = 13 90 | Width = 90 91 | AutoSize = True 92 | Transparent = True 93 | end 94 | object Label5: TLabel 95 | Left = 264 96 | Height = 16 97 | Top = 8 98 | Width = 37 99 | Caption = 'Image' 100 | end 101 | object Button6: TButton 102 | Left = 264 103 | Height = 21 104 | Top = 29 105 | Width = 43 106 | Caption = 'load' 107 | TabOrder = 5 108 | OnClick = Button6Click 109 | end 110 | object Label3: TLabel 111 | Left = 16 112 | Height = 16 113 | Top = 50 114 | Width = 23 115 | Caption = 'Size' 116 | end 117 | object Edit2: TEdit 118 | Left = 80 119 | Height = 26 120 | Hint = 'Size in Buy Menu' 121 | Top = 40 122 | Width = 80 123 | ParentShowHint = False 124 | ShowHint = True 125 | TabOrder = 6 126 | Text = 'Edit2' 127 | end 128 | object Label13: TLabel 129 | Left = 16 130 | Height = 16 131 | Top = 82 132 | Width = 27 133 | Caption = 'Cost' 134 | end 135 | object Edit11: TEdit 136 | Left = 80 137 | Height = 26 138 | Top = 72 139 | Width = 80 140 | TabOrder = 7 141 | Text = 'Edit11' 142 | end 143 | object Label14: TLabel 144 | Left = 16 145 | Height = 16 146 | Top = 110 147 | Width = 58 148 | Caption = 'Buildtime' 149 | end 150 | object Edit12: TEdit 151 | Left = 80 152 | Height = 26 153 | Top = 100 154 | Width = 80 155 | TabOrder = 8 156 | Text = 'Edit12' 157 | end 158 | object Edit3: TEdit 159 | Left = 80 160 | Height = 26 161 | Hint = 'Size in Buy Menu' 162 | Top = 8 163 | Width = 80 164 | ParentShowHint = False 165 | ShowHint = True 166 | TabOrder = 9 167 | Text = 'Edit3' 168 | end 169 | object OpenPictureDialog1: TOpenPictureDialog 170 | Filter = 'Graphic (*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm;*.tga)|*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm;*.tga;*.ani|Portable Network Graphic (*.png)|*.png|Pixmap (*.xpm)|*.xpm|Bitmaps (*.bmp)|*.bmp|Cursor (*.cur)|*.cur|Icon (*.ico)|*.ico|Mac OS X Icon (*.icns)|*.icns|Joint Picture Expert Group (*.jpeg;*.jpg;*.jpe;*.jfif)|*.jpeg;*.jpg;*.jpe;*.jfif|Tagged Image File Format (*.tif;*.tiff)|*.tif;*.tiff|Graphics Interchange Format (*.gif)|*.gif|Portable PixMap (*.pbm;*.pgm;*.ppm)|*.pbm;*.pgm;*.ppm|TGA Image File (*.tga)|*.tga|Animation|*.ani|All files (*)|*' 171 | Left = 280 172 | Top = 64 173 | end 174 | end 175 | -------------------------------------------------------------------------------- /client/unit2.lfm: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 331 3 | Height = 179 4 | Top = 122 5 | Width = 533 6 | Caption = 'Form2' 7 | ClientHeight = 179 8 | ClientWidth = 533 9 | OnCloseQuery = FormCloseQuery 10 | OnCreate = FormCreate 11 | OnShow = FormShow 12 | Position = poScreenCenter 13 | LCLVersion = '2.3.0.0' 14 | object Label1: TLabel 15 | Left = 8 16 | Height = 16 17 | Top = 56 18 | Width = 26 19 | Caption = 'Port' 20 | end 21 | object Edit1: TEdit 22 | Left = 80 23 | Height = 25 24 | Top = 48 25 | Width = 192 26 | OnKeyPress = Edit1KeyPress 27 | TabOrder = 1 28 | Text = 'Edit1' 29 | end 30 | object Label2: TLabel 31 | Left = 8 32 | Height = 16 33 | Top = 88 34 | Width = 58 35 | Caption = 'Password' 36 | end 37 | object Edit2: TEdit 38 | Left = 80 39 | Height = 25 40 | Top = 80 41 | Width = 192 42 | OnKeyPress = Edit1KeyPress 43 | TabOrder = 2 44 | Text = 'Edit2' 45 | end 46 | object Button2: TButton 47 | Left = 197 48 | Height = 25 49 | Top = 144 50 | Width = 75 51 | Cancel = True 52 | Caption = '&Cancel' 53 | ModalResult = 2 54 | TabOrder = 6 55 | end 56 | object ComboBox1: TComboBox 57 | Left = 80 58 | Height = 27 59 | Top = 15 60 | Width = 192 61 | ItemHeight = 0 62 | OnKeyPress = Edit1KeyPress 63 | TabOrder = 0 64 | Text = 'ComboBox1' 65 | Visible = False 66 | end 67 | object Label3: TLabel 68 | Left = 8 69 | Height = 16 70 | Top = 23 71 | Width = 49 72 | Caption = 'Address' 73 | Visible = False 74 | end 75 | object Label4: TLabel 76 | Left = 8 77 | Height = 16 78 | Top = 120 79 | Width = 74 80 | Caption = 'Player name' 81 | end 82 | object Edit3: TEdit 83 | Left = 80 84 | Height = 25 85 | Top = 112 86 | Width = 192 87 | OnKeyPress = Edit1KeyPress 88 | TabOrder = 3 89 | Text = 'Edit3' 90 | end 91 | object GroupBox1: TGroupBox 92 | Left = 280 93 | Height = 126 94 | Top = 8 95 | Width = 248 96 | Caption = ' Found game sessions' 97 | ClientHeight = 109 98 | ClientWidth = 246 99 | TabOrder = 4 100 | object ListBox1: TListBox 101 | Left = 8 102 | Height = 104 103 | Top = 0 104 | Width = 232 105 | ItemHeight = 0 106 | OnClick = ListBox1Click 107 | OnDblClick = ListBox1DblClick 108 | OnDrawItem = ListBox1DrawItem 109 | ScrollWidth = 230 110 | Style = lbOwnerDrawFixed 111 | TabOrder = 0 112 | TopIndex = -1 113 | end 114 | end 115 | object Button3: TButton 116 | Left = 80 117 | Height = 25 118 | Top = 144 119 | Width = 102 120 | Caption = '&Connect' 121 | Default = True 122 | OnClick = Button3Click 123 | TabOrder = 5 124 | end 125 | object Timer1: TTimer 126 | Enabled = False 127 | Interval = 500 128 | OnTimer = Timer1Timer 129 | Left = 304 130 | Top = 40 131 | end 132 | end 133 | -------------------------------------------------------------------------------- /client/unit20.lfm: -------------------------------------------------------------------------------- 1 | object Form20: TForm20 2 | Left = 351 3 | Height = 600 4 | Top = 121 5 | Width = 822 6 | Caption = 'Form20' 7 | ClientHeight = 600 8 | ClientWidth = 822 9 | Position = poScreenCenter 10 | LCLVersion = '3.99.0.0' 11 | OnCreate = FormCreate 12 | object TreeView1: TTreeView 13 | Left = 0 14 | Height = 575 15 | Top = 0 16 | Width = 150 17 | Align = alLeft 18 | ReadOnly = True 19 | TabOrder = 0 20 | Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw] 21 | OnClick = TreeView1Click 22 | end 23 | object Button1: TButton 24 | Left = 0 25 | Height = 25 26 | Top = 575 27 | Width = 822 28 | Align = alBottom 29 | Caption = 'OK' 30 | TabOrder = 1 31 | OnClick = Button1Click 32 | end 33 | object Splitter1: TSplitter 34 | Left = 150 35 | Height = 575 36 | Top = 0 37 | Width = 5 38 | end 39 | object IpHtmlPanel1: TIpHtmlPanel 40 | Left = 155 41 | Height = 575 42 | Top = 0 43 | Width = 667 44 | Align = alClient 45 | FixedTypeface = 'Courier New' 46 | DefaultTypeFace = 'default' 47 | DefaultFontSize = 12 48 | FlagErrors = False 49 | PrintSettings.MarginLeft = 0.5 50 | PrintSettings.MarginTop = 0.5 51 | PrintSettings.MarginRight = 0.5 52 | PrintSettings.MarginBottom = 0.5 53 | PrintSettings.Preview.Left = 480 54 | PrintSettings.Preview.Top = 300 55 | PrintSettings.Preview.Width = 1440 56 | PrintSettings.Preview.Height = 900 57 | TabOrder = 3 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /client/unit20.pas: -------------------------------------------------------------------------------- 1 | Unit Unit20; 2 | 3 | {$MODE ObjFPC}{$H+} 4 | 5 | Interface 6 | 7 | Uses 8 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, 9 | ExtCtrls, IpHtml; 10 | 11 | Type 12 | 13 | { TForm20 } 14 | 15 | TForm20 = Class(TForm) 16 | Button1: TButton; 17 | IpHtmlPanel1: TIpHtmlPanel; 18 | Splitter1: TSplitter; 19 | TreeView1: TTreeView; 20 | Procedure Button1Click(Sender: TObject); 21 | Procedure FormCreate(Sender: TObject); 22 | Procedure TreeView1Click(Sender: TObject); 23 | private 24 | Procedure HTMLGetImageX(Sender: TIpHtmlNode; Const URL: String; 25 | Var Picture: TPicture); 26 | Procedure LoadPage(Const Filename: String); 27 | 28 | public 29 | Procedure LoadHelp; 30 | 31 | End; 32 | 33 | Var 34 | Form20: TForm20; 35 | 36 | Implementation 37 | 38 | {$R *.lfm} 39 | 40 | Type 41 | TSimpleIpHtml = Class(TIpHtml) 42 | public 43 | Property OnGetImageX; 44 | End; 45 | 46 | { TForm20 } 47 | 48 | Procedure TForm20.Button1Click(Sender: TObject); 49 | Begin 50 | close; 51 | End; 52 | 53 | Procedure TForm20.FormCreate(Sender: TObject); 54 | Begin 55 | caption := 'Online help'; 56 | End; 57 | 58 | Procedure TForm20.TreeView1Click(Sender: TObject); 59 | Var 60 | n: TTreeNode; 61 | Begin 62 | n := TreeView1.Selected; 63 | If assigned(n) Then Begin 64 | LoadPage(n.Text); 65 | End; 66 | End; 67 | 68 | Procedure TForm20.HTMLGetImageX(Sender: TIpHtmlNode; Const URL: String; 69 | Var Picture: TPicture); 70 | Var 71 | dlurl: String; 72 | Begin 73 | If PathDelim <> '/' Then Begin 74 | dlurl := URL; 75 | dlurl := StringReplace(dlurl, '/', PathDelim, [rfReplaceAll]); 76 | End 77 | Else Begin 78 | dlurl := URL; 79 | End; 80 | dlurl := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'help' + PathDelim + dlurl; 81 | If FileExists(dlurl) Then Begin 82 | If Picture = Nil Then Begin 83 | Picture := TPicture.Create; 84 | Picture.LoadFromFile(dlURL); 85 | End; 86 | End 87 | Else Begin 88 | Picture := Nil; 89 | exit; 90 | End; 91 | End; 92 | 93 | Procedure TForm20.LoadPage(Const Filename: String); 94 | Var 95 | error_404, fn: String; 96 | NewHTML: TSimpleIpHtml; 97 | m: TMemoryStream; 98 | Begin 99 | fn := 'help' + PathDelim + Filename + '.html'; 100 | NewHTML := TSimpleIpHtml.Create; 101 | NewHTML.OnGetImageX := @HTMLGetImageX; 102 | m := TMemoryStream.Create; 103 | If FileExists(fn) Then Begin 104 | m.LoadFromFile(fn); 105 | End 106 | Else Begin 107 | error_404 := 108 | '<!DOCTYPE html>' + LineEnding + 109 | '<html>' + LineEnding + 110 | '<body>' + LineEnding + 111 | '<h1>Error:</h1>' + LineEnding + 112 | '<p>404 could not find: ' + Filename + '.html</p>' + LineEnding + 113 | '</body>' + LineEnding + 114 | '</html>'; 115 | m.Write(error_404[1], length(error_404)); 116 | m.Position := 0; 117 | End; 118 | NewHTML.LoadFromStream(m); 119 | IpHtmlPanel1.SetHtml(NewHTML); 120 | End; 121 | 122 | Procedure TForm20.LoadHelp; 123 | Var 124 | sl: TStringList; 125 | i: Integer; 126 | s, pre, suf: String; 127 | par: TTreeNode; 128 | Begin 129 | TreeView1.Items.Clear; 130 | If Not FileExists('help' + PathDelim + 'index.txt') Then Begin 131 | showmessage('Error, online help is not available, please use launcher to update.'); 132 | LoadPage('General'); 133 | exit; 134 | End; 135 | sl := TStringList.Create; 136 | sl.LoadFromFile('help' + PathDelim + 'index.txt'); 137 | For i := 0 To sl.count - 1 Do Begin 138 | s := sl[i]; 139 | If trim(s) = '' Then Continue; 140 | If s[1] = '#' Then Continue; 141 | pre := copy(s, 1, pos('-', s) - 1); 142 | suf := copy(s, pos('>', s) + 1, length(s)); 143 | par := TreeView1.Items.FindNodeWithText(pre); 144 | TreeView1.Items.AddChild(par, suf); 145 | End; 146 | TreeView1.FullExpand; 147 | If TreeView1.Items.Count <> 0 Then TreeView1.Items.SelectOnlyThis(TreeView1.Items[0]); 148 | sl.free; 149 | LoadPage('General'); 150 | End; 151 | 152 | End. 153 | 154 | -------------------------------------------------------------------------------- /client/unit3.lfm: -------------------------------------------------------------------------------- 1 | object Form3: TForm3 2 | Left = 446 3 | Height = 145 4 | Top = 223 5 | Width = 234 6 | Caption = 'Form3' 7 | ClientHeight = 145 8 | ClientWidth = 234 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnCreate = FormCreate 12 | object Edit1: TEdit 13 | Left = 64 14 | Height = 26 15 | Top = 8 16 | Width = 80 17 | TabOrder = 0 18 | Text = 'Edit1' 19 | OnKeyPress = Edit1KeyPress 20 | end 21 | object Edit2: TEdit 22 | Left = 64 23 | Height = 26 24 | Top = 40 25 | Width = 80 26 | TabOrder = 1 27 | Text = 'Edit2' 28 | OnKeyPress = Edit1KeyPress 29 | end 30 | object Label1: TLabel 31 | Left = 8 32 | Height = 16 33 | Top = 16 34 | Width = 36 35 | Caption = 'Width' 36 | ParentColor = False 37 | end 38 | object Label2: TLabel 39 | Left = 8 40 | Height = 16 41 | Top = 48 42 | Width = 40 43 | Caption = 'Height' 44 | ParentColor = False 45 | end 46 | object Button1: TButton 47 | Left = 64 48 | Height = 25 49 | Top = 112 50 | Width = 75 51 | Caption = '&OK' 52 | Default = True 53 | ModalResult = 1 54 | TabOrder = 3 55 | end 56 | object Button2: TButton 57 | Left = 151 58 | Height = 25 59 | Top = 112 60 | Width = 75 61 | Cancel = True 62 | Caption = '&Cancel' 63 | ModalResult = 2 64 | TabOrder = 4 65 | end 66 | object Label3: TLabel 67 | Left = 8 68 | Height = 16 69 | Top = 81 70 | Width = 35 71 | Caption = 'Name' 72 | ParentColor = False 73 | end 74 | object Edit3: TEdit 75 | Left = 64 76 | Height = 26 77 | Top = 73 78 | Width = 162 79 | TabOrder = 2 80 | Text = 'Edit3' 81 | OnKeyPress = Edit1KeyPress 82 | end 83 | object Button3: TSpeedButton 84 | Left = 151 85 | Height = 56 86 | Top = 5 87 | Width = 75 88 | OnClick = Button3Click 89 | end 90 | object OpenPictureDialog1: TOpenPictureDialog 91 | Filter = 'Grafics(*.bmp. *.png)|*.png;*.bmp|Bitmaps (*.bmp)|*.bmp|Portable Network Graphic|*.png' 92 | FilterIndex = 0 93 | Left = 16 94 | Top = 96 95 | end 96 | end 97 | -------------------------------------------------------------------------------- /client/unit3.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit unit3; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 23 | ExtDlgs, Buttons; 24 | 25 | Type 26 | 27 | { TForm3 } 28 | 29 | TForm3 = Class(TForm) 30 | Button1: TButton; 31 | Button2: TButton; 32 | Edit1: TEdit; 33 | Edit2: TEdit; 34 | Edit3: TEdit; 35 | Label1: TLabel; 36 | Label2: TLabel; 37 | Label3: TLabel; 38 | OpenPictureDialog1: TOpenPictureDialog; 39 | Button3: TSpeedButton; 40 | Procedure Button3Click(Sender: TObject); 41 | Procedure Edit1KeyPress(Sender: TObject; Var Key: char); 42 | Procedure FormCreate(Sender: TObject); 43 | private 44 | { private declarations } 45 | public 46 | { public declarations } 47 | End; 48 | 49 | Var 50 | Form3: TForm3; 51 | Form3Filename: String; 52 | 53 | Implementation 54 | 55 | {$R *.lfm} 56 | 57 | { TForm3 } 58 | 59 | Procedure TForm3.FormCreate(Sender: TObject); 60 | Begin 61 | Tform(self).Constraints.MaxHeight := Tform(self).Height; 62 | Tform(self).Constraints.MinHeight := Tform(self).Height; 63 | Tform(self).Constraints.Maxwidth := Tform(self).width; 64 | Tform(self).Constraints.Minwidth := Tform(self).width; 65 | Button3.caption := 'Import' + LineEnding + 'image'; 66 | End; 67 | 68 | Procedure TForm3.Edit1KeyPress(Sender: TObject; Var Key: char); 69 | Begin 70 | If key = #13 Then Button1.Click; 71 | End; 72 | 73 | Procedure TForm3.Button3Click(Sender: TObject); 74 | Var 75 | g: TGraphic; 76 | Begin 77 | If OpenPictureDialog1.Execute Then Begin 78 | Form3Filename := OpenPictureDialog1.FileName; 79 | If LowerCase(ExtractFileExt(OpenPictureDialog1.FileName)) = '.png' Then Begin 80 | g := TPortableNetworkGraphic.Create; 81 | End 82 | Else Begin 83 | g := TBitmap.Create; 84 | End; 85 | g.LoadFromFile(OpenPictureDialog1.FileName); 86 | edit1.text := inttostr(g.Width); 87 | edit2.text := inttostr(g.Height); 88 | g.free; 89 | End; 90 | End; 91 | 92 | End. 93 | 94 | -------------------------------------------------------------------------------- /client/unit6.lfm: -------------------------------------------------------------------------------- 1 | object Form6: TForm6 2 | Left = 522 3 | Height = 717 4 | Top = 86 5 | Width = 426 6 | Caption = 'Form6' 7 | ClientHeight = 717 8 | ClientWidth = 426 9 | FormStyle = fsStayOnTop 10 | Position = poScreenCenter 11 | LCLVersion = '3.99.0.0' 12 | OnCloseQuery = FormCloseQuery 13 | OnCreate = FormCreate 14 | OnDestroy = FormDestroy 15 | object PageControl1: TPageControl 16 | Left = 8 17 | Height = 472 18 | Top = 192 19 | Width = 408 20 | ActivePage = TabSheet1 21 | TabIndex = 0 22 | TabOrder = 7 23 | object TabSheet1: TTabSheet 24 | Caption = 'TabSheet1' 25 | ClientHeight = 438 26 | ClientWidth = 402 27 | object Label6: TLabel 28 | Left = 58 29 | Height = 80 30 | Top = 71 31 | Width = 240 32 | Caption = 'Alles was hier stünde, wird'#10'durch '#10#10'TBuilding_stage'#10#10'geregelt. Bei Änderungen ist das Frame '#10'direkt zu editieren !' 33 | Font.Color = clRed 34 | ParentFont = False 35 | end 36 | end 37 | end 38 | object Label1: TLabel 39 | Left = 16 40 | Height = 16 41 | Top = 16 42 | Width = 35 43 | Caption = 'Name' 44 | end 45 | object Label2: TLabel 46 | Left = 16 47 | Height = 16 48 | Top = 40 49 | Width = 23 50 | Caption = 'Size' 51 | end 52 | object Label3: TLabel 53 | Left = 16 54 | Height = 16 55 | Top = 168 56 | Width = 69 57 | Caption = 'Stagecount' 58 | end 59 | object Label4: TLabel 60 | Left = 16 61 | Height = 16 62 | Top = 64 63 | Width = 55 64 | Caption = 'Category' 65 | end 66 | object Image1: TImage 67 | Left = 304 68 | Height = 90 69 | Top = 13 70 | Width = 90 71 | AutoSize = True 72 | Transparent = True 73 | end 74 | object Label5: TLabel 75 | Left = 248 76 | Height = 16 77 | Top = 8 78 | Width = 37 79 | Caption = 'Image' 80 | end 81 | object Edit1: TEdit 82 | Left = 128 83 | Height = 26 84 | Top = 8 85 | Width = 80 86 | TabOrder = 0 87 | Text = 'Edit1' 88 | end 89 | object Edit2: TEdit 90 | Left = 128 91 | Height = 26 92 | Top = 32 93 | Width = 80 94 | TabOrder = 1 95 | Text = 'Edit2' 96 | end 97 | object Edit3: TEdit 98 | Left = 128 99 | Height = 26 100 | Top = 160 101 | Width = 80 102 | TabOrder = 6 103 | Text = 'Edit3' 104 | end 105 | object Edit4: TEdit 106 | Left = 128 107 | Height = 26 108 | Top = 56 109 | Width = 80 110 | TabOrder = 2 111 | Text = 'Edit4' 112 | end 113 | object Button1: TButton 114 | Left = 216 115 | Height = 21 116 | Top = 160 117 | Width = 24 118 | Caption = 'set' 119 | TabOrder = 9 120 | OnClick = Button1Click 121 | end 122 | object Button2: TButton 123 | Left = 248 124 | Height = 21 125 | Top = 29 126 | Width = 43 127 | Caption = 'load' 128 | TabOrder = 8 129 | OnClick = Button2Click 130 | end 131 | object Edit20: TEdit 132 | Left = 128 133 | Height = 26 134 | Top = 82 135 | Width = 80 136 | TabOrder = 3 137 | Text = 'Edit20' 138 | end 139 | object Edit21: TEdit 140 | Left = 128 141 | Height = 26 142 | Top = 107 143 | Width = 80 144 | TabOrder = 4 145 | Text = 'Edit21' 146 | end 147 | object Edit22: TEdit 148 | Left = 128 149 | Height = 26 150 | Top = 134 151 | Width = 80 152 | TabOrder = 5 153 | Text = 'Edit22' 154 | end 155 | object Label24: TLabel 156 | Left = 16 157 | Height = 16 158 | Top = 90 159 | Width = 96 160 | Caption = 'Refund easy [%]' 161 | end 162 | object Label25: TLabel 163 | Left = 16 164 | Height = 16 165 | Top = 115 166 | Width = 110 167 | Caption = 'Refund middle [%]' 168 | end 169 | object Label26: TLabel 170 | Left = 16 171 | Height = 16 172 | Top = 142 173 | Width = 97 174 | Caption = 'Refund hard [%]' 175 | end 176 | object Button3: TButton 177 | Left = 341 178 | Height = 25 179 | Top = 680 180 | Width = 75 181 | Caption = 'Ok' 182 | TabOrder = 10 183 | OnClick = Button3Click 184 | end 185 | object Button4: TButton 186 | Left = 8 187 | Height = 25 188 | Top = 680 189 | Width = 75 190 | Caption = 'Cancel' 191 | TabOrder = 11 192 | OnClick = Button4Click 193 | end 194 | object OpenDialog2: TOpenDialog 195 | DefaultExt = '.geb' 196 | Filter = 'Building|*.geb|All|*.*' 197 | Left = 148 198 | Top = 608 199 | end 200 | object SaveDialog1: TSaveDialog 201 | DefaultExt = '.geb' 202 | Filter = 'Building|*.geb|All|*.*' 203 | Left = 256 204 | Top = 608 205 | end 206 | object OpenPictureDialog1: TOpenPictureDialog 207 | Filter = 'Graphic (*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm;*.tga)|*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm;*.tga;*.ani|Portable Network Graphic (*.png)|*.png|Pixmap (*.xpm)|*.xpm|Bitmaps (*.bmp)|*.bmp|Cursor (*.cur)|*.cur|Icon (*.ico)|*.ico|Mac OS X Icon (*.icns)|*.icns|Joint Picture Expert Group (*.jpeg;*.jpg;*.jpe;*.jfif)|*.jpeg;*.jpg;*.jpe;*.jfif|Tagged Image File Format (*.tif;*.tiff)|*.tif;*.tiff|Graphics Interchange Format (*.gif)|*.gif|Portable PixMap (*.pbm;*.pgm;*.ppm)|*.pbm;*.pgm;*.ppm|TGA Image File (*.tga)|*.tga|Animation|*.ani|All files (*)|*' 208 | Left = 340 209 | Top = 124 210 | end 211 | end 212 | -------------------------------------------------------------------------------- /client/unit9.lfm: -------------------------------------------------------------------------------- 1 | object Form9: TForm9 2 | Left = 329 3 | Height = 382 4 | Top = 121 5 | Width = 585 6 | Caption = 'Form9' 7 | ClientHeight = 382 8 | ClientWidth = 585 9 | Position = poScreenCenter 10 | LCLVersion = '3.99.0.0' 11 | OnCreate = FormCreate 12 | object PageControl1: TPageControl 13 | Left = 8 14 | Height = 240 15 | Top = 8 16 | Width = 304 17 | ActivePage = TabSheet1 18 | TabIndex = 0 19 | TabOrder = 0 20 | object TabSheet1: TTabSheet 21 | Caption = 'TabSheet1' 22 | ClientHeight = 206 23 | ClientWidth = 298 24 | object StringGrid1: TStringGrid 25 | Left = 16 26 | Height = 160 27 | Top = 24 28 | Width = 208 29 | TabOrder = 0 30 | OnHeaderClick = StringGrid1HeaderClick 31 | end 32 | end 33 | end 34 | object Panel1: TPanel 35 | Left = 8 36 | Height = 50 37 | Top = 288 38 | Width = 360 39 | Caption = 'Panel1' 40 | ClientHeight = 50 41 | ClientWidth = 360 42 | TabOrder = 1 43 | OnResize = Panel1Resize 44 | object Button1: TButton 45 | Left = 272 46 | Height = 25 47 | Top = 14 48 | Width = 75 49 | Anchors = [akTop, akRight] 50 | Caption = 'OK' 51 | ModalResult = 1 52 | TabOrder = 0 53 | end 54 | object Button2: TButton 55 | Left = 8 56 | Height = 25 57 | Top = 14 58 | Width = 75 59 | Caption = 'Clear' 60 | TabOrder = 1 61 | OnClick = Button2Click 62 | end 63 | object Image1: TImage 64 | Left = 135 65 | Height = 13 66 | Top = 24 67 | Width = 61 68 | AutoSize = True 69 | Transparent = True 70 | end 71 | end 72 | end 73 | -------------------------------------------------------------------------------- /client/updater_settings.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | Const 17 | 18 | (* 19 | * Der Updater braucht die "int" version nicht, die ist nur für Config_td, klar dass beide immer gleich sein müssen ! 20 | *) 21 | updater_Version = '0.11001'; // Zum Unterscheiden im Updater kann man auch gern "unterversionen nehmen" die Zahl wird als Floatingpoint angenommen. 22 | updater_int_Version = 11; 23 | 24 | updater_AppName = 'Config TD'; 25 | updater_StarterName = 'config_td'; 26 | updater_UpdaterName = 'updater'; 27 | updater_DownloadLink = 'https://corpsman.de/download/ctd.zip'; 28 | updater_Additional = ''; // Liste der Potenziellen weiteren Datenfelder alle durch , getrennt. 29 | 30 | -------------------------------------------------------------------------------- /client/uplayer_info_frame.lfm: -------------------------------------------------------------------------------- 1 | object PlayerInfoFrame: TPlayerInfoFrame 2 | Left = 0 3 | Height = 54 4 | Top = 0 5 | Width = 465 6 | ClientHeight = 54 7 | ClientWidth = 465 8 | TabOrder = 0 9 | DesignLeft = 331 10 | DesignTop = 119 11 | object Label1: TLabel 12 | Left = 8 13 | Height = 15 14 | Top = 8 15 | Width = 62 16 | Caption = 'Playername' 17 | ParentColor = False 18 | end 19 | object Label2: TLabel 20 | Left = 8 21 | Height = 15 22 | Top = 32 23 | Width = 34 24 | Caption = 'Label2' 25 | ParentColor = False 26 | end 27 | object Label3: TLabel 28 | Left = 112 29 | Height = 15 30 | Top = 8 31 | Width = 26 32 | Caption = 'Cash' 33 | ParentColor = False 34 | end 35 | object Label4: TLabel 36 | Left = 112 37 | Height = 15 38 | Top = 32 39 | Width = 34 40 | Caption = 'Label4' 41 | ParentColor = False 42 | end 43 | object Label5: TLabel 44 | Left = 191 45 | Height = 15 46 | Top = 8 47 | Width = 26 48 | Caption = 'Lives' 49 | ParentColor = False 50 | end 51 | object Label6: TLabel 52 | Left = 191 53 | Height = 15 54 | Top = 32 55 | Width = 34 56 | Caption = 'Label6' 57 | ParentColor = False 58 | end 59 | object Label7: TLabel 60 | Left = 264 61 | Height = 15 62 | Top = 8 63 | Width = 21 64 | Caption = 'Kills' 65 | ParentColor = False 66 | end 67 | object Label8: TLabel 68 | Left = 264 69 | Height = 15 70 | Top = 32 71 | Width = 34 72 | Caption = 'Label8' 73 | ParentColor = False 74 | end 75 | object Button1: TButton 76 | Left = 320 77 | Height = 25 78 | Top = 24 79 | Width = 48 80 | Caption = 'Send' 81 | TabOrder = 0 82 | OnClick = Button1Click 83 | end 84 | object Label9: TLabel 85 | Left = 376 86 | Height = 15 87 | Top = 8 88 | Width = 26 89 | Caption = 'Cash' 90 | ParentColor = False 91 | end 92 | object ComboBox1: TComboBox 93 | Left = 376 94 | Height = 23 95 | Top = 24 96 | Width = 84 97 | ItemHeight = 15 98 | ItemIndex = 3 99 | Items.Strings = ( 100 | '5' 101 | '10' 102 | '50' 103 | '100' 104 | '500' 105 | ) 106 | TabOrder = 1 107 | Text = '100' 108 | OnKeyPress = ComboBox1KeyPress 109 | end 110 | end 111 | -------------------------------------------------------------------------------- /client/uplayer_info_frame.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit uplayer_info_frame; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls; 23 | 24 | Type 25 | 26 | TTransferCallback = Procedure(Sender: TObject; DestPlayer, Count: integer) Of Object; 27 | 28 | { TPlayerInfoFrame } 29 | 30 | TPlayerInfoFrame = Class(TFrame) 31 | Button1: TButton; 32 | ComboBox1: TComboBox; 33 | Label1: TLabel; 34 | Label2: TLabel; 35 | Label3: TLabel; 36 | Label4: TLabel; 37 | Label5: TLabel; 38 | Label6: TLabel; 39 | Label7: TLabel; 40 | Label8: TLabel; 41 | Label9: TLabel; 42 | Procedure Button1Click(Sender: TObject); 43 | Procedure ComboBox1KeyPress(Sender: TObject; Var Key: char); 44 | private 45 | { private declarations } 46 | public 47 | { public declarations } 48 | CashTransferCallback: TTransferCallback; 49 | 50 | Constructor Create(AOwner: TComponent; WithLabels: Boolean); reintroduce; 51 | End; 52 | 53 | Implementation 54 | 55 | {$R *.lfm} 56 | 57 | { TPlayerInfoFrame } 58 | 59 | Constructor TPlayerInfoFrame.Create(AOwner: TComponent; WithLabels: Boolean); 60 | Begin 61 | Inherited Create(AOwner); 62 | ComboBox1.text := '100'; 63 | If Not WithLabels Then Begin 64 | Label1.Visible := false; 65 | Label3.Visible := false; 66 | Label5.Visible := false; 67 | Label7.Visible := false; 68 | Label9.Visible := false; 69 | label2.top := label1.top; 70 | label4.top := label1.top; 71 | label6.top := label1.top; 72 | label8.top := label1.top; 73 | button1.top := label1.top; 74 | ComboBox1.Top := label1.top; 75 | height := label1.top + ComboBox1.Height + label1.top; 76 | End; 77 | End; 78 | 79 | Procedure TPlayerInfoFrame.Button1Click(Sender: TObject); 80 | Var 81 | i: integer; 82 | Begin 83 | // Geld Senden.. 84 | i := strtointdef(ComboBox1.text, -1); 85 | If i > 0 Then Begin 86 | CashTransferCallback(self, tag - 1, i); 87 | End; 88 | End; 89 | 90 | Procedure TPlayerInfoFrame.ComboBox1KeyPress(Sender: TObject; Var Key: char); 91 | Begin 92 | If key = #13 Then Button1Click(self); 93 | End; 94 | 95 | End. 96 | 97 | -------------------------------------------------------------------------------- /client/usplashmarkmanager.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit usplashmarkmanager; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | {$I apptype.inc} 20 | 21 | Interface 22 | 23 | Uses 24 | Classes, SysUtils; 25 | 26 | Type 27 | 28 | TMark = Record 29 | CreationTime: int64; 30 | x, y: integer; 31 | End; 32 | 33 | { TSplashMarkManager } 34 | 35 | TSplashMarkManager = Class 36 | private 37 | fMarks: Array Of TMark; 38 | Procedure RenderAbstract(blockw, blockh: Single); 39 | public 40 | Texture: integer; 41 | Procedure AddMark(x, y: integer); 42 | Procedure Render(sx, sy, x, y: integer); 43 | Procedure RenderPreview(x, y, w, h, width, height: integer); // Gendert eine Vorschau der Karte 44 | Constructor Create; 45 | Destructor Destroy; override; 46 | End; 47 | 48 | Implementation 49 | 50 | Uses LCLIntf, uctd_common, dglOpenGL, uopengl_graphikengine; 51 | 52 | { TSplashMarkManager } 53 | 54 | Constructor TSplashMarkManager.Create; 55 | Begin 56 | Inherited create; 57 | End; 58 | 59 | Destructor TSplashMarkManager.Destroy; 60 | Begin 61 | setlength(fMarks, 0); 62 | End; 63 | 64 | Procedure TSplashMarkManager.AddMark(x, y: integer); 65 | Begin 66 | setlength(fMarks, high(fMarks) + 2); 67 | fMarks[high(fMarks)].CreationTime := gettick(); 68 | fMarks[high(fMarks)].x := x; 69 | fMarks[high(fMarks)].y := y; 70 | End; 71 | 72 | Procedure TSplashMarkManager.RenderAbstract(blockw, blockh: Single); 73 | Var 74 | s, i: integer; 75 | n: int64; 76 | Begin 77 | n := GetTick(); 78 | glPushMatrix; 79 | // So Skallieren, dass alles nachfolgende in MAP_BLOCK_WIDTH koordinaten gerendert werden kann. 80 | glScalef(blockw, blockh, 1); 81 | glColor4f(1, 0, 0, 1); 82 | For i := 0 To high(fMarks) Do Begin 83 | glPushMatrix; 84 | // Vom Erzeugungszeitpunkt bis zum "Sterben" wächst das Ausrufezeichen auf Mapsize * 7 an 85 | s := round(((n - fMarks[i].CreationTime) / MarkLifeTime) * 7 * MapBlockSize); 86 | glTranslatef(fMarks[i].x * MapBlockSize + MapBlockSize / 2, fMarks[i].y * MapBlockSize + MapBlockSize / 2, 0); 87 | RenderAlphaQuad(point(0, 0), s, s, 180, Texture); 88 | glpopmatrix; 89 | End; 90 | glpopmatrix; 91 | End; 92 | 93 | Procedure TSplashMarkManager.Render(sx, sy, x, y: integer); 94 | Var 95 | i: Integer; 96 | n: int64; 97 | j: Integer; 98 | Begin 99 | n := GetTick(); 100 | glColor4f(1, 1, 1, 1); 101 | glBindTexture(GL_TEXTURE_2D, Texture); 102 | glPushMatrix; 103 | glTranslatef(x - sx, y - sy, ctd_Map_Layer); 104 | glDisable(GL_DEPTH_TEST); 105 | RenderAbstract(1, 1); 106 | glEnable(GL_DEPTH_TEST); 107 | glpopmatrix; 108 | // Alte Marks Raus Schmeisen 109 | For i := high(fMarks) Downto 0 Do Begin 110 | If n - fMarks[i].CreationTime > MarkLifeTime Then Begin 111 | For j := i To high(fMarks) - 1 Do Begin 112 | fMarks[j] := fMarks[j + 1]; 113 | End; 114 | SetLength(fMarks, high(fMarks)); 115 | End; 116 | End; 117 | End; 118 | 119 | Procedure TSplashMarkManager.RenderPreview(x, y, w, h, width, height: integer); 120 | Begin 121 | glColor4f(1, 1, 1, 1); 122 | glBindTexture(GL_TEXTURE_2D, Texture); 123 | glPushMatrix; 124 | glTranslatef(x, y, ctd_Menu_Layer + ctd_Epsilon); 125 | glDisable(GL_DEPTH_TEST); 126 | RenderAbstract(w / (width * MapBlockSize), h / (height * MapBlockSize)); 127 | glEnable(GL_DEPTH_TEST); 128 | glPopMatrix; 129 | End; 130 | 131 | End. 132 | 133 | -------------------------------------------------------------------------------- /client/uvectormath.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {$DEFINE UseOperandOverloading} 17 | 18 | TBaseType = Single; // Alle Komponenten bestehen aus BaseType, zur Nutzung von OpenGL ist Single zwingend !! 19 | 20 | -------------------------------------------------------------------------------- /client/uwave_frame.lfm: -------------------------------------------------------------------------------- 1 | object WaveFrame: TWaveFrame 2 | Left = 0 3 | Height = 341 4 | Top = 0 5 | Width = 282 6 | Anchors = [akTop, akLeft, akRight, akBottom] 7 | ClientHeight = 341 8 | ClientWidth = 282 9 | TabOrder = 0 10 | DesignLeft = 317 11 | DesignTop = 117 12 | object Label2: TLabel 13 | Left = 4 14 | Height = 25 15 | Top = 10 16 | Width = 88 17 | Alignment = taRightJustify 18 | AutoSize = False 19 | Caption = 'Cash on start' 20 | end 21 | object Edit2: TEdit 22 | Left = 95 23 | Height = 26 24 | Top = 10 25 | Width = 80 26 | NumbersOnly = True 27 | TabOrder = 0 28 | Text = 'Edit2' 29 | OnChange = Edit2Change 30 | OnEnter = OnEditEnter 31 | OnExit = OnEditExit 32 | end 33 | object Label3: TLabel 34 | Left = 4 35 | Height = 25 36 | Top = 70 37 | Width = 88 38 | Alignment = taRightJustify 39 | AutoSize = False 40 | Caption = 'Opponents' 41 | end 42 | object Button1: TButton 43 | Left = 95 44 | Height = 25 45 | Top = 70 46 | Width = 50 47 | Caption = '&Add' 48 | TabOrder = 2 49 | OnClick = Button1Click 50 | end 51 | object Label11: TLabel 52 | Left = 4 53 | Height = 25 54 | Top = 40 55 | Width = 88 56 | Alignment = taRightJustify 57 | AutoSize = False 58 | Caption = 'Wave hint' 59 | end 60 | object Edit1: TEdit 61 | Left = 95 62 | Height = 26 63 | Top = 40 64 | Width = 80 65 | TabOrder = 1 66 | Text = 'Edit1' 67 | OnChange = Edit1Change 68 | end 69 | object PageControl1: TPageControl 70 | Left = 4 71 | Height = 232 72 | Top = 104 73 | Width = 270 74 | Anchors = [akTop, akLeft, akRight, akBottom] 75 | TabOrder = 5 76 | OnChange = PageControl1Change 77 | end 78 | object Button2: TButton 79 | Left = 235 80 | Height = 25 81 | Top = 24 82 | Width = 19 83 | Caption = '<' 84 | TabOrder = 3 85 | OnClick = Button2Click 86 | end 87 | object Button3: TButton 88 | Left = 253 89 | Height = 25 90 | Top = 24 91 | Width = 19 92 | Caption = '>' 93 | TabOrder = 4 94 | OnClick = Button3Click 95 | end 96 | object Label1: TLabel 97 | Left = 235 98 | Height = 16 99 | Top = 6 100 | Width = 33 101 | Caption = 'move' 102 | end 103 | object Button4: TButton 104 | Left = 224 105 | Height = 25 106 | Top = 70 107 | Width = 50 108 | Caption = 'del' 109 | TabOrder = 6 110 | OnClick = Button4Click 111 | end 112 | object Bevel1: TBevel 113 | Left = 152 114 | Height = 3 115 | Top = 82 116 | Width = 64 117 | end 118 | end 119 | -------------------------------------------------------------------------------- /client/uwave_oppenent_frame.lfm: -------------------------------------------------------------------------------- 1 | object WaveOpponentFrame: TWaveOpponentFrame 2 | Left = 0 3 | Height = 191 4 | Top = 0 5 | Width = 271 6 | Anchors = [akTop, akLeft, akRight, akBottom] 7 | ClientHeight = 191 8 | ClientWidth = 271 9 | TabOrder = 0 10 | DesignLeft = 350 11 | DesignTop = 190 12 | object ComboBox1: TComboBox 13 | Left = 88 14 | Height = 30 15 | Top = 10 16 | Width = 176 17 | Anchors = [akTop, akLeft, akRight] 18 | ItemHeight = 16 19 | Style = csOwnerDrawFixed 20 | TabOrder = 0 21 | OnChange = ComboBox1Change 22 | OnDrawItem = ComboBox1DrawItem 23 | OnKeyDown = ComboBox1KeyDown 24 | end 25 | object Label4: TLabel 26 | Left = 9 27 | Height = 27 28 | Top = 10 29 | Width = 76 30 | Alignment = taRightJustify 31 | AutoSize = False 32 | Caption = 'Opponent' 33 | end 34 | object Label5: TLabel 35 | Left = 9 36 | Height = 25 37 | Top = 39 38 | Width = 76 39 | Alignment = taRightJustify 40 | AutoSize = False 41 | Caption = 'Count' 42 | end 43 | object Edit1: TEdit 44 | Left = 88 45 | Height = 26 46 | Hint = 'Total number of opponents to send out '#10'(devide by units per spawn to get the number of spawns)' 47 | Top = 39 48 | Width = 80 49 | NumbersOnly = True 50 | ParentShowHint = False 51 | ShowHint = True 52 | TabOrder = 1 53 | OnChange = Edit1Change 54 | OnEnter = OnEditEnter 55 | OnExit = OnEditExit 56 | end 57 | object Label6: TLabel 58 | Left = 9 59 | Height = 32 60 | Top = 64 61 | Width = 76 62 | Alignment = taRightJustify 63 | AutoSize = False 64 | Caption = 'Cash per'#13#10'Unit' 65 | end 66 | object Edit2: TEdit 67 | Left = 88 68 | Height = 26 69 | Top = 71 70 | Width = 80 71 | NumbersOnly = True 72 | TabOrder = 2 73 | OnChange = Edit2Change 74 | OnEnter = OnEditEnter 75 | OnExit = OnEditExit 76 | end 77 | object Label7: TLabel 78 | Left = 9 79 | Height = 32 80 | Top = 100 81 | Width = 76 82 | Alignment = taRightJustify 83 | AutoSize = False 84 | Caption = 'Units per'#10'spawn' 85 | end 86 | object Edit3: TEdit 87 | Left = 88 88 | Height = 26 89 | Top = 100 90 | Width = 80 91 | NumbersOnly = True 92 | ParentShowHint = False 93 | TabOrder = 3 94 | OnChange = Edit3Change 95 | OnEnter = OnEditEnter 96 | OnExit = OnEditExit 97 | end 98 | object Label8: TLabel 99 | Left = 9 100 | Height = 16 101 | Top = 168 102 | Width = 76 103 | Alignment = taRightJustify 104 | AutoSize = False 105 | Caption = 'Spawndelta' 106 | end 107 | object Edit4: TEdit 108 | Left = 88 109 | Height = 26 110 | Hint = 'Time in ms until the first spawn is send out' 111 | Top = 130 112 | Width = 80 113 | NumbersOnly = True 114 | ParentShowHint = False 115 | ShowHint = True 116 | TabOrder = 4 117 | OnChange = Edit4Change 118 | OnEnter = OnEditEnter 119 | OnExit = OnEditExit 120 | end 121 | object Label9: TLabel 122 | Left = 9 123 | Height = 16 124 | Top = 139 125 | Width = 76 126 | Alignment = taRightJustify 127 | AutoSize = False 128 | Caption = 'Spawndelay' 129 | end 130 | object Edit5: TEdit 131 | Left = 88 132 | Height = 26 133 | Hint = 'Time in ms between sending two spawns' 134 | Top = 160 135 | Width = 80 136 | NumbersOnly = True 137 | ParentShowHint = False 138 | ShowHint = True 139 | TabOrder = 5 140 | OnChange = Edit5Change 141 | OnEnter = OnEditEnter 142 | OnExit = OnEditExit 143 | end 144 | object Button1: TButton 145 | Left = 176 146 | Height = 25 147 | Top = 160 148 | Width = 80 149 | Caption = '&Refresh' 150 | TabOrder = 6 151 | Visible = False 152 | OnClick = Button1Click 153 | end 154 | object SpeedButton1: TSpeedButton 155 | Left = 176 156 | Height = 145 157 | Top = 39 158 | Width = 80 159 | Anchors = [akTop, akLeft, akRight, akBottom] 160 | OnClick = SpeedButton1Click 161 | end 162 | end 163 | -------------------------------------------------------------------------------- /documentation/FAQ.md: -------------------------------------------------------------------------------- 1 | # FAQ 2 | 3 | This file holds all questions and answers that came up in the past... 4 | 5 | Q: i updated the game with the launcher and now i get strange warnings when running the "check and save map" button. <br> 6 | A: The launcher does not delete any files during update, so this warnings can occur, if files have been renamed. Best way to get rid of this is by deleting the map and its copy in the "share" folder and then redownload it by the launcher. -------------------------------------------------------------------------------- /documentation/Readme.md: -------------------------------------------------------------------------------- 1 | # Manual 2 | This document acts as table of content and shall give you easy access to the different manuals, ordering is by "priority" (top first to bottom last) to read. 3 | 4 | ## For players 5 | 6 | | Manual | Description | 7 | | --- | --- | 8 | | [quickstart](quickstart.md) | introduction on how to start and play a map 9 | | [controls](controls.md) | list of keyboard and mouse commands 10 | | [in game](ingame.md) | explains in game elements 11 | 12 | ## For creators 13 | 14 | | Manual | Description | 15 | | --- | --- | 16 | | [mapguide](mapguide.md) | instructions how to create a new map with first wave from scratch 17 | | [waveguide](waveguide.md) | instructions how to create waves for a map 18 | | [buildingguide](buildingguide.md) | instructions how to create buildings 19 | | [opponentguide](opponentguide.md) | instructions how to create opponents 20 | | [heroguide](heroguide.md) | instructions how to create opponents 21 | | [validate map](validate_map.md) | instructions that show how to finetune waves and secure that the map is actually playable 22 | | [cleanup and check map](clean_and_check_map.md) | instructions to cleanup files of a map, ready to relase it 23 | 24 | ## For power users 25 | | Manual | Description | 26 | | --- | --- | 27 | | [cmd commands](cmd_commands.md) | list of availably console commands 28 | | [file folders](filefolders.md) | explains the content of each and every file in this repository 29 | -------------------------------------------------------------------------------- /documentation/buildingguide.md: -------------------------------------------------------------------------------- 1 | # Building guide 2 | 3 | This guide explains in detail how to create a new building 4 | 5 | Always a good start is to look at a existing building, that is already known. To do so 6 | 7 | 1. Open Building editor ![](images/OpenBuilding.png) 8 | (1) click editors 9 | (2) Buildings 10 | (3) select a global building (on the left side) 11 | (4) click edit (on the left side) 12 | (4.1) if you enter a new name and click Create you get the same screen with empty values to edit your newly created building 13 | 14 | 2. When openend you have the following settings to adjust ![](images/BuildingSettings.png) 15 | 16 | | Name | Description | 17 | | -- | -- | 18 | | (1) Name | Name that is shown in the info box during the game 19 | | (2) Size | Normalized size in grid (the image will be scaled to the given values), this is the size that will be blocked on the map after the building is placed (it can be smaler as the stage sizes) 20 | | (3) Image | Image / Animation used, supported are (.bmp, .png, .ani), this is the image only for the buy menu 21 | | (4) Category | This field is not used by the game in the moment 22 | | (5) Refund easy [%] | If you sell the building during the game, this is the factor which the invest will be multiplied with before being refunded 23 | | (6) Refund middle [%] | If you sell the building during the game, this is the factor which the invest will be multiplied with before being refunded 24 | | (7) Refund hard [%] | If you sell the building during the game, this is the factor which the invest will be multiplied with before being refunded 25 | | (8) Stagecount | defines the number of stages to which the building can be leveled up 26 | 27 | The following settings are per stage. In prinzipal a building can have as many stages as someone defines but need to have at least one stage (even if the building is used to maze and does not attack at all [see fence building]) 28 | 29 | | Name | Description | 30 | | -- | -- | 31 | | (9) Description | Optional further details 32 | | (10) Image | Image / Animation used, supported are (.bmp, .png, .ani), this is the image that is shown on the map during gameplay 33 | | (11) Cost | Prize you have to afford to buy the building (if stage 1) or to upgrade to this stage 34 | | (12) Buildtime [ms] | Time in milli seconds to level up, or build the building 35 | | (13) Bullet exitpoint | Coordinates of the bullet exit point in grid coordinates, relative from the buttom left corner of the image (you can set this by clicking onto the image, or by typing it in manually) 36 | | (14) Size | Size in Grid coordinates shown on the map, if this is grater than the size (2), than the image will grow towards the top and "hide" the maps content behind 37 | 38 | Each stage defines its own weapon settings 39 | | Name | Description | 40 | | -- | -- | 41 | | (15) Load from previous stage | This buttons loads all weapon settings from previous stage into the fields 42 | | (16) Range | This is the range in grid coordinates if range is > 0 then the building acutally "shoots" at the opponents. if range is < 0 the bullets will be "placed" on every reload time somewhere whithin this range on the floor 43 | | (17) Image | Image / Animation used, supported are (.bmp, .png, .ani), this is the image for the bullet that is beeing shoot at the opponents or layed onto the map 44 | | (18) Reload time [ms]| time in ms until the building is ready to shoot out the next weapon (if a opponent is in range) 45 | | (19) Earn | if > 0 then the owner earns money if the bullet hits the opponent even it the bullet does not destroy it 46 | | (20) Bulletspeed | speed in grid coords per second of the bullet 47 | | (21) Chain radius | if > 0 the bullet can hit multiple opponents if there is "damage" left after the actual hit. If a other opponent is within the chain radius the bullet will set this opponent as its new target 48 | | (22) Damage | Strength in the first power class 49 | | (23) Damage | Strength in the second power class 50 | | (24) Damage | Strength in the third power class 51 | | (25) Damage | Strength in the fourth power class 52 | | (26) Size | Size of the bullet in grid coordinates 53 | | (27) slowdown static | Multiplier to the speed of the opponent that applies permanently, different buildings can chain these multipliers to one opponent 54 | | (28) slowdown dynamic | Multiplier to the speed of the opponent that applies for a given time, different buildings can chain these multipliers to one opponent 55 | | (29) Time [ms] | time in milli seconds how long the slowdown dynamic value will be applied to the opponent 56 | 57 | 58 | -------------------------------------------------------------------------------- /documentation/clean_and_check_map.md: -------------------------------------------------------------------------------- 1 | # Clean and check map 2 | 3 | This guides help you cleaning up the map after you finished wave creation. 4 | 5 | In order to share the map with other players its higly recommended to clean up the map from all files that not needed anymore (This could decrease the map size by a lot). During the [waveguide](waveguide.md) all possible buildings / heros and opponents where added to the map, but are they really used ? 6 | 7 | 1. Removing unused opponents ![](images/demo_map_cleanup_opponents.png) 8 | (1) click check and save map 9 | (2) click yes, every unused opponent is now removed from them map. 10 | 11 | 2. Removing unused buildings / heros is not possible to be automated, so you need to remove all unused buildings / heros by hand ![](images/demo_map_remove_buildings.png) 12 | (1) open the Buyables tab 13 | (2) open the building editor 14 | (3) select the buildings you want to remove 15 | (4) remove the building and repeat step (3), (4) for each building that needs to be removed 16 | (5) close editor 17 | 18 | 3. Finally check, if you not deleted to much, by again hitting the "Check and save map" button ![](images/demo_map_check_result.png) 19 | 20 | If you see the message as shown above, you made it. Happy playing. -------------------------------------------------------------------------------- /documentation/cmd_commands.md: -------------------------------------------------------------------------------- 1 | 2 | # CMD Commands 3 | 4 | Typically you start all applications by double clicking on them. Experienced user may also use some additional startparameters. All startparameters are optional, the applications will also run without them. 5 | 6 | ### Client 7 | | Parameter | Description | 8 | | --- | :--- | 9 | | -f <filename> | enable logging to file 10 | | -l <number> | set loglegel to <number> (0..6) 11 | | -s <folder> | set share folder to <folder> 12 | | -m <folder> | set map folder 13 | | -c | enable logging to console [Windows version only] 14 | 15 | ### Server 16 | Normaly the server would be started from the client, that creates the host game. If you want to run a dedicated server you can start the server by hand using the following parameters 17 | 18 | | Parameter | Description | 19 | | --- | :--- | 20 | | -p <Port> | Spezifies the port number to listen to. 21 | | -pw <Password> | Spezifies the password default "" (= none) 22 | | -l <LogLevel> | Sets Loglevel (default = 2) [1 = show everything .. 7 = show only fatal errors] 23 | | -t <Timeout> | Sets automatic close on no user connected, default 3000 ms <br> 0 = Disabled, typing "ESC" in the servers console window will terminate 24 | | -f <Filename> | Logs additional to a file 25 | | -m <Foldername> | Folder to load the maps from (default ./maps) 26 | | -h | Help screen 27 | -------------------------------------------------------------------------------- /documentation/controls.md: -------------------------------------------------------------------------------- 1 | # Controls 2 | 3 | Gives a overview over the keyboard and mouse commands in Editor- and Gamemode. 4 | 5 | ## Keyboard commands 6 | 7 | ### Ingame 8 | | Key | Description | 9 | | --- | :--- | 10 | | ^ | Toggle show/hide side menu 11 | | p | Toggle pause 12 | | q | Select all buildings of same stage and owner and type (as the selected) 13 | | s | Sell selected buildings / stop movement of selected heros / move map down 14 | | h | Select all own heros 15 | | u | Upgrade selected buildings 16 | | w | Show player names on map, where opponents get spawned 17 | | b | Overlay which tiles are buildable or not 18 | | "+" | Increase simulation speed 19 | | "-" | Decrease simulation speed 20 | | ALT | Show lifepoints of all opponents 21 | | Return | Open Chat window 22 | | ESC | Deselect what ever actually is selected 23 | | 0..9 | Keyboard shortcuts for buildings/hero in the buy menu 24 | | F1..F8 | if a building/hero is selected, the corresponding building/hero strategy will be set (only on own ones) 25 | | cursors | Scroll map 26 | | e | Zoom map in 27 | | c | Zoom map out 28 | 29 | ### Editor 30 | | Key | Description | 31 | | --- | :--- | 32 | | ^ | Toggle show/hide side menu 33 | | cursors | Scroll map 34 | | e | Zoom map in 35 | | c | Zoom map out 36 | ## Mouse commands 37 | 38 | ### Ingame 39 | | Key | Description | 40 | | --- | :--- | 41 | | Left | Select building / Opponent / Placement, place building 42 | | Right | Remove selection 43 | | Left doubleclick | Select all buildings of same stage and owner and type on the visible screen 44 | | CTRL + Left | Display a "!" on the map that can be seen by all players 45 | | SHIFT + Left | Toggle selection of building / Place Building and keep buy selection 46 | | Move + (Middle/Right) | Scroll map 47 | | Wheel Up | Zoom map in 48 | | Wheel Down | Zoom map Out 49 | 50 | ### Editor 51 | | Key | Description | 52 | | --- | :--- | 53 | | Left | Modify terrain, add/del placements, add/del waypoint 54 | | CTRL + Left | Display a "!" on the map that can be seen by all players 55 | | Move + Right | Scroll map 56 | | Wheel Up | Zoom map in 57 | | Wheel Down | Zoom map Out 58 | 59 | ## Chat commands 60 | | Command | Description | 61 | | --- | :--- | 62 | | -air | list all waves that contain damageclass 4 opponents 63 | | -boss | list all waves that contain boss opponents 64 | | -bonus | list all waves that contain bonus opponents 65 | | -clear | clear log 66 | | -? | list all available commands 67 | | -p | show pint times between all players and server 68 | | -kick <playername> | tells the server to kick player <playername> out of the game (ATTENTION use with care!) 69 | -------------------------------------------------------------------------------- /documentation/filefolders.md: -------------------------------------------------------------------------------- 1 | # File / Folder descriptions 2 | 3 | This document explains the porpuse and reason of every file in this repository. 4 | 5 | ## Folder Descriptions 6 | 7 | | Folder | Description | 8 | | --- | --- | 9 | | [buildings](https://github.com/PascalCorpsman/ConfigTD_Data/tree/main/buildings) | All global accessable buildings are stored here (use ingame editor to access) 10 | | client | sourcecode folder of the client 11 | | documentation| Holds all documentations 12 | | [graphics](https://github.com/PascalCorpsman/ConfigTD_Data/tree/main/graphics) | Lots of sample graphics, if you want to create a map / opponent or building by yourself 13 | | heros | All global accessable heros are stored here (use ingame editor to access) 14 | | logs | Server stores its log files here (for debuging) 15 | | [maps](https://github.com/PascalCorpsman/ConfigTD_Data/tree/main/maps) | All maps that are created by the server 16 | | [opponents](https://github.com/PascalCorpsman/ConfigTD_Data/tree/main/opponents) | All global accessable opponents are stored here (use ingame editor to access) 17 | | savegames | Location where the server stores backups and savegames 18 | | server | sourcecode folder of the server 19 | | share | The client always "downloads" all maps and stores them into the share folder, if you played on a external server you can copy the maps from the share folder to your local maps folder to be able to single play them 20 | | [textures](https://github.com/PascalCorpsman/ConfigTD/tree/main/textures) | Textures needed by the program do not modify its content 21 | | units | sourcecode folder of shared units between server and client 22 | 23 | ## Application Descriptions 24 | 25 | | Application | Description | 26 | | --- | --- | 27 | | Animation_editor | This is the editor to create and modify .ani files it's source can be downloaded [here](https://github.com/PascalCorpsman/Examples/tree/master/OpenGL/Animation_Editor) 28 | | config_td | This is the client application and the actual game, start to play 29 | | ctd_server | This is the server application, it will be started through the game, when hosting a game or can be started manually (dedicated mode) 30 | | image_overview | If you want to browse over all graphics within the "graphics" folder use this program 31 | | opponent_overview | If you want to see / compare all global opponents whithin one screen use this program 32 | 33 | ## general file descriptions 34 | 35 | | Filename | Description | 36 | | --- | --- | 37 | | *.inc | Sourcecode files (configuration for libs) 38 | | *.lpi | Sourcecode file (Lazarus project file) 39 | | *.lpr | Sourcecode file (same as main.c) 40 | | *.dll | precompiled SSH library (for windows users needed) 41 | | *.lfm | Sourcecode file (Lazarus form module) 42 | | *.pas | Sourcecode file (Free Pascal source code) 43 | | *.md | Documentation / License / .. 44 | | [balancing.ods](https://github.com/PascalCorpsman/ConfigTD_Data/tree/main/balancing.ods) | Tabelular overview over all buildings / opponents settings 45 | | settings.ini | All by the game collected informations and settings 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /documentation/heroguide.md: -------------------------------------------------------------------------------- 1 | # Hero guide 2 | 3 | This guide explains in detail how to create a new hero. In short, a hero is a building that can move. Instead of leveling up by money the hero levels up by "hitpoints". 4 | 5 | 1. Open hero editor ![](images/OpenHeros.png) 6 | (1) click editors 7 | (2) Heros 8 | (3) select a global hero (on the left side) 9 | (4) click edit (on the left side) 10 | (4.1) if you enter a new name and click Create you get the same screen with empty values to edit your newly created hero 11 | 12 | 2. When openend you have the following settings to adjust ![](images/Hero_Settings.png) 13 | 14 | | Name | Description | 15 | | -- | -- | 16 | | (1) Name | Name that is shown in the info box during the game 17 | | (2) Image | Image / Animation used, supported are (.bmp, .png, .ani), this is the image only for the buy menu 18 | | (3) Size | Normalized size in grid (the image will be scaled to the given values), this is the size that will be blocked on the map after the building is placed (it can be smaler as the stage sizes) 19 | | (4) Const | initial cost to by the hero 20 | | (5) Buildtime | initial build time to build the hero 21 | | (6) Levels | Number of levels the hero can "grow" 22 | 23 | The following settings are per level. In prinzipal a hero can have as many levels as someone defines but need to have at least one level. 24 | 25 | | Name | Description | 26 | | -- | -- | 27 | | (7) Description | Optional further details for each level 28 | | (8) Image | Image per stage (use image shower to find good matchings (L1 ..L4)), supported are (.bmp, .png, .ani) 29 | | (9) Size | adjust size as needed 30 | | (10) Speed | in grids per second 31 | | (11) Hitpoints for next level | the minimum amount of hitpoints needed to level up (typically this value should increase exponentially from level to level) 32 | | (12) rotate image| rotate image (disabled if using a .ani file) 33 | | (13) stop animation when idle | if a .ani file is used, the animation can be stopped if hero is not moving 34 | | (14) Load from previous stage| This buttons loads all weapon settings from previous level into the fields 35 | | (15) Image | defines the weapons image, supported are (.bmp, .png, .ani) 36 | | (16) Range | This is the range in grid coordinates 37 | | (17) Reload time [ms] | time in ms until the building is ready to shoot out the next weapon (if a opponent is in range) 38 | | (18) bulletspeed | speed in grid coords per second of the bullet 39 | | (19) Damage | Strength in the first power class 40 | | (20) Damage | Strength in the second power class 41 | | (21) Damage | Strength in the third power class 42 | | (22) Damage | Strength in the fourth power class 43 | | (23) Size | Size of the bullet in grid coordinates 44 | -------------------------------------------------------------------------------- /documentation/images/BuildingSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/BuildingSettings.png -------------------------------------------------------------------------------- /documentation/images/Hero_Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/Hero_Settings.png -------------------------------------------------------------------------------- /documentation/images/OpenBuilding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/OpenBuilding.png -------------------------------------------------------------------------------- /documentation/images/OpenHeros.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/OpenHeros.png -------------------------------------------------------------------------------- /documentation/images/OpenOpponent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/OpenOpponent.png -------------------------------------------------------------------------------- /documentation/images/OpponentSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/OpponentSettings.png -------------------------------------------------------------------------------- /documentation/images/ctd_launcher_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/ctd_launcher_preview.png -------------------------------------------------------------------------------- /documentation/images/demo_map_add_buildings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_add_buildings.png -------------------------------------------------------------------------------- /documentation/images/demo_map_add_opponents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_add_opponents.png -------------------------------------------------------------------------------- /documentation/images/demo_map_check_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_check_result.png -------------------------------------------------------------------------------- /documentation/images/demo_map_cleanup_opponents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_cleanup_opponents.png -------------------------------------------------------------------------------- /documentation/images/demo_map_continue_gaming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_continue_gaming.png -------------------------------------------------------------------------------- /documentation/images/demo_map_create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_create.png -------------------------------------------------------------------------------- /documentation/images/demo_map_first_testrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_first_testrun.png -------------------------------------------------------------------------------- /documentation/images/demo_map_first_wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_first_wave.png -------------------------------------------------------------------------------- /documentation/images/demo_map_general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_general.png -------------------------------------------------------------------------------- /documentation/images/demo_map_general2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_general2.png -------------------------------------------------------------------------------- /documentation/images/demo_map_mapguide_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_mapguide_result.png -------------------------------------------------------------------------------- /documentation/images/demo_map_remove_buildings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_remove_buildings.png -------------------------------------------------------------------------------- /documentation/images/demo_map_restart_last_wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_restart_last_wave.png -------------------------------------------------------------------------------- /documentation/images/demo_map_save_and_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_save_and_check.png -------------------------------------------------------------------------------- /documentation/images/demo_map_set_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_set_background.png -------------------------------------------------------------------------------- /documentation/images/demo_map_set_building_waves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_set_building_waves.png -------------------------------------------------------------------------------- /documentation/images/demo_map_terrain1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_terrain1.png -------------------------------------------------------------------------------- /documentation/images/demo_map_terrain2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_terrain2.png -------------------------------------------------------------------------------- /documentation/images/demo_map_texture_editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_texture_editor.png -------------------------------------------------------------------------------- /documentation/images/demo_map_wave_by_ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_wave_by_ai.png -------------------------------------------------------------------------------- /documentation/images/demo_map_waypoint_editing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/demo_map_waypoint_editing.png -------------------------------------------------------------------------------- /documentation/images/folder_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/folder_preview.png -------------------------------------------------------------------------------- /documentation/images/game_started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/game_started.png -------------------------------------------------------------------------------- /documentation/images/host_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/host_game.png -------------------------------------------------------------------------------- /documentation/images/in_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/in_game.png -------------------------------------------------------------------------------- /documentation/images/preview_classic_pixelart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/preview_classic_pixelart.png -------------------------------------------------------------------------------- /documentation/images/preview_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/preview_color.png -------------------------------------------------------------------------------- /documentation/images/preview_comic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/preview_comic.png -------------------------------------------------------------------------------- /documentation/images/preview_minitd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/preview_minitd.png -------------------------------------------------------------------------------- /documentation/images/select_G1_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/select_G1_map.png -------------------------------------------------------------------------------- /documentation/images/select_difficulty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/select_difficulty.png -------------------------------------------------------------------------------- /documentation/images/select_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/documentation/images/select_map.png -------------------------------------------------------------------------------- /documentation/ingame.md: -------------------------------------------------------------------------------- 1 | # In game 2 | 3 | This guide tries to give you a overview of the different in game elements 4 | 5 | General element description: 6 | ![](images/in_game.png) 7 | 8 | ## Buildings strategy buttons 9 | | Image | Description | Shortcut 10 | | --- | :--- | :---: 11 | | ![](../textures/first.png) | Attack first opponent first | F1 12 | | ![](../textures/last.png) | Attack last opponent first | F2 13 | | ![](../textures/mindistance.png) | Attack nearest opponent first | F3 14 | | ![](../textures/maxdistance.png) | Attack farest opponent first | F4 15 | | ![](../textures/strongest.png) | Attack strongest opponent first | F5 16 | | ![](../textures/weakest.png) | Attack weakest opponent first | F6 17 | | ![](../textures/random.png) | Attack Random opponent | F7 18 | | ![](../textures/prefer_air.png) | prefer air units over floor units | 19 | | ![](../textures/prefer_airs.png) | prefer floor units over air units | -------------------------------------------------------------------------------- /documentation/opponentguide.md: -------------------------------------------------------------------------------- 1 | # Opponent guide 2 | 3 | This guide explains in detail how to create a new opponent. 4 | 5 | First take a look at a existing opponent, this can be done by: 6 | 7 | 1. Open Opponent editor ![](images/OpenOpponent.png) 8 | (1) click editors 9 | (2) Opponents 10 | (3) select a global opponent (on the left side) 11 | (4) click edit (on the left side) 12 | (4.1) if you enter a new name and click Create you get the same screen with empty values to edit your newly created opponent 13 | 14 | 2. When opened you have the following settings to adjust 15 | ![](images/OpponentSettings.png) 16 | 17 | | Name | Description | 18 | | -- | -- | 19 | | (1) Name | Name that is shown in the info box during the game 20 | | (2) Description | Optional further details 21 | | (3) Speed | Normalized speed in grid per second 22 | | (4) Size | Normalized size in grid (the image will be scaled to the given values) 23 | | (5) Image | Image / Animation used, supported are (.bmp, .png, .ani) 24 | | (6) Power | Strength in the first power class 25 | | (7) Power | Strength in the second power class 26 | | (8) Power | Strength in the third power class 27 | | (9) Power | Strength in the fourth power class 28 | | (10) rotate image | if source is .bmp or .png image rotation can be enabled or disabled 29 | | (11) powerfactor easy | all power class values will be multiplied with this value if game is running in easy mode 30 | | (12) powerfactor medium | all power class values will be multiplied with this value if game is running in medium mode 31 | | (13) powerfactor hard | all power class values will be multiplied with this value if game is running in hard mode 32 | | (14) can fly | if set, the unit moves straight from waypoint to waypoint (does not care about mazing) 33 | | (15) is boss | this is a label, and can be quereed by the chat, does not influence any game dynamics 34 | | (16) is bonus | if unit reached the last waypoint the player will not loose a lifepoint 35 | -------------------------------------------------------------------------------- /documentation/quickstart.md: -------------------------------------------------------------------------------- 1 | # Quickstart 2 | 3 | In this guide you get all information needed to start and host a game and play the first wave. 4 | 5 | 1. Start the "config_td" client supposed for your operating system (Linux 64 or Win64 are supported by default, for other OS you need to compile the source by yourself) (On Linux it could be needed to chmod client and ctd_server application with x flag to be able to execute). ![](images/game_started.png) 6 | 2. Click "Host Game" if you are the first player and do not use a dedicated server, otherwise click "Join Game" ![](images/host_game.png) 7 | 3. Fill in your Player name and click on "Create" ![](images/select_map.png) 8 | 4. Select "Load Map" ![](images/select_G1_map.png) 9 | 5. Select the G1 map (side note: every map thats description is "not empty" is playable, all the other maps are in "development" state) and hit "Play" (Attention, if you want to play with multiple players, only hit load and wait until all players connected to the game) ![](images/select_difficulty.png) 10 | 6. Select the difficulty you want to play the map. ![](images/in_game.png) 11 | 7. Hit "P" to pause the game and take a look what the map offers you and how to play. The "G1" map is a defeating map, so you do not need to maze here, place all the buildings you buy onto the blue area and enjoy the game. Can you defeat all 12 waves in hard mode ? -------------------------------------------------------------------------------- /documentation/validate_map.md: -------------------------------------------------------------------------------- 1 | # Validate map 2 | 3 | This guide shows how to validate a map wave by wave and proof that it is playable (balanced right). 4 | 5 | First you need to define waves (see [waveguide](waveguide.md) on how to do that). 6 | 7 | 1. check if the map contains any errors ![](images/demo_map_save_and_check.png) 8 | (1) switch to "General" tab 9 | (2) hit the "Check and save map" button 10 | (3) if you just did the waveguide with its first wave, then you see a result like in the picture above. To play and test the map you can ignore warnings, only errors you need to take care of. 11 | 12 | 2. In this case everything is fine we can continue by actually playing the wave. 13 | 14 | Wait until all players who also want to test are connected, then 15 | 16 | * If you start from scratch and want to start testing with the First wave ![](images/demo_map_first_testrun.png) 17 | (1) Switch to "General" tab if not there already and hit "Start / Restart game" 18 | (2) Select the difficulty for which you want to test. Its absolutly recommended to test / validate and play the map on "Normal" or "Hard" settings. If you validate the map using "Easy" the map could be to hard to play for other players. 19 | * If you won the last wave, have defined a new wave and now want to test the next defined wave ![](images/demo_map_continue_gaming.png) 20 | (1), (2) hit "Game" -> "Continue game" and the game proceeds like the new wave was always there 21 | * If you lost the wave, adjust the wave settings to what ever you think would make the wave winable (see [waveguide](waveguide.md)) ![](images/demo_map_restart_last_wave.png) 22 | (1), (2) hit "Game" -> "Restart last wave" and restart the last played wave (the game will automatically restore the game progress like it was before playing the last wave) 23 | 24 | Thats it, happy wave defining. <br> 25 | Remember, if you are finished with wave adding, do the [clean and check](clean_and_check_map.md) guide. 26 | -------------------------------------------------------------------------------- /documentation/waveguide.md: -------------------------------------------------------------------------------- 1 | # Waveguide 2 | 3 | This instructions show how to populate the map with buyable buildings, and waves to play. 4 | 5 | To be able to actually play the map you need to meet 2 conditions: 6 | 7 | * have buildings that can be bought 8 | * define waves that send out creeps 9 | 10 | ## Defining buyable buildings 11 | 12 | 1. You need to add buildings to the map ![](images/demo_map_add_buildings.png) 13 | (1), (2) open the building editor 14 | (3) on the left side are the "global" accessable buildings on the right side the buildings on the map. Select all global buildings 15 | (4) add them to the map and 16 | (5) close the editor 17 | 2. Next we define the waves up when the buildings should be buyable. <br> 18 | The idea is as follows: first introduce each new wave one building per damage class, as last (wave 5) enable all buildings needed for mazing.<br>![](images/demo_map_set_building_waves.png) 19 | (1) switch to "Buyables" 20 | (2) select a building 21 | (3) define the minimum wave (seting "upper limit of towers" to 0 removes the limit, otherwise it is only allowed to buy the given amount of towers, this can be usefull with e.g. "Banks" or "Heros") 22 | (4) set the values and repeat until all buildings are set like in the image above 23 | 24 | Defining the minimum wave for a building to by has two effects: 25 | * by reducing the buildings to buy the player knows better which building to buy (at least at the very first waves this makes sense) 26 | * the ai wave generation algorithm takes also care of these values, which improves the quality of generated waves 27 | 28 | ## Defining a wave that send creeps 29 | 30 | 1. add all creeps to the map ![](images/demo_map_add_opponents.png) 31 | (1), (2) open the opponent editor 32 | (3) select all color sheme opponents and 33 | (4) add them to the map 34 | (5) close the editor 35 | 36 | There are 2 way's of defining a new wave: 37 | * Manually 38 | * by using the "+AI Wave" button 39 | 40 | 2. define a new wave (by hand) <br>![](images/demo_map_first_wave.png) 41 | (1) switch to "Waves" tab 42 | (2) click "Add" to manually add a new wave to the map 43 | (3) as this is the very first wave give the player some money to buy towes 44 | (4) select a opponent (see [balancing](../balancing.ods) table or opponent overview for opponent properties) 45 | (5) increase the amount of money per opponent kill by a bit 46 | (6) set spawndelay to 6s this gives the player enough time to place his first buildings before the map is populated with opponents 47 | 48 | 3. define a new wave (using the "+AI Wave" button) ![](images/demo_map_wave_by_ai.png) 49 | (1) switch to "Waves" tab 50 | (2) click "+AI Waves" button 51 | (3) select the difficulty level you are aiming for 52 | (4) check results and tweak them if needed 53 | 54 | Thats it, you now have set everything to actually play the map. Continue with the [validate map](validate_map.md) guide to see how you can play and validate the map during wave generation. 55 | 56 | Finally do the [check and clean map](clean_and_check_map.md) guide to cleanup your map when finished. -------------------------------------------------------------------------------- /help/General.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html> 3 | <body> 4 | 5 | <h1>Online Manual for Config TD</h1> 6 | <p></p> 7 | 8 | </body> 9 | </html> 10 | -------------------------------------------------------------------------------- /help/Keyboard_Shortcuts.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html> 3 | <body> 4 | 5 | <h1>Keyboard shortcuts</h1> 6 | 7 | <h2>In game</h2> 8 | <table> 9 | <tr> 10 | <td>Key</td> 11 | <td>Description</td> 12 | </tr> 13 | <tr> 14 | <td>^</td> 15 | <td>Toggle show/hide side menu</td> 16 | </tr> 17 | <tr> 18 | <td>p</td> 19 | <td>Toggle pause</td> 20 | </tr> 21 | <tr> 22 | <td>q</td> 23 | <td>Select all buildings of same stage and owner and type (as the selected)</td> 24 | </tr> 25 | <tr> 26 | <td>s</td> 27 | <td>Sell selected buildings / stop movement of selected heros / move map down</td> 28 | </tr> 29 | <tr> 30 | <td>h</td> 31 | <td>Select all own heros</td> 32 | </tr> 33 | <tr> 34 | <td>u</td> 35 | <td>Upgrade selected buildings</td> 36 | </tr> 37 | <tr> 38 | <td>w</td> 39 | <td>Show player names on map, where opponents get spawned</td> 40 | </tr> 41 | <tr> 42 | <td>+</td> 43 | <td>Increase simulation speed</td> 44 | </tr> 45 | <tr> 46 | <td>-</td> 47 | <td>Decrease simulation speed</td> 48 | </tr> 49 | <tr> 50 | <td>p</td> 51 | <td>Toggle pause</td> 52 | </tr> 53 | <tr> 54 | <td>ALT</td> 55 | <td>Show lifepoints of all opponents</td> 56 | </tr> 57 | <tr> 58 | <td>RETURN</td> 59 | <td>Open Chat window</td> 60 | </tr> 61 | <tr> 62 | <td>ESC</td> 63 | <td>Deselect what ever actually is selected</td> 64 | </tr> 65 | <tr> 66 | <td>0 .. 9</td> 67 | <td>Keyboard shortcuts for buildings/hero in the buy menu</td> 68 | </tr> 69 | <tr> 70 | <td>F1 .. F8</td> 71 | <td>if a building/hero is selected, the corresponding building/hero strategy will be set (only on own ones)</td> 72 | </tr> 73 | <tr> 74 | <td>cursors</td> 75 | <td>Scroll map</td> 76 | </tr> 77 | <tr> 78 | <td>e</td> 79 | <td>Zoom map in</td> 80 | </tr> 81 | <tr> 82 | <td>c</td> 83 | <td>Zoom map out</td> 84 | </tr> 85 | </table> 86 | 87 | <h2>Editor</h2> 88 | <table> 89 | <tr> 90 | <td>Key</td> 91 | <td>Description</td> 92 | </tr> 93 | <tr> 94 | <td>^</td> 95 | <td>Toggle show/hide side menu</td> 96 | </tr> 97 | <tr> 98 | <td>cursors</td> 99 | <td>Scroll map</td> 100 | </tr> 101 | <tr> 102 | <td>e</td> 103 | <td>Zoom map in</td> 104 | </tr> 105 | <tr> 106 | <td>c</td> 107 | <td>Zoom map out</td> 108 | </tr> 109 | </table> 110 | 111 | <h2>Chat</h2> 112 | <table> 113 | <tr> 114 | <td>Key / Text</td> 115 | <td>Description</td> 116 | </tr> 117 | <tr> 118 | <td>UP</td> 119 | <td>repeat last chat message</td> 120 | </tr> 121 | <tr> 122 | <td>-clear</td> 123 | <td>clear chats</td> 124 | </tr> 125 | <tr> 126 | <td>-air</td> 127 | <td>list all waves containing damageclass 4 opponents</td> 128 | </tr> 129 | <tr> 130 | <td>-boss</td> 131 | <td>list all waves containing boss opponents</td> 132 | </tr> 133 | <tr> 134 | <td>-bonus</td> 135 | <td>list all waves containing bonus opponents</td> 136 | </tr> 137 | <tr> 138 | <td>-p</td> 139 | <td>lists ping times to all participants</td> 140 | </tr> 141 | <tr> 142 | <td>-kick <playername></td> 143 | <td>tells the server to kick player <playername> out of the game</td> 144 | </tr> 145 | <tr> 146 | <td>-?</td> 147 | <td>in chat help screen</td> 148 | </tr> 149 | </table> 150 | 151 | </body> 152 | </html> 153 | -------------------------------------------------------------------------------- /help/index.txt: -------------------------------------------------------------------------------- 1 | # 2 | # The File is organized as following: 3 | # 4 | # # lines will be ignored 5 | # 6 | # <Parent Node>-><NodeName> 7 | # 8 | # When clicking the online help the <NodeName>.html will be loaded an shown 9 | # 10 | ->General 11 | General->Keyboard_Shortcuts 12 | -------------------------------------------------------------------------------- /launcher/ctd_launcher.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/launcher/ctd_launcher.ico -------------------------------------------------------------------------------- /launcher/ctd_launcher.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="12"/> 5 | <PathDelim Value="\"/> 6 | <General> 7 | <SessionStorage Value="InProjectDir"/> 8 | <Title Value="ctd_launcher"/> 9 | <Scaled Value="True"/> 10 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <XPManifest> 13 | <DpiAware Value="True"/> 14 | </XPManifest> 15 | <Icon Value="0"/> 16 | </General> 17 | <BuildModes> 18 | <Item Name="Default" Default="True"/> 19 | </BuildModes> 20 | <PublishOptions> 21 | <Version Value="2"/> 22 | <UseFileFilters Value="True"/> 23 | </PublishOptions> 24 | <RunParams> 25 | <FormatVersion Value="2"/> 26 | </RunParams> 27 | <RequiredPackages> 28 | <Item> 29 | <PackageName Value="LCL"/> 30 | </Item> 31 | </RequiredPackages> 32 | <Units> 33 | <Unit> 34 | <Filename Value="ctd_launcher.lpr"/> 35 | <IsPartOfProject Value="True"/> 36 | </Unit> 37 | <Unit> 38 | <Filename Value="unit1.pas"/> 39 | <IsPartOfProject Value="True"/> 40 | <ComponentName Value="Form1"/> 41 | <HasResources Value="True"/> 42 | <ResourceBaseClass Value="Form"/> 43 | <UnitName Value="Unit1"/> 44 | </Unit> 45 | <Unit> 46 | <Filename Value="unit2.pas"/> 47 | <IsPartOfProject Value="True"/> 48 | <ComponentName Value="Form2"/> 49 | <HasResources Value="True"/> 50 | <ResourceBaseClass Value="Form"/> 51 | <UnitName Value="Unit2"/> 52 | </Unit> 53 | <Unit> 54 | <Filename Value="..\..\Sample\DatenSteuerung\uJSON.pas"/> 55 | <IsPartOfProject Value="True"/> 56 | </Unit> 57 | <Unit> 58 | <Filename Value="ulauncher.pas"/> 59 | <IsPartOfProject Value="True"/> 60 | </Unit> 61 | <Unit> 62 | <Filename Value="unit3.pas"/> 63 | <IsPartOfProject Value="True"/> 64 | <ComponentName Value="Form3"/> 65 | <HasResources Value="True"/> 66 | <ResourceBaseClass Value="Form"/> 67 | <UnitName Value="Unit3"/> 68 | </Unit> 69 | <Unit> 70 | <Filename Value="..\..\Sample\DatenSteuerung\uncommenter.pas"/> 71 | <IsPartOfProject Value="True"/> 72 | </Unit> 73 | <Unit> 74 | <Filename Value="..\..\Sample\TCP_IP\usynapsedownloader.pas"/> 75 | <IsPartOfProject Value="True"/> 76 | </Unit> 77 | <Unit> 78 | <Filename Value="unit4.pas"/> 79 | <IsPartOfProject Value="True"/> 80 | <ComponentName Value="Form4"/> 81 | <HasResources Value="True"/> 82 | <ResourceBaseClass Value="Form"/> 83 | <UnitName Value="Unit4"/> 84 | </Unit> 85 | <Unit> 86 | <Filename Value="unit5.pas"/> 87 | <IsPartOfProject Value="True"/> 88 | <ComponentName Value="Form5"/> 89 | <ResourceBaseClass Value="Form"/> 90 | <UnitName Value="Unit5"/> 91 | </Unit> 92 | </Units> 93 | </ProjectOptions> 94 | <CompilerOptions> 95 | <Version Value="11"/> 96 | <PathDelim Value="\"/> 97 | <Target> 98 | <Filename Value="..\ctd_launcher"/> 99 | </Target> 100 | <SearchPaths> 101 | <IncludeFiles Value="$(ProjOutDir)"/> 102 | <OtherUnitFiles Value="..\..\Sample\synapse;..\..\Sample\DatenSteuerung;..\units;..\..\Sample\TCP_IP"/> 103 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 104 | </SearchPaths> 105 | <Linking> 106 | <Debugging> 107 | <DebugInfoType Value="dsDwarf3"/> 108 | </Debugging> 109 | <Options> 110 | <Win32> 111 | <GraphicApplication Value="True"/> 112 | </Win32> 113 | </Options> 114 | </Linking> 115 | </CompilerOptions> 116 | <Debugging> 117 | <Exceptions> 118 | <Item> 119 | <Name Value="EAbort"/> 120 | </Item> 121 | <Item> 122 | <Name Value="ECodetoolError"/> 123 | </Item> 124 | <Item> 125 | <Name Value="EFOpenError"/> 126 | </Item> 127 | </Exceptions> 128 | </Debugging> 129 | </CONFIG> 130 | -------------------------------------------------------------------------------- /launcher/ctd_launcher.lpr: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of ctd_launcher *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Program ctd_launcher; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Uses 20 | {$IFDEF UNIX} 21 | cthreads, 22 | {$ENDIF} 23 | {$IFDEF HASAMIGA} 24 | athreads, 25 | {$ENDIF} 26 | Interfaces, // this includes the LCL widgetset 27 | Forms, unit1, unit2, uJSON, uncommenter, usynapsedownloader, ulauncher, unit3, 28 | Unit4, unit5; 29 | 30 | {$R *.res} 31 | 32 | Begin 33 | RequireDerivedFormResource := True; 34 | Application.Scaled:=True; 35 | Application.Initialize; 36 | Application.CreateForm(TForm1, Form1); 37 | Application.CreateForm(TForm2, Form2); 38 | Application.CreateForm(TForm3, Form3); 39 | Application.CreateForm(TForm4, Form4); 40 | Application.CreateForm(TForm5, Form5); 41 | Application.Run; 42 | End. 43 | 44 | -------------------------------------------------------------------------------- /launcher/ctd_updater/ctd_updater.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="12"/> 5 | <PathDelim Value="\"/> 6 | <General> 7 | <SessionStorage Value="InProjectDir"/> 8 | <Title Value="ctd_updater"/> 9 | <Scaled Value="True"/> 10 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <XPManifest> 13 | <DpiAware Value="True"/> 14 | </XPManifest> 15 | </General> 16 | <BuildModes> 17 | <Item Name="Default" Default="True"/> 18 | </BuildModes> 19 | <PublishOptions> 20 | <Version Value="2"/> 21 | <UseFileFilters Value="True"/> 22 | </PublishOptions> 23 | <RunParams> 24 | <FormatVersion Value="2"/> 25 | </RunParams> 26 | <RequiredPackages> 27 | <Item> 28 | <PackageName Value="LCL"/> 29 | </Item> 30 | </RequiredPackages> 31 | <Units> 32 | <Unit> 33 | <Filename Value="ctd_updater.lpr"/> 34 | <IsPartOfProject Value="True"/> 35 | </Unit> 36 | <Unit> 37 | <Filename Value="unit1.pas"/> 38 | <IsPartOfProject Value="True"/> 39 | <ComponentName Value="Form1"/> 40 | <HasResources Value="True"/> 41 | <ResourceBaseClass Value="Form"/> 42 | <UnitName Value="Unit1"/> 43 | </Unit> 44 | </Units> 45 | </ProjectOptions> 46 | <CompilerOptions> 47 | <Version Value="11"/> 48 | <PathDelim Value="\"/> 49 | <Target> 50 | <Filename Value="..\..\ctd_updater"/> 51 | </Target> 52 | <SearchPaths> 53 | <IncludeFiles Value="$(ProjOutDir)"/> 54 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 55 | </SearchPaths> 56 | <Linking> 57 | <Debugging> 58 | <DebugInfoType Value="dsDwarf3"/> 59 | </Debugging> 60 | <Options> 61 | <Win32> 62 | <GraphicApplication Value="True"/> 63 | </Win32> 64 | </Options> 65 | </Linking> 66 | </CompilerOptions> 67 | <Debugging> 68 | <Exceptions> 69 | <Item> 70 | <Name Value="EAbort"/> 71 | </Item> 72 | <Item> 73 | <Name Value="ECodetoolError"/> 74 | </Item> 75 | <Item> 76 | <Name Value="EFOpenError"/> 77 | </Item> 78 | </Exceptions> 79 | </Debugging> 80 | </CONFIG> 81 | -------------------------------------------------------------------------------- /launcher/ctd_updater/ctd_updater.lpr: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of ctd_updater *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Program ctd_updater; 16 | 17 | {$MODE objfpc}{$H+} 18 | 19 | Uses 20 | {$IFDEF UNIX} 21 | cthreads, 22 | {$ENDIF} 23 | {$IFDEF HASAMIGA} 24 | athreads, 25 | {$ENDIF} 26 | Interfaces, // this includes the LCL widgetset 27 | Forms, unit1 28 | { you can add units after this }; 29 | 30 | {$R *.res} 31 | 32 | Begin 33 | RequireDerivedFormResource := True; 34 | Application.Scaled := True; 35 | Application.Initialize; 36 | Application.CreateForm(TForm1, Form1); 37 | Application.Run; 38 | End. 39 | 40 | -------------------------------------------------------------------------------- /launcher/ctd_updater/unit1.lfm: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 333 3 | Height = 99 4 | Top = 115 5 | Width = 273 6 | Caption = 'Form1' 7 | LCLVersion = '3.99.0.0' 8 | OnCreate = FormCreate 9 | OnShow = FormShow 10 | object Timer1: TTimer 11 | Enabled = False 12 | Interval = 100 13 | OnTimer = Timer1Timer 14 | Left = 46 15 | Top = 20 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /launcher/ctd_updater/unit1.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* ctd_updater 16.05.2024 *) 3 | (* *) 4 | (* Version : 0.01 *) 5 | (* *) 6 | (* Author : Uwe Schächterle (Corpsman) *) 7 | (* *) 8 | (* Support : www.Corpsman.de *) 9 | (* *) 10 | (* Description : ctd_updater to update the ctd_launcher app *) 11 | (* *) 12 | (* License : See the file license.md, located under: *) 13 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 14 | (* for details about the license. *) 15 | (* *) 16 | (* It is not allowed to change or remove this text from any *) 17 | (* source file of the project. *) 18 | (* *) 19 | (* Warranty : There is no warranty, neither in correctness of the *) 20 | (* implementation, nor anything other that could happen *) 21 | (* or go wrong, use at your own risk. *) 22 | (* *) 23 | (* Known Issues: none *) 24 | (* *) 25 | (* History : 0.01 - Initial version *) 26 | (* *) 27 | (******************************************************************************) 28 | Unit Unit1; 29 | 30 | {$MODE objfpc}{$H+} 31 | 32 | Interface 33 | 34 | Uses 35 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls; 36 | 37 | Type 38 | 39 | { TForm1 } 40 | 41 | TForm1 = Class(TForm) 42 | Timer1: TTimer; 43 | Procedure FormCreate(Sender: TObject); 44 | Procedure FormShow(Sender: TObject); 45 | Procedure Timer1Timer(Sender: TObject); 46 | private 47 | 48 | public 49 | 50 | End; 51 | 52 | Var 53 | Form1: TForm1; 54 | 55 | Implementation 56 | 57 | {$R *.lfm} 58 | 59 | Uses FileUtil, process, UTF8Process; 60 | 61 | { TForm1 } 62 | 63 | Procedure TForm1.FormCreate(Sender: TObject); 64 | Begin 65 | caption := 'CTD_updater ver. 0.01'; 66 | End; 67 | 68 | Procedure TForm1.FormShow(Sender: TObject); 69 | Var 70 | fileToCopyAndStart, target: String; 71 | aTime: QWord; 72 | p: TProcessUTF8; 73 | Begin 74 | If ParamCount >= 1 Then Begin 75 | fileToCopyAndStart := ParamStr(1); 76 | End 77 | Else Begin 78 | showmessage('Error, invalid parameters, terminate now.'); 79 | halt; 80 | End; 81 | If Not FileExists(fileToCopyAndStart) Then Begin 82 | showmessage('Error, could not find:' + fileToCopyAndStart); 83 | halt; 84 | End; 85 | target := ExtractFileName(fileToCopyAndStart); 86 | SetCurrentDir(ExtractFilePath(ParamStr(0))); 87 | // Wir Versuchen die Ziel Datei zu löschen 88 | aTime := GetTickCount64; 89 | While FileExists(target) And (aTime + 10000 > GetTickCount64) Do Begin 90 | sleep(100); 91 | DeleteFile(target); 92 | End; 93 | If FileExists(target) Then Begin 94 | Showmessage('Error, could not delete: ' + target); 95 | halt; 96 | End; 97 | If Not CopyFile(fileToCopyAndStart, target) Then Begin 98 | Showmessage('Error, could not copy: ' + fileToCopyAndStart + ' -> ' + target); 99 | halt; 100 | End; 101 | {$IFDEF LINUX} 102 | p := TProcessUTF8.Create(Nil); 103 | p.Options := [poWaitOnExit]; 104 | p.CurrentDirectory := GetCurrentDir; 105 | p.Executable := 'chmod'; 106 | p.Parameters.Add('+x'); 107 | p.Parameters.Add(target); 108 | p.Execute; 109 | p.free; 110 | {$ENDIF} 111 | p := TProcessUTF8.Create(Nil); 112 | p.Executable := target; 113 | p.Execute; 114 | p.free; 115 | timer1.Enabled := true; 116 | End; 117 | 118 | Procedure TForm1.Timer1Timer(Sender: TObject); 119 | Begin 120 | close; 121 | End; 122 | 123 | End. 124 | 125 | -------------------------------------------------------------------------------- /launcher/launcher.rc: -------------------------------------------------------------------------------- 1 | // Kommentar, Pfade werden Relativ zur .pas Datei angegeben 2 | SSL_DLL RCDATA "ssleay32.dll" 3 | -------------------------------------------------------------------------------- /launcher/unit2.lfm: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 718 3 | Height = 240 4 | Top = 108 5 | Width = 320 6 | Caption = 'Form2' 7 | ClientHeight = 240 8 | ClientWidth = 320 9 | LCLVersion = '3.99.0.0' 10 | OnCreate = FormCreate 11 | object Memo1: TMemo 12 | Left = 0 13 | Height = 240 14 | Top = 0 15 | Width = 320 16 | Align = alClient 17 | Lines.Strings = ( 18 | 'Memo1' 19 | ) 20 | ReadOnly = True 21 | ScrollBars = ssAutoBoth 22 | TabOrder = 0 23 | WordWrap = False 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /launcher/unit2.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of ctd_launcher *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit Unit2; 16 | 17 | {$MODE ObjFPC}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; 23 | 24 | Type 25 | 26 | { TForm2 } 27 | 28 | TForm2 = Class(TForm) 29 | Memo1: TMemo; 30 | Procedure FormCreate(Sender: TObject); 31 | private 32 | 33 | public 34 | 35 | End; 36 | 37 | Var 38 | Form2: TForm2; 39 | 40 | Implementation 41 | 42 | {$R *.lfm} 43 | 44 | { TForm2 } 45 | 46 | Procedure TForm2.FormCreate(Sender: TObject); 47 | Begin 48 | caption := 'Log'; 49 | End; 50 | 51 | End. 52 | 53 | -------------------------------------------------------------------------------- /launcher/unit3.lfm: -------------------------------------------------------------------------------- 1 | object Form3: TForm3 2 | Left = 348 3 | Height = 617 4 | Top = 114 5 | Width = 773 6 | Caption = 'Form3' 7 | ClientHeight = 617 8 | ClientWidth = 773 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnCreate = FormCreate 12 | object Memo1: TMemo 13 | Left = 8 14 | Height = 98 15 | Top = 24 16 | Width = 756 17 | Anchors = [akTop, akLeft, akRight] 18 | Lines.Strings = ( 19 | 'Memo1' 20 | ) 21 | ReadOnly = True 22 | ScrollBars = ssAutoBoth 23 | TabOrder = 0 24 | WordWrap = False 25 | end 26 | object CheckBox1: TCheckBox 27 | Left = 8 28 | Height = 22 29 | Top = 128 30 | Width = 124 31 | Caption = 'Update launcher' 32 | TabOrder = 1 33 | OnChange = CheckListBox1Click 34 | end 35 | object Label1: TLabel 36 | Left = 8 37 | Height = 16 38 | Top = 160 39 | Width = 175 40 | Caption = 'Files that should be updated:' 41 | end 42 | object CheckListBox1: TCheckListBox 43 | Left = 8 44 | Height = 134 45 | Top = 176 46 | Width = 756 47 | Anchors = [akTop, akLeft, akRight, akBottom] 48 | ItemHeight = 0 49 | TabOrder = 2 50 | TopIndex = -1 51 | OnClick = CheckListBox1Click 52 | end 53 | object Label2: TLabel 54 | Left = 8 55 | Height = 16 56 | Top = 343 57 | Width = 244 58 | Anchors = [akLeft, akBottom] 59 | Caption = 'Additional files that can be downloaded:' 60 | end 61 | object CheckListBox2: TCheckListBox 62 | Left = 8 63 | Height = 97 64 | Top = 359 65 | Width = 756 66 | Anchors = [akLeft, akRight, akBottom] 67 | ItemHeight = 0 68 | TabOrder = 3 69 | TopIndex = -1 70 | OnClick = CheckListBox1Click 71 | end 72 | object Button1: TButton 73 | Left = 8 74 | Height = 25 75 | Top = 541 76 | Width = 756 77 | Anchors = [akLeft, akRight, akBottom] 78 | Caption = 'Download and update files' 79 | TabOrder = 4 80 | OnClick = Button1Click 81 | end 82 | object Button2: TButton 83 | Left = 8 84 | Height = 25 85 | Top = 581 86 | Width = 756 87 | Anchors = [akLeft, akRight, akBottom] 88 | Caption = 'Cancel' 89 | TabOrder = 5 90 | OnClick = Button2Click 91 | end 92 | object Label3: TLabel 93 | Left = 8 94 | Height = 16 95 | Top = 464 96 | Width = 41 97 | Anchors = [akLeft, akBottom] 98 | Caption = 'Label3' 99 | end 100 | object Button3: TButton 101 | Left = 658 102 | Height = 25 103 | Top = 316 104 | Width = 50 105 | Anchors = [akRight, akBottom] 106 | Caption = 'All' 107 | TabOrder = 6 108 | OnClick = Button3Click 109 | end 110 | object Button4: TButton 111 | Left = 714 112 | Height = 25 113 | Top = 316 114 | Width = 50 115 | Anchors = [akRight, akBottom] 116 | Caption = 'None' 117 | TabOrder = 7 118 | OnClick = Button4Click 119 | end 120 | object Label4: TLabel 121 | Left = 8 122 | Height = 16 123 | Top = 8 124 | Width = 129 125 | Caption = 'Last release message:' 126 | end 127 | object ProgressBar1: TProgressBar 128 | Left = 8 129 | Height = 20 130 | Top = 488 131 | Width = 756 132 | Anchors = [akLeft, akRight, akBottom] 133 | TabOrder = 8 134 | end 135 | object ProgressBar2: TProgressBar 136 | Left = 8 137 | Height = 20 138 | Top = 512 139 | Width = 756 140 | Anchors = [akLeft, akRight, akBottom] 141 | TabOrder = 9 142 | end 143 | object Label5: TLabel 144 | Left = 200 145 | Height = 16 146 | Top = 464 147 | Width = 564 148 | Alignment = taRightJustify 149 | Anchors = [akTop, akLeft, akRight, akBottom] 150 | AutoSize = False 151 | Caption = 'Label5' 152 | end 153 | end 154 | -------------------------------------------------------------------------------- /launcher/unit4.lfm: -------------------------------------------------------------------------------- 1 | object Form4: TForm4 2 | Left = 323 3 | Height = 438 4 | Top = 107 5 | Width = 786 6 | Caption = 'Form4' 7 | ClientHeight = 438 8 | ClientWidth = 786 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnCreate = FormCreate 12 | object CheckListBox1: TCheckListBox 13 | Left = 8 14 | Height = 338 15 | Top = 32 16 | Width = 773 17 | Anchors = [akTop, akLeft, akRight, akBottom] 18 | ItemHeight = 0 19 | PopupMenu = PopupMenu1 20 | TabOrder = 0 21 | TopIndex = -1 22 | OnClick = CheckListBox1Click 23 | OnDblClick = CheckListBox1DblClick 24 | end 25 | object Label1: TLabel 26 | Left = 8 27 | Height = 16 28 | Top = 8 29 | Width = 102 30 | Caption = 'Files / Filegroups' 31 | end 32 | object Button1: TButton 33 | Left = 8 34 | Height = 25 35 | Top = 402 36 | Width = 75 37 | Anchors = [akLeft, akBottom] 38 | Caption = 'Cancel' 39 | ModalResult = 2 40 | TabOrder = 1 41 | end 42 | object Button2: TButton 43 | Left = 706 44 | Height = 25 45 | Top = 406 46 | Width = 75 47 | Anchors = [akRight, akBottom] 48 | Caption = 'OK' 49 | ModalResult = 1 50 | TabOrder = 2 51 | end 52 | object Button3: TButton 53 | Left = 263 54 | Height = 25 55 | Top = 376 56 | Width = 50 57 | Anchors = [akRight, akBottom] 58 | Caption = 'All' 59 | TabOrder = 3 60 | OnClick = Button3Click 61 | end 62 | object Button4: TButton 63 | Left = 319 64 | Height = 25 65 | Top = 376 66 | Width = 50 67 | Anchors = [akRight, akBottom] 68 | Caption = 'None' 69 | TabOrder = 4 70 | OnClick = Button4Click 71 | end 72 | object Label2: TLabel 73 | Left = 8 74 | Height = 16 75 | Top = 376 76 | Width = 59 77 | Anchors = [akLeft, akBottom] 78 | Caption = 'Total size:' 79 | end 80 | object Label3: TLabel 81 | Left = 72 82 | Height = 16 83 | Top = 376 84 | Width = 41 85 | Anchors = [akLeft, akBottom] 86 | Caption = 'Label3' 87 | end 88 | object Button5: TButton 89 | Left = 383 90 | Height = 25 91 | Top = 376 92 | Width = 75 93 | Anchors = [akRight, akBottom] 94 | Caption = 'Buildings' 95 | TabOrder = 5 96 | OnClick = Button9Click 97 | end 98 | object Button6: TButton 99 | Left = 543 100 | Height = 25 101 | Top = 376 102 | Width = 75 103 | Anchors = [akRight, akBottom] 104 | Caption = 'Heroes' 105 | TabOrder = 6 106 | OnClick = Button9Click 107 | end 108 | object Button7: TButton 109 | Left = 463 110 | Height = 25 111 | Top = 376 112 | Width = 75 113 | Anchors = [akRight, akBottom] 114 | Caption = 'Graphics' 115 | TabOrder = 7 116 | OnClick = Button9Click 117 | end 118 | object Button8: TButton 119 | Left = 623 120 | Height = 25 121 | Top = 376 122 | Width = 75 123 | Anchors = [akRight, akBottom] 124 | Caption = 'Maps' 125 | TabOrder = 8 126 | OnClick = Button9Click 127 | end 128 | object Button9: TButton 129 | Left = 706 130 | Height = 25 131 | Top = 376 132 | Width = 75 133 | Anchors = [akRight, akBottom] 134 | Caption = 'Opponents' 135 | TabOrder = 9 136 | OnClick = Button9Click 137 | end 138 | object PopupMenu1: TPopupMenu 139 | Left = 120 140 | Top = 112 141 | object MenuItem1: TMenuItem 142 | Caption = 'Show details' 143 | OnClick = MenuItem1Click 144 | end 145 | end 146 | end 147 | -------------------------------------------------------------------------------- /launcher/unit5.lfm: -------------------------------------------------------------------------------- 1 | object Form5: TForm5 2 | Left = 331 3 | Height = 335 4 | Top = 114 5 | Width = 637 6 | Caption = 'Form5' 7 | ClientHeight = 335 8 | ClientWidth = 637 9 | Position = poScreenCenter 10 | LCLVersion = '4.99.0.0' 11 | OnCreate = FormCreate 12 | object ListBox1: TListBox 13 | Left = 8 14 | Height = 280 15 | Top = 8 16 | Width = 616 17 | Anchors = [akTop, akLeft, akRight, akBottom] 18 | ItemHeight = 0 19 | TabOrder = 0 20 | TopIndex = -1 21 | OnDblClick = ListBox1DblClick 22 | end 23 | object Button1: TButton 24 | Left = 8 25 | Height = 25 26 | Top = 296 27 | Width = 616 28 | Anchors = [akLeft, akRight, akBottom] 29 | Caption = 'OK' 30 | ModalResult = 1 31 | TabOrder = 1 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /launcher/unit5.pas: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of ctd_launcher *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | Unit Unit5; 16 | 17 | {$MODE ObjFPC}{$H+} 18 | 19 | Interface 20 | 21 | Uses 22 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus, 23 | ulauncher; 24 | 25 | Type 26 | 27 | { TForm5 } 28 | 29 | TForm5 = Class(TForm) 30 | Button1: TButton; 31 | ListBox1: TListBox; 32 | Procedure FormCreate(Sender: TObject); 33 | Procedure ListBox1DblClick(Sender: TObject); 34 | private 35 | fFiles: TFiles; 36 | 37 | public 38 | Procedure ShowData(Const files: TFiles); 39 | End; 40 | 41 | Var 42 | Form5: TForm5; 43 | 44 | Implementation 45 | 46 | {$R *.lfm} 47 | 48 | { TForm5 } 49 | 50 | Procedure TForm5.FormCreate(Sender: TObject); 51 | Begin 52 | caption := 'Detail viewer'; 53 | End; 54 | 55 | Procedure TForm5.ListBox1DblClick(Sender: TObject); 56 | Begin 57 | If ListBox1.ItemIndex <> -1 Then Begin 58 | showmessage(fFiles[ListBox1.ItemIndex].URL); 59 | End; 60 | End; 61 | 62 | Procedure TForm5.ShowData(Const files: TFiles); 63 | Var 64 | i: Integer; 65 | Begin 66 | fFiles := Files; 67 | ListBox1.Clear; 68 | For i := 0 To high(files) Do Begin 69 | ListBox1.Items.Add( 70 | format('%s (%s)', 71 | [ 72 | ExtractFileName(files[i].Filename), 73 | FileSizeToString(files[i].Size) 74 | ]) 75 | ); 76 | End; 77 | ShowModal; 78 | End; 79 | 80 | End. 81 | 82 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | There are two licenses for this software you can choose of: 2 | # 1. Postcardware 3 | you can download COPYING.Postcardware using this link: <br> 4 | https://github.com/PascalCorpsman/Software_Licenses/blob/main/COPYING.Postcardware.txt 5 | 6 | or 7 | # 2. modified LGPL (as described in COPYING.modifiedLGPL) 8 | you can download COPYING.modifiedLGPL using this link: <br> 9 | https://github.com/PascalCorpsman/Software_Licenses/blob/main/COPYING.modifiedLGPL.txt 10 | 11 | 12 | -------------------------------------------------------------------------------- /server/apptype.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | (* 16 | * Zur Unterscheidung ob Server oder Client 17 | * Da die IDE hier durcheinander kommt ist dieses Define gesetzt unter 18 | * Projekt -> Projekteinstellungen -> Compilereinstellungen -> Benutzerdefinierte Einstellungen 19 | * -dServer 20 | *) 21 | {.$DEFINE Server} 22 | 23 | (* 24 | * Wenn dieser Switch gesetzt ist, dann wird die sehr Hochfrequente Lognachricht 25 | * UpdateMoveables nicht im Trace geloggt. 26 | * 27 | * Ignoriert werden : 28 | * 29 | * - miHeartBeat 30 | * - miUpdateMoveables 31 | *) 32 | {$DEFINE DoNotLog_CyclicMessages} 33 | 34 | {$I ../client/globalsettings.inc} 35 | 36 | -------------------------------------------------------------------------------- /server/ctd_server.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/server/ctd_server.ico -------------------------------------------------------------------------------- /server/uchunkmanager.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {.$DEFINE UseLogger}// wenn Aktiv, dann nutzt der Chunkmanager die Logger Routinen 17 | 18 | {.$DEFINE UseMagicHeader} // Wenn Aktiviert, dann wird jedem Chunk eine Kennung vorangestellt, diese prüft dann zusätzlich noch einmal ob die Daten stimmen 19 | 20 | -------------------------------------------------------------------------------- /server/ulogger.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {.$define USELCL} 17 | 18 | -------------------------------------------------------------------------------- /server/uvectormath.inc: -------------------------------------------------------------------------------- 1 | (******************************************************************************) 2 | (* *) 3 | (* Author : Uwe Schächterle (Corpsman) *) 4 | (* *) 5 | (* This file is part of config_td *) 6 | (* *) 7 | (* See the file license.md, located under: *) 8 | (* https://github.com/PascalCorpsman/Software_Licenses/blob/main/license.md *) 9 | (* for details about the license. *) 10 | (* *) 11 | (* It is not allowed to change or remove this text from any *) 12 | (* source file of the project. *) 13 | (* *) 14 | (******************************************************************************) 15 | 16 | {$DEFINE UseOperandOverloading} 17 | 18 | TBaseType = Single; // Alle Komponenten bestehen aus BaseType, zur Nutzung von OpenGL ist Single zwingend !! 19 | 20 | -------------------------------------------------------------------------------- /textures/BTN_host_game_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_host_game_n.png -------------------------------------------------------------------------------- /textures/BTN_host_game_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_host_game_s.png -------------------------------------------------------------------------------- /textures/BTN_join_game_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_join_game_n.png -------------------------------------------------------------------------------- /textures/BTN_join_game_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_join_game_s.png -------------------------------------------------------------------------------- /textures/BTN_load_game_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_load_game_n.png -------------------------------------------------------------------------------- /textures/BTN_load_game_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_load_game_s.png -------------------------------------------------------------------------------- /textures/BTN_load_map_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_load_map_n.png -------------------------------------------------------------------------------- /textures/BTN_load_map_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_load_map_s.png -------------------------------------------------------------------------------- /textures/BTN_new_map_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_new_map_n.png -------------------------------------------------------------------------------- /textures/BTN_new_map_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/BTN_new_map_s.png -------------------------------------------------------------------------------- /textures/build_in_progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/build_in_progress.png -------------------------------------------------------------------------------- /textures/buykachel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/buykachel.png -------------------------------------------------------------------------------- /textures/coins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/coins.png -------------------------------------------------------------------------------- /textures/coins_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/coins_dark.png -------------------------------------------------------------------------------- /textures/dc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/dc1.png -------------------------------------------------------------------------------- /textures/dc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/dc2.png -------------------------------------------------------------------------------- /textures/dc3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/dc3.png -------------------------------------------------------------------------------- /textures/dc4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/dc4.png -------------------------------------------------------------------------------- /textures/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/first.png -------------------------------------------------------------------------------- /textures/firsts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/firsts.png -------------------------------------------------------------------------------- /textures/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/heart.png -------------------------------------------------------------------------------- /textures/heart_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/heart_dark.png -------------------------------------------------------------------------------- /textures/host_join_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/host_join_back.png -------------------------------------------------------------------------------- /textures/last.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/last.png -------------------------------------------------------------------------------- /textures/lasts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/lasts.png -------------------------------------------------------------------------------- /textures/level_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/level_up.png -------------------------------------------------------------------------------- /textures/load_map_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/load_map_back.png -------------------------------------------------------------------------------- /textures/maxdistance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/maxdistance.png -------------------------------------------------------------------------------- /textures/maxdistances.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/maxdistances.png -------------------------------------------------------------------------------- /textures/mindistance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/mindistance.png -------------------------------------------------------------------------------- /textures/mindistances.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/mindistances.png -------------------------------------------------------------------------------- /textures/playerstartpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/playerstartpoint.png -------------------------------------------------------------------------------- /textures/prefer_air.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/prefer_air.png -------------------------------------------------------------------------------- /textures/prefer_airs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/prefer_airs.png -------------------------------------------------------------------------------- /textures/random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/random.png -------------------------------------------------------------------------------- /textures/randoms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/randoms.png -------------------------------------------------------------------------------- /textures/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/select.png -------------------------------------------------------------------------------- /textures/sell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/sell.png -------------------------------------------------------------------------------- /textures/splashmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/splashmark.png -------------------------------------------------------------------------------- /textures/stars0.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars0.bmp -------------------------------------------------------------------------------- /textures/stars1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars1.bmp -------------------------------------------------------------------------------- /textures/stars2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars2.bmp -------------------------------------------------------------------------------- /textures/stars3.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars3.bmp -------------------------------------------------------------------------------- /textures/stars4.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars4.bmp -------------------------------------------------------------------------------- /textures/stars5.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars5.bmp -------------------------------------------------------------------------------- /textures/stars6.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars6.bmp -------------------------------------------------------------------------------- /textures/stars7.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars7.bmp -------------------------------------------------------------------------------- /textures/stars8.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars8.bmp -------------------------------------------------------------------------------- /textures/stars9.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/stars9.bmp -------------------------------------------------------------------------------- /textures/strongest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/strongest.png -------------------------------------------------------------------------------- /textures/strongests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/strongests.png -------------------------------------------------------------------------------- /textures/tab_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/tab_down.png -------------------------------------------------------------------------------- /textures/tab_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/tab_left.png -------------------------------------------------------------------------------- /textures/tab_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/tab_right.png -------------------------------------------------------------------------------- /textures/tab_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/tab_up.png -------------------------------------------------------------------------------- /textures/targets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/targets.png -------------------------------------------------------------------------------- /textures/targets_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/targets_dark.png -------------------------------------------------------------------------------- /textures/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/wave.png -------------------------------------------------------------------------------- /textures/wave_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/wave_dark.png -------------------------------------------------------------------------------- /textures/weakest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/weakest.png -------------------------------------------------------------------------------- /textures/weakests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/textures/weakests.png -------------------------------------------------------------------------------- /units/ulogger.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PascalCorpsman/ConfigTD/2bd87baed4f044283b66434b1c2099f2b8424ab4/units/ulogger.pas --------------------------------------------------------------------------------