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);
        }
예제 #2
0
 public static bool InstrumentAccessible(Building_MusicalInstrument i, Pawn p)
 {
     if (!i.IsBeingPlayed)
     {
         return(p.CanReserveAndReach(i.InteractionCell, PathEndMode.OnCell, p.NormalMaxDanger()));
     }
     return(false);
 }
예제 #3
0
        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);
        }
예제 #5
0
 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();
         }
     }
 }