diff --git a/Content.Server/Dice/DiceSystem.cs b/Content.Server/Dice/DiceSystem.cs index b9095bf878..2369f11b36 100644 --- a/Content.Server/Dice/DiceSystem.cs +++ b/Content.Server/Dice/DiceSystem.cs @@ -1,3 +1,5 @@ +using System; +using Content.Server.Notification; using Content.Shared.Audio; using Content.Shared.Examine; using Content.Shared.Interaction; @@ -22,23 +24,17 @@ namespace Content.Server.Dice { base.Initialize(); + SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnUse); SubscribeLocalEvent(OnLand); SubscribeLocalEvent(OnExamined); } - public void Roll(EntityUid uid, DiceComponent die) + private void OnComponentInit(EntityUid uid, DiceComponent component, ComponentInit args) { - die.CurrentSide = _random.Next(1, (die.Sides/die.Step)+1) * die.Step; - - SoundSystem.Play(Filter.Pvs(die.Owner), die.Sound.GetSound(), die.Owner, AudioHelpers.WithVariation(0.05f)); - - if (!ComponentManager.TryGetComponent(uid, out SpriteComponent? sprite)) - return; - - // TODO DICE: Use a visualizer instead. - sprite.LayerSetState(0, $"d{die.Sides}{die.CurrentSide}"); + if (component.CurrentSide > component.Sides) + component.CurrentSide = component.Sides; } private void OnActivate(EntityUid uid, DiceComponent component, ActivateInWorldEvent args) @@ -62,5 +58,31 @@ namespace Content.Server.Dice args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-1", ("sidesAmount", dice.Sides))); args.PushMarkup(Loc.GetString("dice-component-on-examine-message-part-2", ("currentSide", dice.CurrentSide))); } + + public void SetCurrentSide(EntityUid uid, int side, DiceComponent? die = null, SpriteComponent? sprite = null) + { + if (!Resolve(uid, ref die, ref sprite)) + return; + + side = Math.Min(Math.Max(side, 1), die.Sides); + side += side % die.Step; + + die.CurrentSide = side; + + // TODO DICE: Use a visualizer instead. + sprite.LayerSetState(0, $"d{die.Sides}{die.CurrentSide}"); + } + + public void Roll(EntityUid uid, DiceComponent? die = null) + { + if (!Resolve(uid, ref die)) + return; + + var roll = _random.Next(1, die.Sides/die.Step+1) * die.Step; + SetCurrentSide(uid, roll, die); + + die.Owner.PopupMessageEveryone(Loc.GetString("dice-component-on-roll-land", ("die", die.Owner), ("currentSide", die.CurrentSide))); + SoundSystem.Play(Filter.Pvs(die.Owner), die.Sound.GetSound(), die.Owner, AudioHelpers.WithVariation(0.05f)); + } } } diff --git a/Resources/Changelog/Parts/dice.yml b/Resources/Changelog/Parts/dice.yml new file mode 100644 index 0000000000..a096c14422 --- /dev/null +++ b/Resources/Changelog/Parts/dice.yml @@ -0,0 +1,5 @@ +author: Zumorica +changes: + - type: Tweak # One of the following: Add, Remove, Tweak, Fix + message: Dice now show a popup with the number they rolled when used. + diff --git a/Resources/Locale/en-US/dice/dice-component.ftl b/Resources/Locale/en-US/dice/dice-component.ftl index fa74e80dfb..98a02d6588 100644 --- a/Resources/Locale/en-US/dice/dice-component.ftl +++ b/Resources/Locale/en-US/dice/dice-component.ftl @@ -1,2 +1,3 @@ dice-component-on-examine-message-part-1 = A die with [color=lightgray]{$sidesAmount}[/color] sides. dice-component-on-examine-message-part-2 = It has landed on a [color=white]{$currentSide}[/color]. +dice-component-on-roll-land = { CAPITALIZE(THE($die)) } lands on a {$currentSide}.