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); }
public static bool InstrumentAccessible(Building_MusicalInstrument i, Pawn p) { if (!i.IsBeingPlayed) { return(p.CanReserveAndReach(i.InteractionCell, PathEndMode.OnCell, p.NormalMaxDanger())); } return(false); }
protected override ThoughtState CurrentStateInternal(Pawn p) { ThingDef def = InstrumentDef; return(GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(def), PathEndMode.ClosestTouch, TraverseParms.For(p), def.building.instrumentRange, delegate(Thing thing) { Building_MusicalInstrument building_MusicalInstrument = thing as Building_MusicalInstrument; return building_MusicalInstrument != null && building_MusicalInstrument.IsBeingPlayed && Building_MusicalInstrument.IsAffectedByInstrument(def, building_MusicalInstrument.Position, p.Position, p.Map); }) != null); }
public override AcceptanceReport AllowsPlacing(BuildableDef checkingDef, IntVec3 loc, Rot4 rot, Map map, Thing thingToIgnore = null, Thing thing = null) { ThingDef thingDef = (ThingDef)checkingDef; tmpCells.Clear(); int num = GenRadial.NumCellsInRadius(thingDef.building.instrumentRange); for (int i = 0; i < num; i++) { IntVec3 intVec = loc + GenRadial.RadialPattern[i]; if (Building_MusicalInstrument.IsAffectedByInstrument(thingDef, loc, intVec, map)) { tmpCells.Add(intVec); } } GenDraw.DrawFieldEdges(tmpCells); return(true); }
public void MusicUpdate() { if (!gameObjectCreated) { gameObjectCreated = true; GameObject gameObject = new GameObject("MusicAudioSourceDummy"); gameObject.transform.parent = Find.Root.soundRoot.sourcePool.sourcePoolCamera.cameraSourcesContainer.transform; audioSource = gameObject.AddComponent <AudioSource>(); audioSource.bypassEffects = true; audioSource.bypassListenerEffects = true; audioSource.bypassReverbZones = true; audioSource.priority = 0; } UpdateSubtleAmbienceSoundVolumeMultiplier(); if (disabled) { return; } if (songWasForced) { state = MusicManagerState.Normal; fadeoutFactor = 1f; } if (audioSource.isPlaying && !songWasForced && ((DangerMusicMode && !lastStartedSong.tense) || (!DangerMusicMode && lastStartedSong.tense))) { state = MusicManagerState.Fadeout; } audioSource.volume = CurSanitizedVolume; if (audioSource.isPlaying) { if (state == MusicManagerState.Fadeout) { fadeoutFactor -= Time.deltaTime / 10f; if (fadeoutFactor <= 0f) { audioSource.Stop(); state = MusicManagerState.Normal; fadeoutFactor = 1f; } } Map currentMap = Find.CurrentMap; if (currentMap != null && !WorldRendererUtility.WorldRenderedNow) { float num = 1f; Camera camera = Find.Camera; List <Thing> list = currentMap.listerThings.ThingsInGroup(ThingRequestGroup.MusicalInstrument); for (int i = 0; i < list.Count; i++) { Building_MusicalInstrument building_MusicalInstrument = (Building_MusicalInstrument)list[i]; if (building_MusicalInstrument.IsBeingPlayed) { Vector3 vector = camera.transform.position - building_MusicalInstrument.Position.ToVector3Shifted(); vector.y = Mathf.Max(vector.y - 15f, 0f); vector.y *= 3.5f; float magnitude = vector.magnitude; FloatRange soundRange = building_MusicalInstrument.SoundRange; float num2 = Mathf.Min(Mathf.Max(magnitude - soundRange.min, 0f) / (soundRange.max - soundRange.min), 1f); if (num2 < num) { num = num2; } } } instrumentProximityFadeFactor = num; } else { instrumentProximityFadeFactor = 1f; } } else { if (DangerMusicMode && nextSongStartTime > CurTime + SongIntervalTension.max) { nextSongStartTime = CurTime + SongIntervalTension.RandomInRange; } if (nextSongStartTime < CurTime - 5f) { float num3 = (!DangerMusicMode) ? SongIntervalRelax.RandomInRange : SongIntervalTension.RandomInRange; nextSongStartTime = CurTime + num3; } if (CurTime >= nextSongStartTime) { ignorePrefsVolumeThisSong = false; StartNewSong(); } } }