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