public bool TryFindChairNear(CompMusicSpot spot, Pawn sitter, out Thing chair) { IntVec3 center = spot.parent.Position; CompMusicalInstrument comp = spot.parent.TryGetComp <CompMusicalInstrument>(); for (int i = 0; i < RadialPatternMiddleOutward.Count; i++) { IntVec3 c = center + RadialPatternMiddleOutward[i]; if (comp != null && comp.Props.isBuilding && c == comp.parent.InteractionCell) { continue; } Building edifice = c.GetEdifice(map); if (edifice != null && edifice.def.building.isSittable && sitter.CanReserveAndReach(edifice, PathEndMode.OnCell, Danger.None) && !edifice.IsForbidden(sitter) && GenSight.LineOfSight(center, edifice.Position, map, skipFirstCell: true)) { chair = edifice; return(true); } } chair = null; return(false); }
public static float GetMusicQuality(Pawn musician, Thing instrument, int?luck = null) { if (musician == null || instrument == null) { return(0f); } int artSkill = musician.skills.GetSkill(SkillDefOf.Artistic).Level; int luckActual; if (luck.HasValue) { luckActual = luck.Value; } else { JobDriver driver = musician.jobs.curDriver; luckActual = (driver != null && driver is JobDriver_MusicPlayBase ? ((JobDriver_MusicPlayBase)driver).Luck : 0); } bool isInspired = musician.Inspired ? musician.Inspiration.def == InspirationDefOf.Inspired_Creativity : false; QualityCategory instrumentQuality = QualityCategory.Normal; instrument.TryGetQuality(out instrumentQuality); float instrumentCondition = (float)instrument.HitPoints / instrument.MaxHitPoints; CompMusicalInstrument instrumentComp = instrument.TryGetComp <CompMusicalInstrument>(); float easiness = instrumentComp.Props.easiness; float expressiveness = instrumentComp.Props.expressiveness; float quality = (easiness + (expressiveness * ((artSkill + luckActual + (isInspired ? 0 : -3)) / 5.0f))) * ((float)instrumentQuality / 3.0f + 0.1f) * instrumentCondition; return(quality - 0.3f); }
public bool TryFindStandingSpotOrChair(CompMusicSpot musicSpot, Pawn musician, Thing instrument, out LocalTargetInfo target) { IntVec3 standingSpot; Thing chair; target = null; PerformanceManager pm = musician.Map.GetComponent <PerformanceManager>(); CompMusicalInstrument comp = instrument.TryGetComp <CompMusicalInstrument>(); if (comp.Props.isBuilding) { if (pm.TryFindChairAt(comp, musician, out chair)) { target = chair; return(true); } else if (pm.TryFindSpotAt(comp, musician, out standingSpot)) { target = standingSpot; return(true); } } else { if (pm.TryFindSitSpotOnGroundNear(musicSpot, musician, out standingSpot)) { target = standingSpot; return(true); } } return(false); }
public bool TryFindSpotAt(CompMusicalInstrument instrument, Pawn sitter, out IntVec3 result) { result = IntVec3.Invalid; if (!instrument.Props.isBuilding) { return(false); } IntVec3 intVec = instrument.parent.InteractionCell; if (sitter.CanReserveAndReach(intVec, PathEndMode.OnCell, Danger.None, 1, -1, null, false) && intVec.GetEdifice(map) == null) { result = intVec; return(true); } return(false); }
public bool TryFindChairAt(CompMusicalInstrument instrument, Pawn sitter, out Thing chair) { chair = null; if (!instrument.Props.isBuilding) { return(false); } Building edifice = instrument.parent.InteractionCell.GetEdifice(map); if (edifice != null && edifice.def.building.isSittable && sitter.CanReserveAndReach(edifice, PathEndMode.OnCell, Danger.None) && !edifice.IsForbidden(sitter)) { chair = edifice; return(true); } return(false); }
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Hearing) || !pawn.Awake() || pawn.WorkTagIsDisabled(WorkTags.Artistic)) { return(false); } PerformanceManager pm = pawn.Map.GetComponent <PerformanceManager>(); if (!pm.CanPlayForWorkNow(pawn)) { return(false); } CompMusicSpot compMusicSpot = t.TryGetComp <CompMusicSpot>(); CompMusicalInstrument instrumentComp = t.TryGetComp <CompMusicalInstrument>(); CompPowerTrader powerComp = t.TryGetComp <CompPowerTrader>(); if (compMusicSpot == null) { return(false); } if (!compMusicSpot.Active || instrumentComp == null) { return(false); } IntVec3 standingSpot; if (!pm.TryFindSitSpotOnGroundNear(compMusicSpot, pawn, out standingSpot)) { return(false); } Thing instrument; LocalTargetInfo chairOrSpot = null; if (forced && instrumentComp != null && instrumentComp.Props.isBuilding && pawn.CanReserveAndReach(t, PathEndMode.Touch, Danger.None) && (powerComp == null || powerComp.PowerOn)) { if (!pm.TryFindStandingSpotOrChair(compMusicSpot, pawn, t, out chairOrSpot)) { return(false); } } else if (pm.TryFindInstrumentToPlay(compMusicSpot.parent, pawn, out instrument, true)) { #if DEBUG Verse.Log.Message(String.Format("{0} chose to play {1}", pawn.LabelShort, instrument.LabelShort)); #endif if (!pm.TryFindStandingSpotOrChair(compMusicSpot, pawn, instrument, out chairOrSpot)) { return(false); } } else { return(false); } return(true); }
public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) { //Verse.Log.Message(String.Format("Trying to play at {0}", thing.Label)); if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Hearing) || !pawn.Awake() || pawn.WorkTagIsDisabled(WorkTags.Artistic)) { return(null); } PerformanceManager pm = pawn.Map.GetComponent <PerformanceManager>(); if (!pm.CanPlayForWorkNow(pawn)) { return(null); } CompMusicSpot compMusicSpot = thing.TryGetComp <CompMusicSpot>(); if (compMusicSpot == null) { return(null); } if (!compMusicSpot.Active) { return(null); } Job job; IntVec3 standingSpot; if (!pm.TryFindSitSpotOnGroundNear(compMusicSpot, pawn, out standingSpot)) { return(null); } job = new Job(JobDefOf_MusicPlayWork.MusicPlayWork, compMusicSpot.parent); //, standingSpot); Thing instrument; CompMusicSpot musicSpotComp = thing.TryGetComp <CompMusicSpot>(); CompMusicalInstrument instrumentComp = thing.TryGetComp <CompMusicalInstrument>(); CompPowerTrader powerComp = thing.TryGetComp <CompPowerTrader>(); LocalTargetInfo chairOrSpot = null; if (forced && instrumentComp != null && instrumentComp.Props.isBuilding && pawn.CanReserveAndReach(thing, PathEndMode.Touch, Danger.None) && (powerComp == null || powerComp.PowerOn)) { if (!pm.TryFindStandingSpotOrChair(musicSpotComp, pawn, thing, out chairOrSpot)) { return(null); } job.targetB = chairOrSpot; job.targetC = thing; } else if (pm.TryFindInstrumentToPlay(compMusicSpot.parent, pawn, out instrument, true)) { #if DEBUG Verse.Log.Message(String.Format("{0} chose to play {1}", pawn.LabelShort, instrument.LabelShort)); #endif if (!pm.TryFindStandingSpotOrChair(musicSpotComp, pawn, instrument, out chairOrSpot)) { return(null); } job.targetB = chairOrSpot; job.targetC = instrument; } else { #if DEBUG Verse.Log.Message(String.Format("{0} couldn't find an instrument", pawn.LabelShort)); #endif return(null); } job.count = 1; return(job); }