Editing Wikifang:Network Translation Patchsite/BugVM

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 95: Line 95:
|-
|-
! 5x
! 5x
| SCRCURS <br> [[#op_C54|$C54]] || || || || || || || || || || WINDIALOG <br> [[#op_AED|$AED]] || WINCLR <br> [[#op_97C|$97C]] || || || || RESLD <br> [[#op_9C6|$9C6]]
| || || || || || || || || || || || WINCLR <br> [[#op_97C|$97C]] || || || || RESLD <br> [[#op_9C6|$9C6]]
|-
|-
! 6x
! 6x
| || SPRINPUT <br> [[#op_A29|$A29]] || || || || || || || || || FARCALL <br> [[#op_91B|$91B]] || FARJMP <br> [[#op_83B|$83B]] || || || SPRANIM <br> [[#op_2775|$2775]] || SPRPOSPLAY <br> [[#op_2788|$2788]]
| || || || || || || || || || || FARCALL <br> [[#op_91B|$91B]] || FARJMP <br> [[#op_83B|$83B]] || || || ||
|-
|-
! 7x
! 7x
| WINCHOICE <br> [[#op_13B4|$13B4]] || || TILELD <br> [[#op_1BAC|$1BAC]] || || || PALLD <br> [[#op_2F0E|$2F0E]] || || || SPRCHOREO <br> [[#op_3269|$3269]] || || || || || WINCOORD <br> [[#op_C24|$C24]] || WINCURS <br> [[#op_C63|$C63]] ||
| || || TILELD <br> [[#op_1BAC|$1BAC]] || || || || || || || || || || || || ||
|-
|-
! 8x
! 8x
| || || WINBRK <br> [[#op_ADA|$ADA]] || || || || TMAPSAV <br> [[#op_1C92|$1C92]] || || || || || || SPRDIR <br> [[#op_324F|$324F]] || || SPRWIPE <br> [[#op_289C|$289C]] ||
| || || WINBRK <br> [[#op_ADA|$ADA]] || || || || || || || || || || || || ||
|-
|-
! 9x
! 9x
| || || SPRPLAY <br> [[#op_27B3|$27B3]] || || || || || || || || || || || || || PRKEY <br> [[#op_165A|$165A]]
| || || || || || || || || || || || || || || || PRKEY <br> [[#op_165A|$165A]]
|-
|-
! Ax
! Ax
| BLKKEY <br> [[#op_42A|$42A]] || PRMOVE <br> [[#op_1668|$1668]] || BLKMOVE <br> [[#op_3FE|$3FE]] || || || PRNAME <br> [[#op_162A|$162A]] || SPRCTRL <br> [[#op_235E|$235E]] || SPRFINISH <br> [[#op_2386|$2386]] || || || || || || WINFRARROW <br> [[#op_B05|$B05]] || || PRMON <br> [[#op_1622|$1622]]
| BLKKEY <br> [[#op_42A|$42A]] || PRMOVE <br> [[#op_1668|$1668]] || BLKMOVE <br> [[#op_3FE|$3FE]] || || || || || || || || || || || || || PRMON <br> [[#op_1622|$1622]]
|-
|-
! Bx
! Bx
| NTSTR <br> [[#op_1677|$1677]] || NTPRINT <br> [[#op_1670|$1670]] || WINOPEN <br> [[#op_B2D|$B2D]] || WINFRAME <br> [[#op_AFC|$AFC]] || || || || || || || || BLKMON <br> [[#op_39C|$39C]] || || || ||
| || || || || || || || || || || || BLKMON <br> [[#op_39C|$39C]] || || || ||
|-
|-
! Cx
! Cx
| || || || || || || SPRWAIT <br> [[#op_27BB|$27BB]] || || || || || SPRFREEZE <br> [[#op_32C7|$32C7]] || SPRTHAW <br> [[#op_32D5|$32D5]] || || || SPRHIDE <br> [[#op_2877|$2877]]
| || || || || || || || || || || || || || || ||
|-
|-
! Dx
! Dx
| || || SPRHOLD <br> [[#op_A39|$A39]] || || || || || || || WININPUT <br> [[#op_A1D|$A1D]] || || || || || ||
| || || || || || || || || || || || || || || ||
|-
|-
! Ex
! Ex
| || || BLKCHIP <br> [[#op_456|$456]] || PRCHIP <br> [[#op_1661|$1661]] || || PRNICK <br> [[#op_1638|$1638]] || || || || || || || || || ||
| || || BLKCHIP <br> [[#op_456|$456]] || PRCHIP <br> [[#op_1661|$1661]] || || || || || || || || || || || ||
|-
|-
! Fx
! Fx
| || BLKENC <br> [[#op_3CD|$3CD]] || || || WINARROW <br> [[#op_B10|$B10]] || || || || || || || || || || ||
| || BLKENC <br> [[#op_3CD|$3CD]] || || || || || || || || || || || || || ||
|}
|}


Line 202: Line 202:
| PRED <br> (PREDicate) || $1E || $820 || None || immed (TOP) -> &pred (TOP) || Cast the value '''immed''' into a predicate memory index &'''pred'''.
| PRED <br> (PREDicate) || $1E || $820 || None || immed (TOP) -> &pred (TOP) || Cast the value '''immed''' into a predicate memory index &'''pred'''.
|- id='op_831'
|- id='op_831'
| POPALL <br> (POP ALL) || $2C || $831 || None || (...) -> (EMPTY) || Empty the stack.
| POPALL <br> (POP ALL) || $2C || $831 || None || anything (TOP) -> (EMPTY) || Empty the stack.
|- id='op_8DE'
|- id='op_8DE'
| IMMED <br> (IMMEDiate) || $3D || $8DE || immed (16b) || (TOP) -> immed (TOP) || Push '''immed''' onto the data stack as an immediate value.
| IMMED <br> (IMMEDiate) || $3D || $8DE || immed (16b) || (TOP) -> immed (TOP) || Push '''immed''' onto the data stack as an immediate value.
Line 213: Line 213:


This opcode should be used as soon as possible after you are done with the data in the string arena. The arena has a maximum capacity of 255 bytes, and memory is not reclaimed from use by a [[#op_941|DB]] opcode until you ARFREE the entire arena.
This opcode should be used as soon as possible after you are done with the data in the string arena. The arena has a maximum capacity of 255 bytes, and memory is not reclaimed from use by a [[#op_941|DB]] opcode until you ARFREE the entire arena.
|- id='op_1677'
| NTSTR <br> (Name Temporary SToRe) || $B0 || $1677 || None || srcaddr (TOP) -> (TOP) || Store string data in the naming temporary string area.
This is primarily used by naming / password screens which need to redraw themselves while retaining the user's input data. srcaddr is the address of a string, usually provided by the DB opcode.
The naming temporary area has a maximum size of $E bytes, not counting the mandatory null terminator.
|}
|}


Line 297: Line 291:
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
|- id='op_1BAC'
|- id='op_1BAC'
| TILELD <br> (TILE LoaD) || $72 || $1BAC || None || linkage_index, tile_x, tile_y, base_tile, base_attr (TOP) -> (TOP) || Load a precomposed tilemap from BugFS file linkage_index into the first tilemap in VRAM ($9800).
| TILELD <br> (TILE LoaD) || $72 || $1BAC || None || base_attr, base_tile, tile_y, tile_x, linkage_index (TOP) -> (TOP) || Load a precomposed tilemap from BugFS file linkage_index into the first tilemap in VRAM ($9800).


The base_tile and base_attr parameters allow the user to add a dynamic tile index and palette index offset to the tilemap. For example, if you loaded the tilemap's graphics into slot $30 on the second VRAM tile bank, with color data starting at BG palette 3, you could set base_tile to $30 and base_attr to Bank 1, Palette 3.
The base_tile and base_attr parameters allow the user to add a dynamic tile index and palette index offset to the tilemap. For example, if you loaded the tilemap's graphics into slot $30 on the second VRAM tile bank, with color data starting at BG palette 3, you could set base_tile to $30 and base_attr to Bank 1, Palette 3.


Tile X and Y coordinates allow you to control where the tilemap data is written. These coordinates are in tile units and are relative to the first visible tile on the screen (based on the current screen scroll).
Tile X and Y coordinates allow you to control where the tilemap data is written. These coordinates are in tile units and are relative to the first visible tile on the screen (based on the current screen scroll).
Each tilemap's data starts with the width and height of the tilemap, followed by two bytes for each tile's ID and attributes, starting from the top-left of the tilemap and continuing right until the end, then the next line down. These IDs and attributes are relative to the base parameters as described above.
|- id='op_9C6'
|- id='op_9C6'
| RESLD <br> (RESource LoaD) || $5F || $9C6 || None || linkage_index, copy_start, copy_len, target_addr, target_bank (TOP) -> (TOP) || Load graphics resources from BugFS file linkage_index into tile memory.
| RESLD <br> (RESource LoaD) || $5F || $9C6 || None || linkage_index, copy_start, copy_len, target_addr, target_bank (TOP) -> (TOP) || Load graphics resources from BugFS file linkage_index into tile memory.
Line 310: Line 302:


target_addr and target_bank determines where to place the copied resources in VRAM. They are native memory pointers, not indexed to anything.
target_addr and target_bank determines where to place the copied resources in VRAM. They are native memory pointers, not indexed to anything.
|- id='op_2F0E'
| PALLD <br> (PALette LoaD) || $75 || $2F0E || None || linkage_index, is_bgpal, source_palette, target_palette (TOP) -> (TOP) || Copy a color palette into color palette memory.
Palette color data will be copied from source_palette palettes into the file at linkage_index, into color memory at the given target_palette. If is_bgpal is True then the color data will be loaded into background palette memory; otherwise, color data will load into object palette memory.
source_palette and target_palette are both palette indices; it is not possible to copy part of a palette, or unaligned data from the filesystem.
|- id='op_C54'
| SCRCURS <br> (SCReen CURSor) || $7E || $C54 || None || x, y (TOP) -> (TOP) || Set the tile cursor relative to the screen.
The tile cursor is a screen offset in increments of 8x8 pixels, used to control the positioning of various graphical operations on the screen, such as [[#op_A84|PRINT]]ing text.
|- id='op_A84'
|- id='op_A84'
| PRINT <br> (PRINT) || $4C || $A84 || None || string_addr (TOP) -> (TOP) || Print tile text onto the screen.
| PRINT <br> (PRINT) || $4C || $A84 || None || string_addr (TOP) -> (TOP) || Print tile text onto the screen.
Printed text will appear on screen at the current tile cursor - usually set by an opcode like [[#op_C54|SCRCURS]], [[#op_C63|WINCURS]], or [[#op_C24|WINCOORD]].


string_addr points to a null-terminated string in unbanked memory - usually some portion of the string arena that is written to by [[#op_941|DB]]. Since that opcode returns an unbanked memory pointer on stack, one can print to the screen using just DB and PRINT opcodes.
string_addr points to a null-terminated string in unbanked memory - usually some portion of the string arena that is written to by [[#op_941|DB]]. Since that opcode returns an unbanked memory pointer on stack, one can print to the screen using just DB and PRINT opcodes.
Line 330: Line 310:


PRINT uses tile text in order to draw letters. A tile font must have been previously loaded in VRAM at tile location 0; it's encoded character value will be used as a tile index to draw with.
PRINT uses tile text in order to draw letters. A tile font must have been previously loaded in VRAM at tile location 0; it's encoded character value will be used as a tile index to draw with.
|- id='op_1670'
| NTPRINT <br> (Name Temporary PRINT) || $B0 || $1677 || None || None || Print stored string data in the naming temporary area.
|- id='op_1C92'
| TMAPSAV <br> (Tile MAP SAVe) || $86 || $1C92 || None || None || Copy the contents of tile map 1 ($9800) to tile map 2 ($9C00).
|}
|}


Line 342: Line 318:
|-
|-
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
|- id='op_C24'
| WINCOORD <br> (WINdow COORDinate) || $7D || $C24 || None || xmin, ymin, xmax, ymax (TOP) -> (TOP) || Set the coordinates of the current window.
xmin, ymin, xmax, ymax are the screen pixel coordinates of the left, top, right, and bottom edges of the window, respectively; including the frame. They will be used to configure Window Manager variables for other WINnn opcodes.
The tile cursor will be set to the X and Y coordinates of the ''contents'' of the specified window, so you can [[#op_A84|PRINT]] to it immediately. This is equivalent to [[#op_C63|WINCURS]] with an x and y of zero.
|- id='op_AFC'
| WINFRAME <br> (WINdow FRAME) || $B3 || $AFC || None || None || Draw the current window's frame.
You must have an active window style loaded into VRAM.
If this window is a menu, and the item counts are configured correctly, WINFRAME will also draw the overflow arrows.
|- id='op_B05'
| WINFRARROW <br> (WINdow FRame ARROW) || $AD || $B05 || None || arrow_position (TOP) -> (TOP) || Draw the current window's frame, with overflow arrows.
This is equivalent to [[#op_AFC|WINFRAME]] + [[#op_B10|WINARROW]] all at once.
|- id='op_B2D'
| WINOPEN <br> (WINdow OPEN) || $B2 || $B2D || None || None || Animate the current window opening.
This animation requires that the window span the whole width of the screen and that [[#op_1C92|TMAPSAV]] had been used to copy the screen before the window frame was drawn (e.g. with [[#op_AFC|WINFRAME]]). Execution of BugVM code is halted until the animation completes.
|- id='op_AED'
| WINDIALOG <br> (WINdow DIALOG) || $5A || $AED || None || None || Draw and open the current window.
This is equivalent to [[#op_1C92|TMAPSAV]] + [[#op_AFC|WINFRAME]] + [[#op_B2D|WINOPEN]] all at once.
|- id='op_97C'
|- id='op_97C'
| WINCLR <br> (WINdow CLeaR) || $5B || $97C || None || None || Clear the active window region.
| WINCLR <br> (WINdow CLeaR) || $5B || $97C || None || None || Clear the active window region.


Tiles will be set to $20, which is the encoded byte for a space. In any loaded font, this tile is intended to be blank.
Tiles will be set to $20, which is the encoded byte for a space. In any loaded font, this tile is intended to be blank.
|- id='op_C63'
| WINCURS <br> (WINdow CURSor) || $7E || $C63 || None || x, y (TOP) -> (TOP) || Set the tile cursor relative to the window.
|- id='op_13B4'
| WINCHOICE <br> (WINdow CHOICE) || $70 || $13B4 || None || choice, choice, (...) -> (EMPTY) || Print a series of menu choices.
Each choice will be prefixed with a space, to make room for the selection cursor. They will also be printed single-spaced, as opposed to normal line printing which is double-spaced.
The choice arguments are string pointers (e.g. from [[#op_941|DB]]); this opcode consumes all pointers on the data stack.
|- id='op_B10'
| WINARROW <br> (WINdow ARROW) || $F4 || $B10 || None || arrow_position (TOP) -> (TOP) || Draw overflow arrows for a given menu position.
''arrow_position'' is the index of a particular selected menu choice. Overflow arrows will be drawn on top of the window frame based on this value.
|- id='op_A12'
|- id='op_A12'
| WINWAIT <br> (WINdow WAIT) || $60 || $A12 || None || None || Wait for user input.
| WINWAIT <br> (WINdow WAIT) || $60 || $A12 || None || None || Wait for user input.


BugVM execution will halt until the user presses the "A" button on the system. A blinking A-button prompt will be displayed at the bottom-right of the window range.
BugVM execution will halt until the user presses the "A" button on the system.
|- id='op_A1D'
| WININPUT <br> (WINdow INPUT) || $D9 || $A1D || None || (TOP) -> input_changed (TOP) || Wait for user input.
 
BugVM execution will halt until the user presses any button on the system. A blinking A-button prompt will be displayed at the bottom-right of the window range.


The state of which buttons were pressed to continue is returned on the stack. The format for input data is that of eight bit-flags; from highest to lowest: Start, Select, Button B, Button A, Down, Up, Left, and Right. The upper 8 bits of data are always zero.
A blinking A-button prompt will be displayed at the bottom-right of the window range.
|- id='op_97C'
|- id='op_97C'
| WINBRK <br> (WINdow BReaK) || $82 || $ADA || None || None || Insert a 'page break' of sorts between two full windows' worth of text.
| WINBRK <br> (WINdow BReaK) || $82 || $ADA || None || None || Insert a 'page break' of sorts between two full windows' worth of text.


Internally this is equivalent to a WINWAIT followed by a WINCLR.
Internally this is equivalent to a WINWAIT followed by a WINCLR.
|}
=== Sprite Management ===
BugVM contains a fully featured metaspriting and animation system, which we've nicknamed Sprite Manager.
{| class='wikitable'
|-
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
|- id='op_324F'
| SPRDIR <br> (SPRite DIRection) || $8C || $324F || None || slot, direction (TOP) -> (TOP) || Set the facing direction of a given sprite.
''slot'' refers to the sprite to control (0 thru 7) and ''direction'' is the direction to make it face. If either are invalid, then nothing will happen. Consult [[Wikifang:Network Translation Patchsite/SpriteManager#Metasprite_Data_Structure|SpriteManager documentation]] for more information on which direction numbers are valid.
|- id='op_235E'
| SPRCTRL <br> (SPRite ConTRoL) || $A6 || $235E || None || slot, input (TOP) -> (TOP) || Control a given sprite with user or simulated input.
''slot'' refers to the sprite to control (0 thru 7) and ''input'' is the input state or simulated input state to send to the sprite.
The given sprite will have a movement animation queued on it if and only if the space for the sprite to move to is free. Otherwise, no action will be taken. Queued sprite animations can be played with other SPR opcodes.
Consult [[#op_A1D|WININPUT]] for information about the format of input state.
|- id='op_3269'
| SPRCHOREO <br> (SPRite CHOREOgraphy) || $78 || $3269 || None || file_id, slot (TOP) -> (TOP) || Place a sprite under control of a choreography script.
''file_id'' refers to the BugFS file containing the choreography script and ''slot'' is the sprite to be placed under it's control. The sprite in ''slot'' will have the choreography script installed, and then frozen in place for later execution.
The choreography script will be copied into one of eight choreography script slots. Each slot is 128 bytes max; and lives in an array starting at $2:DC00. This means choreography scripts may not exceed 64 instructions.
|- id='op_2775'
| SPRANIM <br> (SPRite ANIMate) || $6E || $2775 || None || file_id, ctxt_slot, slot (TOP) -> (TOP) || Load an animation into a sprite animation context for a given sprite.
''file_id'' is the BugFS file ID for a sprite animation to play.
''ctxt_slot'' refers to the animation context that will execute the animation script; while ''slot'' refers to the sprite to be animated. Usually both indices are the same; for example, idle-sprite choreography assumes that sprite 5's animations must always be loaded into animation context 5.
|- id='op_2788'
| SPRPOSPLAY <br> (SPRite POSition and PLAY) || $6F || $2788 || None || slot, x, y (TOP) -> (TOP) || Position and then play a previously loaded animation on a given sprite.
''slot'' refers to the sprite being played (0 thru 7). It must already have an animation queued. It's origin will be placed at the coordinates (''x'', ''y'').
Additionally, all active sprite animations will be evaluated for one frame.
|- id='op_27B3'
| SPRPLAY <br> (SPRite PLAY) || $92 || $27B3 || None || slot (TOP) -> (TOP) || Play a previously-loaded animation on a given sprite.
''slot'' refers to the sprite being played (0 thru 7). It must already have an animation queued.
This opcode is not in use in Network Adventure Bugsite.
|- id='op_27D8'
| SPRWAIT <br> (SPRite WAIT) || $C6 || $27D8 || None || slot, should_clear (TOP) -> (TOP) || Wait for sprite animation to finish.
BugVM execution will halt until the given sprite in ''slot'' finishes animating. Optionally, if ''should_clear'' is TRUE, then we will also clear any deactivated sprites from the screen.
|- id='op_27D8'
| SPRWAITALL <br> (SPRite WAIT ALL) || $79 || $27BB || None || None || Wait for all sprite animations to finish.
BugVM execution will halt until all sprite animations finish, then any deactivated sprites will be cleared from the screen.
This opcode is not in use in Network Adventure Bugsite.
|- id='op_A29'
| SPRINPUT <br> (SPRite INPUT) || $61 || $A29 || None || (TOP) -> input_changed (TOP) || Wait for user input.
BugVM execution will halt until the user presses any button on the system. Sprite animations will continue to execute during this period of halted execution.
Consult [[#op_A1D|WININPUT]] for information about this opcode's output format.
|- id='op_A39'
| SPRHOLD <br> (SPRite HOLD) || $D2 || $A39 || None || (TOP) -> input_held (TOP) || Wait for user input.
BugVM execution will halt until the user presses, or is already holding, any button on the system. Sprite animations will continue to execute during this period of halted execution.
Consult [[#op_A1D|WININPUT]] for information about this opcode's output format.
|- id='op_2386'
| SPRFINISH <br> (SPRite FINISH) || $A7 || $2386 || None || None || Wait for sprites to finish moving.
BugVM execution will halt until all sprites have finished moving.
|- id='op_2877'
| SPRHIDE <br> (SPRite HIDE) || $CF || $2877 || None || slot (TOP) -> (TOP) || Deactivate sprite in ''slot''.
|- id='op_289C'
| SPRWIPE <br> (SPRite WIPE) || $8E || $289C || None || None || Deactivate all sprites and clear them from the screen.
|- id='op_32C7'
| SPRFREEZE <br> (SPRite FREEZE) || $CB || $32C7 || None || slot (TOP) -> (TOP) || Manually freeze sprite in ''slot''.
This opcode is not in use in Network Adventure Bugsite.
|- id='op_32D5'
| SPRTHAW <br> (SPRite THAW) || $CB || $32D5 || None || slot (TOP) -> (TOP) || Manually unfreeze sprite in ''slot''.
This does not revert the freeze caused by [[#op_3269|SPRCHOREO]] - SPRFREEZE and SPRCHOREO freezes are treated separately.
This opcode is not in use in Network Adventure Bugsite.
|}
|}


Line 515: Line 367:


All PRint instructions that reference Attribute Table data execute this opcode. It prints data from $CF30, which is an offset into W_Battle_AttrStaging that appears to be a standard offset for this kind of data.
All PRint instructions that reference Attribute Table data execute this opcode. It prints data from $CF30, which is an offset into W_Battle_AttrStaging that appears to be a standard offset for this kind of data.
|- id='op_1670'
| PRNICK <br> (PRint NICKname) || $E5 || $1638 || None || None || Print the name of the currently loaded Nickname block.
Like PRNAME, this opcode prints the name section of a datablock. However, it prints data stored in the Nickname datablock area, $CC30, which is an offset into the W_NameInput_NicknameDataBlock area. The name "nickname data block area" is assumed; it is not currently known what semantic purpose this area serves other than use by the naming screens.
|}
=== Variable Width Font Rendering ===
These opcodes are exclusive to the English patch of Bugsite and represent new opcodes. They overlap existing ENOP instructions starting from $1F and thus can only be used if you are using BugTools' auto-optimize feature to remove existing ENOP instructions.
{| class='wikitable'
|-
! Opcode !! Encoding(s) !! Native Impl. !! Operand Args !! Stack Args !! Description
|- id='op_VWFCONFIG'
| VWFCONFIG <br> (VWF CONFIG) || $1F || (varies) || None || font, metrics, bg (TOP) -> (TOP) || Configure the font used for VWF text rendering.
''font'' and ''metrics'' refers to the file IDs of the font character data and metrics data, respectively. Character data is stored similarly to FWF fonts, but left-aligned; while metrics data is an array of one byte per character indicating width of each character.
This instruction only configures the font in use by VWF; it does not enable VWF.
|- id='op_VWFENABLE'
| VWFENABLE <br> (VWF ENABLE) || $20 || (varies) || None || ring_start, ring_end (TOP) -> (TOP) || Enable VWF rendering.
When enabled, [[#op_A84|PRINT]] instructions will use the VWF font rendering path. A font should have already been configured via VWFCONFIG before enabling VWF.
''ring_start'' and ''ring_end'' are a range of tiles to use for VWF rendering. Tiles from $100 onward indicate tiles in the second VRAM bank. This range of tiles will constitute a ring buffer of free tiles to be overwritten with VWF text, with drawn tiles starting from the first tile in the ring. Most importantly, new text will overwrite old tiles if the ring runs out of space, so you must ensure text that you don't intend to overwrite occupies it's own rings.
|- id='op_VWFDISABLE'
| VWFDISABLE <br> (VWF DISABLE) || $21 || (varies) || None || None || Disable VWF rendering.
Rendering will return to tile based fonts, using the same tiles normally used for tile text. Note that if you have overwritten these tiles, you will need to reload the FWF font equivalents.
|}
|}
Please note that all contributions to Wikifang are considered to be released under the Attribution-NonCommercial-ShareAlike 3.0 Unported (see Wikifang:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)