Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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));
                    }
                }
            }
        }
Exemplo n.º 3
0
 /// <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);
             }
         }
     }
 }
Exemplo n.º 4
0
        public static Rumor GetNew(Deed deed)
        {
            var rumor = GetNew();

            rumor.AssignDeed(deed);
            return(rumor);
        }
Exemplo n.º 5
0
 /// <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);
     }
 }
Exemplo n.º 6
0
 public static void Release(WitnessQueueItem item)
 {
     if (item == null)
     {
         return;
     }
     Deed.Release(item.deed);
     pool.Release(item);
 }
Exemplo n.º 7
0
 /// <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);
     }
 }
Exemplo n.º 8
0
 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);
 }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
 /// <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);
 }