Ejemplo n.º 1
0
        private void StartMerging()
        {
            ThingDef merge = ChaomorphUtilities.GetRandomChaomorph(ChaomorphType.Merge);

            if (merge == null)
            {
                Log.Error("unable to get random merge, instead generating chaomorph!");
                merge = ChaomorphUtilities.GetRandomChaomorph(ChaomorphType.Chaomorph);
            }

            _targetAnimal = DefDatabase <PawnKindDef> .AllDefs.FirstOrDefault(pk => pk.race == merge);

            if (_targetAnimal == null)
            {
                Log.Error($"unable to find pawnkind def for {merge.defName}! aborting!");
                EjectContents();
                return;
            }

            _timer               = GetTransformationTime(_targetAnimal);
            _lastTotal           = _timer;
            _innerState          = ChamberState.Active;
            _currentUse          = ChamberUse.Merge;
            SelectorComp.Enabled = false;
        }
Ejemplo n.º 2
0
    public ChamberState Clear()
    {
        var returnedState = state;

        State = ChamberState.Empty;
        return(returnedState);
    }
Ejemplo n.º 3
0
        /// <summary>
        ///     tries to accept a new thing into this chamber
        /// </summary>
        /// <param name="thing"></param>
        /// <param name="allowSpecialEffects"></param>
        /// <returns></returns>
        public override bool TryAcceptThing(Thing thing, bool allowSpecialEffects = true)
        {
            if (base.TryAcceptThing(thing, allowSpecialEffects))
            {
                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (_innerState)
                {
                case ChamberState.WaitingForPawn:
                    _innerState          = ChamberState.Idle;
                    SelectorComp.Enabled = true;
                    break;

                case ChamberState.WaitingForPawnMerging:
                    _innerState = ChamberState.Active;
                    StartMerging();
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_innerState), _innerState.ToString());
                }

                return(true);
            }

            return(false);
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Notifies this instance that it is merging
 /// </summary>
 /// <param name="isMasterChamber">if set to <c>true</c> this instance is the master chamber.</param>
 public void NotifyMerging(bool isMasterChamber)
 {
     if (_state != ChamberState.Transforming)
     {
         Log.Warning($"Mutagenic chamber is merging when it isn't transforming already!");
     }
     _state = isMasterChamber ? ChamberState.MergeInto : ChamberState.MergeOutOf;
 }
Ejemplo n.º 5
0
 private void AnimalChosen(PawnKindDef pawnkinddef)
 {
     _timer               = GetTransformationTime(pawnkinddef); //TODO make this dependent on the animal chosen
     _lastTotal           = _timer;
     _innerState          = ChamberState.Active;
     _currentUse          = ChamberUse.Tf;
     _targetAnimal        = pawnkinddef;
     SelectorComp.Enabled = false;
 }
Ejemplo n.º 6
0
 private void ResetChamber()
 {
     FillableDrawer?.Clear();
     SelectorComp.Enabled = false;
     _innerState          = ChamberState.WaitingForPawn;
     _currentUse          = ChamberUse.Tf;
     _addedMutationData   = null;
     _curMutationIndex    = -1;
 }
Ejemplo n.º 7
0
        /// <summary>
        ///     Ticks this instance.
        /// </summary>
        public override void Tick()
        {
            base.Tick();

            if (!Refuelable.HasFuel)
            {
                return;
            }

            if (_innerState != ChamberState.Active)
            {
                return;
            }
            if (_timer <= 0)
            {
                try
                {
                    EjectPawn();
                }
                catch (Exception e)
                {
                    Log.Error($"unable to eject pawns from chamber!\ncaught exception {e.GetType().Name}\n{e}");
                }//make sure an exception while ejecting a pawn doesn't put the chamber in a bad state
                _currentUse = ChamberUse.Tf;//this should be the default
                _innerState = ChamberState.WaitingForPawn;
                _timer      = 0;
                return;
            }

            if (PowerCompTrader?.PowerOn == false)
            {
                return;
            }


            if (!Flickable.SwitchIsOn)
            {
                return;
            }
            Refuelable.Notify_UsedThisTick();
            _timer -= 1;
            switch (_currentUse)
            {
            case ChamberUse.Mutation:
                CheckMutationProgress();
                break;

            case ChamberUse.Tf:
                CheckTfMutationProgress();
                break;

            case ChamberUse.Merge:
            default:
                break;
            }
        }
Ejemplo n.º 8
0
        private void AnimalChosen(PawnKindDef pawnkinddef)
        {
            _timer        = GetTransformationTime(pawnkinddef);
            _lastTotal    = _timer;
            _innerState   = ChamberState.Active;
            _currentUse   = ChamberUse.Tf;
            _targetAnimal = pawnkinddef;

            SetActive();

            SelectorComp.Enabled = false;
        }
Ejemplo n.º 9
0
        public override bool TryAcceptThing(Thing thing, bool allowSpecialEffects = true)
        {
            if (base.TryAcceptThing(thing, allowSpecialEffects))
            {
                if (allowSpecialEffects)
                {
                    SoundDefOf.CryptosleepCasket_Accept.PlayOneShot(new TargetInfo(base.Position, base.Map));
                }

                _state = ChamberState.Transforming;
                return(true);
            }
            return(false);
        }
Ejemplo n.º 10
0
        /// <summary>
        ///     Ticks this instance.
        /// </summary>
        public override void Tick()
        {
            base.Tick();

            if (_innerState != ChamberState.Active)
            {
                return;
            }
            if (_timer <= 0)
            {
                try
                {
                    EjectPawn();
                }
                catch (Exception e)
                {
                    Log.Error($"unable to eject pawns from chamber!\ncaught exception {e.GetType().Name}\n{e}");
                }//make sure an exception while ejecting a pawn doesn't put the chamber in a bad state
                _currentUse = ChamberUse.Tf;//this should be the default
                _innerState = ChamberState.WaitingForPawn;
                _timer      = 0;
                return;
            }


            if (!Refuelable.HasFuel)
            {
                if (_hasFuelLast)
                {
                    TryRefillFromTank();
                }
                else if (this.IsHashIntervalTick(REFUEL_CHECK_TIMER))
                {
                    TryRefillFromTank();
                }
                _hasFuelLast = false;
                return;
            }
            else
            {
                _hasFuelLast = true;
            }
            if (!Flickable.SwitchIsOn)
            {
                return;
            }
            Refuelable.Notify_UsedThisTick();
            _timer -= 1;
        }
Ejemplo n.º 11
0
        void CheckState()
        {
            if (innerContainer.Count == 0)
            {
                _state = ChamberState.Idle;
                return;
            }

            if (innerContainer.Count == 1)
            {
                if (modulator?.merging ?? false)
                {
                    _state = modulator.GetLinkedChamber() == this ? ChamberState.MergeInto : ChamberState.MergeOutOf;
                }
            }
        }
Ejemplo n.º 12
0
    public bool Fire()
    {
        switch (state)
        {
        case ChamberState.Round:
            State = ChamberState.Case;
            if (OnShotFired != null)
            {
                OnShotFired();
            }
            Debug.Log("Shot fired.");
            return(true);

        default: return(false);
        }
    }
Ejemplo n.º 13
0
        public override void EjectContents() //should refactor the mutagenic chamber, make it a state machine
        {
            DebugLogUtils.Assert(innerContainer.Count == 1, "innerContainer.Count == 1");

            var pawn = (Pawn)innerContainer[0];

            if (pawn == null)
            {
                Log.Warning($"mutagenic chamber ejecting nothing");

                return;
            }



            if (IsFinished)
            {
                TransformPawn(pawn);
            }
            else
            {
                base.EjectContents();
                if (!Destroyed)
                {
                    SoundDefOf.CryptosleepCasket_Eject.PlayOneShot(SoundInfo.InMap(new TargetInfo(base.Position, base.Map)));
                    fuelComp.ConsumeFuel(fuelComp.Fuel);
                }


                if (_state != ChamberState.MergeOutOf || (linkTo?.daysIn ?? 0) < 1)
                {
                    pawn.health.AddHediff(Hediffs.MorphTransformationDefOf.FullRandomTFAnyOutcome);
                }

                pawn.health.AddHediff(Hediffs.MorphTransformationDefOf.FullRandomTFAnyOutcome);
                if (_state == ChamberState.MergeInto)
                {
                    linkTo?.EjectContents();
                }
            }

            _state = ChamberState.Idle;
            daysIn = 0;
        }
Ejemplo n.º 14
0
        private void WindowClosed(Dialog_PartPicker sender, IReadOnlyAddedMutations addedmutations)
        {
            sender.WindowClosed -= WindowClosed;

            if (_innerState != ChamberState.Idle)
            {
                Log.Message("state is not idle!");

                return;
            }

            if (addedmutations?.Any() != true)
            {
                return;
            }


            _addedMutationData = new AddedMutations(addedmutations);
            _timer             = GetMutationDuration(addedmutations);
            _currentUse        = ChamberUse.Mutation;
            _innerState        = ChamberState.Active;
            SetActive();
            _lastTotal = _timer;
            sender.Reset();

            //remove any mutations left over
            var pawn = innerContainer.FirstOrDefault() as Pawn;

            if (pawn == null)
            {
                return;
            }
            foreach (IReadOnlyMutationData mData in _addedMutationData.Where(m => !m.Removing))
            {
                var hediff =
                    pawn.health?.hediffSet?.hediffs?.FirstOrDefault(h => h.def == mData.Mutation && h.Part == mData.Part) as
                    Hediff_AddedMutation;
                hediff?.MarkForRemoval();
            }

            SelectorComp.Enabled = false;
        }
Ejemplo n.º 15
0
        /// <summary>
        ///     tries to accept a new thing into this chamber
        /// </summary>
        /// <param name="thing"></param>
        /// <param name="allowSpecialEffects"></param>
        /// <returns></returns>
        public override bool TryAcceptThing(Thing thing, bool allowSpecialEffects = true)
        {
            if (base.TryAcceptThing(thing, allowSpecialEffects))
            {
                var p = thing as Pawn;
                if (p == null)
                {
                    Log.Error($"{ThingID} accepted non pawn {p.ThingID}/{p.GetType().Name}! this should never happen");
                    return(true);
                }

                var food = p.needs?.food;
                if (food != null)
                {
                    food.CurLevel = food.MaxLevel;
                }

                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (_innerState)
                {
                case ChamberState.WaitingForPawn:
                    _innerState          = ChamberState.Idle;
                    SelectorComp.Enabled = true;
                    break;

                case ChamberState.WaitingForPawnMerging:
                    _innerState = ChamberState.Active;
                    SetActive();
                    StartMerging();
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_innerState), _innerState.ToString());
                }

                return(true);
            }

            return(false);
        }
Ejemplo n.º 16
0
        private void WindowClosed(Dialog_PartPicker sender, IReadOnlyAddedMutations addedmutations)
        {
            sender.WindowClosed -= WindowClosed;

            if (_innerState != ChamberState.Idle)
            {
                Log.Message("state is not idle!");

                return;
            }

            if (addedmutations?.Any() != true)
            {
                return;
            }

            //TODO get wait time based on number of mutations added/removed
            _timer      = Mathf.RoundToInt(TF_ANIMAL_DURATION * 60000);
            _currentUse = ChamberUse.Mutation;
            _innerState = ChamberState.Active;
            _lastTotal  = _timer;
        }
Ejemplo n.º 17
0
 private void EnterMergingIdle()
 {
     _innerState          = ChamberState.WaitingForPawnMerging;
     _currentUse          = ChamberUse.Merge;
     SelectorComp.Enabled = false;
 }