public void Interact(Entity.Entity entitySource, Entity.Entity entityTarget, Random random) { lock (_interLock) { //do not interact if both already interacting if (entitySource.State == EntityState.Talking && entityTarget.State == EntityState.Talking) { return; } //do not interact if social latency is not elapsed if (entitySource.Social.CurrentSocialLatency < entitySource.Social.SocialLatencyThreshold || entityTarget.Social.CurrentSocialLatency < entityTarget.Social.SocialLatencyThreshold) { return; } float interactProbability = entitySource.Social.NeedForSociability * entityTarget.Social.Charisma; float interactionIntensity = (float)(interactProbability - random.NextDouble()); bool willInteract = interactionIntensity > 0; _logger.Log($"Entity {entitySource.Id} & Entity {entityTarget.Id} will interact = {willInteract}"); if (willInteract) { _logger.Log($"Entity {entitySource.Id} & Entity {entityTarget.Id} interact intensity = {interactionIntensity}"); entitySource.State = entityTarget.State = EntityState.Talking; entitySource.RegisterCurrentMovement(); entityTarget.RegisterCurrentMovement(); entitySource.MovementType = entityTarget.MovementType = MovementType.Stopped; Interaction i = new Interaction(entitySource, entityTarget, interactionIntensity); _interactions.Add(i.InteractionId, i); i.InteractionEnded += EndInteraction; _logger.Log($"Entity {entitySource.Id} & Entity {entityTarget.Id} are interacting"); } } }