Librarian gameplay (DND, but in SS14) (#17041)

* D&D character sheets

* Tabletop improvements

* Grass battlemap

* You can now put shit inside of the board

* change variable name

* make the grass tabletop better, again

* update the damn thing AGAIN

* update the shit AGAIN

* You can now take stuff out of tabletops

* Make it use parenting to avoid zany bugs

* MORE battlemaps! Battlemaps for everyone!

* You can now dump out pieces + cleanup

* All (most) non-game pieces should fall to the ground

* make the verb a bit more responsive

* Librarian content officially done

* fix tests i think

* i forgot the sheet

* Smidgen of refactoring

* You can no longer put high risk items inside of boards

* no boardgame defusal

* minor refactoring

* hoplogrma

* doc

* fix rt
This commit is contained in:
eclips_e
2023-07-17 17:03:18 +08:00
committed by GitHub
parent 73c7ed67fa
commit 01a0e2002a
44 changed files with 720 additions and 83 deletions

View File

@@ -45,6 +45,7 @@ namespace Content.Client.Tabletop
CommandBinds.Builder CommandBinds.Builder
.Bind(EngineKeyFunctions.Use, new PointerInputCmdHandler(OnUse, false, true)) .Bind(EngineKeyFunctions.Use, new PointerInputCmdHandler(OnUse, false, true))
.Bind(EngineKeyFunctions.UseSecondary, new PointerInputCmdHandler(OnUseSecondary, true, true))
.Register<TabletopSystem>(); .Register<TabletopSystem>();
SubscribeNetworkEvent<TabletopPlayEvent>(OnTabletopPlay); SubscribeNetworkEvent<TabletopPlayEvent>(OnTabletopPlay);
@@ -177,6 +178,17 @@ namespace Content.Client.Tabletop
_ => false _ => false
}; };
} }
private bool OnUseSecondary(in PointerInputCmdArgs args)
{
if (_draggedEntity != null && _table != null)
{
var ev = new TabletopRequestTakeOut();
ev.Entity = _draggedEntity.Value;
ev.TableUid = _table.Value;
RaiseNetworkEvent(ev);
}
return false;
}
private bool OnMouseDown(in PointerInputCmdArgs args) private bool OnMouseDown(in PointerInputCmdArgs args)
{ {

View File

@@ -1,4 +1,5 @@
using System.Numerics; using System.Numerics;
using Vector2 = System.Numerics.Vector2;
namespace Content.Server.Tabletop.Components namespace Content.Server.Tabletop.Components
{ {
@@ -8,18 +9,33 @@ namespace Content.Server.Tabletop.Components
[RegisterComponent, Access(typeof(TabletopSystem))] [RegisterComponent, Access(typeof(TabletopSystem))]
public sealed class TabletopGameComponent : Component public sealed class TabletopGameComponent : Component
{ {
/// <summary>
/// The localized name of the board. Shown in the UI.
/// </summary>
[DataField("boardName")] [DataField("boardName")]
public string BoardName { get; } = "tabletop-default-board-name"; public string BoardName { get; } = "tabletop-default-board-name";
/// <summary>
/// The type of method used to set up a tabletop.
/// </summary>
[DataField("setup", required: true)] [DataField("setup", required: true)]
public TabletopSetup Setup { get; } = new TabletopChessSetup(); public TabletopSetup Setup { get; } = new TabletopChessSetup();
/// <summary>
/// The size of the viewport being opened. Must match the board dimensions otherwise you'll get the space parallax (unless that's what you want).
/// </summary>
[DataField("size")] [DataField("size")]
public Vector2i Size { get; } = (300, 300); public Vector2i Size { get; } = (300, 300);
/// <summary>
/// The zoom of the viewport camera.
/// </summary>
[DataField("cameraZoom")] [DataField("cameraZoom")]
public Vector2 CameraZoom { get; } = Vector2.One; public Vector2 CameraZoom { get; } = Vector2.One;
/// <summary>
/// The specific session of this tabletop.
/// </summary>
[ViewVariables] [ViewVariables]
public TabletopSession? Session { get; set; } = null; public TabletopSession? Session { get; set; } = null;
} }

View File

@@ -5,8 +5,6 @@ namespace Content.Server.Tabletop
[UsedImplicitly] [UsedImplicitly]
public sealed class TabletopBackgammonSetup : TabletopSetup public sealed class TabletopBackgammonSetup : TabletopSetup
{ {
[DataField("boardPrototype")]
public string BackgammonBoardPrototype { get; } = "BackgammonBoardTabletop";
[DataField("whitePiecePrototype")] [DataField("whitePiecePrototype")]
public string WhitePiecePrototype { get; } = "WhiteTabletopPiece"; public string WhitePiecePrototype { get; } = "WhiteTabletopPiece";
@@ -15,7 +13,7 @@ namespace Content.Server.Tabletop
public string BlackPiecePrototype { get; } = "BlackTabletopPiece"; public string BlackPiecePrototype { get; } = "BlackTabletopPiece";
public override void SetupTabletop(TabletopSession session, IEntityManager entityManager) public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
{ {
var board = entityManager.SpawnEntity(BackgammonBoardPrototype, session.Position); var board = entityManager.SpawnEntity(BoardPrototype, session.Position);
const float borderLengthX = 7.35f; //BORDER const float borderLengthX = 7.35f; //BORDER
const float borderLengthY = 5.60f; //BORDER const float borderLengthY = 5.60f; //BORDER

View File

@@ -8,14 +8,12 @@ namespace Content.Server.Tabletop
[UsedImplicitly] [UsedImplicitly]
public sealed class TabletopCheckerSetup : TabletopSetup public sealed class TabletopCheckerSetup : TabletopSetup
{ {
[DataField("boardPrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string CheckerBoardPrototype { get; } = "CheckerBoardTabletop";
// TODO: Un-hardcode the rest of entity prototype IDs, probably. // TODO: Un-hardcode the rest of entity prototype IDs, probably.
public override void SetupTabletop(TabletopSession session, IEntityManager entityManager) public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
{ {
var checkerboard = entityManager.SpawnEntity(CheckerBoardPrototype, session.Position.Offset(-1, 0)); var checkerboard = entityManager.SpawnEntity(BoardPrototype, session.Position.Offset(-1, 0));
session.Entities.Add(checkerboard); session.Entities.Add(checkerboard);

View File

@@ -8,14 +8,12 @@ namespace Content.Server.Tabletop
[UsedImplicitly] [UsedImplicitly]
public sealed class TabletopChessSetup : TabletopSetup public sealed class TabletopChessSetup : TabletopSetup
{ {
[DataField("boardPrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string ChessBoardPrototype { get; } = "ChessBoardTabletop";
// TODO: Un-hardcode the rest of entity prototype IDs, probably. // TODO: Un-hardcode the rest of entity prototype IDs, probably.
public override void SetupTabletop(TabletopSession session, IEntityManager entityManager) public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
{ {
var chessboard = entityManager.SpawnEntity(ChessBoardPrototype, session.Position.Offset(-1, 0)); var chessboard = entityManager.SpawnEntity(BoardPrototype, session.Position.Offset(-1, 0));
session.Entities.Add(chessboard); session.Entities.Add(chessboard);

View File

@@ -0,0 +1,14 @@
using JetBrains.Annotations;
namespace Content.Server.Tabletop
{
[UsedImplicitly]
public sealed class TabletopEmptySetup : TabletopSetup
{
public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
{
var board = entityManager.SpawnEntity(BoardPrototype, session.Position.Offset(0, 0));
session.Entities.Add(board);
}
}
}

View File

@@ -0,0 +1,10 @@
namespace Content.Server.Tabletop;
/// <summary>
/// This is used for tracking pieces that are simply "holograms" shown on the tabletop
/// </summary>
[RegisterComponent]
public sealed class TabletopHologramComponent : Component
{
}

View File

@@ -7,8 +7,6 @@ namespace Content.Server.Tabletop
[UsedImplicitly] [UsedImplicitly]
public sealed class TabletopParchisSetup : TabletopSetup public sealed class TabletopParchisSetup : TabletopSetup
{ {
[DataField("boardPrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string ParchisBoardPrototype { get; } = "ParchisBoardTabletop";
[DataField("redPiecePrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))] [DataField("redPiecePrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string RedPiecePrototype { get; } = "RedTabletopPiece"; public string RedPiecePrototype { get; } = "RedTabletopPiece";
@@ -24,7 +22,7 @@ namespace Content.Server.Tabletop
public override void SetupTabletop(TabletopSession session, IEntityManager entityManager) public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
{ {
var board = entityManager.SpawnEntity(ParchisBoardPrototype, session.Position); var board = entityManager.SpawnEntity(BoardPrototype, session.Position);
const float x1 = 6.25f; const float x1 = 6.25f;
const float x2 = 4.25f; const float x2 = 4.25f;

View File

@@ -1,3 +1,6 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Tabletop namespace Content.Server.Tabletop
{ {
[ImplicitDataDefinitionForInheritors] [ImplicitDataDefinitionForInheritors]
@@ -10,5 +13,8 @@ namespace Content.Server.Tabletop
/// <param name="session">Tabletop session to set up. You'll want to grab the tabletop center position here for spawning entities.</param> /// <param name="session">Tabletop session to set up. You'll want to grab the tabletop center position here for spawning entities.</param>
/// <param name="entityManager">Dependency that can be used for spawning entities.</param> /// <param name="entityManager">Dependency that can be used for spawning entities.</param>
public abstract void SetupTabletop(TabletopSession session, IEntityManager entityManager); public abstract void SetupTabletop(TabletopSession session, IEntityManager entityManager);
[DataField("boardPrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string BoardPrototype = default!;
} }
} }

View File

@@ -1,6 +1,11 @@
using Content.Server.Popups;
using Content.Server.Tabletop.Components; using Content.Server.Tabletop.Components;
using Content.Shared.Examine;
using Content.Shared.Hands.Components;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Item;
using Content.Shared.Tabletop; using Content.Shared.Tabletop;
using Content.Shared.Tabletop.Components;
using Content.Shared.Tabletop.Events; using Content.Shared.Tabletop.Events;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using JetBrains.Annotations; using JetBrains.Annotations;
@@ -16,7 +21,9 @@ namespace Content.Server.Tabletop
public sealed partial class TabletopSystem : SharedTabletopSystem public sealed partial class TabletopSystem : SharedTabletopSystem
{ {
[Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly ViewSubscriberSystem _viewSubscriberSystem = default!; [Dependency] private readonly ViewSubscriberSystem _viewSubscriberSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -27,10 +34,73 @@ namespace Content.Server.Tabletop
SubscribeLocalEvent<TabletopGamerComponent, PlayerDetachedEvent>(OnPlayerDetached); SubscribeLocalEvent<TabletopGamerComponent, PlayerDetachedEvent>(OnPlayerDetached);
SubscribeLocalEvent<TabletopGamerComponent, ComponentShutdown>(OnGamerShutdown); SubscribeLocalEvent<TabletopGamerComponent, ComponentShutdown>(OnGamerShutdown);
SubscribeLocalEvent<TabletopGameComponent, GetVerbsEvent<ActivationVerb>>(AddPlayGameVerb); SubscribeLocalEvent<TabletopGameComponent, GetVerbsEvent<ActivationVerb>>(AddPlayGameVerb);
SubscribeLocalEvent<TabletopGameComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeNetworkEvent<TabletopRequestTakeOut>(OnTabletopRequestTakeOut);
InitializeMap(); InitializeMap();
} }
private void OnTabletopRequestTakeOut(TabletopRequestTakeOut msg, EntitySessionEventArgs args)
{
if (args.SenderSession is not IPlayerSession playerSession)
return;
if (!TryComp(msg.TableUid, out TabletopGameComponent? tabletop) || tabletop.Session is not { } session)
return;
if (!msg.Entity.IsValid())
return;
if (!TryComp(msg.Entity, out TabletopHologramComponent? hologram))
{
_popupSystem.PopupEntity(Loc.GetString("tabletop-error-remove-non-hologram"), msg.TableUid, args.SenderSession);
return;
}
// Check if player is actually playing at this table
if (!session.Players.ContainsKey(playerSession))
return;
// Find the entity, remove it from the session and set it's position to the tabletop
session.Entities.TryGetValue(msg.Entity, out var result);
session.Entities.Remove(result);
_entityManager.QueueDeleteEntity(result);
}
private void OnInteractUsing(EntityUid uid, TabletopGameComponent component, InteractUsingEvent args)
{
if (!EntityManager.TryGetComponent(args.User, out HandsComponent? hands))
return;
if (component.Session is not { } session)
return;
if (hands.ActiveHand == null)
return;
if (hands.ActiveHand.HeldEntity == null)
return;
var handEnt = hands.ActiveHand.HeldEntity.Value;
if (!TryComp<ItemComponent>(handEnt, out var item))
return;
var meta = MetaData(handEnt);
var protoId = meta.EntityPrototype?.ID;
var hologram = _entityManager.SpawnEntity(protoId, session.Position.Offset(-1, 0));
// Make sure the entity can be dragged and can be removed, move it into the board game world and add it to the Entities hashmap
EnsureComp<TabletopDraggableComponent>(hologram);
EnsureComp<TabletopHologramComponent>(hologram);
session.Entities.Add(hologram);
_popupSystem.PopupEntity(Loc.GetString("tabletop-added-piece"), uid, args.User);
}
protected override void OnTabletopMove(TabletopMoveEvent msg, EntitySessionEventArgs args) protected override void OnTabletopMove(TabletopMoveEvent msg, EntitySessionEventArgs args)
{ {
if (args.SenderSession is not IPlayerSession playerSession) if (args.SenderSession is not IPlayerSession playerSession)
@@ -57,11 +127,14 @@ namespace Content.Server.Tabletop
if (!EntityManager.TryGetComponent<ActorComponent?>(args.User, out var actor)) if (!EntityManager.TryGetComponent<ActorComponent?>(args.User, out var actor))
return; return;
ActivationVerb verb = new(); var playVerb = new ActivationVerb()
verb.Text = Loc.GetString("tabletop-verb-play-game"); {
verb.Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/die.svg.192dpi.png")); Text = Loc.GetString("tabletop-verb-play-game"),
verb.Act = () => OpenSessionFor(actor.PlayerSession, uid); Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
args.Verbs.Add(verb); Act = () => OpenSessionFor(actor.PlayerSession, uid)
};
args.Verbs.Add(playVerb);
} }
private void OnTabletopActivate(EntityUid uid, TabletopGameComponent component, ActivateInWorldEvent args) private void OnTabletopActivate(EntityUid uid, TabletopGameComponent component, ActivateInWorldEvent args)

View File

@@ -86,6 +86,13 @@ namespace Content.Shared.Tabletop
} }
} }
[Serializable, NetSerializable]
public sealed class TabletopRequestTakeOut : EntityEventArgs
{
public EntityUid Entity;
public EntityUid TableUid;
}
#region Utility #region Utility
/// <summary> /// <summary>

View File

@@ -0,0 +1,155 @@
book-cnc-sheet = C&C 5e Character Sheet
--------------------------------------------------------------------------------------
SECTION 1: THE BASICS
--------------------------------------------------------------------------------------
Character Name :
Race / Class :
Level / Exp Pts :
Background :
--------------------------------------------------------------------------------------
SECTION 2: ABILITIES
--------------------------------------------------------------------------------------
Strength = 10 (+0) 10 Base
Dexterity = 10 (+0) 10 Base
Constitution = 10 (+0) 10 Base
Intelligence = 10 (+0) 10 Base
Wisdom = 10 (+0) 10 Base
Charisma = 10 (+0) 10 Base
Proficiency Bonus =
Perception (passive wisdom) =
Racial (Race)
Class (Class)
--------------------------------------------------------------------------------------
SECTION 3: SAVING THROWS
--------------------------------------------------------------------------------------
( )Strength = +0
( )Dexterity = +0
( )Constitution = +0
( )Intelligence = +0
( )Wisdom = +0
( )Charisma = +0
--------------------------------------------------------------------------------------
SECTION 4: SKILLS
--------------------------------------------------------------------------------------
( ) Acrobatics (Dex) +0 ( ) Medicine (Wis) +0
( ) Animal Handling (Wis) +0 ( ) Nature (Int) +0
( ) Arcana (Int) +0 ( ) Perception (Wis) +0
( ) Athletics (Str) +0 ( ) Performance (Cha) +0
( ) Deception (Cha) +0 ( ) Persuasion (Cha) +0
( ) History (Int) +0 ( ) Religion (Int) +0
( ) Insight (Wis) +0 ( ) Sleight of Hand (Dex) +0
( ) Intimidation (Cha) +0 ( ) Stealth (Dex) +0
( ) Investigation (Int) +0 ( ) Survival (Wis) +0
--------------------------------------------------------------------------------------
SECTION 5: COMBAT & HEALTH
--------------------------------------------------------------------------------------
Armor Class :
Initiative (passive) :
Speed :
Hit Dice :
Max Hit Points :
Current Hit Points :
Temporary Hit Points :
ATTACKS
Weapon type(Melee or Ranged) / Bonus / Damage (Type)
--------------------------------------------------------------------------------------
SECTION 6: BACKGROUND
--------------------------------------------------------------------------------------
Age / Gender :
Height / Weight :
Eyes / Skin / Hair :
Description :
Background :
Skill Proficiencies :
Tool Proficiencies :
Languages :
Features :
Con of Choice :
Traits :
Ideal :
Bonds :
Flaws :
--------------------------------------------------------------------------------------
SECTION 7: EXTRAS
--------------------------------------------------------------------------------------
Equipment List
Description Cost Weight
lbs
Wealth
PP :
EP :
GP :
SP :
CP :
Gems :
Jewelry :
Other :
Magic Items :
--------------------------------------------------------------------------------------
SECTION 8: SPELLCASTING
--------------------------------------------------------------------------------------
Spell Level:
Spell Save DC:
Spell Attack Mod:
Spell Slots:
1: (MAX) (USED)
2: (MAX) (USED)
3: (MAX) (USED)
4: (MAX) (USED)
5: (MAX) (USED)
6: (MAX) (USED)
7: (MAX) (USED)
8: (MAX) (USED)
9: (MAX) (USED)
Cantrips
Name Casting Time Range Duration Components
1: Name Casting Time Range Duration Components Ritual?
2: Name Casting Time Range Duration Components Ritual?
3: Name Casting Time Range Duration Components Ritual?
4: Name Casting Time Range Duration Components Ritual?
5: Name Casting Time Range Duration Components Ritual?
6: Name Casting Time Range Duration Components Ritual?
7: Name Casting Time Range Duration Components Ritual?
8: Name Casting Time Range Duration Components Ritual?
9: Name Casting Time Range Duration Components Ritual?
--------------------------------------------------------------------------------------
Carps and Crypts 5e

View File

@@ -1,6 +1,9 @@
## TabletopGameComponent ## TabletopGameComponent
tabletop-verb-play-game = Play Game tabletop-verb-play-game = Play Game
tabletop-verb-dump-pieces = Dump Pieces
tabletop-default-board-name = Board Game tabletop-default-board-name = Board Game
tabletop-error-remove-non-hologram = You cant remove a built in piece!
tabletop-added-piece = The board shimmers brightly!
## Chess ## Chess
tabletop-chess-board-name = Chess tabletop-chess-board-name = Chess
@@ -14,3 +17,6 @@ tabletop-backgammon-board-name = Backgammon
## Checkers ## Checkers
tabletop-checkers-board-name = Checkers tabletop-checkers-board-name = Checkers
## Battlemap
tabletop-battlemap-board-name = Battlemap

View File

@@ -140,8 +140,13 @@
- id: BackgammonBoard - id: BackgammonBoard
- id: ParchisBoard - id: ParchisBoard
- id: CheckerBoard - id: CheckerBoard
- id: d6Dice - id: ShipBattlemap
amount: 4 - id: SnowBattlemap
- id: SandBattlemap
- id: MoonBattlemap
- id: GrassBattlemap
- id: DiceBag
amount: 6
- type: entity - type: entity
id: CrateFunATV id: CrateFunATV

View File

@@ -1,12 +1,18 @@
- type: vendingMachineInventory - type: vendingMachineInventory
id: GoodCleanFunInventory id: GoodCleanFunInventory
startingInventory: startingInventory:
DiceBag: 4 DiceBag: 6
Paper: 8 Paper: 8
d6Dice: 8 d6Dice: 8
ChessBoard: 1 ChessBoard: 1
BackgammonBoard: 1 BackgammonBoard: 1
ParchisBoard: 1 ParchisBoard: 1
CheckerBoard: 1 CheckerBoard: 1
ShipBattlemap: 1
SnowBattlemap: 1
SandBattlemap: 1
MoonBattlemap: 1
GrassBattlemap: 1
PaperCNCSheet: 6
MysteryFigureBox: 2 MysteryFigureBox: 2
BooksBag: 3 BooksBag: 3

View File

@@ -1,5 +1,5 @@
- type: entity - type: entity
parent: BaseItem parent: BaseBoardEntity
id: BackgammonBoard id: BackgammonBoard
name: backgammon board name: backgammon board
description: Old fashioned game of dice and pieces. description: Old fashioned game of dice and pieces.
@@ -12,14 +12,14 @@
size: 550, 410 size: 550, 410
setup: setup:
!type:TabletopBackgammonSetup !type:TabletopBackgammonSetup
boardPrototype: BackgammonBoardTabletop
- type: entity - type: entity
id: BackgammonBoardTabletop id: BackgammonBoardTabletop
name: backgammon name: backgammon
parent: BaseBoardTabletop
noSpawn: true noSpawn: true
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/backgammon_tabletop.rsi sprite: Objects/Fun/Tabletop/backgammon_tabletop.rsi
state: backgammonBoard state: backgammonBoard
noRot: false
drawdepth: FloorTiles

View File

@@ -0,0 +1,39 @@
- type: entity
parent: BaseItem
id: BaseBoardEntity # Board item
name: board
abstract: true
description: A blank board.
components:
- type: TabletopGame
size: 256, 256
setup:
!type:TabletopEmptySetup
boardPrototype: Crowbar
- type: entity
id: BaseTabletopPiece # Board piece
parent: BaseItem
abstract: true
components:
- type: TabletopDraggable
- type: Sprite
netsync: false
noRot: true
- type: Appearance
- type: Tag
tags:
- TabletopPiece
- type: entity
id: BaseBoardTabletop
name: baseboard
abstract: true
noSpawn: true
components:
- type: Tag
tags:
- TabletopBoard
- type: Sprite
noRot: false
drawdepth: FloorTiles

View File

@@ -1,6 +1,6 @@
# Uses the chessboard and generic pieces # Uses the chessboard and generic pieces
- type: entity - type: entity
parent: BaseItem parent: BaseBoardEntity
id: CheckerBoard id: CheckerBoard
name: checkerboard name: checkerboard
description: A checkerboard. Pieces included! description: A checkerboard. Pieces included!
@@ -11,35 +11,26 @@
- type: TabletopGame - type: TabletopGame
boardName: tabletop-checkers-board-name boardName: tabletop-checkers-board-name
size: 338, 274 size: 338, 274
setup: !type:TabletopCheckerSetup setup:
!type:TabletopCheckerSetup
boardPrototype: CheckerBoardTabletop
# Checkerboard tabletop item (item only visible in tabletop game) # Checkerboard tabletop item (item only visible in tabletop game)
- type: entity - type: entity
id: CheckerBoardTabletop id: CheckerBoardTabletop
name: checkerboard name: checkerboard
parent: BaseBoardTabletop
noSpawn: true noSpawn: true
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chessboard_tabletop.rsi sprite: Objects/Fun/Tabletop/chessboard_tabletop.rsi
state: chessboard_tabletop state: chessboard_tabletop
noRot: false
drawdepth: FloorTiles
- type: entity
id: BaseCheckerPiece
parent: BaseItem
noSpawn: true
components:
- type: TabletopDraggable
- type: Sprite
noRot: true
- type: Appearance
# The pieces # The pieces
- type: entity - type: entity
id: WhiteCheckerPiece id: WhiteCheckerPiece
name: white piece name: white piece
parent: BaseCheckerPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/checker_pieces.rsi sprite: Objects/Fun/Tabletop/checker_pieces.rsi
@@ -48,7 +39,7 @@
- type: entity - type: entity
id: WhiteCheckerQueen id: WhiteCheckerQueen
name: white queen name: white queen
parent: BaseCheckerPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/checker_pieces.rsi sprite: Objects/Fun/Tabletop/checker_pieces.rsi
@@ -57,7 +48,7 @@
- type: entity - type: entity
id: BlackCheckerPiece id: BlackCheckerPiece
name: black piece name: black piece
parent: BaseCheckerPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/checker_pieces.rsi sprite: Objects/Fun/Tabletop/checker_pieces.rsi
@@ -66,7 +57,7 @@
- type: entity - type: entity
id: BlackCheckerQueen id: BlackCheckerQueen
name: black queen name: black queen
parent: BaseCheckerPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/checker_pieces.rsi sprite: Objects/Fun/Tabletop/checker_pieces.rsi

View File

@@ -1,6 +1,6 @@
# Chessboard item (normal in game item you can hold in your hand) # Chessboard item (normal in game item you can hold in your hand)
- type: entity - type: entity
parent: BaseItem parent: BaseBoardEntity
id: ChessBoard id: ChessBoard
name: chessboard name: chessboard
description: A chessboard. Pieces included! description: A chessboard. Pieces included!
@@ -11,36 +11,26 @@
- type: TabletopGame - type: TabletopGame
boardName: tabletop-chess-board-name boardName: tabletop-chess-board-name
size: 338, 274 size: 338, 274
setup: !type:TabletopChessSetup setup:
!type:TabletopChessSetup
boardPrototype: ChessBoardTabletop
# Chessboard tabletop item (item only visible in tabletop game) # Chessboard tabletop item (item only visible in tabletop game)
- type: entity - type: entity
id: ChessBoardTabletop id: ChessBoardTabletop
name: chessboard name: chessboard
parent: BaseBoardTabletop
noSpawn: true noSpawn: true
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chessboard_tabletop.rsi sprite: Objects/Fun/Tabletop/chessboard_tabletop.rsi
state: chessboard_tabletop state: chessboard_tabletop
noRot: false
drawdepth: FloorTiles
## Chess pieces
- type: entity
id: BaseChessPiece
parent: BaseItem
abstract: true
components:
- type: TabletopDraggable
- type: Sprite
noRot: true
- type: Appearance
# White pieces # White pieces
- type: entity - type: entity
id: WhiteKing id: WhiteKing
name: white king name: white king
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -49,7 +39,7 @@
- type: entity - type: entity
id: WhiteQueen id: WhiteQueen
name: white queen name: white queen
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -58,7 +48,7 @@
- type: entity - type: entity
id: WhiteRook id: WhiteRook
name: white rook name: white rook
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -67,7 +57,7 @@
- type: entity - type: entity
id: WhiteBishop id: WhiteBishop
name: white bishop name: white bishop
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -76,7 +66,7 @@
- type: entity - type: entity
id: WhiteKnight id: WhiteKnight
name: white knight name: white knight
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -85,7 +75,7 @@
- type: entity - type: entity
id: WhitePawn id: WhitePawn
name: white pawn name: white pawn
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -95,7 +85,7 @@
- type: entity - type: entity
id: BlackKing id: BlackKing
name: black king name: black king
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -104,7 +94,7 @@
- type: entity - type: entity
id: BlackQueen id: BlackQueen
name: black queen name: black queen
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -113,7 +103,7 @@
- type: entity - type: entity
id: BlackRook id: BlackRook
name: black rook name: black rook
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -122,7 +112,7 @@
- type: entity - type: entity
id: BlackBishop id: BlackBishop
name: black bishop name: black bishop
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -131,7 +121,7 @@
- type: entity - type: entity
id: BlackKnight id: BlackKnight
name: black knight name: black knight
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi
@@ -140,7 +130,7 @@
- type: entity - type: entity
id: BlackPawn id: BlackPawn
name: black pawn name: black pawn
parent: BaseChessPiece parent: BaseTabletopPiece
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/chess_pieces.rsi sprite: Objects/Fun/Tabletop/chess_pieces.rsi

View File

@@ -0,0 +1,135 @@
# Board item (given to players)
- type: entity
parent: BaseBoardEntity
id: BaseBattlemap
name: battlemap
abstract: true
description: A battlemap for your epic dungeon exploring to begin, pieces not included!
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/grassbm.rsi
state: icon
- type: TabletopGame
boardName: tabletop-battlemap-board-name
setup:
!type:TabletopEmptySetup
boardPrototype: GrassBoardTabletop
- type: entity
parent: BaseBattlemap
id: GrassBattlemap
name: grass battlemap
description: A battlemap for your epic dungeon exploring to begin, pieces not included!
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/grassbm.rsi
- type: TabletopGame
setup:
!type:TabletopEmptySetup
boardPrototype: GrassBoardTabletop
- type: entity
parent: BaseBattlemap
id: MoonBattlemap
name: moon battlemap
description: A battlemap for your epic moon exploring to begin, pieces not included!
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/moonbm.rsi
- type: TabletopGame
setup:
!type:TabletopEmptySetup
boardPrototype: MoonBoardTabletop
- type: entity
parent: BaseBattlemap
id: SandBattlemap
name: sand battlemap
description: A battlemap for your epic beach episodes to begin, pieces not included!
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/sandbm.rsi
- type: TabletopGame
setup:
!type:TabletopEmptySetup
boardPrototype: SandBoardTabletop
- type: entity
parent: BaseBattlemap
id: SnowBattlemap
name: snow battlemap
description: A battlemap for your frigid exploring to begin, pieces not included! # if this isn't funny enough i can remove it
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/snowbm.rsi
- type: TabletopGame
setup:
!type:TabletopEmptySetup
boardPrototype: SnowBoardTabletop
- type: entity
parent: BaseBattlemap
id: ShipBattlemap
name: ship battlemap
description: A battlemap for your epic space exploring to begin, pieces not included!
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/shipbm.rsi
- type: TabletopGame
size: 543, 543
setup:
!type:TabletopEmptySetup
boardPrototype: ShipBoardTabletop
# Background entity (actually shown in the board)
- type: entity
parent: BaseBoardTabletop
id: GrassBoardTabletop
name: grass battlemap
noSpawn: true
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/grassbm_tabletop.rsi
state: tabletop
noRot: false
drawdepth: FloorTiles
- type: entity
parent: BaseBoardTabletop
id: MoonBoardTabletop
name: grass battlemap
noSpawn: true
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/moonbm_tabletop.rsi
state: tabletop
- type: entity
parent: BaseBoardTabletop
id: SandBoardTabletop
name: sand battlemap
noSpawn: true
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/sandbm_tabletop.rsi
state: tabletop
- type: entity
parent: BaseBoardTabletop
id: SnowBoardTabletop
name: snow battlemap
noSpawn: true
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/snowbm_tabletop.rsi
state: tabletop
- type: entity
parent: BaseBoardTabletop
id: ShipBoardTabletop
name: ship battlemap
noSpawn: true
components:
- type: Sprite
sprite: Objects/Fun/Tabletop/Battlemaps/shipbm_tabletop.rsi
state: tabletop

View File

@@ -1,6 +1,6 @@
# Parchís board item (normal in game item you can hold in your hand) # Parchís board item (normal in game item you can hold in your hand)
- type: entity - type: entity
parent: BaseItem parent: BaseBoardEntity
id: ParchisBoard id: ParchisBoard
name: parchís board name: parchís board
description: Cross and circle board game famous for destroying countless friendships. description: Cross and circle board game famous for destroying countless friendships.
@@ -13,16 +13,16 @@
size: 574, 574 size: 574, 574
setup: setup:
!type:TabletopParchisSetup !type:TabletopParchisSetup
boardPrototype: ParchisBoardTabletop
# Parchís tabletop item (item only visible in tabletop game) # Parchís tabletop item (item only visible in tabletop game)
- type: entity - type: entity
id: ParchisBoardTabletop id: ParchisBoardTabletop
name: parchís name: parchís
parent: BaseBoardTabletop
noSpawn: true noSpawn: true
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Fun/Tabletop/parchis_tabletop.rsi sprite: Objects/Fun/Tabletop/parchis_tabletop.rsi
state: board state: board
noRot: false
drawdepth: FloorTiles

View File

@@ -1,18 +1,16 @@
- type: entity - type: entity
id: BaseTabletopPiece id: BaseGenericTabletopPiece
parent: BaseItem parent: BaseTabletopPiece
abstract: true abstract: true
components: components:
- type: TabletopDraggable
- type: Sprite - type: Sprite
noRot: true noRot: true
sprite: Objects/Fun/Tabletop/generic_pieces.rsi sprite: Objects/Fun/Tabletop/generic_pieces.rsi
- type: Appearance
- type: entity - type: entity
id: RedTabletopPiece id: RedTabletopPiece
name: red piece name: red piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: red state: red
@@ -20,7 +18,7 @@
- type: entity - type: entity
id: GreenTabletopPiece id: GreenTabletopPiece
name: green piece name: green piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: green state: green
@@ -28,7 +26,7 @@
- type: entity - type: entity
id: YellowTabletopPiece id: YellowTabletopPiece
name: yellow piece name: yellow piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: yellow state: yellow
@@ -36,7 +34,7 @@
- type: entity - type: entity
id: BlueTabletopPiece id: BlueTabletopPiece
name: blue piece name: blue piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: blue state: blue
@@ -44,7 +42,7 @@
- type: entity - type: entity
id: WhiteTabletopPiece id: WhiteTabletopPiece
name: white piece name: white piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: white state: white
@@ -52,7 +50,7 @@
- type: entity - type: entity
id: BlackTabletopPiece id: BlackTabletopPiece
name: black piece name: black piece
parent: BaseTabletopPiece parent: BaseGenericTabletopPiece
components: components:
- type: Sprite - type: Sprite
state: black state: black

View File

@@ -140,6 +140,37 @@
guides: guides:
- CargoBounties - CargoBounties
- type: entity
name: character sheet
parent: Paper
id: PaperCNCSheet # legally gray zone of using "D&D" and "DND"
description: 'A sheet for your Carps and Crypts characters.'
components:
- type: Paper
contentSize: 10000
escapeFormatting: false
content: book-cnc-sheet
- type: Sprite
sprite: Objects/Misc/bureaucracy.rsi
netsync: false
layers:
- state: paper
color: "#cccccc"
- state: paper_words
map: ["enum.PaperVisualLayers.Writing"]
color: "#cccccc" #aaaaaaaaaaaaaaaaaaaaaaa
visible: false
- state: paper_stamp-generic
map: ["enum.PaperVisualLayers.Stamp"]
visible: false
- type: PaperVisuals
backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png"
contentImagePath: "/Textures/Interface/Paper/paper_content_lined.svg.96dpi.png"
backgroundModulate: "#cccccc"
contentImageModulate: "#cccccc"
backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0
contentMargin: 16.0, 16.0, 16.0, 16.0
- type: entity - type: entity
parent: Paper parent: Paper
id: PaperWritten id: PaperWritten

View File

@@ -801,6 +801,12 @@
- type: Tag - type: Tag
id: Taser id: Taser
- type: Tag
id: TabletopBoard
- type: Tag
id: TabletopPiece
- type: Tag - type: Tag
id: TimerBrigElectronics id: TimerBrigElectronics

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Original by Visne, Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/discordia-space/CEV-Eris/commit/026ee3250ac1de938b503e3eb46ad73dd9c3ca82",
"size": {
"x": 18,
"y": 18
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/discordia-space/CEV-Eris/commit/026ee3250ac1de938b503e3eb46ad73dd9c3ca82",
"size": {
"x": 288,
"y": 288
},
"states": [
{
"name": "tabletop"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Original by Visne, Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/vgstation-coders/vgstation13/tree/e4d3ea7f69d21c3667be12b114fa935c4640cb05",
"size": {
"x": 18,
"y": 18
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/vgstation-coders/vgstation13/tree/e4d3ea7f69d21c3667be12b114fa935c4640cb05",
"size": {
"x": 288,
"y": 288
},
"states": [
{
"name": "tabletop"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Original by Visne, Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/discordia-space/CEV-Eris/commit/026ee3250ac1de938b503e3eb46ad73dd9c3ca82",
"size": {
"x": 18,
"y": 18
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/discordia-space/CEV-Eris/commit/026ee3250ac1de938b503e3eb46ad73dd9c3ca82",
"size": {
"x": 288,
"y": 288
},
"states": [
{
"name": "tabletop"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Original by Visne, Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://opengameart.org/content/seamless-space-backgrounds",
"size": {
"x": 18,
"y": 18
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, parallax from https://opengameart.org/content/seamless-space-backgrounds",
"size": {
"x": 543,
"y": 543
},
"states": [
{
"name": "tabletop"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Original by Visne, Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/tgstation/tgstation/tree/8abb19545828230d92ba18827feeb42a67a55d49",
"size": {
"x": 18,
"y": 18
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Assembled by Just-a-Unity-Dev on GitHub or eclips_e#0001 (728101795427254312) on Discord, texture from https://github.com/tgstation/tgstation/tree/8abb19545828230d92ba18827feeb42a67a55d49",
"size": {
"x": 288,
"y": 288
},
"states": [
{
"name": "tabletop"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB