├── .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 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
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 | '' + LineEnding +
109 | '' + LineEnding +
110 | '
' + LineEnding +
111 | 'Error:
' + LineEnding +
112 | '404 could not find: ' + Filename + '.html
' + LineEnding +
113 | '' + LineEnding +
114 | '';
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.
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 
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 
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 
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 
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 
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 | enable logging to file
10 | | -l | set loglegel to (0..6)
11 | | -s | set share folder to
12 | | -m | 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 | Spezifies the port number to listen to.
21 | | -pw | Spezifies the password default "" (= none)
22 | | -l | Sets Loglevel (default = 2) [1 = show everything .. 7 = show only fatal errors]
23 | | -t | Sets automatic close on no user connected, default 3000 ms
0 = Disabled, typing "ESC" in the servers console window will terminate
24 | | -f | Logs additional to a file
25 | | -m | 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 | tells the server to kick player 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 
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 
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 | 
7 |
8 | ## Buildings strategy buttons
9 | | Image | Description | Shortcut
10 | | --- | :--- | :---:
11 | |  | Attack first opponent first | F1
12 | |  | Attack last opponent first | F2
13 | |  | Attack nearest opponent first | F3
14 | |  | Attack farest opponent first | F4
15 | |  | Attack strongest opponent first | F5
16 | |  | Attack weakest opponent first | F6
17 | |  | Attack Random opponent | F7
18 | |  | prefer air units over floor units |
19 | |  | 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 
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 | 
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). 
6 | 2. Click "Host Game" if you are the first player and do not use a dedicated server, otherwise click "Join Game" 
7 | 3. Fill in your Player name and click on "Create" 
8 | 4. Select "Load Map" 
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) 
10 | 6. Select the difficulty you want to play the map. 
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 
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 
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 
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)) 
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.
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 
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.
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.

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 
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)

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) 
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 |
2 |
3 |
4 |
5 | Online Manual for Config TD
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/help/Keyboard_Shortcuts.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Keyboard shortcuts
6 |
7 | In game
8 |
9 |
10 | Key |
11 | Description |
12 |
13 |
14 | ^ |
15 | Toggle show/hide side menu |
16 |
17 |
18 | p |
19 | Toggle pause |
20 |
21 |
22 | q |
23 | Select all buildings of same stage and owner and type (as the selected) |
24 |
25 |
26 | s |
27 | Sell selected buildings / stop movement of selected heros / move map down |
28 |
29 |
30 | h |
31 | Select all own heros |
32 |
33 |
34 | u |
35 | Upgrade selected buildings |
36 |
37 |
38 | w |
39 | Show player names on map, where opponents get spawned |
40 |
41 |
42 | + |
43 | Increase simulation speed |
44 |
45 |
46 | - |
47 | Decrease simulation speed |
48 |
49 |
50 | p |
51 | Toggle pause |
52 |
53 |
54 | ALT |
55 | Show lifepoints of all opponents |
56 |
57 |
58 | RETURN |
59 | Open Chat window |
60 |
61 |
62 | ESC |
63 | Deselect what ever actually is selected |
64 |
65 |
66 | 0 .. 9 |
67 | Keyboard shortcuts for buildings/hero in the buy menu |
68 |
69 |
70 | F1 .. F8 |
71 | if a building/hero is selected, the corresponding building/hero strategy will be set (only on own ones) |
72 |
73 |
74 | cursors |
75 | Scroll map |
76 |
77 |
78 | e |
79 | Zoom map in |
80 |
81 |
82 | c |
83 | Zoom map out |
84 |
85 |
86 |
87 | Editor
88 |
89 |
90 | Key |
91 | Description |
92 |
93 |
94 | ^ |
95 | Toggle show/hide side menu |
96 |
97 |
98 | cursors |
99 | Scroll map |
100 |
101 |
102 | e |
103 | Zoom map in |
104 |
105 |
106 | c |
107 | Zoom map out |
108 |
109 |
110 |
111 | Chat
112 |
113 |
114 | Key / Text |
115 | Description |
116 |
117 |
118 | UP |
119 | repeat last chat message |
120 |
121 |
122 | -clear |
123 | clear chats |
124 |
125 |
126 | -air |
127 | list all waves containing damageclass 4 opponents |
128 |
129 |
130 | -boss |
131 | list all waves containing boss opponents |
132 |
133 |
134 | -bonus |
135 | list all waves containing bonus opponents |
136 |
137 |
138 | -p |
139 | lists ping times to all participants |
140 |
141 |
142 | -kick <playername> |
143 | tells the server to kick player <playername> out of the game |
144 |
145 |
146 | -? |
147 | in chat help screen |
148 |
149 |
150 |
151 |
152 |
153 |
--------------------------------------------------------------------------------
/help/index.txt:
--------------------------------------------------------------------------------
1 | #
2 | # The File is organized as following:
3 | #
4 | # # lines will be ignored
5 | #
6 | # ->
7 | #
8 | # When clicking the online help the .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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | -
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 | -
119 |
120 |
121 | -
122 |
123 |
124 | -
125 |
126 |
127 |
128 |
129 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | -
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | -
70 |
71 |
72 | -
73 |
74 |
75 | -
76 |
77 |
78 |
79 |
80 |
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:
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:
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
--------------------------------------------------------------------------------