Skip to content

Visual editor

These sheets can be edited in the browser with Elin ModMaker. A character's sprites, portrait, talk lines, dramas and per-language text are gathered in one place, and cross-sheet references such as race, job and elements come with completion and validation.

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 filled with empty values โ€” the game logs a #source ill-format warning (visible in Player.log) and keeps loading. Reordered columns are re-mapped by header name automatically. Still, copy the whole official header row as-is; it avoids both paths entirely.

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 โ€” an unknown value throws during card initialization and interrupts loading of all card rows. Left blank it defaults to Obj.
_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 (main color of the coloring material), alt (the material's alt color), or random.
recipeKeystring[]How the recipe is acquired: * = known by default; - = excluded from the random recipe pool; a shop type name (ShopType enum, e.g. Farris) = sold by merchants of that shop type.
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 falls back to granite with an error logged.
tierGroupstringTier grouping for upgrade/progression.
valueintBase sell value in orens.
LVintItem level. Also used as the crafting 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.
HPintItem HP. Default 100.
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 [****].
rangeintBest effective range in tiles for ranged weapons โ€” accuracy falls off away from this distance. 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,hitBonus,damageBonus. E.g. 2,8,5,4 means 2d8, +5 hit, +4 damage. See Offense and Defense below.
substatsint[]Sub-stat modifiers; the first value is used as penetration. 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.
SlopeRamp that can be traversed up/down.
StairsLike Slope with different rendering and build rules.
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 it directly in the Texture folder of your mod. 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.

New Block / Floor / Obj rows do not need a slot

Tile rows (Block, Floor, Obj, Deco, CellEffect) can ship their own PNG as Texture/<Table>/<alias>.png; the game gives them a free cell in the sprite sheet at startup, so they never collide with other mods. See Texture Replace & Tile Textures.

Snow Variants โ€‹

TypeNon-Replacement (@obj)Replacement (obj)
RegularID.pngobj_123.png
SnowID_snow.pngobjSnow_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 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_writting
Cookerstove

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

Only the + prefix can be stacked in front of another prefix, e.g. +#book or +$log; $ and # cannot be combined with each other.

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,width,height,backgroundImage,idContainer

idContainer is optional: an item/category/spawnlist id whose contents are pre-spawned inside the container when it is first opened.

ExampleMeaning
beekeep,2,2,crate,honey2ร—2 container with crate background, pre-spawns honey.
ChestPractice,7,5,crate7 wide ร— 5 tall container with crate background.

Parameters of some other common traits:

ExampleMeaning
Workbench,blacksmithWorkbench; required skill (defaults to handicraft).
LightPlaced light source; appearance/radius comes from the lightData preset, takes no parameters.
LightSource,4Equippable light 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,hitBonus,damageBonus. So 2,8,5,4 reads as "2d8, +5 hit, +4 damage". 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, hit bonus โ‰ˆ hitBonus ร— the material's atk ร— 9 รท baseline, damage bonus โ‰ˆ damageBonus ร— the material's dmg ร— 5 รท baseline (dice, atk and dmg are columns on the Material sheet); DV โ‰ˆ DV ร— the material's dv ร— 7 รท baseline and PV โ‰ˆ PV ร— the material's pv ร— 9 รท baseline.

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
klin
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
exoticPresent on vanilla exotic goods; no direct code effect found.
godArtifactTreated as a god artifact. See Religion
noWishCannot be obtained via wishing.
tourismCounts as a tourism item.
rareResourceConsidered a rare resource.
throwWeaponMarks a dedicated throwing weapon (thrown on auto-attack, throwing bonuses apply). To make it return like a boomerang, add the throwReturn element in elements instead.
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. Canes don't use this value; energy (laser) guns still play it.
  • 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. Only takes effect on laser-type guns (trait ToolRangeGunEnergy or ForceLaser). 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.