And it should probably be WRITE_SHORT, for 4-byte fields?
1-byte fields get WRITE_BYTE
2-byte fields get WRITE_SHORT
4-byte fields get WRITE_LONG
8-byte fields get WRITE_ASCII (I think? Rarely encounter these.)
Eight-byte fields are typically ASCII fields, so while this is generally correct, it's not technically correct (the best kind of correct). WRITE_ASCII should be used for any ASCII field, be it the two-byte item animation field, the eight-byte resource field in an effect, or a 32-byte creature DV field. If you have a non-ASCII field of any length, use whatever combo of WRITE_BYTE/SHORT/LONG is appropriate. This is also why you see macros use INT_VAR (integers, non-ASCII) and STR_VAR (strings, ASCII) parameters.
SAY is just a fancy WRITE_LONG that accepts string parameters and spits out the correct strref for a field. SAY #123, SAY @123, and SAY ~foo~ will all work; WeiDU will either use an existing tlk reference that matches your string, or add the string to the tlk and use the new reference.
You can abuse READ/WRITE_ASCII for non-ASCII stuff since its ability to read/write arbitrary lengths is very useful--Tweaks and others use it to clone effects in single read/writes, for example, the majority of which is not data. In general, though, you're better served keeping them separate.
edit: A simple example may be better. Using WRITE_BYTE 0x00 4 will write 0x04 at the offset. Using WRITE_ASCII 0x00 4 #1 will write 0x34, the ASCII value for 4, at the offset.
Edited by CamDawg, 20 November 2017 - 12:18 PM.