From a0910f8fa18d8527e03ffca784c5f43ad80c60ca Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 13 Sep 2022 13:12:38 +0900 Subject: [PATCH] gameblockloader --- Modules:Setup.md | 59 ++++++++++++++++++++++++++++++++++++++++++++--- autotiling1.png | Bin 0 -> 18823 bytes 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 autotiling1.png diff --git a/Modules:Setup.md b/Modules:Setup.md index 2370503..f850e6b 100644 --- a/Modules:Setup.md +++ b/Modules:Setup.md @@ -1,5 +1,5 @@ ## Metadata -Every modules must be able to introduce themselves through the `metadata.properties` file. +Every module must be able to introduce themselves through the `metadata.properties` file. The metadata file is a standard-issue Java properties file with some required keys. @@ -59,22 +59,75 @@ The Modmgr provides the functions to load the following ingame elements: - ModMgr.**GameRetextureLoader** — loads the retextures - ModMgr.**GameCraftingRecipeLoader** — loads the crafting recipes +The Modmgr will load the blocks/items, assign them the Itme IDs, and register them to their respective *Codex*. + #### GameBlockLoader The GameBlockLoader looks for the `/blocks/blocks.csv` for the list of blocks and the `/wires/wires.csv` for the list of wires. Every block within a module gets a unique number as an ID. A texture of the block must be named as the ID, with the extension of `.tga`. -TODO describe the csv +The Item ID for the blocks will be `:` e.g. `basegame:32` + +##### blocks.csv + +Every block's property is defined on the csv file with following columns: + +- id: ID of this block +- drop: Which item the DroppedItem actually adds to your inventory +- spawn: Which item the DroppedItem should impersonate when spawned +- name: String identifier of the block +- shdr: Shade Red (light absorption). Valid range 0.0–1.0+ +- shdg: Shade Green (light absorption). Valid range 0.0–1.0+ +- shdb: Shade Blue (light absorption). Valid range 0.0–1.0+ +- shduv: Shade UV (light absorbtion). Valid range 0.0–1.0+ +- lumr: Luminosity Red (light intensity). Valid range 0.0–1.0+ +- lumg: Luminosity Green (light intensity). Valid range 0.0–1.0+ +- lumb: Luminosity Blue (light intensity). Valid range 0.0–1.0+ +- lumuv: Luminosity UV (light intensity). Valid range 0.0–1.0+ +- str: Strength of the block +- dsty: Density of the block. Water have 1000 in the in-game scale +- mate: Material of the block (defined in the MaterialCodex; see GameMaterialLoader) +- solid: Whether the file has full collision (0/1) +- plat: Whether the block should behave like a platform (0/1) +- wall: Whether the block can be used as a wall (0/1) +- grav: Whether the block should fall through the empty space. N/A to not make it fall; 0 to fall immediately (e.g. Sand), nonzero to indicate that number of floating blocks can be supported (e.g. Scaffolding) +- dlfn: Dynamic Light Function. 0=Static. Please see notes +- fv: Vertical friction when player slide on the cliff. 0 means not slide-able +- fr: Horizontal friction. <16:slippery; 16:regular; >16:sticky +- colour: [Fluids] Colour of the block in hexadecimal RGBA. +- vscs: [Fluids] Viscocity of the block. 16 for water. +- refl: [NOT Fluids] Reflectance of the block, used by the light calculation. Valid range 0.0–1.0 +- tags: Tags used by the crafting system and the game's internals + +Notes on `dlfn`: + +- dlfn stands for the Dynamic Luminosity Function. +- 0—static; 1—torch flicker; 2—current global light (sun, star, moon); 3—daylight at noon; 4—slow breath; 5—pulsating ##### Block Texture Format -Autotiling and TODO +Block spritesheet must be one of following sizes (assuming global TILE_SIZE of 16): 16x16, 64x16, 128x16, 112x112, 224x224. Different sheet size denotes different format of the sheet. + +- 16x16: Just a single tile. No autotiling and other tiles won't connect to it. +- 64x16: A "wall sticker". Used by torches. Indices: free-floating, stuck-on-left, stuck-on-right, stuck-on-bottom +- 128x16: A "platforms". Used by platforms. Indices: middle, right-end, left-end, stuck-on-left-middle, stuck-on-left-end, stuck-on-right-middle, stuck-on-right-end, single-piece +- 112x112: The full autotiling. +![If this image does not load, please look at the ingame asset located on assets/mods/basegame/blocks/33.tga](autotiling1.png) +The "empty" tile at the (6,5) work as a "barcode" to assign properties. Each row on the square encodes a number in binary: pixel plotted = 1 + - Topmost row: the connection type + - …0000—connect mutually (every tile tagged as 0 will connect to each other); …0001—connect to self + - Second row: the mask type + - …0010—use the autotiling (this row is reserved for future expansion; for now just mark it accordingly) +- 224x224: Same as 112x112 but has seasonal variations. On render, colours from the current and the next seasons will be blended according to the ingame calender time. + - Top-left—spring; Top-right—summer; Bottom-right—autumn; Bottom-left—winter #### GameItemLoader The GameItemLoader looks for the `/items/itemid.csv` for the list of items. +The Item ID for the items will be `item@:` e.g. `item@basegame:1` + TODO describe the csv but not the GameItem #### GameMaterialLoader diff --git a/autotiling1.png b/autotiling1.png new file mode 100644 index 0000000000000000000000000000000000000000..939fcf86c4257fd74d990b878facd55fdd97ffee GIT binary patch literal 18823 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