Spoiler
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
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
- Initialize the script and define global variables addhook("startround", "td_init") function td_init() td_startmoney = 100 -- Player's starting money td_wave = 0 -- Current monster wave td_waveactive = false -- State of the monster wave td_monsters = {} -- Table to store active monsters td_soldiers = {} -- Table to store soldiers td_monster_hp = {50, 100, 150} -- Monster health points per wave td_monster_armor = {0, 5, 10} -- Monster armor per wave td_soldier_damage = {10, 20, 30} -- Soldier weapon damage td_soldier_armor_penetration = {5, 10, 15} -- Soldier weapon armor penetration td_soldier_cost = {50, 100, 150} -- Soldier cost end -- Create a monster with health and armor defined by the wave function td_createmonster(id, wave) local monster = {} monster.id = id monster.hp = td_monster_hp[wave] monster.armor = td_monster_armor[wave] td_monsters[id] = monster end -- Create a soldier function td_createsoldier(id, type, x, y) local soldier = {} soldier.id = id soldier.type = type soldier.x = x soldier.y = y soldier.damage = td_soldier_damage[type] soldier.armor_penetration = td_soldier_armor_penetration[type] td_soldiers[id] = soldier end -- Handle soldier attacking a monster function td_attack(monster_id, soldier_id) local monster = td_monsters[monster_id] local soldier = td_soldiers[soldier_id] -- Calculate damage considering monster's armor and soldier's armor penetration local effective_armor = monster.armor - soldier.armor_penetration if effective_armor < 0 then effective_armor = 0 end local effective_damage = soldier.damage - effective_armor if effective_damage < 0 then effective_damage = 0 end monster.hp = monster.hp - effective_damage if monster.hp <= 0 then td_monsters[monster_id] = nil -- Remove the monster if its health is zero or less parse("killobject "..monster_id) -- Kill the monster object in the game end end -- Function called when a new wave starts function td_newwave() td_wave = td_wave + 1 td_waveactive = true -- Create monsters for the new wave for i = 1, 10 do local monster_id = math.random(1000, 9999) td_createmonster(monster_id, td_wave) parse("spawnobject 3 "..monster_id) -- Create a monster object in the game end end -- Function called when the player creates a soldier addhook("buy", "td_buysoldier") function td_buysoldier(id, type, x, y) if player(id, "money") >= td_soldier_cost[type] then local soldier_id = math.random(1000, 9999) td_createsoldier(soldier_id, type, x, y) parse("spawnobject 1 "..soldier_id.." "..x.." "..y) -- Create a soldier object in the game parse("setmoney "..id.." "..(player(id, "money") - td_soldier_cost[type])) -- Deduct the soldier cost from the player's money else msg2(id, "You don't have enough money to buy this soldier.") end end -- Function called on every game tick to manage attacks addhook("always", "td_gameupdate") function td_gameupdate() if td_waveactive then for monster_id, monster in pairs(td_monsters) do for soldier_id, soldier in pairs(td_soldiers) do -- Check if the monster is within the soldier's range (implement your own range logic here) local distance = math.sqrt((soldier.x - monster.x)^2 + (soldier.y - monster.y)^2) if distance < 100 then td_attack(monster_id, soldier_id) end end end end end