Dice tweaks (#13514)
21
Content.Client/Dice/DiceSystem.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using Content.Shared.Dice;
|
||||
using Robust.Client.GameObjects;
|
||||
|
||||
namespace Content.Client.Dice;
|
||||
|
||||
public sealed class DiceSystem : SharedDiceSystem
|
||||
{
|
||||
protected override void UpdateVisuals(EntityUid uid, DiceComponent? die = null)
|
||||
{
|
||||
if (!Resolve(uid, ref die) || !TryComp(uid, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
// TODO maybe just move each diue to its own RSI?
|
||||
var state = sprite.LayerGetState(0).Name;
|
||||
if (state == null)
|
||||
return;
|
||||
|
||||
var prefix = state.Substring(0, state.IndexOf('_'));
|
||||
sprite.LayerSetState(0, $"{prefix}_{die.CurrentValue}");
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Server.Dice
|
||||
{
|
||||
[RegisterComponent, Access(typeof(DiceSystem))]
|
||||
public sealed class DiceComponent : Component
|
||||
{
|
||||
[DataField("sound")]
|
||||
public SoundSpecifier Sound { get; } = new SoundCollectionSpecifier("Dice");
|
||||
|
||||
[DataField("step")]
|
||||
public int Step { get; } = 1;
|
||||
|
||||
[DataField("sides")]
|
||||
public int Sides { get; } = 20;
|
||||
|
||||
[ViewVariables]
|
||||
public int CurrentSide { get; set; } = 20;
|
||||
}
|
||||
}
|
||||
@@ -1,81 +1,26 @@
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Audio;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Dice;
|
||||
using Content.Shared.Popups;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server.Dice
|
||||
namespace Content.Server.Dice;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed class DiceSystem : SharedDiceSystem
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public sealed class DiceSystem : EntitySystem
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
|
||||
public override void Roll(EntityUid uid, DiceComponent? die = null)
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
if (!Resolve(uid, ref die))
|
||||
return;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
var roll = _random.Next(1, die.Sides);
|
||||
SetCurrentSide(uid, roll, die);
|
||||
|
||||
SubscribeLocalEvent<DiceComponent, ComponentInit>(OnComponentInit);
|
||||
SubscribeLocalEvent<DiceComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<DiceComponent, LandEvent>(OnLand);
|
||||
SubscribeLocalEvent<DiceComponent, ExaminedEvent>(OnExamined);
|
||||
}
|
||||
|
||||
private void OnComponentInit(EntityUid uid, DiceComponent component, ComponentInit args)
|
||||
{
|
||||
if (component.CurrentSide > component.Sides)
|
||||
component.CurrentSide = component.Sides;
|
||||
}
|
||||
|
||||
private void OnUseInHand(EntityUid uid, DiceComponent component, UseInHandEvent args)
|
||||
{
|
||||
if (args.Handled) return;
|
||||
|
||||
args.Handled = true;
|
||||
Roll(uid, component);
|
||||
}
|
||||
|
||||
private void OnLand(EntityUid uid, DiceComponent component, ref LandEvent args)
|
||||
{
|
||||
Roll(uid, component);
|
||||
}
|
||||
|
||||
private void OnExamined(EntityUid uid, DiceComponent dice, ExaminedEvent args)
|
||||
{
|
||||
//No details check, since the sprite updates to show the side.
|
||||
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(die.Sound.GetSound(), Filter.Pvs(die.Owner), die.Owner, AudioHelpers.WithVariation(0.05f));
|
||||
}
|
||||
_popup.PopupEntity(Loc.GetString("dice-component-on-roll-land", ("die", uid), ("currentSide", die.CurrentValue)), uid);
|
||||
_audio.PlayPvs(die.Sound, uid);
|
||||
}
|
||||
}
|
||||
|
||||
44
Content.Shared/Dice/DiceComponent.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Dice;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, Access(typeof(SharedDiceSystem))]
|
||||
public sealed class DiceComponent : Component
|
||||
{
|
||||
[DataField("sound")]
|
||||
public SoundSpecifier Sound { get; } = new SoundCollectionSpecifier("Dice");
|
||||
|
||||
/// <summary>
|
||||
/// Multiplier for the value of a die. Applied after the <see cref="Offset"/>.
|
||||
/// </summary>
|
||||
[DataField("multiplier")]
|
||||
public int Multiplier { get; } = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Quantity that is subtracted from the value of a die. Can be used to make dice that start at "0". Applied
|
||||
/// before the <see cref="Multiplier"/>
|
||||
/// </summary>
|
||||
[DataField("offset")]
|
||||
public int Offset { get; } = 0;
|
||||
|
||||
[DataField("sides")]
|
||||
public int Sides { get; } = 20;
|
||||
|
||||
/// <summary>
|
||||
/// The currently displayed value.
|
||||
/// </summary>
|
||||
[DataField("currentValue")]
|
||||
public int CurrentValue { get; set; } = 20;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class DiceState : ComponentState
|
||||
{
|
||||
public int CurrentSide { get; set; } = 20;
|
||||
public DiceState(int side)
|
||||
{
|
||||
CurrentSide = side;
|
||||
}
|
||||
}
|
||||
}
|
||||
93
Content.Shared/Dice/SharedDiceSystem.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Throwing;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Dice;
|
||||
|
||||
public abstract class SharedDiceSystem : EntitySystem
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<DiceComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<DiceComponent, LandEvent>(OnLand);
|
||||
SubscribeLocalEvent<DiceComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<DiceComponent, ComponentGetState>(OnGetState);
|
||||
SubscribeLocalEvent<DiceComponent, ComponentHandleState>(OnHandleState);
|
||||
}
|
||||
|
||||
private void OnHandleState(EntityUid uid, DiceComponent component, ref ComponentHandleState args)
|
||||
{
|
||||
if (args.Current is DiceComponent.DiceState state)
|
||||
component.CurrentValue = state.CurrentSide;
|
||||
|
||||
UpdateVisuals(uid, component);
|
||||
}
|
||||
|
||||
private void OnGetState(EntityUid uid, DiceComponent component, ref ComponentGetState args)
|
||||
{
|
||||
args.State = new DiceComponent.DiceState(component.CurrentValue);
|
||||
}
|
||||
|
||||
private void OnUseInHand(EntityUid uid, DiceComponent component, UseInHandEvent args)
|
||||
{
|
||||
if (args.Handled) return;
|
||||
|
||||
args.Handled = true;
|
||||
Roll(uid, component);
|
||||
}
|
||||
|
||||
private void OnLand(EntityUid uid, DiceComponent component, ref LandEvent args)
|
||||
{
|
||||
Roll(uid, component);
|
||||
}
|
||||
|
||||
private void OnExamined(EntityUid uid, DiceComponent dice, ExaminedEvent args)
|
||||
{
|
||||
//No details check, since the sprite updates to show the side.
|
||||
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.CurrentValue)));
|
||||
}
|
||||
|
||||
public void SetCurrentSide(EntityUid uid, int side, DiceComponent? die = null)
|
||||
{
|
||||
if (!Resolve(uid, ref die))
|
||||
return;
|
||||
|
||||
if (side < 1 || side > die.Sides)
|
||||
{
|
||||
Logger.Error($"Attempted to set die {ToPrettyString(uid)} to an invalid side ({side}).");
|
||||
return;
|
||||
}
|
||||
|
||||
die.CurrentValue = (side - die.Offset) * die.Multiplier;
|
||||
Dirty(die);
|
||||
UpdateVisuals(uid, die);
|
||||
}
|
||||
|
||||
public void SetCurrentValue(EntityUid uid, int value, DiceComponent? die = null)
|
||||
{
|
||||
if (!Resolve(uid, ref die))
|
||||
return;
|
||||
|
||||
if (value % die.Multiplier != 0 || value/ die.Multiplier + die.Offset < 1)
|
||||
{
|
||||
Logger.Error($"Attempted to set die {ToPrettyString(uid)} to an invalid value ({value}).");
|
||||
return;
|
||||
}
|
||||
|
||||
SetCurrentSide(uid, value / die.Multiplier + die.Offset, die);
|
||||
}
|
||||
|
||||
protected virtual void UpdateVisuals(EntityUid uid, DiceComponent? die = null)
|
||||
{
|
||||
// See client system.
|
||||
}
|
||||
|
||||
public virtual void Roll(EntityUid uid, DiceComponent? die = null)
|
||||
{
|
||||
// See the server system, client cannot predict rolling.
|
||||
}
|
||||
}
|
||||
@@ -5973,7 +5973,7 @@ entities:
|
||||
parent: 8364
|
||||
type: Transform
|
||||
- uid: 898
|
||||
type: d100Dice
|
||||
type: PercentileDie
|
||||
components:
|
||||
- pos: 57.5,20.5
|
||||
parent: 8364
|
||||
@@ -97138,7 +97138,7 @@ entities:
|
||||
parent: 8364
|
||||
type: Transform
|
||||
- uid: 10853
|
||||
type: d100Dice
|
||||
type: PercentileDie
|
||||
components:
|
||||
- pos: 56.5,3.5000002
|
||||
parent: 8364
|
||||
@@ -97304,7 +97304,7 @@ entities:
|
||||
parent: 8364
|
||||
type: Transform
|
||||
- uid: 10873
|
||||
type: d100Dice
|
||||
type: PercentileDie
|
||||
components:
|
||||
- pos: 55.5,0.5
|
||||
parent: 8364
|
||||
|
||||
@@ -33065,7 +33065,7 @@ entities:
|
||||
parent: 0
|
||||
type: Transform
|
||||
- uid: 3765
|
||||
type: d100Dice
|
||||
type: PercentileDie
|
||||
components:
|
||||
- pos: -18.522638,2.6762333
|
||||
parent: 0
|
||||
|
||||
@@ -156547,7 +156547,7 @@ entities:
|
||||
parent: 30
|
||||
type: Transform
|
||||
- uid: 19473
|
||||
type: d100Dice
|
||||
type: PercentileDie
|
||||
components:
|
||||
- rot: 1.5707963267948966 rad
|
||||
pos: -57.4998,-65.351234
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
id: FunBoardGames
|
||||
icon:
|
||||
sprite: Objects/Fun/dice.rsi
|
||||
state: d66
|
||||
state: d6_6
|
||||
product: CrateFunBoardGames
|
||||
cost: 1500
|
||||
category: Fun
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
- type: ItemCooldown
|
||||
- type: UseDelay
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
sprite: Objects/Fun/dice.rsi
|
||||
noRot: true # If their sprites rotate, the number becomes even more illegible than usual.
|
||||
- type: Tag
|
||||
@@ -17,15 +18,17 @@
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
id: d100Dice
|
||||
name: d100
|
||||
id: PercentileDie
|
||||
name: Percentile Die
|
||||
description: A die with ten sides. Works better for d100 rolls than a golf ball.
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 100
|
||||
step: 10
|
||||
sides: 10
|
||||
multiplier: 10
|
||||
offset: 1 # first side is a 0
|
||||
currentValue: 1
|
||||
- type: Sprite
|
||||
state: d100100
|
||||
state: percentile_0
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -35,8 +38,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 20
|
||||
currentValue: 20
|
||||
- type: Sprite
|
||||
state: d2020
|
||||
state: d20_20
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -46,8 +50,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 12
|
||||
currentValue: 12
|
||||
- type: Sprite
|
||||
state: d1212
|
||||
state: d12_12
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -57,8 +62,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 10
|
||||
currentValue: 10
|
||||
- type: Sprite
|
||||
state: d1010
|
||||
state: d10_10
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -68,8 +74,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 8
|
||||
currentValue: 8
|
||||
- type: Sprite
|
||||
state: d88
|
||||
state: d8_8
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -79,8 +86,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 6
|
||||
currentValue: 6
|
||||
- type: Sprite
|
||||
state: d66
|
||||
state: d6_6
|
||||
|
||||
- type: entity
|
||||
parent: BaseDice
|
||||
@@ -90,8 +98,9 @@
|
||||
components:
|
||||
- type: Dice
|
||||
sides: 4
|
||||
currentValue: 4
|
||||
- type: Sprite
|
||||
state: d44
|
||||
state: d4_4
|
||||
- type: CollisionWake
|
||||
enabled: false
|
||||
- type: Fixtures
|
||||
@@ -122,3 +131,4 @@
|
||||
damage:
|
||||
types:
|
||||
Piercing: 5
|
||||
# I love this
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- id: d10Dice
|
||||
- id: d12Dice
|
||||
- id: d20Dice
|
||||
- id: d100Dice
|
||||
- id: PercentileDie
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
sprite: Objects/Fun/dice.rsi
|
||||
|
||||
|
Before Width: | Height: | Size: 361 B |
|
Before Width: | Height: | Size: 359 B |
|
Before Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 361 B |
|
Before Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 353 B After Width: | Height: | Size: 353 B |
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 360 B |
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 355 B |
|
Before Width: | Height: | Size: 356 B After Width: | Height: | Size: 356 B |
|
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 353 B After Width: | Height: | Size: 353 B |
|
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 392 B |
|
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 399 B |
|
Before Width: | Height: | Size: 382 B After Width: | Height: | Size: 382 B |
|
Before Width: | Height: | Size: 407 B After Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 401 B After Width: | Height: | Size: 401 B |
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 400 B |
|
Before Width: | Height: | Size: 386 B After Width: | Height: | Size: 386 B |
|
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 399 B |
|
Before Width: | Height: | Size: 395 B After Width: | Height: | Size: 395 B |
|
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 387 B |
|
Before Width: | Height: | Size: 396 B After Width: | Height: | Size: 396 B |
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 400 B |
|
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 447 B After Width: | Height: | Size: 447 B |
|
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 469 B After Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 440 B After Width: | Height: | Size: 440 B |
|
Before Width: | Height: | Size: 458 B After Width: | Height: | Size: 458 B |
|
Before Width: | Height: | Size: 454 B After Width: | Height: | Size: 454 B |
|
Before Width: | Height: | Size: 459 B After Width: | Height: | Size: 459 B |
|
Before Width: | Height: | Size: 445 B After Width: | Height: | Size: 445 B |
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 455 B After Width: | Height: | Size: 455 B |
|
Before Width: | Height: | Size: 441 B After Width: | Height: | Size: 441 B |
|
Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 456 B |
|
Before Width: | Height: | Size: 453 B After Width: | Height: | Size: 453 B |
|
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 463 B |
|
Before Width: | Height: | Size: 459 B After Width: | Height: | Size: 459 B |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 456 B |
|
Before Width: | Height: | Size: 459 B After Width: | Height: | Size: 459 B |
|
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 242 B |
|
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
|
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 246 B |
|
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 247 B |
|
Before Width: | Height: | Size: 345 B After Width: | Height: | Size: 345 B |
|
Before Width: | Height: | Size: 337 B After Width: | Height: | Size: 337 B |
|
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 341 B |
|
Before Width: | Height: | Size: 317 B After Width: | Height: | Size: 317 B |
|
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 364 B After Width: | Height: | Size: 364 B |
|
Before Width: | Height: | Size: 364 B After Width: | Height: | Size: 364 B |
|
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 376 B After Width: | Height: | Size: 376 B |
|
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 355 B |
|
Before Width: | Height: | Size: 368 B After Width: | Height: | Size: 368 B |
@@ -1,221 +1,221 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d",
|
||||
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d. Edited by ElectroSR.",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "d10010"
|
||||
"name": "percentile_10"
|
||||
},
|
||||
{
|
||||
"name": "d100100"
|
||||
"name": "percentile_0"
|
||||
},
|
||||
{
|
||||
"name": "d10020"
|
||||
"name": "percentile_20"
|
||||
},
|
||||
{
|
||||
"name": "d10030"
|
||||
"name": "percentile_30"
|
||||
},
|
||||
{
|
||||
"name": "d10040"
|
||||
"name": "percentile_40"
|
||||
},
|
||||
{
|
||||
"name": "d10050"
|
||||
"name": "percentile_50"
|
||||
},
|
||||
{
|
||||
"name": "d10060"
|
||||
"name": "percentile_60"
|
||||
},
|
||||
{
|
||||
"name": "d10070"
|
||||
"name": "percentile_70"
|
||||
},
|
||||
{
|
||||
"name": "d10080"
|
||||
"name": "percentile_80"
|
||||
},
|
||||
{
|
||||
"name": "d10090"
|
||||
"name": "percentile_90"
|
||||
},
|
||||
{
|
||||
"name": "d101"
|
||||
"name": "d10_1"
|
||||
},
|
||||
{
|
||||
"name": "d1010"
|
||||
"name": "d10_10"
|
||||
},
|
||||
{
|
||||
"name": "d102"
|
||||
"name": "d10_2"
|
||||
},
|
||||
{
|
||||
"name": "d103"
|
||||
"name": "d10_3"
|
||||
},
|
||||
{
|
||||
"name": "d104"
|
||||
"name": "d10_4"
|
||||
},
|
||||
{
|
||||
"name": "d105"
|
||||
"name": "d10_5"
|
||||
},
|
||||
{
|
||||
"name": "d106"
|
||||
"name": "d10_6"
|
||||
},
|
||||
{
|
||||
"name": "d107"
|
||||
"name": "d10_7"
|
||||
},
|
||||
{
|
||||
"name": "d108"
|
||||
"name": "d10_8"
|
||||
},
|
||||
{
|
||||
"name": "d109"
|
||||
"name": "d10_9"
|
||||
},
|
||||
{
|
||||
"name": "d121"
|
||||
"name": "d12_1"
|
||||
},
|
||||
{
|
||||
"name": "d1210"
|
||||
"name": "d12_10"
|
||||
},
|
||||
{
|
||||
"name": "d1211"
|
||||
"name": "d12_11"
|
||||
},
|
||||
{
|
||||
"name": "d1212"
|
||||
"name": "d12_12"
|
||||
},
|
||||
{
|
||||
"name": "d122"
|
||||
"name": "d12_2"
|
||||
},
|
||||
{
|
||||
"name": "d123"
|
||||
"name": "d12_3"
|
||||
},
|
||||
{
|
||||
"name": "d124"
|
||||
"name": "d12_4"
|
||||
},
|
||||
{
|
||||
"name": "d125"
|
||||
"name": "d12_5"
|
||||
},
|
||||
{
|
||||
"name": "d126"
|
||||
"name": "d12_6"
|
||||
},
|
||||
{
|
||||
"name": "d127"
|
||||
"name": "d12_7"
|
||||
},
|
||||
{
|
||||
"name": "d128"
|
||||
"name": "d12_8"
|
||||
},
|
||||
{
|
||||
"name": "d129"
|
||||
"name": "d12_9"
|
||||
},
|
||||
{
|
||||
"name": "d201"
|
||||
"name": "d20_1"
|
||||
},
|
||||
{
|
||||
"name": "d2010"
|
||||
"name": "d20_10"
|
||||
},
|
||||
{
|
||||
"name": "d2011"
|
||||
"name": "d20_11"
|
||||
},
|
||||
{
|
||||
"name": "d2012"
|
||||
"name": "d20_12"
|
||||
},
|
||||
{
|
||||
"name": "d2013"
|
||||
"name": "d20_13"
|
||||
},
|
||||
{
|
||||
"name": "d2014"
|
||||
"name": "d20_14"
|
||||
},
|
||||
{
|
||||
"name": "d2015"
|
||||
"name": "d20_15"
|
||||
},
|
||||
{
|
||||
"name": "d2016"
|
||||
"name": "d20_16"
|
||||
},
|
||||
{
|
||||
"name": "d2017"
|
||||
"name": "d20_17"
|
||||
},
|
||||
{
|
||||
"name": "d2018"
|
||||
"name": "d20_18"
|
||||
},
|
||||
{
|
||||
"name": "d2019"
|
||||
"name": "d20_19"
|
||||
},
|
||||
{
|
||||
"name": "d202"
|
||||
"name": "d20_2"
|
||||
},
|
||||
{
|
||||
"name": "d2020"
|
||||
"name": "d20_20"
|
||||
},
|
||||
{
|
||||
"name": "d203"
|
||||
"name": "d20_3"
|
||||
},
|
||||
{
|
||||
"name": "d204"
|
||||
"name": "d20_4"
|
||||
},
|
||||
{
|
||||
"name": "d205"
|
||||
"name": "d20_5"
|
||||
},
|
||||
{
|
||||
"name": "d206"
|
||||
"name": "d20_6"
|
||||
},
|
||||
{
|
||||
"name": "d207"
|
||||
"name": "d20_7"
|
||||
},
|
||||
{
|
||||
"name": "d208"
|
||||
"name": "d20_8"
|
||||
},
|
||||
{
|
||||
"name": "d209"
|
||||
"name": "d20_9"
|
||||
},
|
||||
{
|
||||
"name": "d41"
|
||||
"name": "d4_1"
|
||||
},
|
||||
{
|
||||
"name": "d42"
|
||||
"name": "d4_2"
|
||||
},
|
||||
{
|
||||
"name": "d43"
|
||||
"name": "d4_3"
|
||||
},
|
||||
{
|
||||
"name": "d44"
|
||||
"name": "d4_4"
|
||||
},
|
||||
{
|
||||
"name": "d61"
|
||||
"name": "d6_1"
|
||||
},
|
||||
{
|
||||
"name": "d62"
|
||||
"name": "d6_2"
|
||||
},
|
||||
{
|
||||
"name": "d63"
|
||||
"name": "d6_3"
|
||||
},
|
||||
{
|
||||
"name": "d64"
|
||||
"name": "d6_4"
|
||||
},
|
||||
{
|
||||
"name": "d65"
|
||||
"name": "d6_5"
|
||||
},
|
||||
{
|
||||
"name": "d66"
|
||||
"name": "d6_6"
|
||||
},
|
||||
{
|
||||
"name": "d81"
|
||||
"name": "d8_1"
|
||||
},
|
||||
{
|
||||
"name": "d82"
|
||||
"name": "d8_2"
|
||||
},
|
||||
{
|
||||
"name": "d83"
|
||||
"name": "d8_3"
|
||||
},
|
||||
{
|
||||
"name": "d84"
|
||||
"name": "d8_4"
|
||||
},
|
||||
{
|
||||
"name": "d85"
|
||||
"name": "d8_5"
|
||||
},
|
||||
{
|
||||
"name": "d86"
|
||||
"name": "d8_6"
|
||||
},
|
||||
{
|
||||
"name": "d87"
|
||||
"name": "d8_7"
|
||||
},
|
||||
{
|
||||
"name": "d88"
|
||||
"name": "d8_8"
|
||||
},
|
||||
{
|
||||
"name": "dicebag"
|
||||
|
||||
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_0.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_10.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_20.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_30.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_40.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_50.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_60.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_70.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_80.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Textures/Objects/Fun/dice.rsi/percentile_90.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |