/// <summary> /// Reports that the faction member committed a deed. /// </summary> /// <param name="tag">Tag of the deed in the deed template library.</param> /// <param name="target">Target of the deed.</param> public virtual void ReportDeedByActor(FactionMember actor, string tag, FactionMember target) { if (actor == null) { Debug.LogWarning("Love/Hate: ReportDeed(" + tag + ") actor is null", this); return; } if (target == null) { Debug.LogWarning("Love/Hate: ReportDeed(" + tag + ") target is null", this); return; } if (deedTemplateLibrary == null) { Debug.LogWarning("Love/Hate: ReportDeed(" + tag + ") no Deed Template Library is assigned", this); return; } DeedTemplate deedTemplate; if (FindDeedTemplate(tag, out deedTemplate)) { var actorPowerLevel = (actor == null) ? 0 : actor.GetPowerLevel(); var deed = Deed.GetNew(deedTemplate.tag, actor.factionID, target.factionID, deedTemplate.impact, deedTemplate.aggression, actorPowerLevel, deedTemplate.traits, deedTemplate.permittedEvaluators); actor.factionManager.CommitDeed(actor, deed, deedTemplate.requiresSight, dimension, deedTemplate.radius); Deed.Release(deed); } }
/// <summary> /// Informs factions that a deed was committed. /// </summary> /// <param name="actor">FactionMember who committed the deed.</param> /// <param name="deed">Deed.</param> /// <param name="requiresSight">If `true`, the deed must be seen to be witnessed.</param> /// <param name="dimension">The world space dimension to use for radius checks.</param> /// <param name="radius">Max distance from position that factions can witness the deed (0=anywhere).</param> public void CommitDeed(FactionMember actor, Deed deed, bool requiresSight, Dimension dimension, float radius) { if (actor == null) { Debug.LogError("Love/Hate: CommitDeed actor is null", this); return; } if (deed == null) { Debug.LogError("Love/Hate: CommitDeed deed is null", this); return; } if (debug) { Debug.Log("Love/Hate: CommitDeed(" + deed.tag + ") actor:" + actor.name + " target:" + GetFaction(deed.targetFactionID).name + " impact:" + deed.impact, this); } var enumerator = m_members.GetEnumerator(); // Enumerates manually to avoid garbage. while (enumerator.MoveNext()) { var members = enumerator.Current.Value; for (int i = 0; i < members.Count; i++) { var member = members[i]; if (IsFactionMemberAwake(member, actor) && IsWitnessInRange(member, actor, dimension, radius)) { //---Now queued to distribute across frames: member.WitnessDeed(deed, actor, requiresSight, dimension); m_witnessQueue.Enqueue(WitnessQueueItem.GetNew(deed, member, actor, requiresSight, dimension)); } } } }
/// <summary> /// Witnesses a deed. /// </summary> /// <param name="deed">Deed.</param> /// <param name="actor">Actor who committed deed.</param> /// <param name="requiresSight">If `true`, must be able to see actor to witness deed.</param> /// <param name="dimension">Specifies how to determine line of sight (2D or 3D).</param> public void WitnessDeed(Deed deed, FactionMember actor, bool requiresSight, Dimension dimension = Dimension.Is3D) { if (!FindResources()) { return; } if (!requiresSight || CanSee(actor, dimension)) { if (factionManager.debug) { Debug.Log(string.Format("Love/Hate: " + name + ".WitnessDeed actor:" + factionManager.GetFaction(deed.actorFactionID).name + " target:" + factionManager.GetFaction(deed.targetFactionID).name + " impact:" + deed.impact), this); } var tempRumor = Rumor.GetNew(deed); tempRumor.confidence = 100; var newRumor = EvaluateRumor(tempRumor, this); Rumor.Release(tempRumor); if (newRumor != null) { ExecuteEvents.Execute <IWitnessDeedEventHandler>(gameObject, null, (x, y) => x.OnWitnessDeed(newRumor)); if (!newRumor.memorable) { Rumor.Release(newRumor); } } } }
public static Rumor GetNew(Deed deed) { var rumor = GetNew(); rumor.AssignDeed(deed); return(rumor); }
/// <summary> /// Informs factions that a deed was committed. /// </summary> /// <param name="actor">FactionMember who committed the deed.</param> /// <param name="deed">Deed.</param> /// <param name="requiresSight">If `true`, the deed must be seen to be witnessed.</param> /// <param name="dimension">The world space dimension to use for radius checks.</param> /// <param name="radius">Max distance from position that factions can witness the deed (0=anywhere).</param> public static void CommitDeed(FactionMember actor, Deed deed, bool requiresSight, Dimension dimension, float radius) { if (factionManager) { factionManager.CommitDeed(actor, deed, requiresSight, dimension, radius); } }
public static void Release(WitnessQueueItem item) { if (item == null) { return; } Deed.Release(item.deed); pool.Release(item); }
/// <summary> /// Releases a deed object back to the pool. /// </summary> /// <param name="deed">Deed.</param> public static void Release(Deed deed) { if (deed == null) { return; } deed.refCount--; if (deed.refCount <= 0) { pool.Release(deed); } }
public void AssignDeed(Deed deed) { Clear(); deedGuid = deed.guid; tag = deed.tag; actorFactionID = deed.actorFactionID; targetFactionID = deed.targetFactionID; impact = deed.impact; aggression = deed.aggression; actorPowerLevel = deed.actorPowerLevel; Traits.Copy(deed.traits, ref traits); }
public static WitnessQueueItem GetNew(Deed deed, FactionMember witness, FactionMember actor, bool requiresSight, Dimension dimension) { var item = pool.Get(); if (deed != null) { deed.refCount++; } item.deed = deed; item.witness = witness; item.actor = actor; item.requiresSight = requiresSight; item.dimension = dimension; return(item); }
/// <summary> /// Commits the deed. This version has no distance restrictions. /// </summary> /// <param name="actor">Actor.</param> /// <param name="deed">Deed.</param> /// <param name="requiresSight">If set to <c>true</c> requires sight.</param> public void CommitDeed(FactionMember actor, Deed deed, bool requiresSight) { CommitDeed(actor, deed, requiresSight, Dimension.Is3D, 0); }