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; }
public ChamberState Clear() { var returnedState = state; State = ChamberState.Empty; return(returnedState); }
/// <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); }
/// <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; }
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; }
private void ResetChamber() { FillableDrawer?.Clear(); SelectorComp.Enabled = false; _innerState = ChamberState.WaitingForPawn; _currentUse = ChamberUse.Tf; _addedMutationData = null; _curMutationIndex = -1; }
/// <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; } }
private void AnimalChosen(PawnKindDef pawnkinddef) { _timer = GetTransformationTime(pawnkinddef); _lastTotal = _timer; _innerState = ChamberState.Active; _currentUse = ChamberUse.Tf; _targetAnimal = pawnkinddef; SetActive(); SelectorComp.Enabled = false; }
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); }
/// <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; }
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; } } }
public bool Fire() { switch (state) { case ChamberState.Round: State = ChamberState.Case; if (OnShotFired != null) { OnShotFired(); } Debug.Log("Shot fired."); return(true); default: return(false); } }
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; }
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; }
/// <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); }
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; }
private void EnterMergingIdle() { _innerState = ChamberState.WaitingForPawnMerging; _currentUse = ChamberUse.Merge; SelectorComp.Enabled = false; }