Exemplo n.º 1
0
        protected override void _Process(dynamic incomingData, Action <IFlowResult> callBack)
        {
            var sacrificeType = (incomingData as Sacrifice)?.Type;

            ConsoleAccessor.WriteLine($"The {sacrificeType} has been sacrificed, and the ritual has begun. Now, speak!");
            ConsoleAccessor.Write("-> ");

            var input = ConsoleAccessor.Read();

            bool satanPleased;

            if (string.IsNullOrEmpty(input))
            {
                ConsoleAccessor.WriteLine("Satan responds: \"Insolent wretch!\"");
                satanPleased = false;
            }
            else if (input == "Hail, Satan!")
            {
                ConsoleAccessor.WriteLine("Satan responds: \"Your master is pleased, vassal.\"");
                satanPleased = true;
            }
            else
            {
                ConsoleAccessor.WriteLine("Satan responds: \"Begone, whelp!\"");
                satanPleased = sacrificeType == SacrificeType.Human;
            }

            var ritualResult = new RitualResult
            {
                SoulIntact = satanPleased
            };

            callBack(new FlowResult(ritualResult));
        }
	/// <summary>
	/// Call this when an object is interacted to see what happens with the ritual
	/// </summary>
	/// <returns><c>true</c>, if a ritual is in progress or completed after the interaction, <c>false</c> otherwise.</returns>
	/// <param name="objectNumber">object number 0..objectCount-1</param>
	/// <param name="interactionNumber">interaction number 0..interactionCount-1</param>
	public bool InteractWithObject(int objectNumber, int interactionNumber)
	{
		// Check to see if this interaction is the next step in the current ritual
		if (currentInternalRitualIndex >= 0)
		{
			var currentRitual = rituals[currentInternalRitualIndex];
			if (objectNumber == currentRitual.objects[currentRitualProgress.currentSteps]
			    && interactionNumber == currentRitual.interactions[currentRitualProgress.currentSteps])
			{
				++currentRitualProgress.currentSteps;
				if (currentRitualProgress.currentSteps >= currentRitual.objects.Count)
				{
					// Ritual complete!
					RitualResult result = new RitualResult();
					result.isDud = currentRitual.isDud;
					result.ritualNumber = currentRitual.ritualNumber;
					completedRitualMessages.Add(result);

                    lastCompletedRitual = currentRitual.ritualNumber;

                    // start working on another
                    currentInternalRitualIndex = -1;
				}
				// We made progress, so return true
				return true;
			}
			else
			{
                return false;
				// Not the current ritual, cancel it
                // dont' cancel rituals anymore,  you gotta finish it
				//currentInternalRitualIndex = -1;
			}
		}

		// Find a ritual that starts with this interaction
		for (int i = 0; i < rituals.Count; ++i)
		{
			var currentRitual = rituals[i];
			if (objectNumber == currentRitual.objects[0]
			    && interactionNumber == currentRitual.interactions[0])
			{
				// it's this ritual!
				currentInternalRitualIndex = i;

				currentRitualProgress.isDud = currentRitual.isDud;
				currentRitualProgress.ritualNumber = currentRitual.ritualNumber;
				currentRitualProgress.currentSteps = 1;
				currentRitualProgress.requiredSteps = currentRitual.objects.Count;

				return true;
			}
		}                        

		currentRitualProgress.isDud = true;
		currentRitualProgress.ritualNumber = -1;
		currentRitualProgress.currentSteps = -1;
		currentRitualProgress.requiredSteps = -1;

		return false;
	}