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
| Column | Type | Description |
|---|---|---|
| id | string | Unique identifier for the item. |
| name_JP | string | Display name in Japanese. |
| name | string | Display name in English. |
| unknown_JP | string | Japanese name of higher-rarity items when unidentified. Can also be a special property, e.g.: #randomBook, #randomPotion. |
| unit_JP | string | Japanese counter word for the object. See Unit JP below. |
| unit | string | Physical form of the object. See Unit below. |
| unknown | string | English name of higher-rarity items when unidentified. Can also be a special property, e.g.: #randomBook, #randomPotion. |
| naming | string | How 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). |
| category | string | Category the item belongs to. Used for auto-dumping and recipe menus (linked to the Category sheet). |
| sort | int | Sort 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. |
| _tileType | string | How 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. |
| _idRenderData | string | How the object sits on the ground and its clipping. See idRenderData below. |
| tiles | int[] | Replacement texture tile ID(s). Multiple tiles follow: front → front reversed → back → back reversed. E.g. 123,-123,456,-456. |
| altTiles | int[] | Variant tiles for alternate states (e.g. a closed chest with contents inside). |
| anime | int[] | 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. |
| skins | int[] | 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. |
| size | int[] | Grid size for large objects: width,height. |
| colorMod | int | Color saturation modifier. 0 means no tinting. |
| colorType | string | Color source: default (first crafting ingredient), alt (secondary), or random. |
| recipeKey | string[] | How the recipe is acquired: * = known by default; - = excluded from the random recipe pool; a character ID = sold by that character. |
| factory | string[] | Crafting station where the item is made. See Factory below. |
| components | string[] | Crafting ingredients. See Components below. |
| disassemble | string[] | Items produced when disassembled. |
| defMat | string | Default 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. |
| tierGroup | string | Tier grouping for upgrade/progression. |
| value | int | Base sell value in orens. |
| LV | int | Crafting skill level required. |
| chance | int | Spawn or generation chance modifier. |
| quality | int | Item 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. |
| weight | int | Item weight. E.g. seed = 30, rod = 500, bed = 4500, piano = 85000. |
| electricity | int | Power draw. Negative values consume electricity (e.g. monitor = -10). |
| trait | string[] | Special behaviors. See Trait below. |
| elements | string | Element aliases from the Element sheet with /level. E.g. lumberjack/4 displays as Lumberjack [****]. |
| range | int | Weapon range in tiles. E.g. short bow = 1, bow = 3, rail gun = 5. |
| attackType | string | Damage/weapon type: Blunt, Bow, Cane, Claw, Gun, Pierce, Punch, Slash. |
| offense | int[4] | Offensive stats: diceCount,diceFaces,damageBonus,hitBonus. E.g. 2,8,5,4 means 2d8, +5 damage, +4 hit. See Offense and Defense below. |
| substats | int[] | Sub-stat modifiers. Official rows only ever use a single value. |
| defense | int[2] | Defensive stats: DV,PV. See Offense and Defense below. |
| lightData | string | Light emission preset. See Light Data below. |
| idExtra | string | Additional render data reference. |
| idToggleExtra | string | Toggleable render data (e.g. on/off lighting). |
| idActorEx | string | Ambient effect around the object. See Ambient Effects below. |
| idSound | string | Sound played when crafting: glass, money, paper, etc. |
| tag | string[] | Built-in behavior flags. See Tags below. |
| workTag | string | Work-related tags. |
| filter | string[] | Generation sources outside crafting: fish, gacha, supply, etc. Used by CreateFromFilter to randomly generate items. |
| roomName_JP | string[] | Room type definition in Japanese. Multiple entries separated by commas. |
| roomName | string[] | Room type definition in English. E.g. Bedroom or Kitchen,Dining Room. |
| detail_JP | string | Item description in Japanese. Shown above the stat info in-game. |
| detail | string | Item 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.
| Character | Romaji | Meaning |
|---|---|---|
| 塊 | katamari | cluster, clump |
| 振り | furi | handheld, melee |
| 対 | tai | pair (e.g. gloves) |
| 台 | dai | machine, pedestal, harp |
| 挺 | tei | long narrow object (e.g. gun, scissors, hoe) |
| 発 | hatsu | ammo |
| 本 | hon | base, body, object |
| 枚 | mai | sheet |
| 粒 | tsubu | grain, pebble |
| 巻 | maki | rolled object |
| 冊 | saku | booklet |
| 錠 | jou | pill |
| 隻 | seki | boat, ship |
| 束 | taba | bundle, bunch |
| 体 | karada | form, statue |
| 袋 | fukuro | bag |
| 張 | chou / hari | stretched |
| 杯 | hai | cup |
| 匹 | biki | (small) animal |
| 品 | hin | object |
Unit
The unit column defines the physical form of the object.
| Value | Value | Value |
|---|---|---|
| bottle | box | bucket |
| bundle | can | chunk |
| feather | gift box | grand cross |
| grimoire | handful | letter |
| painting | pair | piece |
| pinch | poster | pot |
| rod | set | signboard |
| spellbook | staff | statue |
| syringe | tree | tuft |
| whip | whistle |
Tile Type
The _tileType column controls how the object is displayed on the map.
| Type | Behavior |
|---|---|
| ObjBig | Blocks movement. |
| ObjHuge | Blocks movement. |
| Door | Requires a wall; acts as a door/opening. |
| Slope | Changes movement speed when traversing up/down. |
| Stairs | Like Slope but with a more dramatic speed/height change. |
| Paint | Requires a wall to attach to. |
| WallHang | Requires a wall to attach to. |
| Window | Requires 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
idexactly. - Use lowercase
.pngextension (.PNGwill not work). - Place in the
Texturefolder of your mod.Texture/Item/works too — when<id>is not found the game looks upItem/<id>as well. Other subfolders are not found, unless theiditself 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
.pngextension. - Place in the
Texture Replacefolder of your mod.
Snow Variants
| Type | Non-Replacement (@obj) | Replacement (obj) |
|---|---|---|
| Regular | ID.png | obj_123.png |
| Snow | ID_snow.png | objSnow_123.png |
| Small | — | objS_456.png |
| Small Snow | — | objSSnow_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 Name | Value |
|---|---|
| Quick Craft | self |
| Workbench | workbench |
| Tinker's Table | factory_tinker |
| Drafting Table | workbench2 |
| Signboard Workshop | factory_sign |
| Carpenter's Table | factory_wood |
| Blacksmith's Table | factory_metal |
| Anvil | anvil |
| Machine Table | machinebench |
| Mason's Table | factory_stone |
| Glassmaker's Table | factory_glass |
| Accessory Table | factory_accessory |
| Loom | loom |
| Writing Tool | tool_writing |
| Stove | stove |
Components
The components column defines crafting ingredients.
| Syntax | Meaning | Example |
|---|---|---|
id | Requires item id with id. | log |
/N | Requires N items. Default 1. | log/2 |
@material | Requires 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. |
#category | Requires 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| Example | Meaning |
|---|---|
beekeep,2,2,crate,honey | 2×2 container with crate background, holds honey. |
ChestPractice,7,5,crate | 7×5 container with crate background. |
Parameters of some other common traits:
| Example | Meaning |
|---|---|
Workbench,blacksmith | Workbench; required skill (defaults to handicraft). |
Light,3 | Light source; light radius. |
ToolRangeGun,12,4 | Gun; max ammo, reload turns. |
Harvest,gathering,1 | Harvestable; harvest skill, amount. |
Drink,DrinkWater,10 | Drinkable; effect id, value. |
Altar,ehekatl | Altar; deity id. |
RecipeCat,food | Recipe 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(diceandatkare 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.
| Value | Effect |
|---|---|
amb_boat | Boat ambiance. |
amb_crowd | Crowd noise. |
amb_fire | Fire crackling. |
amb_fountain | Fountain sounds. |
amb_smelter | Smelter sounds. |
Tags
The tag column assigns built-in behavior flags.
Some tags, not all:
| Tag | Effect |
|---|---|
exotic | Considered an exotic item. |
godArtifact | Treated as a god artifact. See Religion |
noWish | Cannot be obtained via wishing. |
tourism | Counts as a tourism item. |
rareResource | Considered a rare resource. |
snowTile | Prefers snow tiles (optional if snow obj variants are set up). |
throwWeapon | Returns after being thrown (like a boomerang). |
noCopy | Cannot be copied. |
noShop | Does not appear in the corresponding type of shop. |
fixedElement | Fixed elements enchantment value. |
randomElement | Random elements enchantment value. |
randomSkin | Picks one of the skins looks at random when spawned. |
noSkinRecipe | No 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.
{
"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
{
"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": {}
}
}Numis the number of shots in a burst.Delayis the animation delay in seconds.IdEffectis the ID of the muzzle effect. You may use Custom Effect. Default value isgunfire. Lasers and canes don't use this value.IdSpriteis 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.IdSoundis the ID of the firing sound. You may use Custom Sound. This can be set for all types of guns.IdSoundEjectis the ID of the ejecting sound. You may use Custom Sound. This can be set for all types of guns.Ejectdetermines whether there is a shell eject animation. This can be set for all types of guns.FirePosis the position offset of the muzzle effect relative to the center of the weapon. This can be set for all types of guns.CaneColoris the optional tint override for cane type weapons, leave blank to use weapon's default element's color. The format isRRGGBBhex string. Only guns with traitToolRangeCanecan use this value.CaneColorBlendenables default color and override color blending for cane type weapons. Only guns with traitToolRangeCanecan use this value.ForceLaserforces the gun to use laser animation(added in 23.206 Nightly). This is not needed if gun has traitToolRangeGunEnergy.ForceRailforces the gun to use railgun animation. This is no longer the default behaviour for guns with traitToolRangeGunEnergy.
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:
{
"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.