bool HoldableSafePlace(Item item, IHoldable holdable) { if (!item.Grabable) { GameScreen.PrintLine("\nYou cannot grab this item."); return(false); } else if (!Game.GetPlayer.IsInRangeOf(item, Game.GetPlayer.InteractionRanges.grabRange)) { GameScreen.PrintLine("\nYou are not close enough to grab this."); return(false); } if (holdable.IsHoldingItem) { GameScreen.PrintLine($"\nThe item <{Color.Cyan.ToInteger()},look at {holdable.HoldingItem.ID}>{holdable.HoldingItem.Name}@ is already being held - would you like to swap it for <{Color.Cyan.ToInteger()},look at {item.ID}>{item.Name}@?"); Utilities.PromptYesNo((answer, cancelled) => { if (answer && !cancelled) { var old = holdable.SwitchItems(item); var casted = holdable as GameObject; GameScreen.PrintLine($"\nMoved <{Color.Cyan.ToInteger()},look at {item.ID}>{item.Name}@ to <{Color.Cyan.ToInteger()},look at {casted.ID}>{casted.Name}@"); GameScreen.PrintLine($"Moved <{Color.Cyan.ToInteger()},look at {old.ID}>{old.Name}@ to <{Color.Cyan.ToInteger()},look at {old.container.GetTypedCollection().owner.ID}>{ old.container.GetTypedCollection().owner.Name}@"); } else { GameScreen.PrintLine($"\nLeft the <{Color.Cyan.ToInteger()},look at {item.ID}>{ item.Name }@ where it is."); } }); } else { holdable.PutItem(item); GameScreen.PrintLine($"\nMoved <{Color.Cyan.ToInteger()},look at {item.ID}>{ item.Name }@ to <{Color.Cyan.ToInteger()},look at {(holdable as GameObject).ID}>{ (holdable as GameObject).Name }@"); } return(false); }