protected override Job TryGiveJob(Pawn pawn) { if (pawn.mindState.duty == null) { return(null); } LordJob_Joinable_Concert lordJob_Joinable_Concert = pawn.GetLord().LordJob as LordJob_Joinable_Concert; if (lordJob_Joinable_Concert == null || lordJob_Joinable_Concert.Organizer != pawn) { return(null); } IntVec3 gatherSpot = pawn.mindState.duty.focus.Cell; Building_MusicalInstrument building_MusicalInstrument = pawn.Map.listerBuildings.AllBuildingsColonistOfClass <Building_MusicalInstrument>().Where(delegate(Building_MusicalInstrument i) { if (!GatheringsUtility.InGatheringArea(i.InteractionCell, gatherSpot, pawn.Map)) { return(false); } return(GatheringWorker_Concert.InstrumentAccessible(i, pawn) ? true : false); }).RandomElementWithFallback(); if (building_MusicalInstrument != null) { Job job = JobMaker.MakeJob(JobDefOf.Play_MusicalInstrument, building_MusicalInstrument, building_MusicalInstrument.InteractionCell); job.doUntilGatheringEnded = true; job.expiryInterval = lordJob_Joinable_Concert.DurationTicks; return(job); } return(null); }
protected override bool Satisfied(Pawn pawn) { if (pawn.mindState.duty == null) { return(false); } IntVec3 cell = pawn.mindState.duty.focus.Cell; return(GatheringsUtility.InGatheringArea(pawn.Position, cell, pawn.Map)); }
private bool AreFiancesInPartyArea() { if (!lord.ownedPawns.Contains(firstPawn) || !lord.ownedPawns.Contains(secondPawn)) { return(false); } if (firstPawn.Map != base.Map || !GatheringsUtility.InGatheringArea(firstPawn.Position, spot, base.Map)) { return(false); } if (secondPawn.Map != base.Map || !GatheringsUtility.InGatheringArea(secondPawn.Position, spot, base.Map)) { return(false); } return(true); }
public override void LordToilTick() { List <Pawn> ownedPawns = lord.ownedPawns; for (int i = 0; i < ownedPawns.Count; i++) { if (GatheringsUtility.InGatheringArea(ownedPawns[i].Position, spot, base.Map)) { ownedPawns[i].needs.joy.GainJoy(joyPerTick, JoyKindDefOf.Social); if (!Data.presentForTicks.ContainsKey(ownedPawns[i])) { Data.presentForTicks.Add(ownedPawns[i], 0); } Data.presentForTicks[ownedPawns[i]]++; } } }
private Thing FindBestGame(Pawn pawn, bool inBed, IntVec3 gatheringSpot) { tmpCandidates.Clear(); GetSearchSet(pawn, tmpCandidates); if (tmpCandidates.Count == 0) { return(null); } Predicate <Thing> predicate = (Thing t) => CanInteractWith(pawn, t, inBed); if (gatheringSpot.IsValid) { Predicate <Thing> oldValidator = predicate; predicate = ((Thing x) => GatheringsUtility.InGatheringArea(x.Position, gatheringSpot, pawn.Map) && oldValidator(x)); } Thing result = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, tmpCandidates, PathEndMode.OnCell, TraverseParms.For(pawn), 9999f, predicate); tmpCandidates.Clear(); return(result); }
private Thing FindFood(Pawn pawn, IntVec3 gatheringSpot) { Predicate <Thing> validator = delegate(Thing x) { if (!x.IngestibleNow) { return(false); } if (!x.def.IsNutritionGivingIngestible) { return(false); } if (!GatheringsUtility.InGatheringArea(x.Position, gatheringSpot, pawn.Map)) { return(false); } if (x.def.IsDrug) { return(false); } if ((int)x.def.ingestible.preferability <= 4) { return(false); } if (!pawn.WillEat(x)) { return(false); } if (x.IsForbidden(pawn)) { return(false); } if (!x.IsSociallyProper(pawn)) { return(false); } return(pawn.CanReserve(x) ? true : false); }; return(GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.FoodSourceNotPlantOrTree), PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.NoPassClosedDoors), 14f, validator, null, 0, 12)); }
protected override Trigger_TicksPassed GetTimeoutTrigger() { return(new Trigger_TicksPassedAfterConditionMet(base.DurationTicks, () => GatheringsUtility.InGatheringArea(organizer.Position, spot, organizer.Map), 60)); }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); LordToil lordToil = CreateGatheringToil(spot, organizer, gatheringDef); stateGraph.AddToil(lordToil); LordToil_End lordToil_End = new LordToil_End(); stateGraph.AddToil(lordToil_End); float speechDuration = 12500f; Transition transition = new Transition(lordToil, lordToil_End); transition.AddTrigger(new Trigger_TickCondition(ShouldBeCalledOff)); transition.AddTrigger(new Trigger_PawnKilled()); transition.AddTrigger(new Trigger_PawnLost(PawnLostCondition.LeftVoluntarily, organizer)); transition.AddPreAction(new TransitionAction_Custom((Action) delegate { ApplyOutcome((float)lord.ticksInToil / speechDuration); })); stateGraph.AddTransition(transition); timeoutTrigger = new Trigger_TicksPassedAfterConditionMet((int)speechDuration, () => GatheringsUtility.InGatheringArea(organizer.Position, spot, organizer.Map), 60); Transition transition2 = new Transition(lordToil, lordToil_End); transition2.AddTrigger(timeoutTrigger); transition2.AddPreAction(new TransitionAction_Custom((Action) delegate { ApplyOutcome(1f); })); stateGraph.AddTransition(transition2); return(stateGraph); }
public override Job TryGiveJobInGatheringArea(Pawn pawn, IntVec3 gatheringSpot) { return(TryGiveJobInternal(pawn, (Thing x) => !x.Spawned || GatheringsUtility.InGatheringArea(x.Position, gatheringSpot, pawn.Map))); }
public override Job TryGiveJobInGatheringArea(Pawn pawn, IntVec3 gatheringSpot) { return(TryGiveJobInt(pawn, (CompGatherSpot x) => GatheringsUtility.InGatheringArea(x.parent.Position, gatheringSpot, pawn.Map))); }