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; }
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; }
/// <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; }
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; }
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; }