nds_nflib/include/nf_tiledbg.h
2023-05-01 01:00:59 +01:00

556 lines
17 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SPDX-License-Identifier: MIT
//
// Copyright (c) 2009-2014 Cesar Rincon "NightFox"
//
// NightFox LIB - Include de Fondos con tiles
// http://www.nightfoxandco.com/
// Version 20140413
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __NF_TILEDBG_H__
#define __NF_TILEDBG_H__
/// @file nf_tiledbg.h
/// @brief Functions related to regular tiled backgrounds.
/// @defgroup nf_tiledbg Functions related to regular tiled backgrounds.
///
/// Functions related to regular (non-affine) tiled backgrounds.
///
/// @{
#include <nds.h>
/// Maximum number of slots of tiled backgrounds
#define NF_SLOTS_TBG 64
/// Maximum number of slots for extended palettes (max 16 per background)
#define NF_SLOTS_EXBGPAL 128
/// Maxmimum number of VRAM blocks used for tilesets
#define NF_MAX_BANKS_TILES 8
/// Maxmimum number of VRAM blocks used for maps
#define NF_MAX_BANKS_MAPS 16
/// Maxmimum number of tile banks.
///
/// 1 bank = 16 KB. One tile bank is equivalent to 8 map banks.
extern u8 NF_BANKS_TILES[2];
/// Maxmimum number of map banks.
///
/// 1 bank = 2 KB. One tile bank is equivalent to 8 map banks.
///
/// Use multiples of 8 for those values.
extern u8 NF_BANKS_MAPS[2];
/// Buffers to hold background tiles.
extern char* NF_BUFFER_BGTILES[NF_SLOTS_TBG];
/// Buffers to hold background maps.
extern char* NF_BUFFER_BGMAP[NF_SLOTS_TBG];
/// Buffers to hold background palettes.
extern char* NF_BUFFER_BGPAL[NF_SLOTS_TBG];
/// Struct that holds information about regular tiled backgrounds.
typedef struct {
char name[32]; ///< Background name
u32 tilesize; ///< Tileset size
u32 mapsize; ///< Map size
u32 palsize; ///< Palette size
u16 width; ///< Background width
u16 height; ///< Background height
bool available; ///< If the background is available it is true.
} NF_TYPE_TBG_INFO;
/// Information of all tiled backgrounds.
extern NF_TYPE_TBG_INFO NF_TILEDBG[NF_SLOTS_TBG];
/// Struct that holds information about extended palettes.
typedef struct {
char* buffer; ///< Buffer that holds the palette
u32 palsize; ///< Palette size
bool inuse; ///< True if the slot is in use.
} NF_TYPE_EXBGPAL_INFO;
/// Information of all extended palettes.
extern NF_TYPE_EXBGPAL_INFO NF_EXBGPAL[NF_SLOTS_EXBGPAL];
/// Struct that holds information about backgrounds loaded to the screen.
///
/// The hardware of the DS doesn't allow using maps bigger than 512x512 pixels.
/// It is needed to keep a value that speficies if the hardware manages the
/// background (if it's smaller or equal to 512x512), or if we use the tile
/// swapping engine of NFLib (if it's bigger).
///
/// Background types:
/// - 0: Normal (max is 512 x 512)
/// - 1: Larger than 512 x 256
/// - 2: 256 x Largen than 512
/// - 3: Both dimensions are larger than 512
typedef struct {
u8 tilebase; ///< Initial VRAM block used by the tile set
u8 tileblocks; ///< Number of blocks used by the tile set
u8 mapbase; ///< Initial VRAM block used by the map
u8 mapblocks; ///< Number of blocks used by the map
u16 bgwidth; ///< Background width
u16 bgheight; ///< Background height
u16 mapwidth; ///< Map width
u16 mapheight; ///< Map height
u8 bgtype; ///< Background type
u8 bgslot; ///< Graphics buffer used (NF_BUFFER_BGMAP)
u8 blockx; ///< Map block (horizontal)
u8 blocky; ///< Map block (vertical)
bool created; ///< True if the background has been created
} NF_TYPE_TBGLAYERS_INFO;
/// Information of all backgrounds loaded to the screen
extern NF_TYPE_TBGLAYERS_INFO NF_TILEDBG_LAYERS[2][4]; //[screen][layer]
/// Array of free blocks used for tiles
extern u8 NF_TILEBLOCKS[2][NF_MAX_BANKS_TILES];
/// Array of free blocks used for maps
extern u8 NF_MAPBLOCKS[2][NF_MAX_BANKS_MAPS];
/// Initialize library to load files from the filesystem to create tiled BGs.
///
/// Use this function once before loading any BG from FAT. Don't call it more
/// than once.
///
/// Example:
/// ```
/// // Init buffers and variables to load tiled BGs
/// NF_InitTiledBgBuffers();
/// ```
void NF_InitTiledBgBuffers(void);
/// Reset state used for tiled BGs loaded from FAT.
///
/// This function empties all buffers in use and resets variables to their
/// default values. Its useful to do this when you change a level in a game,
/// to clean all stuff from RAM and make free space to load the new level.
///
/// Example:
/// ```
/// // Empty all buffers and reset variable values
/// NF_ResetTiledBgBuffers();
/// ```
void NF_ResetTiledBgBuffers(void);
/// Initialize the tiled BG engine of the selected screen.
///
/// You must call this function before using any tiled BG. This function:
///
/// - Inititializes all variables to control BGs, tiles, palettes and maps.
/// - Configures VRAM to use 128 KB for BGs (96 KB for tiles, 32 KB for maps).
/// - Activates all 4 layers to use with tiled BGs.
/// - Reserves 8 banks of 16 KB for tiles (2 for maps, 6 for tiles).
/// - Reserves 16 banks of 2 KB for maps. The first 2 tile banks will be used
/// for this.
/// - Enables extended palettes.
///
/// The memory allocated for tiles and maps is defined in:
/// ```
/// #define NF_BANKS_TILES 8
/// #define NF_BANKS_MAPS 16
/// ```
/// Each tile bank is as big as 8 map banks.
///
/// Example:
/// ```
/// // Init tiled BG system of screen 1
/// NF_InitTiledBgSys(1);
/// ```
///
/// @param screen Screen (0 - 1).
void NF_InitTiledBgSys(u8 screen);
/// Load all files needed to create a tiled BG from FAT to RAM.
///
/// All files for a BG must have the same name, using IMG extension for tiles
/// files, MAP for map files and PAL for palette files.
///
/// Check the GRIT folder for more info about BG files conversion.
///
/// You can load up to 32 BGs at the same time, this is defined in:
/// ```
/// #define NF_SLOTS_TBG 32
/// ```
///
/// Example:
/// ```
/// // Load to RAM files "mainstage.img", "mainstage.map" and "mainstage.pal"
/// // from the "stage1" subfolder and call it “mifondo”. Also store the size of
/// // the BG (2048 x 256).
/// NF_LoadTiledBg("stage1/mainstage", "mifondo", 2048, 256);
/// ```
///
/// @param file File path without extension.
/// @param name Name used for the BG for other functions.
/// @param width BG width.
/// @param height BG height.
void NF_LoadTiledBg(const char* file, const char* name, u16 width, u16 height);
/// Load a tilesed and palette from FAT to RAM.
///
/// It works like NF_LoadTiledBg() but it lets you specify the range of tiles to
/// load. Also, no actual map is loaded. Instead, a blank map of the given size
/// is created. The background is created using NF_CreateTiledBg().
///
/// Example:
/// ```
/// // Load to RAM tiles 0 to 23 (24 tiles in total) from "mainstage.img" and
/// // the palette (from "mainstage.pal") file, from "stage1" subfolder and
/// // assigns the "mifondo" name to the background. It also sets the size of
/// // background to 256x256 pixels. This creates a 32x32 tiles blank map.
/// NF_LoadTilesForBg("stage1/mainstage", "mifondo", 256, 256, 0, 23);
/// ```
///
/// @param file File name, without extension.
/// @param name Name of the BG.
/// @param width Width of the BG in pixels.
/// @param height Height of the BG in pixels.
/// @param tile_start First tile to load.
/// @param tile_end Last tile to load.
void NF_LoadTilesForBg(const char* file, const char* name, u16 width, u16 height, u16 tile_start, u16 tile_end);
/// Delete from RAM the BG with the specified name.
///
/// You can delete from RAM the BG if you don't need it more or if the size of
/// the BG size is less or equal than 512 x 512. If it's bigger, you must keep
/// it in RAM until you don't need it anymore.
///
/// Example:
/// ```
/// // Delete from RAM the BG with name "mifondo" and mark as free the slot it
/// // uses.
/// NF_UnloadTiledBg("mifondo");
/// ```
///
/// @param name Name used for the BG.
void NF_UnloadTiledBg(const char* name);
/// Create a BG on the screen, using data loaded in RAM.
///
/// This function copies to VRAM all required data. Before you create the BG,
/// you must load data to RAM using NF_LoadTiledBg(). The BG is created on the
/// specified screen and layer.
///
/// Example:
/// ```
/// // Create a tiled BG on layer 3 of screen 0, using the BG called "mifondo"
/// NF_CreateTiledBg(0, 3, "mifondo");
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param name Name used for the BG.
void NF_CreateTiledBg(u8 screen, u8 layer, const char* name);
/// Delete the BG of the specified screen and layer.
///
/// This also deletes from VRAM the data used by this BG.
///
/// Example:
/// ```
/// // Deletes the tiled BG from layer 3 of screen 0
/// NF_DeleteTiledBg(0, 3);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
void NF_DeleteTiledBg(u8 screen, u8 layer);
/// Gets the address of the tile at the specified position.
///
/// Internal use.
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
/// @return Tile address.
u32 NF_GetTileMapAddress(u8 screen, u8 layer, u16 tile_x, u16 tile_y);
/// Gets the value of the tile at the specified position.
///
/// Example:
/// ```
/// // Gets the value of the tile at (20, 10) of the map loaded on screen 0,
/// // layer 2.
/// u16 mytile = NF_GetTileOfMap(0, 2, 10, 20);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
/// @return Tile index.
u16 NF_GetTileOfMap(u8 screen, u8 layer, u16 tile_x, u16 tile_y);
/// Sets the value of the tile at the specified position.
///
/// Example:
/// ```
/// // Sets to 5 the tile at (20, 10) of the map loaded on screen 0, layer 2.
/// NF_SetTileOfMap(0, 2, 10, 20, 5);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
/// @param tile Tile index.
void NF_SetTileOfMap(u8 screen, u8 layer, u16 tile_x, u16 tile_y, u16 tile);
/// Updates the map of the specified screen and layer specified.
///
/// This updates the map on VRAM with the copy of RAM, that can be modified. Use
/// this fuction to apply changes made with NF_SetTileOfMap().
///
/// Example:
/// ```
/// // Update the map in VRAM with the modified copy in RAM of screen 0, layer 2
/// NF_UpdateVramMap(0, 2);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
void NF_UpdateVramMap(u8 screen, u8 layer);
/// Changes the value of one color of the palette of a background.
///
/// The change is made directly in VRAM, so it may be overwritten from the copy
/// in RAM. It's also a very slow function, use it twice or 3 times per frame.
///
/// Example:
/// ```
/// // Change the value of color 1 of the palette of layer 3 on top screen to
/// // red. If this layer is a text layer with the default font, the text
/// // becomes red.
/// NF_BgSetPalColor(0, 3, 1, 31, 0, 0);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param number Color number (0 - 255).
/// @param r Red component (0 - 31).
/// @param g Green component (0 - 31).
/// @param b Blue component (0 - 31).
void NF_BgSetPalColor(u8 screen, u8 layer, u8 number, u8 r, u8 g, u8 b);
/// Changes the value of one color of the palete of the specified background.
///
/// The change is made in the RAM copy of the palette, so you won't see any
/// change until you update it on VRAM with NF_BgUpdatePalette().
///
/// Use this function to make cool effect on your tiled backgrounds.
///
/// Example:
/// ```
/// // Set color 1 of the palette of layer 3 on top screen to red
/// NF_BgSetPalColor(0, 3, 1, 31, 0, 0);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param number Color number (0 - 255).
/// @param r Red component (0 - 31).
/// @param g Green component (0 - 31).
/// @param b Blue component (0 - 31).
void NF_BgEditPalColor(u8 screen, u8 layer, u8 number, u8 r, u8 g, u8 b);
/// Updates the palette of a background from RAM to VRAM.
///
/// Example:
/// ```
/// // Updates the palette of layer 2 of the bottom screen
/// NF_BgUpdatePalette(1, 2);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
void NF_BgUpdatePalette(u8 screen, u8 layer);
/// Gets the RGB value of a color of the palette of the selected background,
/// which is loaded in RAM.
///
/// Example:
/// ```
/// // Gets the RGB value of color number 200 of layer 3 of the bottom screen,
/// // stores it in the "red", "green" and "blue" variables.
/// u8 red;
/// u8 green;
/// u8 blue;
/// NF_BgGetPalColor(1, 3, 200, &red, &green, &blue);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param number Color number (0 - 255).
/// @param r Red component result (0 - 31).
/// @param g Green component result (0 - 31).
/// @param b Blue component result (0 - 31).
void NF_BgGetPalColor(u8 screen, u8 layer, u8 number, u8* r, u8* g, u8* b);
/// Returns the number of extended palette used by specified tile.
///
/// By default, all tiles use extended palette 0.
///
/// Example:
/// ```
/// // Returns the extended palette used by tile in position (20, 10) of layer 3
/// // of the top screen
/// palette = NF_GetTilePal(0, 3, 20, 10);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
/// @return Extended palette index (0 - 15).
u8 NF_GetTilePal(u8 screen, u8 layer, u16 tile_x, u16 tile_y);
/// Sets the extended palette to use for the tile especified.
///
/// The palette has to be loaded in VRAM, and the changes won't be visible until
/// you use NF_UpdateVramMap() because all operations are done in the copy of
/// the map in RAM.
///
/// Example:
/// ```
/// // Sets tile on position (20, 10) of layer 3 on top screen to use the
/// // extended palette 2
/// NF_SetTilePal(0, 3, 20, 10, 2);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
/// @param pal Extended palette index (0 - 15).
void NF_SetTilePal(u8 screen, u8 layer, u16 tile_x, u16 tile_y, u8 pal);
/// Load a palette from a file to RAM to use it as a background extended
/// palette.
///
/// Example:
/// ```
/// // Loads the "bg/sunset.pal" file from the filesystem to RAM slot 3.
/// NF_LoadExBgPal("bg/sunset", 3);
/// ```
///
/// @param file File (.pal extension).
/// @param slot RAM slot (0 - 127)
void NF_LoadExBgPal(const char* file, u8 slot);
/// Deletes a loaded palette from RAM.
///
/// Example:
/// ```
/// // Erase from RAM the palette loaded in slot 5. If the palette is already
/// // transfered to VRAM, you can still use it until you update the palettes.
/// NF_UnloadExBgPal(5);
/// ```
///
/// @param slot RAM slot (0 - 127)
void NF_UnloadExBgPal(u8 slot);
/// Transfers a palette from RAM to VRAM to be used as extended palette.
///
/// Example:
/// ```
/// // Transfers the palette from RAM slot 100 to VRAM of layer 3 of the top
/// // screen, to be used as extended palette 10.
/// NF_VramExBgPal(0, 3, 100, 10);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param id Slot of the palette in RAM.
/// @param slot Slot of extended palette in VRAM.
void NF_VramExBgPal(u8 screen, u8 layer, u8 id, u8 slot);
/// Sets the extended palette to be used in the specified background.
///
/// Example:
/// ```
/// // The backgroun on layer 3 of top screen, uses the extended palette 5
/// NF_SetExBgPal(0, 3, 5);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param pal Extended palette index (0 - 15).
void NF_SetExBgPal(u8 screen, u8 layer, u8 pal);
/// Inverts the horizontal flip status of a tile in the specified map.
///
/// The changes are done to the copy of the map in RAM, so changes won't be
/// visible until you update the copy in VRAM with NF_UpdateVramMap().
///
/// Example:
/// ```
/// // Flips horizontaly the tile in the position (10, 20) of layer 1 of the top
/// // screen
/// NF_SetTileHflip(0, 1, 10, 20);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
void NF_SetTileHflip(u8 screen, u8 layer, u16 tile_x, u16 tile_y);
/// Inverts the vertical flip status of a tile in the specified map.
///
/// The changes are done to the copy of the map in RAM, so changes won't be
/// visible until you update the copy in VRAM with NF_UpdateVramMap().
///
/// Example:
/// ```
/// // Flips vertically the tile in the position (10, 20) of layer 1 of the top
/// // screen
/// NF_SetTileVflip(0, 1, 10, 20);
/// ```
///
/// @param screen Screen (0 - 1).
/// @param layer Layer (0 - 3).
/// @param tile_x X coordinate.
/// @param tile_y Y coordinate.
void NF_SetTileVflip(u8 screen, u8 layer, u16 tile_x, u16 tile_y);
/// Rotates the graphics of a tile in RAM by the specified angle.
///
/// The rotated graphics are stored int the same tile.
///
/// Rotation values:
/// 1 - 90 degrees clockwise
/// 2 - 90 degrees counter-clockwise
/// 3 - 180 degrees
///
/// Example:
/// ```
/// // Rotates 90 degrees counter-clockwise tile 76 of the buffer in slot 3
/// NF_RotateTileGfx(3, 76, 2);
/// ```
///
/// @param slot RAM slot (0 - 127).
/// @param tile Tile index.
/// @param rotation Rotation value.
void NF_RotateTileGfx(u8 slot, u16 tile, u8 rotation);
/// @}
#endif
#ifdef __cplusplus
}
#endif