Add user action evaluators: Find objects in area or container

qteditor
Sven Eberhardt 2016-07-31 15:09:05 -04:00
parent 8163ffac8a
commit 27f9e15042
3 changed files with 137 additions and 7 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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.