public override bool Test(Sim a, InventionWorkbench target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback) { if (target.InUse || target.mIsMakingFrankensim) { return(false); } if (target.mInventionProgress > 0) { if (!a.SkillManager.GetSkill <InventingSkill>(SkillNames.Inventing).KnownInventions.Contains(target.mInventionKey)) { return(false); } } return(true); }
public override bool Run() { try { if (Target == null) { return(false); } if (!Target.RouteToWorkbench(Actor)) { return(false); } mInventSkill = Actor.SkillManager.AddElement(SkillNames.Inventing) as InventingSkill; bool flag = Target.mInventionProgress > 0f; Definition interactionDefinition = InteractionDefinition as Definition; mMakeMany = true; if (flag) { string mInventionKey = Target.mInventionKey; if (!InventingSkill.kInventionDataMap.TryGetValue(mInventionKey, out mCurData)) { return(false); } if (Target.mDummyModel == null) { Target.ScrapCurrentInvention(); return(false); } } else { if (Target.mDummyModel != null) { Target.CleanupDummyModel(); } List <string> choices = new List <string>(mInventSkill.KnownInventions); bool success = false; while (choices.Count > 0) { string choice = RandomUtil.GetRandomObjectFromList(choices); choices.Remove(choice); if (InventingSkill.kInventionDataMap.TryGetValue(choice, out mCurData)) { if (mCurData.InventType == InventionType.Toy) { mIsCheapToy = RandomUtil.CoinFlip(); } if (!Target.ReserveScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor, mScrapList)) { if (mIsCheapToy) { continue; } mIsCheapToy = true; if (!Target.ReserveScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor, mScrapList)) { continue; } } success = true; break; } } if (!success) { return(false); } Target.mInventionKey = mCurData.MedatorName; Target.mInventionProgress = 0f; Target.mIsMakingCheapToy = mIsCheapToy; if (!Target.ConsumeScrap(mScrapList)) { ShowOutOfScrapTNS(); return(false); } } if (Target.mWasFinishedByGnome) { ShowGnomeFinishedInventionTNS(); } StandardEntry(); StartStages(); mTimeUntilModelSwap = GetTimeForNextModelChange(); EnterStateMachine("WorkbenchInvention", "Enter", "x", "workstation"); if (Actor.SimDescription.Child) { mStool = GlobalFunctions.CreateObjectOutOfWorld("ChildStool") as GameObject; SetActor("stool", mStool); } SetParameter("shouldSwipe", !flag); SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill)); if (!flag) { AddSynchronousOneShotScriptEventHandler(0x67, new SacsEventHandler(OnAnimationEvent)); } mTotalTime = GetTimeToCompletion(); AnimateSim("Loop Invent"); BeginCommodityUpdates(); bool succeeded = false; try { if (Actor.SimDescription.TeenOrAbove) { Actor.SkillManager.StartGainWithoutSkillMeter(SkillNames.Handiness, InventionWorkbench.kHandinessSkillGainRateDuringMake, true); } succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), new Interaction <Sim, InventionWorkbench> .InsideLoopFunction(MakeLoopCallback), mCurrentStateMachine); } finally { if (Actor.SimDescription.TeenOrAbove) { Actor.SkillManager.StopSkillGain(SkillNames.Handiness); } EndCommodityUpdates(succeeded); } if ((Target.mInventionProgress == 0f) && (Target.mDummyModel != null)) { Target.mDummyModel.FadeOut(false, true); Target.mDummyModel = null; } AnimateSim("Exit"); StandardExit(); return(succeeded); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
public new void MakeLoopCallback(StateMachineClient smc, Interaction <Sim, InventionWorkbench> .LoopData ld) { try { Target.mInventionProgress += ld.mDeltaTime / mTotalTime; if (Target.mInventionProgress >= 1f) { AddSynchronousOneShotScriptEventHandler(0x65, new SacsEventHandler(OnAnimationEvent)); AnimateSim("Swipe"); if (mMakeMany) { if (!Target.ConsumeScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor)) { ShowOutOfScrapTNS(); Actor.AddExitReason(ExitReason.Finished); } else { AddSynchronousOneShotScriptEventHandler(0x67, new SacsEventHandler(OnAnimationEvent)); SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill)); AnimateSim("Loop Invent"); mFinalModelShown = false; mTimeUntilModelSwap = GetTimeForNextModelChange(); } } else { Actor.AddExitReason(ExitReason.Finished); } } else if (!mFinalModelShown) { if (Target.mInventionProgress >= InventionWorkbench.kShowFinalModelPercent) { string miniModelName = mCurData.MiniModelName; ProductVersion prodVersion = mCurData.ProdVersion; Slot finalModelSlot = mCurData.FinalModelSlot; if (Target.mDummyModel == null) { Actor.AddExitReason(ExitReason.Finished); } else { Target.mDummyModel.UnParent(); Target.mDummyModel.ParentToSlot(Target, finalModelSlot); Target.mDummyModel.SetModel(miniModelName, prodVersion); mFinalModelShown = true; } } else { mTimeUntilModelSwap -= ld.mDeltaTime; if (mTimeUntilModelSwap <= 0f) { Target.SwapToRandomDummyGeoState(false); mTimeUntilModelSwap = GetTimeForNextModelChange(); } } } } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); } }
public override bool Test(Sim a, InventionWorkbench target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback) { if (target.InUse || target.mIsMakingFrankensim) { return false; } if (target.mInventionProgress > 0) { if (!a.SkillManager.GetSkill<InventingSkill>(SkillNames.Inventing).KnownInventions.Contains(target.mInventionKey)) { return false; } } return true; }
public override bool Run() { try { if (!Target.RouteToWorkbench(Actor)) { return(false); } mMakeFemale = Target.mIsMakingFemaleFrankensim; mInventSkill = Actor.SkillManager.AddElement(SkillNames.Inventing) as InventingSkill; bool flag = Target.mInventionProgress > 0f; if (!flag) { Definition interactionDefinition = InteractionDefinition as Definition; mMakeFemale = interactionDefinition.MakeFemale; Target.mIsMakingFemaleFrankensim = mMakeFemale; ConsumeIngredients(); } StandardEntry(); Target.mIsMakingFrankensim = true; Target.mFrankenSimInventorSimId = Actor.SimDescription.SimDescriptionId; StartStages(); mTimeUntilModelSwap = GetTimeForNextModelChange(); EnterStateMachine("WorkbenchInvention", "Enter", "x", "workstation"); SetParameter("shouldSwipe", !flag); SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill)); if (!flag) { AddSynchronousOneShotScriptEventHandler(0x67, OnAnimationEvent); } mTotalTime = GetTimeToCompletion(); AnimateSim("Loop Invent"); BeginCommodityUpdates(); if (Actor.SimDescription.TeenOrAbove) { Actor.SkillManager.StartGainWithoutSkillMeter(SkillNames.Handiness, InventionWorkbench.kHandinessSkillGainRateDuringMake, true); } bool succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), MakeLoopCallback, mCurrentStateMachine); if (Actor.SimDescription.TeenOrAbove) { Actor.SkillManager.StopSkillGain(SkillNames.Handiness); } EndCommodityUpdates(succeeded); AnimateSim("Exit"); if (!mRecipeKnown && !Actor.OpportunityManager.HasOpportunity(OpportunityNames.EP2_SkillInventing_Frankensim4)) { Target.ScrapCurrentInvention(); } if (Target.mInventionProgress >= 1f) { Sims3.Gameplay.Gameflow.SetGameSpeed(Sims3.Gameplay.Gameflow.GameSpeed.Normal, Sims3.Gameplay.Gameflow.SetGameSpeedContext.Gameplay); RouteAwayFromTable(); Target.mDummyModel.UnParent(); Target.mDummyModel.Destroy(); Target.mDummyModel = null; Target.mInventionProgress = 0f; Target.mIsMakingFrankensim = false; Target.mFrankenSimInventorSimId = 0x0L; Target.mIsMakingFemaleFrankensim = false; Target.mWasFinishedByGnome = false; Target.mIsMakingCheapToy = false; CASAgeGenderFlags gender = mMakeFemale ? CASAgeGenderFlags.Female : CASAgeGenderFlags.Male; mFrankensim = OccultFrankenstein.CreateFrankenStein(Actor, gender); mFrankensim.FadeOut(false, false, 0f); mFrankensim.GreetSimOnLot(Target.LotCurrent); mFrankensim.SetPosition(Target, Slot.RoutingSlot_1); mFrankensim.SetForward((Vector3)(Slots.GetForwardOfSlot(Target.ObjectId, Slot.RoutingSlot_1) * -1f)); mFrankensim.AddToWorld(); InventingSkill skill = Actor.SkillManager.GetSkill <InventingSkill>(SkillNames.Inventing); if (!skill.OppKnowFrankensimRecipeCompleted) { EventTracker.SendEvent(EventTypeId.kDiscoveredNewInvention, Actor, mFrankensim); } mCurrentStateMachine = StateMachineClient.Acquire(mFrankensim, "WorkbenchFrankensim", AnimationPriority.kAPDefault); SetActor("workstation", Target); SetActor("x", mFrankensim); SetActor("y", Actor); AddSynchronousOneShotScriptEventHandler(0x65, OnAnimationEvent); EnterState("x", "Enter"); AnimateSim("Exit"); AdoptFrankenSim(Actor, mFrankensim); skill.KnowsFrankensimRecipe = true; skill.TestForNewLifetimeOpp(); EventTracker.SendEvent(EventTypeId.kFrankensimLearned, Actor); } StandardExit(); return(succeeded); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
protected override bool PrivateUpdate(ScenarioFrame frame) { base.PrivateUpdate(frame); InventingSkill skill = Sim.SkillManager.GetElement(SkillNames.Inventing) as InventingSkill; List <InventionWorkbench> benches = new List <InventionWorkbench>(); List <InventionWorkbench> empties = new List <InventionWorkbench>(); foreach (Lot lot in ManagerLot.GetOwnedLots(Sim)) { foreach (InventionWorkbench bench in lot.GetObjects <InventionWorkbench>()) { if (bench.InUse) { continue; } if (bench.mIsMakingFrankensim) { continue; } if (bench.mInventionProgress > 0) { if (skill == null) { continue; } if (!skill.KnownInventions.Contains(bench.mInventionKey)) { continue; } benches.Add(bench); } else { empties.Add(bench); } } } if (benches.Count == 0) { benches.AddRange(empties); if (benches.Count == 0) { IncStat("No Bench"); return(false); } } int minimumScrap = InventionWorkbench.kNumScrapsPerDiceRoll * 10; int inventoryScrap = Inventories.InventoryFindAll <Scrap>(Sim).Count; if (inventoryScrap < minimumScrap) { List <JunkPile> piles = new List <JunkPile>(); foreach (JunkPile pile in Sims3.Gameplay.Queries.GetObjects <JunkPile>()) { if (pile.IsEmpty) { continue; } if (pile.LotCurrent == Sim.LotHome) { piles.Add(pile); } else if (pile.LotCurrent == null) { continue; } else if (pile.LotCurrent.IsCommunityLot) { piles.Add(pile); } } bool success = false; while (piles.Count > 0) { JunkPile junkChoice = RandomUtil.GetRandomObjectFromList(piles); piles.Remove(junkChoice); if (!Situations.PushInteraction(this, Sim, junkChoice, DigThroughEx.Singleton)) { break; } IncStat("Push Dig Through"); success = true; } if (!success) { Money.AdjustFunds(Sim, "BuyItem", -InventionWorkbench.Restock.GetScrapCost(minimumScrap - inventoryScrap)); AddStat("Buy Scrap", minimumScrap - inventoryScrap); CreateScrap(Sim.CreatedSim, minimumScrap - inventoryScrap); } else { return(true); } } InventionWorkbench choice = RandomUtil.GetRandomObjectFromList(benches); if (choice.mInventionProgress > 0) { IncStat("Try Continue"); if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton)) { return(true); } IncStat("Continue Fail"); return(false); } else { if ((skill != null) && (skill.GetUndiscoveredInventions().Count == 0x0) && (skill.ReachedMaxLevel())) { IncStat("Try Start New"); if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton)) { return(true); } IncStat("Start New Fail"); return(false); } else { if ((skill == null) || (skill.KnownInventions.Count == 0) || (RandomUtil.RandomChance(25))) { IncStat("Try Invent"); if (Situations.PushInteraction(this, Sim, choice, new InventionWorkbench.Invent.Definition())) { return(true); } IncStat("Invent Fail"); return(false); } else { IncStat("Try Start New"); if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton)) { return(true); } IncStat("Start New Fail"); return(false); } } } }