1 /**
2 Ownership Area Block
3 Allows to draw ownership areas which block areas from being conquered.
4
5 @author Maikel
6 */
7
8 local lib_block_area;
9
Construction()10 protected func Construction()
11 {
12 // Initialize the flag list if not done already.
13 if (GetType(LIB_FLAG_FlagList) != C4V_Array)
14 LIB_FLAG_FlagList = [];
15 // Add blocking area to list of flags.
16 if (GetIndexOf(LIB_FLAG_FlagList, this) == -1)
17 PushBack(LIB_FLAG_FlagList, this);
18 // Initialize the single proplist for the this library.
19 if (lib_block_area == nil)
20 lib_block_area = {};
21 // Initialize some variables for this library.
22 lib_block_area.markers = [];
23 lib_block_area.rectangle = nil;
24 return;
25 }
26
BlockRectangle(proplist rect)27 public func BlockRectangle(proplist rect)
28 {
29 if (this != Library_BlockOwnershipArea)
30 return;
31 var block_area = CreateObject(Library_BlockOwnershipArea, rect.x + rect.wdt / 2, rect.y + rect.hgt / 2);
32 block_area.lib_block_area.rectangle = rect;
33 block_area->UpdateMarkers();
34 return;
35 }
36
HasCoordinatesInControlArea(int x,int y)37 public func HasCoordinatesInControlArea(int x, int y)
38 {
39 if (!Inside(x, lib_block_area.rectangle.x, lib_block_area.rectangle.x + lib_block_area.rectangle.wdt))
40 return false;
41 if (!Inside(y, lib_block_area.rectangle.y, lib_block_area.rectangle.y + lib_block_area.rectangle.hgt))
42 return false;
43 return true;
44 }
45
46
47 /*-- Flag Library Overloads --*/
48
49 // Always return zero since these areas are supposed to block player flags.
GetFlagConstructionTime()50 public func GetFlagConstructionTime() { return 0; }
51
RedrawFlagRadius()52 public func RedrawFlagRadius() { return; }
53
GetLinkedFlags()54 public func GetLinkedFlags() { return []; }
55
GetPowerHelper()56 public func GetPowerHelper() { return; }
57
SetPowerHelper()58 public func SetPowerHelper() { return; }
59
60
61 /*-- Markers --*/
62
63 // Removes all the ownership markers for this flag.
ClearMarkers()64 private func ClearMarkers()
65 {
66 for (var marker in lib_block_area.markers)
67 if (marker)
68 marker->RemoveObject();
69 lib_block_area.markers = [];
70 return;
71 }
72
UpdateMarkers()73 public func UpdateMarkers()
74 {
75 var step_size = 30;
76 var min_amount = 3;
77 var x_amount = Max(min_amount, lib_block_area.rectangle.wdt / step_size);
78 var y_amount = Max(min_amount, lib_block_area.rectangle.hgt / step_size);
79 var marker_positions = [];
80 // Construct sides.
81 for (var index = 1; index < x_amount; index++)
82 {
83 var x = lib_block_area.rectangle.x - GetX() + index * lib_block_area.rectangle.wdt / x_amount;
84 PushBack(marker_positions, {x = x, y = lib_block_area.rectangle.y - GetY(), r = 0});
85 PushBack(marker_positions, {x = x, y = lib_block_area.rectangle.y + lib_block_area.rectangle.hgt - GetY(), r = 180});
86 }
87 for (var index = 1; index < y_amount; index++)
88 {
89 var y = lib_block_area.rectangle.y - GetY() + index * lib_block_area.rectangle.hgt / y_amount;
90 PushBack(marker_positions, {x = lib_block_area.rectangle.x - GetX(), y = y, r = -90});
91 PushBack(marker_positions, {x = lib_block_area.rectangle.x + lib_block_area.rectangle.wdt - GetX(), y = y, r = 90});
92 }
93 // Construct edges.
94 PushBack(marker_positions, {x = lib_block_area.rectangle.x - GetX(), y = lib_block_area.rectangle.y - GetY(), r = -45});
95 PushBack(marker_positions, {x = lib_block_area.rectangle.x + lib_block_area.rectangle.wdt - GetX(), y = lib_block_area.rectangle.y - GetY(), r = 45});
96 PushBack(marker_positions, {x = lib_block_area.rectangle.x - GetX() - GetX(), y = lib_block_area.rectangle.y + lib_block_area.rectangle.hgt - GetY(), r = -135});
97 PushBack(marker_positions, {x = lib_block_area.rectangle.x + lib_block_area.rectangle.wdt - GetX(), y = lib_block_area.rectangle.y + lib_block_area.rectangle.hgt - GetY(), r = 135});
98 for (var marker_pos in marker_positions)
99 {
100 var other_flag = GetFlagpoleForPosition(marker_pos.x + GetX(), marker_pos.y + GetY());
101 if (other_flag && (other_flag != this) && (other_flag->GetFlagConstructionTime() <= GetFlagConstructionTime()))
102 continue;
103 var marker = CreateObject(Library_Flag_Marker, marker_pos.x, marker_pos.y);
104 marker->FadeIn();
105 marker->SetR(marker_pos.r);
106 }
107 return;
108 }
109