forked from Mirrors/openclonk
Add user action evaluators: Find objects in area or container
parent
8163ffac8a
commit
27f9e15042
|
@ -35,6 +35,7 @@ static g_UserAction_global_vars;
|
|||
local EvaluatorTypeNames = {
|
||||
Action = "$UserAction$",
|
||||
Object = "$UserObject$",
|
||||
ObjectList = "$UserObjectList$",
|
||||
Definition = "$UserDefinition$",
|
||||
Player = "$UserPlayer$",
|
||||
PlayerList = "$UserPlayerList$",
|
||||
|
@ -46,12 +47,13 @@ local EvaluatorTypeNames = {
|
|||
};
|
||||
|
||||
// All evaluator types (unfortunately, EvaluatorReturnTypes->GetProperties() does not work)
|
||||
local EvaluatorTypes = ["Action", "Object", "Definition", "Player", "PlayerList", "Boolean", "Integer", "String", "Position", "Offset", "Any"];
|
||||
local EvaluatorTypes = ["Action", "Object", "ObjectList", "Definition", "Player", "PlayerList", "Boolean", "Integer", "String", "Position", "Offset", "Any"];
|
||||
|
||||
// Evaluator return types
|
||||
local EvaluatorReturnTypes = {
|
||||
Action = C4V_Nil,
|
||||
Object = C4V_C4Object,
|
||||
ObjectList = [C4V_C4Object],
|
||||
Definition = C4V_Def,
|
||||
Player = C4V_Int,
|
||||
PlayerList = [C4V_Int],
|
||||
|
@ -69,6 +71,7 @@ func Definition(def)
|
|||
Evaluator = {};
|
||||
Evaluator.Action = { Name="$UserAction$", Type="enum", OptionKey="Function", Options = [ { Name="$None$" } ] };
|
||||
Evaluator.Object = { Name="$UserObject$", Type="enum", OptionKey="Function", Options = [ { Name="$None$" } ] };
|
||||
Evaluator.ObjectList = { Name="$UserObjectList$", Type="enum", OptionKey="Function", Options = [ { Name="$None$" } ] };
|
||||
Evaluator.Definition = { Name="$UserDefinition$", Type="enum", OptionKey="Function", Options = [ { Name="$None$" } ] };
|
||||
Evaluator.Player = { Name="$UserPlayer$", Type="enum", OptionKey="Function", Options = [ { Name="$Noone$" } ] };
|
||||
Evaluator.PlayerList = { Name="$UserPlayerList$", Type="enum", OptionKey="Function", Options = [ { Name="$Noone$" } ] };
|
||||
|
@ -146,6 +149,25 @@ func Definition(def)
|
|||
AddEvaluator("Object", nil, "$TriggerObject$", "$TriggerObjectHelp$", "triggering_object", [def, def.EvalObj_TriggeringObject]);
|
||||
AddEvaluator("Object", nil, ["$ConstantObject$", ""], "$ConstantObjectHelp$", "object_constant", [def, def.EvalConstant], { Value=nil }, { Type="object", Name="$Value$" });
|
||||
AddEvaluator("Object", nil, "$LastCreatedObject$", "$LastCreatedObjectHelp$", "last_created_object", [def, def.EvalObj_LastCreatedObject]);
|
||||
// Object list evaluators
|
||||
AddEvaluator("ObjectList", nil, "$FindObjectsInArea$", "$FindObjectsInAreaHelp$", "find_objects_in_area", [def, def.EvalObjList_FindObjectsInArea], {}, { Type="proplist", Display="{{ID}}", ShowFullName=true, EditorProps = {
|
||||
ID = new Evaluator.Definition { Name="$ID$", EditorHelp="$FindObjectsIDHelp$", EmptyName="$Any$" },
|
||||
Area = { Name="$SearchArea$", EditorHelp="$SearchAreaHelp$", Type="enum", OptionKey="Function", Options=[
|
||||
{ Name="$SearchAreaWholeMap$", EditorHelp="$SearchAreaWholeMapHelp$" },
|
||||
{ Name="$SearchAreaInRect$", EditorHelp="$SearchAreaInRectHelp$", Value={ Function="InRect" }, Get=def.GetDefaultRect, ValueKey="Area", Delegate={ Type="rect", Name="$Rectangle$", Relative=false, Color=0xffff00 } },
|
||||
{ Name="$SearchAreaAtRect$", EditorHelp="$SearchAreaAtRectHelp$", Value={ Function="AtRect" }, Get=def.GetDefaultRect, ValueKey="Area", Delegate={ Type="rect", Name="$Rectangle$", Relative=false, Color=0xffff80 } },
|
||||
{ Name="$SearchAreaCircle$", EditorHelp="$SearchAreaCircleHelp$", Value={ Function="Circle" }, Get=def.GetDefaultCircle, ValueKey="Area", Delegate={ Type="circle", Name="$Circle$", Relative=false, CanMoveCenter=true, Color=0xff00ff } },
|
||||
{ Name="$SearchAreaNearPosition$", EditorHelp="$SearchAreaNearPositionHelp$", Value={ Function="NearPosition", Parameters={Radius=25} }, ValueKey="Parameters", Delegate={ Type="proplist", Display="{{Object}}", ShowFullName=true, EditorProps = {
|
||||
Position = new Evaluator.Position { EditorHelp="$SearchAreaNearPositionPositionHelp$"},
|
||||
Radius = { Type="circle", Relative=true, Name="$Radius$", Color=0xff80ff }
|
||||
} } }
|
||||
] },
|
||||
AllowContained = { Name="$AllowContained$", EditorHelp="$AllowContainedHelp$", Type="bool" }
|
||||
} } );
|
||||
AddEvaluator("ObjectList", nil, "$FindObjectsInContainer$", "$FindObjectsInContainerHelp$", "find_objects_in_container", [def, def.EvalObjList_FindObjectsInContainer], {}, { Type="proplist", Display="{{ID}} in {{Container}}", ShowFullName=true, EditorProps = {
|
||||
ID = new Evaluator.Definition { Name="$ID$", EditorHelp="$FindObjectsIDHelp$", EmptyName="$Any$" },
|
||||
Container = new Evaluator.Object { Name="$Container$", EditorHelp="FindObjectsContainerHelp" }
|
||||
} } );
|
||||
// Definition evaluators
|
||||
AddEvaluator("Definition", nil, ["$Constant$", ""], "$ConstantHelp$", "def_constant", [def, def.EvalConstant], { Value=nil }, { Type="def", Name="$Value$" });
|
||||
AddEvaluator("Definition", nil, "$TypeOfObject$", "$TypeOfObjectHelp$", "type_of_object", [def, def.EvalDef_TypeOfObject], { }, new Evaluator.Object { }, "Object");
|
||||
|
@ -335,7 +357,7 @@ public func AddEvaluator(string eval_type, string group, name, string help, stri
|
|||
if (GetType(default_val) == C4V_Function)
|
||||
{
|
||||
default_get = default_val;
|
||||
default_val = Call(default_get);
|
||||
default_val = Call(default_get, nil, {Function=identifier});
|
||||
}
|
||||
default_val.Function = identifier;
|
||||
var action_def = { Name=name, ShortName=short_name, EditorHelp=help, Group=group, Value=default_val, Delegate=delegate, Get=default_get }, n;
|
||||
|
@ -485,6 +507,52 @@ private func EvalObj_LastCreatedObject(proplist props, proplist context) { retur
|
|||
private func EvalPlr_Trigger(proplist props, proplist context) { return context.triggering_player; }
|
||||
private func EvalPlrList_Single(proplist props, proplist context, fn) { return [Call(fn, props, context)]; }
|
||||
|
||||
private func EvalObjList_FindObjectsInArea(proplist props, proplist context)
|
||||
{
|
||||
var params = Find_And(), np=1;
|
||||
// Resolve area parameter
|
||||
if (props.Area)
|
||||
{
|
||||
var area = props.Area.Area;
|
||||
var fn = props.Area.Function;
|
||||
var area_criterion;
|
||||
if (fn == "InRect")
|
||||
area_criterion = Find_InRect(area[0], area[1], area[2], area[3]);
|
||||
else if (fn == "AtRect")
|
||||
area_criterion = Find_AtRect(area[0], area[1], area[2], area[3]);
|
||||
else if (fn == "Circle")
|
||||
area_criterion = Find_Distance(area[0], area[1], area[2]);
|
||||
else if (fn == "NearPosition")
|
||||
{
|
||||
var pos_params = props.Area.Parameters;
|
||||
var pos = EvaluatePosition(pos_params.Position, context);
|
||||
area_criterion = Find_Distance(pos_params.Radius, pos[0], pos[1]);
|
||||
}
|
||||
if (area_criterion) params[np++] = area_criterion;
|
||||
}
|
||||
// Other parameters
|
||||
var idobj = EvaluateValue("Definition", props.ID, context);
|
||||
if (idobj) params[np++] = Find_ID(idobj);
|
||||
if (!props.AllowContained) params[np++] = Find_NoContainer();
|
||||
// Find objects
|
||||
return FindObjects(params);
|
||||
}
|
||||
|
||||
private func EvalObjList_FindObjectsInContainer(proplist props, proplist context)
|
||||
{
|
||||
// Return array of all objects contained in container
|
||||
var container = EvaluateValue("Object", props.Container, context);
|
||||
var idobj = EvaluateValue("Definition", props.ID, context);
|
||||
if (!container) return; // nil is treated as empty list
|
||||
var i, n = container->ContentsCount(idobj), j;
|
||||
if (!n) return;
|
||||
var result = CreateArray(n), obj;
|
||||
while ((obj = container->Contents(i++)))
|
||||
if (!idobj || obj->GetID() == idobj)
|
||||
result[j++] = obj;
|
||||
return result;
|
||||
}
|
||||
|
||||
private func EvalPlrList_All(proplist props, proplist context, fn)
|
||||
{
|
||||
var n = GetPlayerCount(C4PT_User);
|
||||
|
@ -776,20 +844,36 @@ private func GetDefaultCoordinates(object target_object)
|
|||
return value;
|
||||
}
|
||||
|
||||
private func GetDefaultRect(object target_object)
|
||||
private func GetDefaultRect(object target_object, proplist props)
|
||||
{
|
||||
// Default rectangle around target object
|
||||
var r;
|
||||
if (target_object) r = [target_object->GetX()-30, target_object->GetY()-30, 60, 60]; else r = [100,100,100,100];
|
||||
return { Function="random_pos_rect_abs", Area=r };
|
||||
return { Function=props.Function, Area=r };
|
||||
}
|
||||
|
||||
private func GetDefaultCircle(object target_object)
|
||||
private func GetDefaultCircle(object target_object, proplist props)
|
||||
{
|
||||
// Default circle around target object
|
||||
var r;
|
||||
if (target_object) r = [50, target_object->GetX(), target_object->GetY()]; else r = [50,100,100];
|
||||
return { Function="random_pos_circle_abs", Area=r };
|
||||
return { Function=props.Function, Area=r };
|
||||
}
|
||||
|
||||
private func GetDefaultSearchRect(object target_object)
|
||||
{
|
||||
// Default rectangle around target object
|
||||
var r;
|
||||
if (target_object) r = [target_object->GetX()-30, target_object->GetY()-30, 60, 60]; else r = [100,100,100,100];
|
||||
return { Function="Rect", Area=r };
|
||||
}
|
||||
|
||||
private func GetDefaultSearchCircle(object target_object)
|
||||
{
|
||||
// Default circle around target object
|
||||
var r;
|
||||
if (target_object) r = [50, target_object->GetX(), target_object->GetY()]; else r = [50,100,100];
|
||||
return { Function="Circle", Area=r };
|
||||
}
|
||||
|
||||
private func EvalIntRandom(proplist props, proplist context)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
UserAction=Aktion
|
||||
UserObject=Objekt
|
||||
UserObjectList=Objektliste
|
||||
UserPlayer=Spieler
|
||||
UserPlayerList=Spieler
|
||||
UserInteger=Zahl
|
||||
|
@ -212,3 +213,25 @@ AndHelp=Wahr, wenn alle Operanden wahr sind.
|
|||
Operands=Operanden
|
||||
Or=Oder
|
||||
OrHelp=Wahr, wenn mindestens einer der Operanden wahr ist.
|
||||
FindObjectsInArea=Objekte im Bereich
|
||||
FindObjectsInAreaHelp=Findet Objekte in einem Bereich der Landschaft.
|
||||
ID=Objekttyp
|
||||
FindObjectsIDHelp=ID der Objekte, die gesucht werden. Bei 'Beliebig' werden alle Objekttypen gefunden.
|
||||
Any=Beliebig
|
||||
SearchArea=Suchbereich
|
||||
SearchAreaHelp=Gibt an, in welchem Bereich der Karte gesucht wird.
|
||||
SearchAreaWholeMap=Ganze Karte
|
||||
SearchAreaWholeMapHelp=Objekte werden ueberall gefunden.
|
||||
SearchAreaInRect=Im Rechteck
|
||||
SearchAreaInRectHelp=Findet Objekte, deren Mittelpunkt innerhalb des angegebenen Rechtecks liegt.
|
||||
SearchAreaAtRect=Beruehrt Rechteck
|
||||
SearchAreaAtRectHelp=Findet Objekte, deren umgebendes Rechteck sich mit dem angegebenen Rechteck ueberschneidet.
|
||||
SearchAreaCircle=Im Kreis
|
||||
SearchAreaCircleHelp=Findet Objekte, deren Mittelpunkt innerhalb des angegebenen Kreises liegt.
|
||||
SearchAreaNearPosition=Im Kreis um einen Punkt
|
||||
SearchAreaNearPositionHelp=Findet Objekte, deren Mittelpunkt innerhalb eines Radius um einen Punkt liegt, der per Funktion angegeben werden kann.
|
||||
Radius=Radius
|
||||
AllowContained=Inhaltsobjekte finden
|
||||
AllowContainedHelp=Gibt an, ob auch in anderne Objekten enthaltene Objekte (zum Beispiel Inventarobjekte oder Clonks in Flugzeugen) gefunden werden sollen.
|
||||
FindObjectsInContainer=Inhaltsobjekte
|
||||
FindObjectsInContainerHelp=Findet Objekte, die in anderen Objekten enthalten sind. Zum Beispiel Inventarobjekte, Objekte in Kisten oder Clonks in Flugzeugen.
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
UserAction=Action
|
||||
UserObject=Object
|
||||
UserObjectList=Object list
|
||||
UserPlayer=Player
|
||||
UserPlayerList=Players
|
||||
UserInteger=Integer
|
||||
|
@ -211,4 +212,26 @@ And=And
|
|||
AndHelp=True if all operands are true.
|
||||
Operands=Operands
|
||||
Or=Or
|
||||
OrHelp=True if at least one operand is true.
|
||||
OrHelp=True if at least one operand is true.
|
||||
FindObjectsInArea=Objekts in area
|
||||
FindObjectsInAreaHelp=Finds objects in a given area of the landscape.
|
||||
ID=Object type
|
||||
FindObjectsIDHelp=Type of object to be found. On 'any', all object types are found.
|
||||
Any=Any
|
||||
SearchArea=Search range
|
||||
SearchAreaHelp=Determines which area of the map to search.
|
||||
SearchAreaWholeMap=Whole map
|
||||
SearchAreaWholeMapHelp=Objects are found anywhere.
|
||||
SearchAreaInRect=In rectangle
|
||||
SearchAreaInRectHelp=Finds objects that have their midpoint within the given rectangle.
|
||||
SearchAreaAtRect=At rectangle
|
||||
SearchAreaAtRectHelp=Findets objects that have an overlapping shape with the given rectangle.
|
||||
SearchAreaCircle=In circle
|
||||
SearchAreaCircleHelp=Finds objects that have their midpoint within the given circle.
|
||||
SearchAreaNearPosition=Circle around point
|
||||
SearchAreaNearPositionHelp=Finds objects that have their midpoint within a radius around a point. The point can be given as a function.
|
||||
Radius=Radius
|
||||
AllowContained=Find contained
|
||||
AllowContainedHelp=Specifies whether contained objects are also found (e.g. inventory objects or clonks within a plane).
|
||||
FindObjectsInContainer=Contents of object
|
||||
FindObjectsInContainerHelp=Finds all contents of a given type of an object.
|
||||
|
|
Loading…
Reference in New Issue