2007-08-21 16:48:18 +03:00
|
|
|
#include "stdafx.h"
|
|
|
|
#include "CCursorHandler.h"
|
|
|
|
#include "SDL.h"
|
|
|
|
#include "SDL_thread.h"
|
|
|
|
#include "CGameInfo.h"
|
|
|
|
#include "SDL_framerate.h"
|
2007-08-30 13:11:53 +03:00
|
|
|
#include "hch\CLodHandler.h"
|
2007-08-21 16:48:18 +03:00
|
|
|
|
|
|
|
extern SDL_Surface * screen;
|
|
|
|
|
|
|
|
/* Creates a new mouse cursor from an XPM */
|
|
|
|
|
|
|
|
|
|
|
|
/* XPM */
|
|
|
|
static const char *arrow[] = { //no cursor mode
|
|
|
|
/* width height num_colors chars_per_pixel */
|
|
|
|
" 32 32 3 1",
|
|
|
|
/* colors */
|
|
|
|
"X c #000000",
|
|
|
|
". c #ffffff",
|
|
|
|
" c None",
|
|
|
|
/* pixels */
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
"0,0"
|
|
|
|
};
|
|
|
|
|
|
|
|
/* XPM */
|
|
|
|
static const char *arrow2[] = { //normal cursor
|
|
|
|
/* width height num_colors chars_per_pixel */
|
|
|
|
" 32 32 3 1",
|
|
|
|
/* colors */
|
|
|
|
"X c #000000",
|
|
|
|
". c #ffffff",
|
|
|
|
" c None",
|
|
|
|
/* pixels */
|
|
|
|
"X ",
|
|
|
|
"XX ",
|
|
|
|
"X.X ",
|
|
|
|
"X..X ",
|
|
|
|
"X...X ",
|
|
|
|
"X....X ",
|
|
|
|
"X.....X ",
|
|
|
|
"X......X ",
|
|
|
|
"X.......X ",
|
|
|
|
"X........X ",
|
|
|
|
"X.....XXXXX ",
|
|
|
|
"X..X..X ",
|
|
|
|
"X.X X..X ",
|
|
|
|
"XX X..X ",
|
|
|
|
"X X..X ",
|
|
|
|
" X..X ",
|
|
|
|
" X..X ",
|
|
|
|
" X..X ",
|
|
|
|
" XX ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
" ",
|
|
|
|
"0,0"
|
|
|
|
};
|
|
|
|
|
|
|
|
static SDL_Cursor *init_system_cursor(const char *image[])
|
|
|
|
{
|
|
|
|
int i, row, col;
|
|
|
|
Uint8 data[4*32];
|
|
|
|
Uint8 mask[4*32];
|
|
|
|
int hot_x, hot_y;
|
|
|
|
|
|
|
|
i = -1;
|
|
|
|
for ( row=0; row<32; ++row ) {
|
|
|
|
for ( col=0; col<32; ++col ) {
|
|
|
|
if ( col % 8 ) {
|
|
|
|
data[i] <<= 1;
|
|
|
|
mask[i] <<= 1;
|
|
|
|
} else {
|
|
|
|
++i;
|
|
|
|
data[i] = mask[i] = 0;
|
|
|
|
}
|
|
|
|
switch (image[4+row][col]) {
|
|
|
|
case 'X':
|
|
|
|
data[i] |= 0x01;
|
|
|
|
//k[i] |= 0x01;
|
|
|
|
break;
|
|
|
|
case '.':
|
|
|
|
mask[i] |= 0x01;
|
|
|
|
break;
|
|
|
|
case ' ':
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
|
|
|
|
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
|
|
|
|
}
|
|
|
|
|
|
|
|
//int cursorHandlerFunc(void * cursorHandler)
|
|
|
|
//{
|
|
|
|
// FPSmanager * cursorFramerateKeeper = new FPSmanager;
|
|
|
|
// SDL_initFramerate(cursorFramerateKeeper);
|
|
|
|
// SDL_setFramerate(cursorFramerateKeeper, 200);
|
|
|
|
//
|
|
|
|
// CCursorHandler * ch = (CCursorHandler *) cursorHandler;
|
|
|
|
// while(true)
|
|
|
|
// {
|
|
|
|
// if(ch->xbef!=-1 && ch->ybef!=-1) //restore surface under cursor
|
|
|
|
// {
|
|
|
|
// blitAtWR(ch->behindCur, ch->xbef, ch->ybef);
|
|
|
|
// }
|
|
|
|
// ch->xbef = ch->xpos;
|
|
|
|
// ch->ybef = ch->ypos;
|
|
|
|
// //prepare part of surface to restore
|
|
|
|
// SDL_BlitSurface(screen, &genRect(32, 32, ch->xpos, ch->ypos), ch->behindCur, NULL);
|
|
|
|
// CSDL_Ext::update(ch->behindCur);
|
|
|
|
//
|
|
|
|
// //blit cursor
|
|
|
|
// if(ch->curVisible)
|
|
|
|
// {
|
|
|
|
// switch(ch->mode)
|
|
|
|
// {
|
|
|
|
// case 0:
|
|
|
|
// {
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// case 1:
|
|
|
|
// {
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// case 2:
|
|
|
|
// {
|
|
|
|
// blitAtWR(ch->deflt->ourImages[ch->number].bitmap, ch->xpos, ch->ypos);
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// SDL_framerateDelay(cursorFramerateKeeper);
|
|
|
|
// //SDL_Delay(5); //to avoid great usage of CPU
|
|
|
|
// }
|
|
|
|
// return 0;
|
|
|
|
//}
|
|
|
|
|
|
|
|
void CCursorHandler::initCursor()
|
|
|
|
{
|
|
|
|
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
|
|
|
int rmask = 0xff000000;
|
|
|
|
int gmask = 0x00ff0000;
|
|
|
|
int bmask = 0x0000ff00;
|
|
|
|
int amask = 0x000000ff;
|
|
|
|
#else
|
|
|
|
int rmask = 0x000000ff;
|
|
|
|
int gmask = 0x0000ff00;
|
|
|
|
int bmask = 0x00ff0000;
|
|
|
|
int amask = 0xff000000;
|
|
|
|
#endif
|
|
|
|
curVisible = true;
|
|
|
|
xpos = ypos = 0;
|
|
|
|
behindCur = SDL_CreateRGBSurface(SDL_SWSURFACE, 32, 32, 32, rmask, gmask, bmask, amask);
|
|
|
|
xbef = ybef = 0;
|
|
|
|
adventure = CGI->spriteh->giveDef("CRADVNTR.DEF");
|
|
|
|
combat = CGI->spriteh->giveDef("CRCOMBAT.DEF");
|
|
|
|
deflt = CGI->spriteh->giveDef("CRDEFLT.DEF");
|
|
|
|
spell = CGI->spriteh->giveDef("CRSPELL.DEF");
|
|
|
|
//SDL_SetCursor(init_system_cursor(arrow));
|
|
|
|
//SDL_Thread * myth = SDL_CreateThread(&cursorHandlerFunc, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCursorHandler::changeGraphic(int type, int no)
|
|
|
|
{
|
|
|
|
mode = type;
|
|
|
|
number = no;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCursorHandler::cursorMove(int x, int y)
|
|
|
|
{
|
|
|
|
xbef = xpos;
|
|
|
|
ybef = ypos;
|
|
|
|
xpos = x;
|
|
|
|
ypos = y;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCursorHandler::hardwareCursor()
|
|
|
|
{
|
|
|
|
curVisible = false;
|
|
|
|
SDL_SetCursor(init_system_cursor(arrow2));
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCursorHandler::hideCursor()
|
|
|
|
{
|
|
|
|
curVisible = false;
|
|
|
|
SDL_SetCursor(init_system_cursor(arrow));
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCursorHandler::showGraphicCursor()
|
|
|
|
{
|
|
|
|
curVisible = true;
|
|
|
|
SDL_SetCursor(init_system_cursor(arrow));
|
|
|
|
changeGraphic(0, 0);
|
|
|
|
}
|