Skip to content

Thing Sheet

When making source sheets, you must copy the first 3 rows of the official source sheet completely and start your data at the 4th row.

About columns, empty rows and empty cells

Missing columns are silently filled with empty values with no error at all — so copy the whole official header row and do not delete columns or change their order.

A row with an empty id aborts the rest of the sheet, every row after it is skipped, again with no warning. Do not use blank rows to group your data unless intentionally.

An empty cell is not an empty value — the game falls back to the default on row 3, where components defaults to log, defMat to oak and category to other.

You can change your default row 3 values to apply it to all other rows. Your data should start at the 4th row.

The official Thing sheet has two sort columns; the later one is the one that takes effect (for duplicate names the last one wins). Just copy the header as-is.

Sheet Columns

ColumnTypeDescription
idstringUnique identifier for the item.
name_JPstringDisplay name in Japanese.
namestringDisplay name in English.
unknown_JPstringJapanese name of higher-rarity items when unidentified. Can also be a special property, e.g.: #randomBook, #randomPotion.
unit_JPstringJapanese counter word for the object. See Unit JP below.
unitstringPhysical form of the object. See Unit below.
unknownstringEnglish name of higher-rarity items when unidentified. Can also be a special property, e.g.: #randomBook, #randomPotion.
namingstringHow the name is composed when stacked. m = "material + item name (count)"; ma = material name only (count), used for raw materials; blank = item name only (count).
categorystringCategory the item belongs to. Used for auto-dumping and recipe menus (linked to the Category sheet).
sortintSort order. E.g. 2200 places it in the bow range. There are two sort columns; the later one takes effect (for duplicate names the last one wins), but note that you should not delete either of them.
_tileTypestringHow the object is displayed on the map. See Tile Type below. Must be a tile type the game knows — a typo here makes the whole source sheet fail to load.
_idRenderDatastringHow the object sits on the ground and its clipping. See idRenderData below.
tilesint[]Replacement texture tile ID(s). Multiple tiles follow: front → front reversed → back → back reversed. E.g. 123,-123,456,-456.
altTilesint[]Variant tiles for alternate states (e.g. a closed chest with contents inside).
animeint[]Two values: frameCount,frameDuration. When the idRenderData column uses the @obj and Sprite Animation is used, this column does not need to be filled in.
skinsint[]Skin variant reference. The number of values is the number of alternate looks (N+1 including the base one); the build and craft menus list them accordingly. When the idRenderData column uses the @obj and Sprite Variations is used, this column does not need to be filled in.
sizeint[]Grid size for large objects: width,height.
colorModintColor saturation modifier. 0 means no tinting.
colorTypestringColor source: default (first crafting ingredient), alt (secondary), or random.
recipeKeystring[]How the recipe is acquired: * = known by default; - = excluded from the random recipe pool; a character ID = sold by that character.
factorystring[]Crafting station where the item is made. See Factory below.
componentsstring[]Crafting ingredients. See Components below.
disassemblestring[]Items produced when disassembled.
defMatstringDefault material (e.g. oak). Determines the icon/preview color. Prefix it with ! (e.g. !oak) to lock the material, so the item never rolls a different one. An unknown material silently falls back to granite.
tierGroupstringTier grouping for upgrade/progression.
valueintBase sell value in orens.
LVintCrafting skill level required.
chanceintSpawn or generation chance modifier.
qualityintItem rarity tier: -1 Crude, 0 Normal, 1 Superior, 2 Legendary, 3 Mythical, 4 Artifact. The ☆ and ★ are determined by this column. It also decides whether offense / defense are used as-is — see Offense and Defense below.
weightintItem weight. E.g. seed = 30, rod = 500, bed = 4500, piano = 85000.
electricityintPower draw. Negative values consume electricity (e.g. monitor = -10).
traitstring[]Special behaviors. See Trait below.
elementsstringElement aliases from the Element sheet with /level. E.g. lumberjack/4 displays as Lumberjack [****].
rangeintWeapon range in tiles. E.g. short bow = 1, bow = 3, rail gun = 5.
attackTypestringDamage/weapon type: Blunt, Bow, Cane, Claw, Gun, Pierce, Punch, Slash.
offenseint[4]Offensive stats: diceCount,diceFaces,damageBonus,hitBonus. E.g. 2,8,5,4 means 2d8, +5 damage, +4 hit. See Offense and Defense below.
substatsint[]Sub-stat modifiers. Official rows only ever use a single value.
defenseint[2]Defensive stats: DV,PV. See Offense and Defense below.
lightDatastringLight emission preset. See Light Data below.
idExtrastringAdditional render data reference.
idToggleExtrastringToggleable render data (e.g. on/off lighting).
idActorExstringAmbient effect around the object. See Ambient Effects below.
idSoundstringSound played when crafting: glass, money, paper, etc.
tagstring[]Built-in behavior flags. See Tags below.
workTagstringWork-related tags.
filterstring[]Generation sources outside crafting: fish, gacha, supply, etc. Used by CreateFromFilter to randomly generate items.
roomName_JPstring[]Room type definition in Japanese. Multiple entries separated by commas.
roomNamestring[]Room type definition in English. E.g. Bedroom or Kitchen,Dining Room.
detail_JPstringItem description in Japanese. Shown above the stat info in-game.
detailstringItem description in English. Shown above the stat info in-game.

Unit JP

The unit_JP column defines the Japanese counter word for the object. These do not directly apply to the English version.

CharacterRomajiMeaning
katamaricluster, clump
振りfurihandheld, melee
taipair (e.g. gloves)
daimachine, pedestal, harp
teilong narrow object (e.g. gun, scissors, hoe)
hatsuammo
honbase, body, object
maisheet
tsubugrain, pebble
makirolled object
sakubooklet
joupill
sekiboat, ship
tababundle, bunch
karadaform, statue
fukurobag
chou / haristretched
haicup
biki(small) animal
hinobject

Unit

The unit column defines the physical form of the object.

ValueValueValue
bottleboxbucket
bundlecanchunk
feathergift boxgrand cross
grimoirehandfulletter
paintingpairpiece
pinchposterpot
rodsetsignboard
spellbookstaffstatue
syringetreetuft
whipwhistle

Tile Type

The _tileType column controls how the object is displayed on the map.

TypeBehavior
ObjBigBlocks movement.
ObjHugeBlocks movement.
DoorRequires a wall; acts as a door/opening.
SlopeChanges movement speed when traversing up/down.
StairsLike Slope but with a more dramatic speed/height change.
PaintRequires a wall to attach to.
WallHangRequires a wall to attach to.
WindowRequires a wall; hides when windows are hidden (e.g. when inside the building).

idRenderData

The _idRenderData column controls how the object sits on the ground and its clipping behavior.

@obj — Custom Texture (Non-Replacement)

Used for custom items not using Texture Replacement:

  • File name must match the id exactly.
  • Use lowercase .png extension (.PNG will not work).
  • Place in the Texture folder of your mod. Texture/Item/ works too — when <id> is not found the game looks up Item/<id> as well. Other subfolders are not found, unless the id itself carries that prefix.

The @ makes the game center the whole image according to its actual size, which is exactly what a full custom sprite needs. You may also write @obj#otherItemId: the part after # borrows that item's pref (placement and collision properties).

obj — Texture Replacement

Used for items using Texture Replacement. This occupies a tile slot in the Texture Viewer and may collide with other mods:

  • File name format: obj_tileID (e.g. objS_5032).
  • Use lowercase .png extension.
  • Place in the Texture Replace folder of your mod.

Snow Variants

TypeNon-Replacement (@obj)Replacement (obj)
RegularID.pngobj_123.png
SnowID_snow.pngobjSnow_123.png
SmallobjS_456.png
Small SnowobjSSnow_456.png

Factory

The factory column defines where the item is crafted. Leave blank if the item is not craftable by the player.

In-Game NameValue
Quick Craftself
Workbenchworkbench
Tinker's Tablefactory_tinker
Drafting Tableworkbench2
Signboard Workshopfactory_sign
Carpenter's Tablefactory_wood
Blacksmith's Tablefactory_metal
Anvilanvil
Machine Tablemachinebench
Mason's Tablefactory_stone
Glassmaker's Tablefactory_glass
Accessory Tablefactory_accessory
Loomloom
Writing Tooltool_writing
Stovestove

Components

The components column defines crafting ingredients.

SyntaxMeaningExample
idRequires item id with id.log
/NRequires N items. Default 1.log/2
@materialRequires item with the given material.chunk@snow/10 → 10 snow chunks.
|"Or" — choose one of the options.rock/2|ingot → 2 rocks or 2 ingots.
#categoryRequires choosing an item from your inventory matching the category.#book → pick any book from your inventory.
+Optional ingredient — the item can be crafted without it.+rune → an extra rune may be added.
$This ingredient determines the color of the result.$log/2

Prefixes can be combined in any order, e.g. +#book.

A components column containing just - means "use the default ingredient list", not "no ingredients". Leaving it blank falls back to the column default log, i.e. one log — to make an item non-craftable, leave factory blank instead.

Examples

Well: rock/10,rope/3,log/2 → 10 rock, 3 ropes, 2 logs.

Sickle: rock/2|ingot,string/1,stick/1 → 2 rocks OR 2 ingots, 1 string, 1 stick.

Bookshelf: plank/4,#book,#book → 4 planks, 2 books of your choice.

generator_snowman chunk@snow/1 → 1 snow chunk.

Trait

The trait column defines special behaviors. The format is always a comma-separated list: the first entry is the trait name (the game looks for a class called Trait<name>), and the remaining entries are its parameters. What those parameters mean depends on the trait.

For container-type objects, use the format:

Container,rows,columns,backgroundImage,specialNotes
ExampleMeaning
beekeep,2,2,crate,honey2×2 container with crate background, holds honey.
ChestPractice,7,5,crate7×5 container with crate background.

Parameters of some other common traits:

ExampleMeaning
Workbench,blacksmithWorkbench; required skill (defaults to handicraft).
Light,3Light source; light radius.
ToolRangeGun,12,4Gun; max ammo, reload turns.
Harvest,gathering,1Harvestable; harvest skill, amount.
Drink,DrinkWater,10Drinkable; effect id, value.
Altar,ehekatlAltar; deity id.
RecipeCat,foodRecipe book; recipe category.

Parameters can always be omitted, in which case the trait's own default is used.

Offense and Defense

offense holds four values: diceCount,diceFaces,damageBonus,hitBonus. So 2,8,5,4 reads as "2d8, +5 damage, +4 hit". defense holds two: DV,PV.

These numbers are only used as-is when quality is 4 (Artifact). For every other quality the game rescales them by material and rarity, with a bit of randomness on top:

  • rarity baseline: Crude 150, Normal 120, Superior 100, Legendary and above 80 — the lower the baseline, the stronger the result;
  • dice faces ≈ diceFaces × the material's dice ÷ baseline, damage bonus ≈ damageBonus × the material's atk × 9 ÷ baseline (dice and atk are columns on the Material sheet), and defense is rescaled by the material the same way.

In other words, for ordinary equipment the sheet holds baseline values, not final ones — tune them together with defMat and quality, or it will look like your edits do nothing.

Light Data

The lightData column defines the light emission appearance.

Value
altar_machine
bonfire
fireplace
fridge
gacha
general
kiln
lamp_sun
lamp_table
light_floor
light_spot
light_stand
light_wall

Ambient Effects

The idActorEx column defines ambient effects around the object.

ValueEffect
amb_boatBoat ambiance.
amb_crowdCrowd noise.
amb_fireFire crackling.
amb_fountainFountain sounds.
amb_smelterSmelter sounds.

Tags

The tag column assigns built-in behavior flags.

Some tags, not all:

TagEffect
exoticConsidered an exotic item.
godArtifactTreated as a god artifact. See Religion
noWishCannot be obtained via wishing.
tourismCounts as a tourism item.
rareResourceConsidered a rare resource.
snowTilePrefers snow tiles (optional if snow obj variants are set up).
throwWeaponReturns after being thrown (like a boomerang).
noCopyCannot be copied.
noShopDoes not appear in the corresponding type of shop.
fixedElementFixed elements enchantment value.
randomElementRandom elements enchantment value.
randomSkinPicks one of the skins looks at random when spawned.
noSkinRecipeNo skin choice offered in the craft menu.

Ranged Weapon

Sometimes you want to customize some data for your ranged weapon. The gun data is a JSON file located in your LangMod/**/Data/ folder, named EffectSetting.guns.json.

json
{
    "biubiu_gun": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "gunfire",
        "IdSprite": "ranged_gun",
        "IdSound": "attack_gun",
        "IdSoundEject": "bullet_drop",
        "Eject": true,
        "FirePos": {
            "x": 0.23,
            "y": 0.04
        },
        "CaneColor": "",
        "CaneColorBlend": false,
        "ForceLaser": false,
        "ForceRail": false,
    }
}

This will import a gun data named biubiu_gun, which should match your ranged weapon ID. You can also use an existing weapon ID in the game to override it.

Here are the existing gun data in game:

Gun Data
json
{
    "gun": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "gunfire",
        "IdSprite": "ranged_gun",
        "IdSound": "attack_gun",
        "IdSoundEject": "bullet_drop",
        "Eject": true,
        "FirePos": {
            "x": 0.23,
            "y": 0.04
        }
    },
    "gun_assault": {
        "Num": 3,
        "Delay": 0.1,
        "IdEffect": "gunfire",
        "IdSprite": "ranged_gun",
        "IdSound": "attack_gun_assault",
        "IdSoundEject": "bullet_drop",
        "Eject": true,
        "FirePos": {
            "x": 0.48,
            "y": 0.04
        }
    },
    "bow": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_arrow",
        "IdSound": "attack_bow",
        "Eject": false,
        "FirePos": {}
    },
    "gun_rail": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "",
        "IdSound": "attack_gun_rail",
        "Eject": false,
        "FirePos": {}
    },
    "cane": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_cane",
        "IdSound": "attack_cane",
        "Eject": false,
        "FirePos": {}
    },
    "windbow": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_arrow_wind",
        "IdSound": "attack_windbow",
        "Eject": false,
        "FirePos": {}
    },
    "gun_mani": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_gun",
        "IdSound": "attack_gun_shotgun",
        "IdSoundEject": "bullet_drop",
        "Eject": true,
        "FirePos": {
            "x": 0.23,
            "y": 0.04
        }
    },
    "gun_laser": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "",
        "IdSound": "attack_gun_laser",
        "Eject": false,
        "FirePos": {}
    },
    "panzerfaust": {
        "Num": 1,
        "Delay": 0.01,
        "IdEffect": "gunfire",
        "IdSprite": "ranged_gun_rocket",
        "IdSound": "attack_gun_rocket",
        "Eject": false,
        "FirePos": {}
    },
    "gun_laser_assault": {
        "Num": 3,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_gun_laser",
        "IdSound": "attack_gun_laser_assault",
        "Eject": false,
        "FirePos": {
            "x": 0.28,
            "y": 0.2
        }
    },
    "shotgun": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_fun",
        "IdSound": "attack_gun_shotgun",
        "Eject": false,
        "FirePos": {
            "x": 0.3,
            "y": 0.18
        }
    },
    "sling": {
        "Num": 1,
        "Delay": 0.1,
        "IdEffect": "",
        "IdSprite": "ranged_stone",
        "IdSound": "throw",
        "Eject": false,
        "FirePos": {}
    }
}
  • Num is the number of shots in a burst.
  • Delay is the animation delay in seconds.
  • IdEffect is the ID of the muzzle effect. You may use Custom Effect. Default value is gunfire. Lasers and canes don't use this value.
  • IdSprite is the name of the projectile texture, which needs to be an existing texture in the game or a texture you placed in the Texture folder. Lasers don't use this value.
  • IdSound is the ID of the firing sound. You may use Custom Sound. This can be set for all types of guns.
  • IdSoundEject is the ID of the ejecting sound. You may use Custom Sound. This can be set for all types of guns.
  • Eject determines whether there is a shell eject animation. This can be set for all types of guns.
  • FirePos is the position offset of the muzzle effect relative to the center of the weapon. This can be set for all types of guns.
  • CaneColor is the optional tint override for cane type weapons, leave blank to use weapon's default element's color. The format is RRGGBB hex string. Only guns with trait ToolRangeCane can use this value.
  • CaneColorBlend enables default color and override color blending for cane type weapons. Only guns with trait ToolRangeCane can use this value.
  • ForceLaser forces the gun to use laser animation(added in 23.206 Nightly). This is not needed if gun has trait ToolRangeGunEnergy.
  • ForceRail forces the gun to use railgun animation. This is no longer the default behaviour for guns with trait ToolRangeGunEnergy.

Any value that you wish to use default for, can be omitted.

You may add as many gun data as you want in this file, simply separate them by , comma, such as:

json
{
    "biubiu_gun": { 
        data 
    },
    "rainbow_wand": {
        data
    }
}

Gun Sockets

You can specify gun sockets by using the tag addSocket and addSocket(enchant_alias) in the Thing sheet. For example, addSocket,addSocket,addSocket(bane_god) will ensure 2 empty sockets and 1 socket with enchant God Bane will be added.

You can also use noRandomSocket tag to remove all random generated sockets before applying your own.

This project is an unofficial documentation site and is not affiliated with, endorsed by, or associated with Elin or Lafrontier / Noa. All trademarks are the property of their respective owners.