From 3d3e118796ad0addab31a66d25920191accc2b66 Mon Sep 17 00:00:00 2001 From: Squid Coder <92821989+realSquidCoder@users.noreply.github.com> Date: Sun, 19 Jan 2025 19:22:51 -0600 Subject: [PATCH] Write the basic guide and add the needed images --- docs/guides/stonesense-art-guide.rst | 53 +++++++++++++++++++++ docs/images/Stonesene_sprite_sample.png | Bin 0 -> 694 bytes docs/images/Stonesene_sprite_template.png | Bin 0 -> 515 bytes docs/images/Stonesense_indexed_sprites.png | Bin 0 -> 10256 bytes 4 files changed, 53 insertions(+) create mode 100644 docs/images/Stonesene_sprite_sample.png create mode 100644 docs/images/Stonesene_sprite_template.png create mode 100644 docs/images/Stonesense_indexed_sprites.png diff --git a/docs/guides/stonesense-art-guide.rst b/docs/guides/stonesense-art-guide.rst index 48428e44e6..1259a41265 100644 --- a/docs/guides/stonesense-art-guide.rst +++ b/docs/guides/stonesense-art-guide.rst @@ -2,3 +2,56 @@ Stonesense art creation guide ============================= + +Understanding Sprites +--------------------- +Understanding how Stonesense deals with sprites is central to anyone who wishes to modify the content. +The scheme is not very complicated, and this guide will give a short introduction to how they work. +The way sprites are loaded is fairly generalized. With the exception of floors, which we will discuss later, +all sprites are 32x32 pixels big and come in groups known as Sprite Sheets. All sprites are loaded and +rendered in 32-bit full-color PNGs. + +Here's an example of a typical Stonesense sprite: +.. figure:: ../images/Stonesene_sprite_sample.png + :align: left + +Note that, in order not to conflict with neighboring sprites, a sprite must actually be within a smaller +area than its 32x32 block. A template for the area used by most sprites is: +.. figure:: ../images/Stonesene_sprite_template.png + :align: left + +The solid area is the floor space taken up by a sprite, while the dotted box indicates the volume above this +area corresponding to one z-level. + +Sprite Sheets +------------- +There can be an arbitrary number of sprite sheets configured for Stonesense, yet some are always present as +they contain default sprites (see further down). Most of the content XML files allow users to specify sprite +sheets, and this is done by adding a file attribute to the content nodes. By convention sprite sheets should +be placed in their appropriate folder, with creature sprite sheets in the creatures folder etc. + +Sprite Index +------------ +Sprite Index (sometimes referred to as Sheet Index) is a concept for referring to a specific sprite on a sheet. +The index starts with the upper left sprite which has index zero. It then increments to the right. Stonesense +is hardcoded to 20 sprites wide sheets, this means that the last sprite to the right in the first row has Sprite +Index 19. The first sprite on the second row has index 20. This boundary is hardcoded and changing the size of +the sheet will not affect it. + +This image shows how sprites are indexed. Note: Grid added for readability. +.. figure:: ../images/Stonesense_indexed_sprites.png + :align: left + +Specific Sprite Sheets +---------------------- +**objects.png** is the default sheet for buildings and vegetation. Also used for all hard-coded content, like default +plants, the cursor, default walls and liquid. + +**creatures.png** is the default sprite sheet for creatures. If no file is specified in a creature node, this is the +sheet it will use. + +**floors.png** holds all the Stonesense floors. Unlike the other sprite sheet, this sheet is hard-coded with sprite +dimensions of 32x20 pixels. + +Stonesense is fully configurable in the way it renders creatures. No information is hardcoded, but rather loaded +from the creature databases found in the creatures directory. diff --git a/docs/images/Stonesene_sprite_sample.png b/docs/images/Stonesene_sprite_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..35dcbefd55151f27e30aa656df873d0681d2b253 GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?ST8O&t`t2nauOECHJd(Bf=5zA0u#~7r?biB#Br15j!LI|B<)rGb&L0pkLQsURC!7eGv!0%U^# z6VO~Hu*x7y3m^-s%h138BrCW67yHpxt!7}bs(QLOhFJKwPHNoNtia=(xpL9}|A+NG zxt+`JMV7m@-bo9*{%-B8Rc4{Tx6R!B^`DE~>}z)po!xaidDXAGcWiZbl^WmnDO1oW z>wfW$JMu1%)pOQGUNd<=PGET6IDgT3o=LqwOW92X1Sij6V4umzl&4yLspw!|@-p^` zvP+Ug8iI{xEYVT6+r(-R<;S`Bbk9s~zm;iTv&#E*otgJNn{@c{DGttx2meaXw0z!e zy+EL8eV1HOvZqKZW0#|R%%S;znID9HZaMr*QEK7y4Ggm$xE$5{KkI5&mP63=A76I` znk@YB=e+GY#jlTLww}G!P$>H&=D7U<332ZueLe{ZzibrevtQ%YOh|ELK2|DN?eQ}v xeN*WtCJ!6qeT)M33`>myuy_`b4FaB$j0`V;o`TV6mNEdP zCa^QG096_o85=MzfS3xhk#zyYq$xl)2rvQ7Wdf@Vva|rQpt=kV3_!B_m-4?!{`z+k z$eiTq;uvD#-#al{s6l~;`RTvu+cY)5vF?z+mBRhF=RAkUnzQWA*Behu^j)>feBisd zac3{v26o;D^>;Qz2D)BfGsAFdSlHWNXJ7ai@lEA#I&x>p98Gf$8P7j#hd62$ghp^? zFN<7r>z=5wH1CUgTe~DWM4fSd50` literal 0 HcmV?d00001 diff --git a/docs/images/Stonesense_indexed_sprites.png b/docs/images/Stonesense_indexed_sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..dc749a21965f0472cf189ecfe1083ec0892ccb87 GIT binary patch literal 10256 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 literal 0 HcmV?d00001