diff options
author | ennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-01-05 01:33:53 +0000 |
---|---|---|
committer | ennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-01-05 01:33:53 +0000 |
commit | 62f7040f14b39e67042be98f951575fbc819e84e (patch) | |
tree | d4fa0598a1bee1d34fff81e2c150de08c2256753 /crawl-ref/source/libwt.cc | |
parent | 19155f1f85058ef9d65d11e60c63cc69c36d4e8a (diff) | |
download | crawl-ref-62f7040f14b39e67042be98f951575fbc819e84e.tar.gz crawl-ref-62f7040f14b39e67042be98f951575fbc819e84e.zip |
Tiles!
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3194 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/libwt.cc')
-rw-r--r-- | crawl-ref/source/libwt.cc | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/crawl-ref/source/libwt.cc b/crawl-ref/source/libwt.cc new file mode 100644 index 0000000000..e3e2ec3b46 --- /dev/null +++ b/crawl-ref/source/libwt.cc @@ -0,0 +1,540 @@ +// Windows ヘッダー ファイル: +#include <windows.h> +#include <windowsx.h> +#include <commdlg.h> +#include <commctrl.h> + +// GDT_NONE in commctrl.h conflicts with enum.h +#ifdef GDT_NONE +#undef GDT_NONE +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <malloc.h> +#include <memory.h> +#include <tchar.h> + +#include "AppHdr.h" +#include "cio.h" +#include "externs.h" +#include "files.h" +#include "guic.h" +#include "itemprop.h" +#include "state.h" +#include "tiles.h" + +// acr.cc +extern int old_main(int argc, char *argv[]); + +extern WinClass *win_main; +extern TileRegionClass *region_tile; +extern img_type TileImg; +extern BYTE pix_transparent; + +typedef struct ev_data +{ + int type; + int key; + int x1, y1; + bool sh, ct; +}ev_data; + +#define EV_MAX 1024 +struct ev_data ev_cue[EV_MAX]; + +static int ev_head = 0; +static int ev_tail = 0; +void ev_push(struct ev_data *e); +static bool skip_key = false; + +// Tip text +static TOOLINFO tiTip; +static HWND hTool; +static HWND pWin; + +#ifdef USE_TILE +#define PAL_STD 0 //standard palette +#define PAL_BER 1 //berserk palette +#define PAL_SHA 2 //shadow palette +static int palette = PAL_STD; +LPBYTE lpPalettes[3] ; +#endif + +#define DF_TOOLTIP_WIDTH 300 + +ATOM MyRegisterClass( HINSTANCE hInstance ); +BOOL InitInstance( HINSTANCE, int ); +LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); + +bool libgui_init_sys(); +void libgui_shutdown_sys(); +void update_tip_text(const char *tip); + +void GetNextEvent(int *etype, int *key, bool *shift, bool *ctrl, + int *x1, int *y1, int *x2, int *y2); +void TileInitWin(); +void delay(unsigned long ms); +int kbhit(); + +/***************************/ +#ifdef USE_TILE +void TileInitWin() +{ + int i; + + //透明色を黒に入れ替える + TileImg->pDib->bmiColors[pix_transparent].rgbRed = 0; + TileImg->pDib->bmiColors[pix_transparent].rgbGreen = 0; + TileImg->pDib->bmiColors[pix_transparent].rgbBlue = 0; + + RegionClass::set_std_palette(&TileImg->pDib->bmiColors[0]); + + //バックバッファ用パレットの作成 + WORD chcol; //グレイスケール計算用 + lpPalettes[0] = (LPBYTE) (&TileImg->pDib->bmiColors[0]); + lpPalettes[1] = (LPBYTE)GlobalAlloc(GPTR, 256 * sizeof(RGBQUAD) ); //バーサークパレットを入れる為のメモリ確保 + lpPalettes[2] = (LPBYTE)GlobalAlloc(GPTR, 256 * sizeof(RGBQUAD) ); //シャドウパレットを入れる為のメモリ確保 + for (i = 0; i < 256; i++) + { + //バーサーク用パレット + chcol = (TileImg->pDib->bmiColors[i].rgbRed * 30 + + TileImg->pDib->bmiColors[i].rgbGreen * 59 + + TileImg->pDib->bmiColors[i].rgbBlue * 11)/100; + LPBYTE ptr = lpPalettes[1] + i * sizeof(RGBQUAD); + ptr[2] = (BYTE)chcol; + ptr[0] = (BYTE)( (chcol +1)/6 ); + ptr[1] = (BYTE)( (chcol +1)/6 ); + + ptr = lpPalettes[2] + i * sizeof(RGBQUAD); + //シャドウ用パレット + ptr[2] = ptr[0] = ptr[1] = (BYTE)chcol; + } +} +#endif + +void update_tip_text(const char *tip) +{ +#define MAXTIP 512 + static char oldtip[MAXTIP+1]; + if (strncmp(oldtip, tip, MAXTIP)==0) return; + strncpy(oldtip, tip, MAXTIP); + tiTip.lpszText = (char *)tip; + SendMessage(hTool, TTM_UPDATETIPTEXT, 0, (LPARAM)&tiTip); +} + +bool libgui_init_sys( ) +{ + return true; +} + +void libgui_shutdown_sys() +{ +#ifdef USE_TILE + GlobalFree(lpPalettes[1]); //バーサーク用パレット メモリ解放 + GlobalFree(lpPalettes[2]); //シャドウ用パレット メモリ解放 +#endif + DestroyWindow( pWin ); +} + +void GetNextEvent(int *etype, int *key, bool *sh, bool *ct, + int *x1, int *y1, int *x2, int *y2) +{ + MSG msg; + + while( GetMessage(&msg, NULL, 0, 0) ) + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + if(ev_tail != ev_head) break; + } + struct ev_data *e = &ev_cue[ev_head]; + ev_head++; + if(ev_head == EV_MAX) + ev_head = 0; + + *etype = e->type; + *key = e->key; + *sh = e->sh; + *ct = e->ct; + *x1 = e->x1; + *y1 = e->y1; +} + +void ev_push(struct ev_data *e) +{ + ev_cue[ev_tail] = *e; + ev_tail++; + if(ev_tail == EV_MAX) + ev_tail = 0; +} + +//FAR PASCAL +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow ) +{ + MSG msg; + + MyRegisterClass( hInstance ); + + GuicInit(hInstance, nCmdShow); + + // after handing the controll to the main code, + // libgui_init , libgui_init_sys will be called + old_main(0, NULL); + + return msg.wParam; +} + + +ATOM MyRegisterClass( HINSTANCE hInstance ) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, TEXT("CRAWL_ICON")); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wcex.lpszMenuName = "CRAWL"; + wcex.lpszClassName = "CrawlList"; + wcex.hIconSm = NULL;//LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); + + return RegisterClassEx( &wcex ); +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + + struct ev_data ev; + static int clix = 0; + static int cliy = 0; + + // For keypad + const unsigned char ck_table[9]= + { + CK_END, CK_DOWN, CK_PGDN, + CK_LEFT, CK_INSERT, CK_RIGHT, + CK_HOME, CK_UP, CK_PGUP + }; + + switch( message ) + { + case WM_CREATE: + { + pWin = hWnd; + + // TOOLTIP テキストの設定 + // Example taken from + // http://black.sakura.ne.jp/~third/system/winapi/common10.html + InitCommonControls(); + hTool = CreateWindowEx( 0 , TOOLTIPS_CLASS , + NULL , TTS_ALWAYSTIP , + CW_USEDEFAULT , CW_USEDEFAULT , + CW_USEDEFAULT , CW_USEDEFAULT , + hWnd , NULL , ((LPCREATESTRUCT)(lParam))->hInstance , + NULL + ); + GetClientRect(hWnd , &tiTip.rect); + + tiTip.cbSize = sizeof (TOOLINFO); + tiTip.uFlags = TTF_SUBCLASS; + tiTip.hwnd = hWnd; + tiTip.lpszText = (char *) + "This text will tell you" EOL + " what you are pointing"; + SendMessage(hTool, TTM_ADDTOOL , 0 , (LPARAM)&tiTip); + // Allow line wrap + SendMessage(hTool, TTM_SETMAXTIPWIDTH, 0, DF_TOOLTIP_WIDTH); + return 0; + } + + case WM_RBUTTONDOWN: + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + { + ev.type = EV_BUTTON; + ev.x1 = LOWORD(lParam); + ev.y1 = HIWORD(lParam); + ev.key = 1; + ev.sh = ((GetKeyState(VK_SHIFT) & 0x80)!=0)? true:false; + ev.ct = ((GetKeyState(VK_CONTROL) & 0x80)!=0)? true:false; + if (message == WM_RBUTTONDOWN) ev.key = 2; + if (message == WM_MBUTTONDOWN) ev.key = 3; + ev_push(&ev); + return 0; + } + + case WM_RBUTTONUP: + //case WM_LBUTTONDOWN: + { + ev.type = EV_UNBUTTON; + ev.x1 = LOWORD(lParam); + ev.y1 = HIWORD(lParam); + ev.key = 1; + if (message == WM_RBUTTONUP) ev.key = 2; + if (message == WM_MBUTTONUP) ev.key = 3; + ev_push(&ev); + return 0; + } + + case WM_MOUSEWHEEL: + { + int z = (short)HIWORD(wParam); + ev.x1 = LOWORD(lParam) - clix; + ev.y1 = HIWORD(lParam) - cliy; + ev.type = EV_BUTTON; + ev.sh = ((GetKeyState(VK_SHIFT) & 0x80)!=0)? true:false; + ev.ct = ((GetKeyState(VK_CONTROL) & 0x80)!=0)? true:false; + ev.key = (z>0)? 4:5; + ev_push(&ev); + return 0; + } + + case WM_MOUSEMOVE: + { + ev.type = EV_MOVE; + ev.x1 = LOWORD(lParam); + ev.y1 = HIWORD(lParam); + ev_push(&ev); + return 0; + } + + case WM_KEYDOWN: + { + int ch=(int)wParam; + int result = 0; + int dir = 0; + bool fs = ((GetKeyState(VK_SHIFT) & 0x80)!=0)? true:false; + bool fc = ((GetKeyState(VK_CONTROL)& 0x80)!=0)? true:false; + bool fa = ((GetKeyState(VK_MENU) & 0x80)!=0)? true:false; + + if (ch >= VK_NUMPAD1 && ch <= VK_NUMPAD9) + { + skip_key = true; + dir = ch - VK_NUMPAD0; + } + else + if ((VK_PRIOR <= ch && ch <=VK_DOWN) || (ch == VK_CLEAR) ) + { + switch(ch) + { + case VK_LEFT: dir = 4; break; + case VK_RIGHT: dir = 6; break; + case VK_UP: dir = 8; break; + case VK_DOWN: dir = 2; break; + case VK_HOME: dir = 7; break; + case VK_PRIOR: dir = 9; break; + case VK_NEXT: dir = 3; break; + case VK_END: dir = 1; break; + case VK_CLEAR: dir = 5; break; + } + } + + if (dir != 0) + { + ch = ck_table[dir-1]; + if (fc) + ch += CK_CTRL_UP - CK_UP; + if (fs) + ch += CK_SHIFT_UP - CK_UP; + + if (fa) ch |= 2048; + ev.key = ch; + ev.type = EV_KEYIN; + ev_push(&ev); + return 0; + } // dir!=0 + + else + if ( ch >= VK_PAUSE + && !(ch >= VK_CAPITAL && ch <= VK_SPACE) + && ch !=VK_PROCESSKEY + && ch != VK_NUMLOCK + && !(ch >=VK_LSHIFT && ch<= VK_RMENU) + && !(ch >= 0x30 && ch<= 0x39) + && !(ch >= 0x41 && ch<= 0x5a) + && !(ch >= 0xa6 && ch<= 0xe4) + ) result = 300+ch; + + if (result) + { + if (fs) result |= 512; + if (fc) result |= 1024; + if (fa) result |= 2048; + ev.key = result; + ev.type = EV_KEYIN; + ev_push(&ev); + } + + return 0; + } + + case WM_CHAR: + { + if (skip_key) + { + skip_key = false; + return 0; + } + ev.key = (int)wParam; + ev.type = EV_KEYIN; + ev_push(&ev); + return 0; + } + + case WM_PAINT: + { + hdc = BeginPaint(hWnd, &ps); + /* + int x1 = ps.rcPaint.left; + int x2 = ps.rcPaint.right; + int y1 = ps.rcPaint.top; + int y2 = ps.rcPaint.bottom; + + int dx = xwin.dx; + int dy = xwin.dy; + */ + win_main->redraw(); + EndPaint(hWnd, &ps); + //ValidateRect(hWnd, NULL); + return 0; + } + + case WM_MOVE: + { + clix = LOWORD(lParam); + cliy = HIWORD(lParam); + return 0; + } + + case WM_COMMAND: + { + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + switch( wmId ) + { + default: + return DefWindowProc( hWnd, message, wParam, lParam ); + } + return 0; + } + case WM_CLOSE: + if ( (mouse_get_mode() == MOUSE_MODE_COMMAND) + ||(!crawl_state.need_save) ) + { + if (crawl_state.need_save) + { + save_game(true); + } + libgui_shutdown(); + } + break; + case WM_DESTROY: + { + PostQuitMessage( 0 ); + exit(0); + break; + } + default: + return DefWindowProc( hWnd, message, wParam, lParam ); + } + return 0; +} + +#ifdef USE_TILE +void TileDrawDungeonAux(){ + dib_pack *pBuf = region_tile->backbuf; + + int new_palette = PAL_STD; + if (you.duration[DUR_BERSERKER]) new_palette = PAL_BER; + if (you.special_wield == SPWLD_SHADOW) new_palette = PAL_SHA; + + if (new_palette != palette) + { + palette = new_palette; + SetDIBColorTable(pBuf->hDC, 0, 256, (RGBQUAD *)lpPalettes[palette]); + } +} +#endif + +bool windows_change_font(char *font_name, int *font_size, bool dos) +{ + CHOOSEFONT cf; + + memset(&cf, 0, sizeof(cf)); + cf.lStructSize = sizeof(cf); + cf.iPointSize = *font_size; + cf.nSizeMin = 8; + cf.nSizeMax = 24; + cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY | CF_NOVERTFONTS + | CF_INITTOLOGFONTSTRUCT | CF_LIMITSIZE | CF_FORCEFONTEXIST; + + LOGFONT lf; + strcpy(lf.lfFaceName, font_name); + lf.lfHeight = 16; + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = lf.lfEscapement; + lf.lfWeight = FW_NORMAL; + lf.lfItalic = FALSE; + lf.lfUnderline = FALSE; + lf.lfStrikeOut = FALSE; + lf.lfOutPrecision = OUT_DEFAULT_PRECIS; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfPitchAndFamily= FF_MODERN|FIXED_PITCH; + lf.lfCharSet = (dos)? OEM_CHARSET:ANSI_CHARSET; + cf.lpLogFont = &lf; + + if (ChooseFont(&cf)) + { + *font_size = (cf.iPointSize / 10); + strcpy(font_name, lf.lfFaceName); + return true; + } + return false; +} + +void windows_get_winpos(int *x, int *y) +{ + WINDOWPLACEMENT wndpl; + + // set length + wndpl.length = sizeof( WINDOWPLACEMENT ); + + if( GetWindowPlacement( win_main->hWnd, &wndpl ) != 0 ) + { + *x = wndpl.rcNormalPosition.top; + *y = wndpl.rcNormalPosition.left; + } +} + +void delay(unsigned long ms) +{ + Sleep((DWORD)ms); +} + +int kbhit() +{ + MSG msg; + + if (PeekMessage(&msg, NULL, WM_CHAR, WM_CHAR, PM_NOREMOVE) + || PeekMessage(&msg, NULL, WM_KEYDOWN, WM_KEYDOWN, PM_NOREMOVE) + /* || PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_NOREMOVE)*/ ) + return 1; + else + return 0; +} + +void update_screen() +{ +} |