* watches

* rename

* add it into loot pools
This commit is contained in:
Nemanja
2024-07-13 02:09:19 -04:00
committed by GitHub
parent 361ec59412
commit 49096cf14f
67 changed files with 452 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using Content.Shared.Clock;
using Robust.Client.GameObjects;
namespace Content.Client.Clock;
public sealed class ClockSystem : SharedClockSystem
{
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<ClockComponent, SpriteComponent>();
while (query.MoveNext(out var uid, out var comp, out var sprite))
{
if (!sprite.LayerMapTryGet(ClockVisualLayers.HourHand, out var hourLayer) ||
!sprite.LayerMapTryGet(ClockVisualLayers.MinuteHand, out var minuteLayer))
continue;
var time = GetClockTime((uid, comp));
var hourState = $"{comp.HoursBase}{time.Hours % 12}";
var minuteState = $"{comp.MinutesBase}{time.Minutes / 5}";
sprite.LayerSetState(hourLayer, hourState);
sprite.LayerSetState(minuteLayer, minuteState);
}
}
}

View File

@@ -0,0 +1,42 @@
using Content.Server.GameTicking.Events;
using Content.Shared.Clock;
using Content.Shared.Destructible;
using Robust.Server.GameStates;
using Robust.Shared.Random;
namespace Content.Server.Clock;
public sealed class ClockSystem : SharedClockSystem
{
[Dependency] private readonly PvsOverrideSystem _pvsOverride = default!;
[Dependency] private readonly IRobustRandom _robustRandom = default!;
/// <inheritdoc/>
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoundStartingEvent>(OnRoundStart);
SubscribeLocalEvent<GlobalTimeManagerComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<ClockComponent, BreakageEventArgs>(OnBreak);
}
private void OnRoundStart(RoundStartingEvent ev)
{
var manager = Spawn();
AddComp<GlobalTimeManagerComponent>(manager);
}
private void OnMapInit(Entity<GlobalTimeManagerComponent> ent, ref MapInitEvent args)
{
ent.Comp.TimeOffset = TimeSpan.FromHours(_robustRandom.NextFloat(0, 24));
_pvsOverride.AddGlobalOverride(ent);
Dirty(ent);
}
private void OnBreak(Entity<ClockComponent> ent, ref BreakageEventArgs args)
{
ent.Comp.StuckTime = GetClockTime(ent);
Dirty(ent, ent.Comp);
}
}

View File

@@ -0,0 +1,42 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Clock;
[RegisterComponent, NetworkedComponent]
[Access(typeof(SharedClockSystem))]
[AutoGenerateComponentState]
public sealed partial class ClockComponent : Component
{
/// <summary>
/// If not null, this time will be permanently shown.
/// </summary>
[DataField, AutoNetworkedField]
public TimeSpan? StuckTime;
/// <summary>
/// The format in which time is displayed.
/// </summary>
[DataField, AutoNetworkedField]
public ClockType ClockType = ClockType.TwelveHour;
[DataField]
public string HoursBase = "hours_";
[DataField]
public string MinutesBase = "minutes_";
}
[Serializable, NetSerializable]
public enum ClockType : byte
{
TwelveHour,
TwentyFourHour
}
[Serializable, NetSerializable]
public enum ClockVisualLayers : byte
{
HourHand,
MinuteHand
}

View File

@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Clock;
/// <summary>
/// This is used for globally managing the time on-station
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause, Access(typeof(SharedClockSystem))]
public sealed partial class GlobalTimeManagerComponent : Component
{
/// <summary>
/// A fixed random offset, used to fuzz the time between shifts.
/// </summary>
[DataField, AutoPausedField, AutoNetworkedField]
public TimeSpan TimeOffset;
}

View File

@@ -0,0 +1,66 @@
using System.Linq;
using Content.Shared.Examine;
using Content.Shared.GameTicking;
namespace Content.Shared.Clock;
public abstract class SharedClockSystem : EntitySystem
{
[Dependency] private readonly SharedGameTicker _ticker = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<ClockComponent, ExaminedEvent>(OnExamined);
}
private void OnExamined(Entity<ClockComponent> ent, ref ExaminedEvent args)
{
if (!args.IsInDetailsRange)
return;
args.PushMarkup(Loc.GetString("clock-examine", ("time", GetClockTimeText(ent))));
}
public string GetClockTimeText(Entity<ClockComponent> ent)
{
var time = GetClockTime(ent);
switch (ent.Comp.ClockType)
{
case ClockType.TwelveHour:
return time.ToString(@"h\:mm");
case ClockType.TwentyFourHour:
return time.ToString(@"hh\:mm");
default:
throw new ArgumentOutOfRangeException();
}
}
private TimeSpan GetGlobalTime()
{
return (EntityQuery<GlobalTimeManagerComponent>().FirstOrDefault()?.TimeOffset ?? TimeSpan.Zero) + _ticker.RoundDuration();
}
public TimeSpan GetClockTime(Entity<ClockComponent> ent)
{
var comp = ent.Comp;
if (comp.StuckTime != null)
return comp.StuckTime.Value;
var time = GetGlobalTime();
switch (comp.ClockType)
{
case ClockType.TwelveHour:
var adjustedHours = time.Hours % 12;
if (adjustedHours == 0)
adjustedHours = 12;
return new TimeSpan(adjustedHours, time.Minutes, time.Seconds);
case ClockType.TwentyFourHour:
return time;
default:
throw new ArgumentOutOfRangeException();
}
}
}

View File

@@ -0,0 +1 @@
clock-examine = The time reads: [color=white]{$time}[/color]

View File

@@ -170,6 +170,8 @@
prob: 0.20
- id: BarberScissors
prob: 0.05
- id: Wristwatch
prob: 0.05
- id: BookRandomStory
prob: 0.1
# Syndicate loot

View File

@@ -67,6 +67,7 @@
- ClothingHeadHatCowboyBountyHunter
- ClothingNeckAutismPin
- ClothingNeckGoldAutismPin
- WristwatchGold
rareChance: 0.01
prototypes:
- Lighter
@@ -128,6 +129,7 @@
- ClothingShoesTourist
- ClothingUniformJumpsuitLoungewear
- ClothingHeadHatCowboyRed
- Wristwatch
chance: 0.6
offset: 0.0

View File

@@ -0,0 +1,59 @@
- type: entity
id: Wristwatch
parent: BaseItem
name: wristwatch
description: A cheap watch for telling time. How much did you waste playing Space Station 14?
components:
- type: Sprite
sprite: Objects/Devices/wristwatch.rsi
layers:
- state: wristwatch
- map: [ "enum.ClockVisualLayers.MinuteHand"]
- map: [ "enum.ClockVisualLayers.HourHand"]
- type: Clock
- type: Item
sprite: Objects/Devices/wristwatch.rsi
size: Small
- type: Clothing
sprite: Objects/Devices/wristwatch.rsi
slots:
- gloves
- type: Appearance
- type: Damageable
damageContainer: Inorganic
- type: StaticPrice
price: 50
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- trigger:
!type:DamageGroupTrigger
damageGroup: Brute
damage: 25
behaviors:
- !type:DoActsBehavior
acts: [ "Breakage" ]
- type: entity
id: WristwatchGold
parent: Wristwatch
name: gold watch
description: A fancy watch worth more than your kidney. It was owned by the notorious Syndicate mobster Vunibaldo "200 Pound Horse Meat Grinder" Frediani.
components:
- type: Sprite
sprite: Objects/Devices/goldwatch.rsi
layers:
- state: goldwatch
- map: [ "enum.ClockVisualLayers.MinuteHand"]
- map: [ "enum.ClockVisualLayers.HourHand"]
- type: Item
sprite: Objects/Devices/goldwatch.rsi
- type: Clothing
sprite: Objects/Devices/goldwatch.rsi
- type: StaticPrice
price: 500 #if you ever increase the price of kidneys, increase this too.

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

View File

@@ -0,0 +1,98 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/obj/watches/goldwatch.dmi, https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/mob/in-hand/right/clothing_accessories.dmi, https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/mob/in-hand/left/clothing_accessories.dmi, https://github.com/vgstation-coders/vgstation13/blob/30f9caeb59b0dd9da1dbcd4c69307ae182033a74/icons/mob/clothing_accessories.dmi",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "goldwatch"
},
{
"name": "hours_1"
},
{
"name": "hours_2"
},
{
"name": "hours_3"
},
{
"name": "hours_4"
},
{
"name": "hours_5"
},
{
"name": "hours_6"
},
{
"name": "hours_7"
},
{
"name": "hours_8"
},
{
"name": "hours_9"
},
{
"name": "hours_10"
},
{
"name": "hours_11"
},
{
"name": "hours_0"
},
{
"name": "minutes_1"
},
{
"name": "minutes_2"
},
{
"name": "minutes_3"
},
{
"name": "minutes_4"
},
{
"name": "minutes_5"
},
{
"name": "minutes_6"
},
{
"name": "minutes_7"
},
{
"name": "minutes_8"
},
{
"name": "minutes_9"
},
{
"name": "minutes_10"
},
{
"name": "minutes_11"
},
{
"name": "minutes_0"
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "equipped-HAND",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

View File

@@ -0,0 +1,98 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/obj/watches/wristwatch.dmi, https://github.com/vgstation-coders/vgstation13/blob/30f9caeb59b0dd9da1dbcd4c69307ae182033a74/icons/obj/clothing/accessory_overlays.dmi, https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/mob/in-hand/right/clothing_accessories.dmi, https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/mob/in-hand/right/clothing_accessories.dmi, https://github.com/vgstation-coders/vgstation13/blob/223bf37a7386249ecf1fe425ca8cef25821ca9d7/icons/mob/in-hand/left/clothing_accessories.dmi, https://github.com/vgstation-coders/vgstation13/blob/30f9caeb59b0dd9da1dbcd4c69307ae182033a74/icons/mob/clothing_accessories.dmi",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "wristwatch"
},
{
"name": "hours_1"
},
{
"name": "hours_2"
},
{
"name": "hours_3"
},
{
"name": "hours_4"
},
{
"name": "hours_5"
},
{
"name": "hours_6"
},
{
"name": "hours_7"
},
{
"name": "hours_8"
},
{
"name": "hours_9"
},
{
"name": "hours_10"
},
{
"name": "hours_11"
},
{
"name": "hours_0"
},
{
"name": "minutes_1"
},
{
"name": "minutes_2"
},
{
"name": "minutes_3"
},
{
"name": "minutes_4"
},
{
"name": "minutes_5"
},
{
"name": "minutes_6"
},
{
"name": "minutes_7"
},
{
"name": "minutes_8"
},
{
"name": "minutes_9"
},
{
"name": "minutes_10"
},
{
"name": "minutes_11"
},
{
"name": "minutes_0"
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "equipped-HAND",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B