public Toil TakeBookFromBookshelf(TargetIndex ind, Pawn reader, TargetIndex bookInd) { Toil takeBook = new Toil(); takeBook.initAction = delegate { bool flag = true; Pawn actor = takeBook.actor; Bookshelf bookshelf = (Bookshelf)actor.jobs.curJob.GetTarget(ind).Thing; Thing thing = bookshelf.JobBook(reader); if (thing == null) { actor.jobs.curDriver.EndJobWith(JobCondition.Incompletable); } else { ReadableBooks readableBooks = thing as ReadableBooks; readableBooks.currentReader = reader; actor.carryTracker.TryStartCarry(readableBooks); actor.jobs.curJob.targetB = actor.carryTracker.CarriedThing; } if (flag) { if (this.pawn.Map.reservationManager.FirstReserverOf(bookshelf, bookshelf.Faction) == reader) { this.pawn.Map.reservationManager.Release(bookshelf, reader); } } }; takeBook.defaultCompleteMode = ToilCompleteMode.Delay; takeBook.defaultDuration = 20; return(takeBook); }
public Toil ReadEnd(Pawn reader, TargetIndex bookInd, TargetIndex BookShelfInd) { return(new Toil { initAction = delegate { Bookshelf bookshelf = (Bookshelf)reader.jobs.curJob.GetTarget(BookShelfInd).Thing; ReadableBooks readableBooks = (ReadableBooks)reader.jobs.curJob.GetTarget(bookInd).Thing; }, defaultCompleteMode = ToilCompleteMode.Instant }); }
public static Toil PlaceBookInShelf(TargetIndex book, TargetIndex shelf, Pawn pawn) { ReadableBooks bookint = (ReadableBooks)pawn.jobs.curJob.GetTarget(book).Thing; Bookshelf bookshelf = (Bookshelf)pawn.jobs.curJob.GetTarget(shelf).Thing; Log.Message("Trying to place book"); Toil toil = new Toil(); toil.defaultCompleteMode = ToilCompleteMode.Instant; toil.AddPreInitAction(delegate { bookint.Destroy(DestroyMode.Vanish); bookshelf.AddBookToLibrary(bookint.Tdef); }); return(toil); }
public void ReadCorruptionTick(Pawn pawn, ReadableBooks book) { Need_Soul soul = pawn.needs.TryGetNeed <Need_Soul>(); if (soul != null) { float num; int sign = 0; switch (book.Tdef.soulItemCategory) { case (SoulItemCategories.Neutral): { sign = 0; break; } case (SoulItemCategories.Corruption): { sign = -1; break; } case (SoulItemCategories.Redemption): { sign = 1; break; } default: { Log.Error("No Soul Item Category Found"); break; } } num = sign * this.Tdef.SoulGainRate * 0.2f / 1200; soul.GainNeed(num); } }
public Toil ReadingBook(Pawn reader, int durationMultiplier, TargetIndex Ind, TargetIndex bookInd) { Toil toil = new Toil(); List <string> text = new List <string>(); Bookshelf thing = null; ReadableBooks thingBook = null; int s = 0; int i = 0; int prog = 0; int oldprog = 0; float showTextFactor = 0; bool tickOnce = false; toil.tickAction = delegate { if (!tickOnce) { thing = (Bookshelf)reader.jobs.curJob.GetTarget(Ind).Thing; thingBook = (ReadableBooks)reader.jobs.curJob.GetTarget(bookInd).Thing; this.tempbook = thingBook; if (thingBook.PrepareText().Count > 0) { text = thingBook.PrepareText(); } showTextFactor = thingBook.Tdef.TextSpeedShowFactor; if (soul != null) { foreach (KeyValuePair <ThingDef, int> current in soul.readablesManager.ReadableProgressEntry) { if (current.Key.defName == thingBook.def.defName) { prog = current.Value; oldprog = prog; s = current.Value / 150; Log.Message("Old Progression Found: " + prog.ToString()); break; } } } thingBook.TexChange = true; tickOnce = true; } if (thingBook.Tdef.SkillToLearn != null) { this.pawn.skills.Learn(thingBook.Tdef.SkillToLearn, thingBook.Tdef.SkillGainFactor * 1f); } prog += 1; if (text.Count > 0) { if (i > showTextFactor * 150) { if (text.Count > s) { MoteMaker.ThrowText(reader.TrueCenter() + new Vector3(0f, 0f, 0.7f), thingBook.Map, text.ElementAt(s), Color.green); reader.needs.joy.CurLevel += 0.03f; s++; thingBook.ReadCorruptionTick(this.pawn, thingBook); i = 0; } } i++; } reader.Drawer.rotator.FaceCell(thingBook.Position); }; toil.defaultCompleteMode = ToilCompleteMode.Delay; toil.FailOnDespawnedOrNull(TargetIndex.B); toil.defaultDuration = durationMultiplier; toil.AddFinishAction(delegate { if (soul != null) { Dictionary <ThingDef, int> entries = soul.readablesManager.ReadableProgressEntry; if (entries.ContainsKey(thingBook.def)) { entries[thingBook.def] = prog; } else { Log.Message("Adding Entry"); entries.Add(thingBook.def, prog); } } thingBook.PostReadEffectSelection(prog, oldprog); thingBook.TexChange = false; this.tempshelf = thing; this.tempbook = thingBook; }); return(toil); }