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
|
#strict 2
#include UT7I
func Floating()
{
return GetProcedure() == "FLOAT";
}
func ControlDigDouble(object caller)
{
if(DenyContainedDirectCom())
{
return false;
}
return SetAction("Idle");
}
func Activate(object caller)
{
caller->Exit(this);
SetAction("Float");
return true;
}
func AcceptsObject(object obj, id id, object requester)
{
return FindObject2(Find_Tube(), ExcludeOrigin(requester), Find_Func("CanSendObject", this, obj));
}
func RetrieveObject(object requester, id type, arriveCallback, object excludeOrigin, failCallback, object realTarget)
{
var line = FindObject2(Find_Tube(), ExcludeOrigin(requester), ExcludeOrigin(excludeOrigin), Find_Func("CanRetrieveObject", this, type, false)) || FindObject2(Find_Tube(), ExcludeOrigin(requester), ExcludeOrigin(excludeOrigin), Find_Func("CanRetrieveObject", this, type, true), Sort_Func("FactoryLoad"));
if(line)
{
return line->RetrieveObject(this, type, BindCallback(Callback("ForwardObject"), [0, 1, 2, Bind(requester), Bind(arriveCallback)]), 0, failCallback, realTarget || requester->GetLineEnd(this));
}
}
func ForwardObject(object obj, object line, object receiver, object requester, arriveCallback)
{
if(requester)
{
return requester->SendObject(this, obj, arriveCallback);
}
}
func ExcludeOrigin(object originLine)
{
var origin = originLine;
if(!originLine)
{
return Find_And();
}
if(origin->~IsTube())
{
origin = origin->ObjectOrigin(this);
}
else
{
originLine = 0;
}
return Find_And(Find_Exclude(originLine), Find_Not(Find_Func("HasObjectOrigin", origin)));
}
func ReceiveObject(object obj, bool noReturn, array arriveCallback, object senderLine)
{
if(arriveCallback)
{
if(CallA(arriveCallback, [obj, senderLine, this], true))
{
return TU7I_NoCallback;
}
}
else
{
var line = FindObject2(Find_Tube(), ExcludeOrigin(senderLine), Find_Func("CanSendObject", this, obj));
return line && line->SendObject(this, obj, noReturn);
}
}
func HasObject(id type, bool allowProduction, object receiverLine, object excludeOrigin)
{
return FindObject2(Find_Tube(), ExcludeOrigin(receiverLine), Find_Func("CanRetrieveObject", this, type, allowProduction), ExcludeOrigin(excludeOrigin));
}
func GetRetrievableObjects(object requester, bool produce)
{
var lines = FindObjects(Find_Tube(), ExcludeOrigin(requester));
var IDs = [], produceIDs = [], part;
for(var line in lines)
{
part = line->~GetRetrievableObjects(this, produce) || [];
for(var id in part)
{
if(GetIndexOf(id, IDs) == -1)
{
IDs[GetLength(IDs)] = id;
}
}
}
return IDs;
}
func RejectEntrance(object obj)
{
return Floating();
}
|