Add sequence triggers: Interval and object count in container

qteditor
Sven Eberhardt 2016-08-07 23:37:48 -04:00
parent e6c483953a
commit 7e87b62e3e
3 changed files with 52 additions and 6 deletions

View File

@ -361,6 +361,12 @@ public func Definition(def)
ID = { Name="$ID$", EditorHelp="$IDHelp$", Type="def", Set="SetTriggerID", SetRoot=true },
Radius = { Type="circle", Color=0xff8000, Relative=true, Set="SetTriggerRadius", SetRoot=true }
} } },
{ Name="$ObjectCountInContainer$", EditorHelp="$ObjectCountInContainerHelp$", Value={ Trigger="contained_object_count", Count=1 }, Delegate={ Name="$ObjectCountInContainer$", EditorHelp="$ObjectCountInContainerHelp$", Type="proplist", EditorProps = {
Container = { Name="$Container$", EditorHelp="$CountContainerHelp$", Type="object" },
ID = { Name="$ID$", EditorHelp="$CountIDHelp$", Type="def", EmptyName="$AnyID$" },
Count = { Name="$Count$", Type="int", Min=1 }
} } },
{ Name="$Interval$", EditorHelp="$IntervalHelp$", Value={ Trigger="interval", Interval=60 }, ValueKey="Interval", Delegate={ Name="$IntervalTime$", Type="int", Min=1, Set="SetIntervalTimer", SetRoot=true } },
{ Name="$GameStart$", Value={ Trigger="game_start" } },
{ Name="$PlayerJoin$", Value={ Trigger="player_join" } },
{ Name="$PlayerRemove$", Value={ Trigger="player_remove" } },
@ -384,11 +390,7 @@ public func SetTrigger(proplist new_trigger)
{
trigger = new_trigger;
// Set trigger: Restart any specific trigger timers
if (active && !finished)
{
StopTrigger();
StartTrigger();
}
if (active && !finished) StartTrigger();
return true;
}
@ -488,6 +490,14 @@ public func StartTrigger()
this.search_mask = Find_And(Find_Distance(trigger.Radius), Find_OCF(OCF_Alive), Find_Func("IsClonk"), id_search);
AddTimer(this.EnterRegionTimer, check_interval);
}
else if (fn == "contained_object_count")
{
AddTimer(this.CountContainedObjectsTimer, check_interval);
}
else if (fn == "interval")
{
AddTimer(this.OnTrigger, trigger.Interval);
}
else return false;
return true;
}
@ -497,6 +507,8 @@ public func StopTrigger()
SetGraphics();
// Remove any timers that may have been added
RemoveTimer(this.EnterRegionTimer);
RemoveTimer(this.CountContainedObjectsTimer);
RemoveTimer(this.OnTrigger);
trigger_started = false;
return true;
}
@ -507,6 +519,12 @@ public func SetCheckInterval(new_interval)
return SetTrigger(trigger); // restart trigger
}
public func SetIntervalTimer(int new_interval)
{
if (trigger) trigger.Interval = new_interval;
return SetTrigger(trigger); // restart trigger
}
private func EnterRegionTimer()
{
for (var clonk in FindObjects(this.search_mask))
@ -517,6 +535,14 @@ private func EnterRegionTimer()
}
}
private func CountContainedObjectsTimer()
{
if (trigger.Container && trigger.Container->ContentsCount(trigger.ID) >= trigger.Count)
{
OnTrigger(nil, NO_OWNER);
}
}
public func OnTrigger(object triggering_clonk, int triggering_player, bool is_editor_test)
{
// Editor test: Triggered by first player

View File

@ -29,3 +29,13 @@ ObjectEnterRegionCircle=Objektyp in Bereich (Radius)
Condition=Bedingung
CheckInterval=Pruefintervall
CheckIntervalHelp=Gibt das Intervall in Frames an, in dem die Bedingung ueberprueft wird.
ObjectCountInContainer=Objektzahl in Container
ObjectCountInContainerHelp=Wird ausgeloest, wenn eine bestimmte Anzahl von Objekten in einem Inhaltsobjekt vorhanden sind. Zum Beispiel wenn der Spieler 20 Kristalle in eine Truhe gelegt hat.
Container=Container
CountContainerHelp=Inhaltsobjekt, in dem Objekte gezaehlt werden.
CountIDHelp=Objekttyp der gezaehlt wird.
AnyID=Beliebig
Count=Anzahl
Interval=Intervall
IntervalHelp=Sequenz wird in regelmaessigem Abstand ausgefuehrt. Der Parameter gibt das Interval in Frames an.
IntervalTime=Anzahl Frames zwischen zwei Ausloesungen.

View File

@ -28,4 +28,14 @@ IDHelp=Definition of object type that triggers this sequence. If nil, any object
ObjectEnterRegionCircle=Object of type enters radius
Condition=Condition
CheckInterval=Check interval
CheckIntervalHelp=Defines the interval in frames at which the condition ist checked.
CheckIntervalHelp=Defines the interval in frames at which the condition ist checked.ObjectCountInContainer=Objektzahl in Container
ObjectCountInContainer=Object count in container
ObjectCountInContainerHelp=Triggered when a minimum number of objects is found in a container. This could for example be when the player put 20 diamonds into a chest.
Container=Container
CountContainerHelp=Container within which objects are counted.
CountIDHelp=Type of object to be counted.
AnyID=Any
Count=Number
Interval=Interval
IntervalHelp=Sequence will be executed in regular interval. The parameter defines the interval in frames.
IntervalTime=Number of frames between executions.