|
|
@@ -0,0 +1,237 @@
|
|
|
+#include "stdafx.h"
|
|
|
+#include "CCursorHandler.h"
|
|
|
+#include "SDL.h"
|
|
|
+#include "SDL_thread.h"
|
|
|
+#include "CGameInfo.h"
|
|
|
+#include "SDL_framerate.h"
|
|
|
+
|
|
|
+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;
|
|
|
+ std::vector<Entry> pom = CGI->spriteh->entries.vectorize();
|
|
|
+ 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);
|
|
|
+}
|