1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
|
/*
* PROPRIETARY INFORMATION. This software is proprietary to POWDER
* Development, and is not to be reproduced, transmitted, or disclosed
* in any way without written permission.
*
* Produced by: Jeff Lait
*
* POWDER Development
*
* NAME: gfxengine.h ( POWDER Library, C++ )
*
* COMMENTS:
* Platform independent graphics engine.
* The mentioned tiles are the tile number in the resource files.
* The world consists of 32x32, 16x16 tiles.
*/
#ifndef __gfxengine_h__
#define __gfxengine_h__
#include "glbdef.h"
#include "buf.h"
// These are special symbols in our character set. The SYMBOLSTRING
// version is "".
#define SYMBOL_HEART '\200'
#define SYMBOLSTRING_HEART "\200"
#define SYMBOL_MAGIC '\201'
#define SYMBOLSTRING_MAGIC "\201"
#define SYMBOL_LEFT '\202'
#define SYMBOLSTRING_LEFT "\202"
#define SYMBOL_RIGHT '\203'
#define SYMBOLSTRING_RIGHT "\203"
#define SYMBOL_UP '\204'
#define SYMBOLSTRING_UP "\204"
#define SYMBOL_DOWN '\205'
#define SYMBOLSTRING_DOWN "\205"
#define SYMBOL_NEXT '\206'
#define SYMBOLSTRING_NEXT "\206"
#define SYMBOL_DLEVEL '\207'
#define SYMBOLSTRING_DLEVEL "\207"
#define SYMBOL_AC '\210'
#define SYMBOLSTRING_AC "\210"
#define SYMBOL_TRIDUDE '\211'
#define SYMBOLSTRING_TRIDUDE "\211"
#define SYMBOL_CURSOR '\212'
#define SYMBOLSTRING_CURSOR "\212"
#define SYMBOL_UNIQUE '\213'
#define SYMBOLSTRING_UNIQUE "\213"
// 230 in octal...
#define COLOURED_SYMBOLS 152
#define SYMBOL_STRENGTH 'S'
#define SYMBOLSTRING_STRENGTH "S"
#define SYMBOL_SMARTS 'I'
#define SYMBOLSTRING_SMARTS "I"
#define SYMBOL_EXP 'X'
#define SYMBOLSTRING_EXP "X"
// Key defines.
#define GFX_KEYMODSHIFT 1
#define GFX_KEYMODCTRL 2
#define GFX_KEYMODALT 4
enum GFX_Keydefine
{
GFX_KEYSTART = 256,
GFX_KEYUP,
GFX_KEYLEFT,
GFX_KEYRIGHT,
GFX_KEYDOWN,
GFX_KEYCTRLUP,
GFX_KEYCTRLLEFT,
GFX_KEYCTRLRIGHT,
GFX_KEYCTRLDOWN,
GFX_KEYPGUP,
GFX_KEYPGDOWN,
GFX_KEYLMB,
GFX_KEYMMB,
GFX_KEYRMB,
// We expect these to be contiguous.
GFX_KEYF1,
GFX_KEYF2,
GFX_KEYF3,
GFX_KEYF4,
GFX_KEYF5,
GFX_KEYF6,
GFX_KEYF7,
GFX_KEYF8,
GFX_KEYF9,
GFX_KEYF10,
GFX_KEYF11,
GFX_KEYF12,
GFX_KEYF13,
GFX_KEYF14,
GFX_KEYF15,
GFX_KEYLAST
};
class MAP;
class MOB;
// Global defines...
#define MAP_WIDTH 32
#define MAP_HEIGHT 32
#define INVALID_TILEIDX 65535
//
// Fake ham functions used by SDL code.
//
void hamfake_rebuildScreen();
void hamfake_awaitEvent();
// Locks the screen for writing as a 240x160x16bit plane.
u16 *hamfake_lockScreen();
void hamfake_unlockScreen(u16 *screen);
// For systems that support it, get a keypress.
int hamfake_peekKeyPress();
int hamfake_getKeyPress(bool onlyascii);
void hamfake_clearKeyboardBuffer();
void hamfake_insertKeyPress(int key);
int hamfake_getKeyModifiers();
// Returns the current stylus/mouse location.
// Returned in terms of screen pixels
void hamfake_getstyluspos(int &x, int &y);
// Returns if the stylus is currently pressed or not.
// If not pressed, you should not trust the pos!
bool hamfake_getstylusstate();
// Returns if an extra tileset is present in the system
bool hamfake_extratileset();
// Reboots the machine.
void hamfake_softReset();
// Returns true if the external UI has demanded POWDER to shutdown.
bool hamfake_forceQuit();
// External UI directions.
void hamfake_flushdir();
bool hamfake_externaldir(int &dx, int &dy);
void hamfake_buttonreq(int mode, // 0 move, 1 action, 2 spell, 3 del
// 4 defaults
// 5 Direction request.
// 6 Unlock request
int type = 0); // action/spell value.
// awaitShutdown is used by external UI to wait until POWDER has finsihed
// an emergency save & quit sparked by forceQuit.
// POWDER lets the ui know it is done with the postShutdown
void hamfake_awaitShutdown();
void hamfake_postShutdown();
void hamfake_setinventorymode(bool invmode);
void hamfake_enableexternalactions(bool enable);
void hamfake_externalaction(int &iact, int &ispell);
bool hamfake_isunlocked();
// Toggles full screen mode
void hamfake_setFullScreen(bool fullscreen);
bool hamfake_isFullScreen();
// Controls sprites by their OAM numbers.
void hamfake_movesprite(int spriteno, int x, int y);
void hamfake_enablesprite(int spriteno, bool enabled);
void hamfake_ReloadSpriteGfx(const u16 *data, int tileno, int numtile);
void hamfake_setTileSize(int tilewidth, int tileheight);
void hamfake_LoadSpritePal(void *data, int bytes);
#ifdef HAS_DISKIO
FILE *hamfake_fopen(const char *path, const char *mode);
bool hamfake_fatvalid();
#endif
void gfx_init();
void gfx_setmode(int mode);
// This finds a free tile block of the given size...
u16 gfx_findFreeTile(int size);
// These lock the tile, returning an index to be used in the map.
// Failure returns -1. unlockTile frees it for further use.
// The actual tile allocated is passed back in result - that is the
// value that should be used in the free!
u16 gfx_lockTile(TILE_NAMES tile, TILE_NAMES *result);
void gfx_unlockTile(TILE_NAMES tile);
// Ensures the tile is locked at least given number. The idea is that one
// intends to leave a stale lock pointer, but don't want the stale
// pointer to accumulate over time.
void gfx_forceLockTile(TILE_NAMES tile, int mincount = 1);
// These lock character tiles which are on the same tile array
// as the other tiles.
// The actual tile allocated is passed back in result - that is the
// value that should be used in the free!
u16 gfx_lockCharTile(u8 c, u8 *result);
u16 gfx_lockColourCharTile(u8 c, COLOUR_NAMES colour, u8 *result);
void gfx_unlockCharTile(u8 c);
// Looking up a tile will find the tile idx for the given name.
// It will not lock it. This can be used for refresh, etc.
// If it returns the invalid index, the tile doesn't exist and the
// generic should be used.
u16 gfx_lookupTile(TILE_NAMES tile);
// This returns the number of unused tiles.
int gfx_getNumFreeTiles();
// Note these all work with TILE_NAMES, NOT the tile index.
void gfx_refreshtiles();
void gfx_settile(int tx, int ty, int tileno);
// This sets the overlay tile.
void gfx_setoverlay(int tx, int ty, int tileno);
int gfx_getoverlay(int tx, int ty);
// This sets the mob layer tiles
void gfx_setmoblayer(int tx, int ty, int tileno);
int gfx_getmoblayer(int tx, int ty);
// These set tiles using absolute coordinates starting from top left
// of the screen. The screen is thus 17x12.
// These do NOT use, or set, the tile caches, so refreshtiles will
// undo them.
void gfx_setabstile(int tx, int ty, int tileno);
void gfx_setabsoverlay(int tx, int ty, int tileno);
void gfx_setabsmob(int tx, int ty, int tileno);
// This clears the given line of any text.
void gfx_cleartextline(int y, int startx=0);
// This prints the text on the screen relative coords x/y, which
// are in text coords, screen is 30x20.
void gfx_printtext(int x, int y, const char *text);
inline void gfx_printtext(int x, int y, BUF buf)
{ gfx_printtext(x, y, buf.buffer()); }
// This writes a character into a mode 3 buffer.
// x & y are pixel level offsets.
void gfx_printcharraw(int x, int y, char c);
void gfx_printcolourcharraw(int x, int y, char c);
// This also works in screen coords, writing a single character.
void gfx_printchar(int x, int y, char c);
// Remaps the character to a coloured character.
// Each coloured character has its own unique tile!
void gfx_printcolourchar(int x, int y, char c, COLOUR_NAMES colour);
// Returns the current center of the viewport in tiles
void gfx_getscrollcenter(int &cx, int &cy);
// This scrolls so tx/ty is the center tile in the viewport.
void gfx_scrollcenter(int tx, int ty);
// Adjust the pixel level scroll by the given number of pixels
// on the given layer.
void gfx_nudgecenter(int px, int py);
// This returns true if we are on a new frame, and then resets
// its new frame counter.
int gfx_isnewframe();
// This returns the current frame number.
int gfx_getframecount();
void gfx_displayminimap(MAP *level);
void gfx_hideminimap();
void gfx_showinventory(MOB *mob);
void gfx_hideinventory();
void gfx_getinvcursor(int &ix, int &iy);
void gfx_setinvcursor(int ix, int iy, bool onlyslots);
// Find the palette entry which most closely matches the given RGB.
int gfx_lookupcolor(int r, int g, int b);
int gfx_lookupcolor(int r, int g, int b, const u16 *palette);
// Find the palette entry for the given predefine.
int gfx_lookupcolor(COLOUR_NAMES color);
void gfx_updatespritegreytable();
const u8 *gfx_getspritegreytable();
// Pauses for the given number of vertical retraces.
void gfx_sleep(int vcycles);
// Displays a null terminated list.
// ylen is the maximum y to write to.
// Select will be vaguely centered and will have >< around it.
void gfx_displaylist(int x, int y, int ylen, const char **list, int select);
// Null terminated list which is prompted at x & y. Returns -1
// if cancelled, otherwise, index into list.
// If the any button is set, it will select with R & L. In this case,
// aorb is set to the appropraite BUTTON_ value.
// Actually, it only selects with R&L if disable paging is set, otherwise
// those are pageup/pagedown. SELECT, on the other hand, is enabled
// with anykey.
// If an action bar is specified, it will become *live* and one can
// drag stuff too and from it.
int gfx_selectmenu(int x, int y, const char **menu, int &aorb, int def=0,
bool anykey = false, bool disablepaging = false,
const u8 *menuactions = 0,
u8 *actionstrip = 0);
// Queries with on screen menu to confirm choice with yes/no prompt
// yes returns true, no false.
bool gfx_yesnomenu(const char *buf, bool defchoice = true);
inline bool gfx_yesnomenu(BUF buf, bool defchoice = true)
{ return gfx_yesnomenu(buf.buffer(), defchoice); }
// This takes a long list which it displays 30 chars at a time,
// allowing the user to scroll as necessary.
// Any key ends it. (and clears it)
void gfx_displayinfotext(const char *text);
inline void gfx_displayinfotext(BUF buf)
{ gfx_displayinfotext(buf.buffer()); }
// These routines allow you to dynamically create a long section of text.
// Each line can be greater than 30 chars and will word wrap properly.
// Nothing will be shown until the gfx_pager_display, at which
// point it will all be displayed in a scrollable view until
// a key is hit. At that point, the temporary structures will
// all be wiped.
void
gfx_pager_addtext(const char *text);
void
gfx_pager_addtext(BUF buf);
// Adds a single line to the pager. Forces this to start
// a new line, adds a new line afterwards. If text is over 30 chars,
// it is truncated.
void
gfx_pager_addsingleline(const char *text);
void
gfx_pager_newline();
void
gfx_pager_reset();
// Adds a --- separator and a new line afterwards.
void
gfx_pager_separator();
// Sets the width of the pager, does not get auto reset so be careful
void
gfx_pager_setwidth(int width);
// Saves the pager data to a text file. Also resets the pager.
void
gfx_pager_savetofile(const char *name);
inline void gfx_pager_savetofile(BUF buf) { gfx_pager_savetofile(buf.buffer()); }
// The given y value is the initial center of the text.
void
gfx_pager_display(int centery = 0);
// Returns true if a tile was selected, false if cancelled.
// tx & ty should start off at initial selection position.
// if quickselect is true, it will return immediately on the first
// movement key. The bool in this case will be false until a or
// b is pressed. aorb will be set to 0 if a pressed, 1 if b.
// Stylus is set to true if stylus used to do selection.
bool gfx_selecttile(int &tx, int &ty, bool quickselect=false, int *quickold=0,
int *aorb = 0, bool *stylus = 0);
// Assumes inventory currently displayed. selectx & selecty are
// starting location to select from. Returns true if user chose
// a new slot, false if they aborted.
bool gfx_selectinventory(int &selectx, int &selecty);
// Returns true if not cancelled.
// If dz is set, the user decided up or down.
// If nothing is set, they decided themselves.
// Otherwise, we have a standard direction.
bool gfx_selectdirection(int tx, int ty, int &dx, int &dy, int &dz);
// This copies the given mini tile on top of the given destination tile
// in graphics memory.
void gfx_copytiledata(TILE_NAMES desttile, MINI_NAMES minitile, bool ismale);
// This only works ontop of the last dest tile to be written to.
void gfx_compositetile(ITEMSLOT_NAMES dstslot, MINI_NAMES minitile, bool ismale);
// Allocates a tile and returns the contents, extracting from our
// graphics tile list. Requires an explicit tileset as we don't
// want to end up with non-power of 2 suddenly.
// The result must be free()d
u8 *gfx_extractsprite(int tileset, SPRITE_NAMES tile);
u8 *gfx_extractlargesprite(SPRITE_NAMES tile, int grey, SPRITE_NAMES overlay);
void gfx_switchfonts(int newfont);
int gfx_getfont();
// We support two tile sets that external UIs can swap between at their
// leisure
void gfx_settilesetmode(int mode, int tileset);
int gfx_gettilesetmode(int mode);
void gfx_tilesetmode(int mode);
// These affect/refer to the current set for the current mode.
void gfx_switchtilesets(int newtileset);
int gfx_gettileset();
int gfx_gettilewidth();
int gfx_gettileheight();
// Cooridinates are in GBA space.
void gfx_drawcursor(int x, int y);
void gfx_cursortile(SPRITE_NAMES tile);
void gfx_removecursor();
// Note that you cannot mix sprite and dungeon tiles. You need to
// use one system or the other.
void gfx_spritetile(int spriteno, SPRITE_NAMES tile);
// The sprite will be greyd out according to the grey variable.
// grey of 0 means entirely grey scale, 256 means full colour.
// greying starts from the top of the tile.
// The overlay tile will then be comped on top.
void gfx_spritetile_grey(int spriteno, SPRITE_NAMES tile, int grey, SPRITE_NAMES overlay);
// Loads a sprite from the dungeon tileset, note you cannot mix
// with normal sprites!
void gfx_spritefromdungeon(int spriteno, TILE_NAMES tile);
// Switches whether we are in dungeon or sprite mode
void gfx_spritemode(bool usesprites);
#endif
|