public bool update(GameTime time, GameLocation location, List <NPCController> allControllers) { puppet.speed = speed; bool reachedMeYet = false; foreach (NPCController i in allControllers) { if (i.puppet != null) { if (i.puppet.Equals(puppet)) { reachedMeYet = true; } if (i.puppet.FacingDirection == puppet.FacingDirection && !i.puppet.Equals(puppet) && i.puppet.GetBoundingBox().Intersects(puppet.nextPosition(puppet.FacingDirection))) { if (reachedMeYet) { break; } return(false); } } } if (puppet is Farmer) { (puppet as Farmer).setRunning(isRunning: false, force: true); puppet.speed = 2; (puppet as Farmer).ignoreCollisions = true; } if (puppet is Farmer && Game1.CurrentEvent != null && Game1.CurrentEvent.farmer != puppet) { (puppet as Farmer).updateMovementAnimation(time); } puppet.MovePosition(time, Game1.viewport, location); if (pauseTime < 0 && !puppet.isMoving()) { setMoving(newTarget: false); } if (pauseTime < 0 && Math.Abs(Vector2.Distance(puppet.Position, target)) <= (float)puppet.Speed) { pathIndex++; if (destroyAtNextTurn) { return(true); } if (!setMoving(newTarget: true)) { if (loop) { pathIndex = 0; setMoving(newTarget: true); } else if (Game1.currentMinigame == null) { if (behaviorAtEnd != null) { behaviorAtEnd(); } return(true); } } } else if (pauseTime >= 0) { pauseTime -= time.ElapsedGameTime.Milliseconds; if (pauseTime < 0) { pathIndex++; if (destroyAtNextTurn) { return(true); } if (!setMoving(newTarget: true)) { if (loop) { pathIndex = 0; setMoving(newTarget: true); } else if (Game1.currentMinigame == null) { if (behaviorAtEnd != null) { behaviorAtEnd(); } return(true); } } } } return(false); }
private void moveCharacter(GameTime time) { Rectangle rectangle = new Rectangle(this.pathToEndPoint.Peek().X *Game1.tileSize, this.pathToEndPoint.Peek().Y *Game1.tileSize, Game1.tileSize, Game1.tileSize); rectangle.Inflate(-2, 0); Rectangle boundingBox = this.character.GetBoundingBox(); if ((rectangle.Contains(boundingBox) || boundingBox.Width > rectangle.Width && rectangle.Contains(boundingBox.Center)) && rectangle.Bottom - boundingBox.Bottom >= 2) { this.timerSinceLastCheckPoint = 0; this.pathToEndPoint.Pop(); this.character.stopWithoutChangingFrame(); if (this.pathToEndPoint.Count != 0) { return; } this.character.Halt(); if (this.finalFacingDirection != -1) { this.character.faceDirection(this.finalFacingDirection); } if (this.NPCSchedule) { (this.character as NPC).DirectionsToNewLocation = (SchedulePathDescription)null; (this.character as NPC).endOfRouteMessage = (this.character as NPC).nextEndOfRouteMessage; } if (this.endBehaviorFunction == null) { return; } this.endBehaviorFunction(this.character, this.location); } else { if (this.character is Farmer) { (this.character as Farmer).movementDirections.Clear(); } else { foreach (NPC character in this.location.characters) { if (!character.Equals((object)this.character) && (character.GetBoundingBox().Intersects(boundingBox) && character.isMoving() && string.Compare(character.name, this.character.name) < 0)) { this.character.Halt(); return; } } } if (boundingBox.Left < rectangle.Left && boundingBox.Right < rectangle.Right) { this.character.SetMovingRight(true); } else if (boundingBox.Right > rectangle.Right && boundingBox.Left > rectangle.Left) { this.character.SetMovingLeft(true); } else if (boundingBox.Top <= rectangle.Top) { this.character.SetMovingDown(true); } else if (boundingBox.Bottom >= rectangle.Bottom - 2) { this.character.SetMovingUp(true); } this.character.MovePosition(time, Game1.viewport, this.location); if (!this.NPCSchedule) { return; } Warp warp = this.location.isCollidingWithWarpOrDoor(this.character.nextPosition(this.character.getDirection())); if (warp == null) { return; } if (this.character is NPC && (this.character as NPC).isMarried() && (this.character as NPC).followSchedule) { NPC character = this.character as NPC; if (this.location is FarmHouse) { warp = new Warp(warp.X, warp.Y, "BusStop", 0, 23, false); } if (this.location is BusStop && warp.X <= 0) { warp = new Warp(warp.X, warp.Y, character.getHome().name, (character.getHome() as FarmHouse).getEntryLocation().X, (character.getHome() as FarmHouse).getEntryLocation().Y, false); } if (character.temporaryController != null && character.controller != null) { character.controller.location = Game1.getLocationFromName(warp.TargetName); } } Game1.warpCharacter(this.character as NPC, warp.TargetName, new Vector2((float)warp.TargetX, (float)warp.TargetY), false, this.location.isOutdoors); this.location.characters.Remove(this.character as NPC); if (this.location.Equals((object)Game1.currentLocation) && Utility.isOnScreen(new Vector2((float)(warp.X * Game1.tileSize), (float)(warp.Y * Game1.tileSize)), Game1.tileSize * 6) && this.location.doors.ContainsKey(new Point(warp.X, warp.Y))) { Game1.playSound("doorClose"); } this.location = Game1.getLocationFromName(warp.TargetName); if (this.location.Equals((object)Game1.currentLocation) && Utility.isOnScreen(new Vector2((float)(warp.TargetX * Game1.tileSize), (float)(warp.TargetY * Game1.tileSize)), Game1.tileSize * 6) && this.location.doors.ContainsKey(new Point(warp.TargetX, warp.TargetY - 1))) { Game1.playSound("doorClose"); } if (this.pathToEndPoint.Count > 0) { this.pathToEndPoint.Pop(); } while (this.pathToEndPoint.Count > 0 && (Math.Abs(this.pathToEndPoint.Peek().X - this.character.getTileX()) > 1 || Math.Abs(this.pathToEndPoint.Peek().Y - this.character.getTileY()) > 1)) { this.pathToEndPoint.Pop(); } } }