1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

WIP: adapt event stuff

This commit is contained in:
Mathieu Schroeter 2017-01-28 23:34:02 +01:00
parent 515c8fedd9
commit a4e75756de
13 changed files with 388 additions and 704 deletions

View File

@ -177,7 +177,6 @@ void UpdateFrame(void)
POINT posMouse; POINT posMouse;
int i, term, speed; int i, term, speed;
g_pPixmap->MouseBackClear(); // enlève la souris dans "back"
posMouse = g_pEvent->GetLastMousePos(); posMouse = g_pEvent->GetLastMousePos();
phase = g_pEvent->GetPhase(); phase = g_pEvent->GetPhase();
@ -277,8 +276,6 @@ void UpdateFrame(void)
if ( term == 1 ) g_pEvent->ChangePhase(WM_PHASE_LOST); // perdu if ( term == 1 ) g_pEvent->ChangePhase(WM_PHASE_LOST); // perdu
if ( term == 2 ) g_pEvent->ChangePhase(WM_PHASE_WINMOVIE); // gagné if ( term == 2 ) g_pEvent->ChangePhase(WM_PHASE_WINMOVIE); // gagné
} }
g_pPixmap->MouseBackDraw(); // remet la souris dans "back"
} }
@ -360,22 +357,13 @@ static void FinishObjects(void)
} }
} }
LRESULT CALLBACK WindowProc2 (HWND hWnd, UINT message,
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam,
WPARAM wParam, LPARAM lParam) const SDL_Event *event)
{ {
static HINSTANCE hInstance; static HINSTANCE hInstance;
POINT mousePos, totalDim, iconDim; POINT mousePos, totalDim, iconDim;
#if 0
if ( message != WM_TIMER )
{
char s[100];
sprintf(s, "message=%d,%d\n", message, wParam);
OutputDebug(s);
}
#endif
// La touche F10 envoie un autre message pour activer // La touche F10 envoie un autre message pour activer
// le menu dans les applications Windows standard ! // le menu dans les applications Windows standard !
if ( message == WM_SYSKEYDOWN && wParam == VK_F10 ) if ( message == WM_SYSKEYDOWN && wParam == VK_F10 )
@ -388,7 +376,7 @@ LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
} }
if ( g_pEvent != NULL && if ( g_pEvent != NULL &&
g_pEvent->TreatEvent(message, wParam, lParam) ) return 0; g_pEvent->TreatEvent(event) ) return 0;
switch( message ) switch( message )
{ {
@ -547,6 +535,11 @@ LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
return DefWindowProc(hWnd, message, wParam, lParam); return DefWindowProc(hWnd, message, wParam, lParam);
} }
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
return WindowProc2 (hWnd, message, wParam, lParam, nullptr);
}
// Erreur dans DoInit. // Erreur dans DoInit.
@ -668,8 +661,6 @@ static bool DoInit(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow)
UpdateWindow(g_hWnd); UpdateWindow(g_hWnd);
SetFocus(g_hWnd); SetFocus(g_hWnd);
ChangeSprite(SPRITE_WAIT); // met le sablier maison
if ( !bOK ) // config.def pas correct ? if ( !bOK ) // config.def pas correct ?
{ {
return InitFail("Game not correctly installed", false); return InitFail("Game not correctly installed", false);
@ -812,6 +803,7 @@ static bool DoInit(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow)
// Load all cursors // Load all cursors
g_pPixmap->LoadCursors (); g_pPixmap->LoadCursors ();
g_pPixmap->ChangeSprite (SPRITE_WAIT); // met le sablier maison
// Crée le gestionnaire de son. // Crée le gestionnaire de son.
g_pSound = new CSound; g_pSound = new CSound;
@ -866,7 +858,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
SetTimer(g_hWnd, 1, g_timerInterval, NULL); SetTimer(g_hWnd, 1, g_timerInterval, NULL);
while ( true ) while (SDL_TRUE)
{ {
if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{ {
@ -880,8 +872,18 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
else else
{ {
// make sure we go to sleep if we have nothing else to do // make sure we go to sleep if we have nothing else to do
if ( !g_bActive ) WaitMessage(); if (!g_bActive)
WaitMessage ();
else
Sleep (1);
} }
SDL_Event event;
while (SDL_PollEvent (&event))
{
WindowProc2 (nullptr, 0, 0, 0, &event);
}
} }
out: out:

View File

@ -10,7 +10,7 @@
#include "decor.h" #include "decor.h"
#include "button.h" #include "button.h"
#include "misc.h" #include "misc.h"
#include "event.h"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -241,27 +241,39 @@ void CButton::SetHide(bool bHide)
// Traitement d'un événement. // Traitement d'un événement.
bool CButton::TreatEvent(UINT message, WPARAM wParam, LPARAM lParam) bool CButton::TreatEvent(const SDL_Event &event)
{ {
POINT pos; POINT pos;
if ( m_bHide || !m_bEnable ) return false; if ( m_bHide || !m_bEnable ) return false;
pos = ConvLongToPos(lParam); //pos = ConvLongToPos(lParam);
switch( message ) switch (event.type)
{ {
case WM_LBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case WM_RBUTTONDOWN: if ( event.button.button != SDL_BUTTON_LEFT
&& event.button.button != SDL_BUTTON_RIGHT)
break;
pos.x = event.button.x;
pos.y = event.button.y;
if ( MouseDown(pos) ) return true; if ( MouseDown(pos) ) return true;
break; break;
case WM_MOUSEMOVE: case SDL_MOUSEMOTION:
pos.x = event.motion.x;
pos.y = event.motion.y;
if ( MouseMove(pos) ) return true; if ( MouseMove(pos) ) return true;
break; break;
case WM_LBUTTONUP: case SDL_MOUSEBUTTONUP:
case WM_RBUTTONUP: if ( event.button.button != SDL_BUTTON_LEFT
&& event.button.button != SDL_BUTTON_RIGHT)
break;
pos.x = event.button.x;
pos.y = event.button.y;
if ( MouseUp(pos) ) return false; // (*) if ( MouseUp(pos) ) return false; // (*)
break; break;
} }
@ -350,7 +362,7 @@ bool CButton::MouseDown(POINT pos)
m_mouseState = 1; m_mouseState = 1;
m_bMouseDown = true; m_bMouseDown = true;
m_bRedraw = true; m_bRedraw = true;
PostMessage(m_hWnd, WM_UPDATE, 0, 0); CEvent::PushUserEvent (WM_UPDATE);
m_pSound->PlayImage(SOUND_CLICK, pos); m_pSound->PlayImage(SOUND_CLICK, pos);
return true; return true;
@ -394,7 +406,7 @@ bool CButton::MouseMove(POINT pos)
iMenu != m_selMenu ) iMenu != m_selMenu )
{ {
m_bRedraw = true; m_bRedraw = true;
PostMessage(m_hWnd, WM_UPDATE, 0, 0); CEvent::PushUserEvent (WM_UPDATE);
} }
return m_bMouseDown; return m_bMouseDown;
@ -416,7 +428,7 @@ bool CButton::MouseUp(POINT pos)
if ( m_message != -1 ) if ( m_message != -1 )
{ {
PostMessage(m_hWnd, m_message, 0, 0); CEvent::PushUserEvent (m_message);
} }
return true; return true;

View File

@ -30,7 +30,7 @@ public:
bool GetHide(); bool GetHide();
void SetHide(bool bHide); void SetHide(bool bHide);
bool TreatEvent(UINT message, WPARAM wParam, LPARAM lParam); bool TreatEvent(const SDL_Event &event);
bool MouseOnButton(POINT pos); bool MouseOnButton(POINT pos);
int GetToolTips(POINT pos); int GetToolTips(POINT pos);

View File

@ -341,9 +341,9 @@ public:
int StatisticGetFire(); int StatisticGetFire();
void StatisticDraw(); void StatisticDraw();
void GenerateStatictic(); void GenerateStatictic();
bool StatisticDown(POINT pos, int fwKeys); bool StatisticDown(POINT pos);
bool StatisticMove(POINT pos, int fwKeys); bool StatisticMove(POINT pos);
bool StatisticUp(POINT pos, int fwKeys); bool StatisticUp(POINT pos);
int StatisticDetect(POINT pos); int StatisticDetect(POINT pos);
// Chemin.cpp // Chemin.cpp

View File

@ -802,7 +802,7 @@ void CDecor::GenerateStatictic()
// Bouton pressé dans les statistiques. // Bouton pressé dans les statistiques.
bool CDecor::StatisticDown(POINT pos, int fwKeys) bool CDecor::StatisticDown(POINT pos)
{ {
int hili, rank, x, y, show, icon; int hili, rank, x, y, show, icon;
POINT cel; POINT cel;
@ -991,7 +991,7 @@ bool CDecor::StatisticDown(POINT pos, int fwKeys)
// Souris déplacée dans les statistiques. // Souris déplacée dans les statistiques.
bool CDecor::StatisticMove(POINT pos, int fwKeys) bool CDecor::StatisticMove(POINT pos)
{ {
int rank; int rank;
@ -1008,7 +1008,7 @@ bool CDecor::StatisticMove(POINT pos, int fwKeys)
// Bouton relâché dans les statistiques. // Bouton relâché dans les statistiques.
bool CDecor::StatisticUp(POINT pos, int fwKeys) bool CDecor::StatisticUp(POINT pos)
{ {
return false; return false;
} }

517
event.cpp
View File

@ -51,15 +51,15 @@ DescInfo;
static char cheat_code[9][20] = static char cheat_code[9][20] =
{ {
"VISION", // 0 "vision", // 0
"POWER", // 1 "power", // 1
"LONESOME", // 2 "lonesome", // 2
"ALLMISSIONS", // 3 "allmissions", // 3
"QUICK", // 4 "quick", // 4
"HELPME", // 5 "helpme", // 5
"INVINCIBLE", // 6 "invincible", // 6
"SUPERBLUPI", // 7 "superblupi", // 7
"CONSTRUIRE", // 8 (CPOTUSVJSF) "construire", // 8 (CPOTUSVJSF)
}; };
@ -1454,11 +1454,10 @@ CEvent::CEvent()
m_bAccessBuild = false; m_bAccessBuild = false;
m_bRunMovie = false; m_bRunMovie = false;
m_bBuildModify = false; m_bBuildModify = false;
m_bMousePress = false;
m_bMouseDown = false; m_bMouseDown = false;
m_oldMousePos.x = 0; m_oldMousePos.x = 0;
m_oldMousePos.y = 0; m_oldMousePos.y = 0;
m_mouseSprite = 0; m_mouseSprite = SPRITE_ARROW;
m_bFillMouse = false; m_bFillMouse = false;
m_bWaitMouse = false; m_bWaitMouse = false;
m_bHideMouse = false; m_bHideMouse = false;
@ -1480,7 +1479,7 @@ CEvent::CEvent()
m_bDemoPlay = false; m_bDemoPlay = false;
m_pDemoBuffer = NULL; m_pDemoBuffer = NULL;
m_demoTime = 0; m_demoTime = 0;
m_bCtrlDown = false; m_keymod = 0;
for ( i=0 ; i<MAXBUTTON ; i++ ) for ( i=0 ; i<MAXBUTTON ; i++ )
{ {
@ -1511,9 +1510,11 @@ CEvent::~CEvent()
POINT CEvent::GetMousePos() POINT CEvent::GetMousePos()
{ {
POINT pos; POINT pos;
int x, y;
GetCursorPos(&pos); SDL_GetMouseState (&x, &y);
ScreenToClient(m_hWnd, &pos); pos.x = x;
pos.y = y;
return pos; return pos;
} }
@ -2401,9 +2402,9 @@ bool CEvent::DrawButtons()
// Retourne le lutin à utiliser à une position donnée. // Retourne le lutin à utiliser à une position donnée.
int CEvent::MousePosToSprite(POINT pos) MouseSprites CEvent::MousePosToSprite(POINT pos)
{ {
int sprite; MouseSprites sprite;
bool bUp=false, bDown=false, bLeft=false, bRight=false; bool bUp=false, bDown=false, bLeft=false, bRight=false;
sprite = SPRITE_POINTER; sprite = SPRITE_POINTER;
@ -2494,7 +2495,7 @@ void CEvent::MouseSprite(POINT pos)
m_mouseSprite = MousePosToSprite(pos); m_mouseSprite = MousePosToSprite(pos);
m_pPixmap->SetMousePosSprite(pos, m_mouseSprite, m_bDemoPlay); m_pPixmap->SetMousePosSprite(pos, m_mouseSprite, m_bDemoPlay);
ChangeSprite(m_mouseSprite); m_pPixmap->ChangeSprite(m_mouseSprite);
} }
// Met ou enlève le sablier de la souris. // Met ou enlève le sablier de la souris.
@ -2512,7 +2513,7 @@ void CEvent::WaitMouse(bool bWait)
m_mouseSprite = MousePosToSprite(GetMousePos()); m_mouseSprite = MousePosToSprite(GetMousePos());
} }
m_pPixmap->SetMouseSprite(m_mouseSprite, m_bDemoPlay); m_pPixmap->SetMouseSprite(m_mouseSprite, m_bDemoPlay);
ChangeSprite(m_mouseSprite); m_pPixmap->ChangeSprite(m_mouseSprite);
} }
// Cache ou montre la souris. // Cache ou montre la souris.
@ -2530,18 +2531,16 @@ void CEvent::HideMouse(bool bHide)
m_mouseSprite = MousePosToSprite(GetMousePos()); m_mouseSprite = MousePosToSprite(GetMousePos());
} }
m_pPixmap->SetMouseSprite(m_mouseSprite, m_bDemoPlay); m_pPixmap->SetMouseSprite(m_mouseSprite, m_bDemoPlay);
ChangeSprite(m_mouseSprite); m_pPixmap->ChangeSprite(m_mouseSprite);
} }
// Traite les événements pour tous les boutons. // Traite les événements pour tous les boutons.
bool CEvent::EventButtons(UINT message, WPARAM wParam, LPARAM lParam) bool CEvent::EventButtons(const SDL_Event &event, POINT pos)
{ {
POINT pos, test; POINT test;
int i, lg, oldx, sound, res; int i, lg, oldx, sound, res;
pos = ConvLongToPos(lParam);
// Cherche le tool tips à utiliser pour la souris. // Cherche le tool tips à utiliser pour la souris.
m_textToolTips[0] = 0; m_textToolTips[0] = 0;
oldx = m_posToolTips.x; oldx = m_posToolTips.x;
@ -2606,15 +2605,17 @@ bool CEvent::EventButtons(UINT message, WPARAM wParam, LPARAM lParam)
{ {
m_bHiliInfoButton = true; m_bHiliInfoButton = true;
if ( message == WM_LBUTTONDOWN || if (event.type == SDL_MOUSEBUTTONDOWN
message == WM_RBUTTONDOWN ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
if ( m_pDecor->GetInfoMode() ) sound = SOUND_CLOSE; if ( m_pDecor->GetInfoMode() ) sound = SOUND_CLOSE;
else sound = SOUND_OPEN; else sound = SOUND_OPEN;
m_pSound->PlayImage(sound, pos); m_pSound->PlayImage(sound, pos);
} }
if ( message == WM_LBUTTONUP || if (event.type == SDL_MOUSEBUTTONUP
message == WM_RBUTTONUP ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
// Montre ou cache les infos tout en haut. // Montre ou cache les infos tout en haut.
m_pDecor->SetInfoMode(!m_pDecor->GetInfoMode()); m_pDecor->SetInfoMode(!m_pDecor->GetInfoMode());
@ -2630,13 +2631,15 @@ bool CEvent::EventButtons(UINT message, WPARAM wParam, LPARAM lParam)
{ {
m_bHiliHelpButton = true; m_bHiliHelpButton = true;
if ( message == WM_LBUTTONDOWN || if (event.type == SDL_MOUSEBUTTONDOWN
message == WM_RBUTTONDOWN ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
m_pSound->PlayImage(SOUND_CLICK, pos); m_pSound->PlayImage(SOUND_CLICK, pos);
} }
if ( message == WM_LBUTTONUP || if (event.type == SDL_MOUSEBUTTONUP
message == WM_RBUTTONUP ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
// Inverse le mode aide dans les infos. // Inverse le mode aide dans les infos.
m_bInfoHelp = !m_bInfoHelp; m_bInfoHelp = !m_bInfoHelp;
@ -2655,13 +2658,15 @@ bool CEvent::EventButtons(UINT message, WPARAM wParam, LPARAM lParam)
if ( m_phase == WM_PHASE_BUILD ) if ( m_phase == WM_PHASE_BUILD )
{ {
if ( message == WM_LBUTTONDOWN || if (event.type == SDL_MOUSEBUTTONDOWN
message == WM_RBUTTONDOWN ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
m_pDecor->HideTooltips(true); // plus de tooltips pour décor m_pDecor->HideTooltips(true); // plus de tooltips pour décor
} }
if ( message == WM_LBUTTONUP || if (event.type == SDL_MOUSEBUTTONUP
message == WM_RBUTTONUP ) && ( event.button.button == SDL_BUTTON_LEFT
|| event.button.button == SDL_BUTTON_RIGHT))
{ {
m_pDecor->HideTooltips(false); m_pDecor->HideTooltips(false);
} }
@ -2671,13 +2676,13 @@ bool CEvent::EventButtons(UINT message, WPARAM wParam, LPARAM lParam)
i = 0; i = 0;
while ( table[m_index].buttons[i].message != 0 ) while ( table[m_index].buttons[i].message != 0 )
{ {
if ( m_buttons[i].TreatEvent(message, wParam, lParam) ) return true; if ( m_buttons[i].TreatEvent(event) ) return true;
i ++; i ++;
} }
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
if ( m_menu.TreatEvent(message, wParam, lParam) ) return true; if ( m_menu.TreatEvent(event) ) return true;
} }
return false; return false;
@ -2785,7 +2790,7 @@ bool CEvent::ChangePhase(UINT phase)
m_textToolTips[0] = 0; m_textToolTips[0] = 0;
m_posToolTips.x = -1; m_posToolTips.x = -1;
m_bPause = false; m_bPause = false;
m_bCtrlDown = false; m_keymod = 0;
m_bMouseDown = false; m_bMouseDown = false;
m_debugPos.x = 0; m_debugPos.x = 0;
m_debugPos.y = 0; m_debugPos.y = 0;
@ -3252,9 +3257,6 @@ void CEvent::DecorAutoShift(POINT pos)
max = 4-m_scrollSpeed; // max <- 3..1 max = 4-m_scrollSpeed; // max <- 3..1
//? if ( m_bMousePress &&
//? (m_phase == WM_PHASE_PLAY ||
//? m_phase == WM_PHASE_BUILD) )
if ( m_phase == WM_PHASE_PLAY || if ( m_phase == WM_PHASE_PLAY ||
m_phase == WM_PHASE_BUILD ) m_phase == WM_PHASE_BUILD )
{ {
@ -3366,7 +3368,7 @@ bool CEvent::IsShift()
// Modifie le décor lorsque le bouton de la souris est pressé. // Modifie le décor lorsque le bouton de la souris est pressé.
bool CEvent::PlayDown(POINT pos, int fwKeys) bool CEvent::PlayDown(POINT pos, const SDL_Event &event)
{ {
bool bDecor = false; bool bDecor = false;
bool bMap = false; bool bMap = false;
@ -3386,7 +3388,7 @@ bool CEvent::PlayDown(POINT pos, int fwKeys)
return true; return true;
} }
m_pDecor->StatisticDown(pos, fwKeys); m_pDecor->StatisticDown(pos);
if ( pos.x >= POSMAPX && pos.x <= POSMAPX+DIMMAPX && if ( pos.x >= POSMAPX && pos.x <= POSMAPX+DIMMAPX &&
pos.y >= POSMAPY && pos.y <= POSMAPY+DIMMAPY ) pos.y >= POSMAPY && pos.y <= POSMAPY+DIMMAPY )
@ -3403,7 +3405,7 @@ bool CEvent::PlayDown(POINT pos, int fwKeys)
if ( !bDecor && !bMap ) return false; if ( !bDecor && !bMap ) return false;
cel = m_pDecor->ConvPosToCel(pos, true); cel = m_pDecor->ConvPosToCel(pos, true);
if ( fwKeys&MK_RBUTTON ) if (event.button.button == SDL_BUTTON_RIGHT)
{ {
if ( bMap ) if ( bMap )
{ {
@ -3430,7 +3432,7 @@ bool CEvent::PlayDown(POINT pos, int fwKeys)
{ {
m_bHili = true; m_bHili = true;
m_bMouseDown = true; m_bMouseDown = true;
m_pDecor->BlupiHiliDown(pos, !!(fwKeys & MK_SHIFT)); m_pDecor->BlupiHiliDown(pos, !!(m_keymod & KMOD_SHIFT));
} }
else else
{ {
@ -3443,7 +3445,7 @@ bool CEvent::PlayDown(POINT pos, int fwKeys)
// Modifie le décor lorsque la souris est déplacée. // Modifie le décor lorsque la souris est déplacée.
bool CEvent::PlayMove(POINT pos, int fwKeys) bool CEvent::PlayMove(POINT pos, Uint16 mod)
{ {
if ( m_bMenu ) if ( m_bMenu )
{ {
@ -3456,13 +3458,13 @@ bool CEvent::PlayMove(POINT pos, int fwKeys)
return true; return true;
} }
m_pDecor->StatisticMove(pos, fwKeys); m_pDecor->StatisticMove(pos);
if ( m_bMouseDown ) // bouton souris pressé ? if ( m_bMouseDown ) // bouton souris pressé ?
{ {
if ( m_bHili ) if ( m_bHili )
{ {
m_pDecor->BlupiHiliMove(pos, !!(fwKeys & MK_SHIFT)); m_pDecor->BlupiHiliMove(pos, !!(mod & KMOD_SHIFT));
} }
else else
{ {
@ -3479,7 +3481,7 @@ bool CEvent::PlayMove(POINT pos, int fwKeys)
// Modifie le décor lorsque le bouton de la souris est relâché. // Modifie le décor lorsque le bouton de la souris est relâché.
bool CEvent::PlayUp(POINT pos, int fwKeys) bool CEvent::PlayUp(POINT pos, Uint16 mod)
{ {
static int table_sound_boing[3] = static int table_sound_boing[3] =
{ {
@ -3488,13 +3490,13 @@ bool CEvent::PlayUp(POINT pos, int fwKeys)
SOUND_BOING3, SOUND_BOING3,
}; };
m_pDecor->StatisticUp(pos, fwKeys); m_pDecor->StatisticUp(pos);
if ( m_bMouseDown ) // bouton souris pressé ? if ( m_bMouseDown ) // bouton souris pressé ?
{ {
if ( m_bHili ) if ( m_bHili )
{ {
m_pDecor->BlupiHiliUp(pos, !!(fwKeys & MK_SHIFT)); m_pDecor->BlupiHiliUp(pos, !!(mod & KMOD_SHIFT));
} }
else else
{ {
@ -3802,7 +3804,7 @@ static int tableHome[] =
// Modifie le décor lorsque le bouton de la souris est pressé. // Modifie le décor lorsque le bouton de la souris est pressé.
bool CEvent::BuildDown(POINT pos, int fwKeys, bool bMix) bool CEvent::BuildDown(POINT pos, Uint16 mod, bool bMix)
{ {
POINT cel; POINT cel;
int menu, channel, icon; int menu, channel, icon;
@ -3833,7 +3835,7 @@ bool CEvent::BuildDown(POINT pos, int fwKeys, bool bMix)
} }
} }
if ( fwKeys & MK_CONTROL ) // touche Ctrl enfoncée ? if (mod & KMOD_CTRL) // touche Ctrl enfoncée ?
{ {
WaitMouse(true); WaitMouse(true);
m_pDecor->ArrangeFill(cel, CHFLOOR, tableFloor[menu*10+m_lastFloor[menu]], true); m_pDecor->ArrangeFill(cel, CHFLOOR, tableFloor[menu*10+m_lastFloor[menu]], true);
@ -3867,7 +3869,7 @@ bool CEvent::BuildDown(POINT pos, int fwKeys, bool bMix)
} }
} }
if ( fwKeys & MK_CONTROL ) // touche Ctrl enfoncée ? if (mod & KMOD_CTRL) // touche Ctrl enfoncée ?
{ {
WaitMouse(true); WaitMouse(true);
m_pDecor->ArrangeFill(cel, CHOBJECT, tableObject[menu*10+m_lastObject[menu]], false); m_pDecor->ArrangeFill(cel, CHOBJECT, tableObject[menu*10+m_lastObject[menu]], false);
@ -3898,7 +3900,7 @@ bool CEvent::BuildDown(POINT pos, int fwKeys, bool bMix)
} }
} }
if ( fwKeys & MK_CONTROL ) // touche Ctrl enfoncée ? if (mod & KMOD_CTRL) // touche Ctrl enfoncée ?
{ {
WaitMouse(true); WaitMouse(true);
m_pDecor->ArrangeFill(cel, CHOBJECT, tableHome[menu*10+m_lastHome[menu]], false); m_pDecor->ArrangeFill(cel, CHOBJECT, tableHome[menu*10+m_lastHome[menu]], false);
@ -3982,11 +3984,11 @@ bool CEvent::BuildDown(POINT pos, int fwKeys, bool bMix)
// Modifie le décor lorsque la souris est déplacée. // Modifie le décor lorsque la souris est déplacée.
bool CEvent::BuildMove(POINT pos, int fwKeys) bool CEvent::BuildMove(POINT pos, Uint16 mod, const SDL_Event &event)
{ {
if ( fwKeys & MK_LBUTTON ) // bouton souris pressé ? if (event.motion.state & SDL_BUTTON (SDL_BUTTON_LEFT)) // bouton souris pressé ?
{ {
BuildDown(pos, fwKeys, false); BuildDown(pos, mod, false);
} }
if ( GetState(WM_DECOR4) == 1 ) // pose d'un blupi if ( GetState(WM_DECOR4) == 1 ) // pose d'un blupi
@ -4003,7 +4005,7 @@ bool CEvent::BuildMove(POINT pos, int fwKeys)
// Modifie le décor lorsque le bouton de la souris est relâché. // Modifie le décor lorsque le bouton de la souris est relâché.
bool CEvent::BuildUp(POINT pos, int fwKeys) bool CEvent::BuildUp(POINT pos)
{ {
return true; return true;
} }
@ -4519,7 +4521,7 @@ void CEvent::DemoStep()
SetCursorPos(pos.x, pos.y); SetCursorPos(pos.x, pos.y);
} }
TreatEventBase(message, wParam, lParam); TreatEventBase(nullptr); // XXX: use SDL_Event
if ( m_demoIndex >= m_demoEnd ) if ( m_demoIndex >= m_demoEnd )
{ {
@ -4584,55 +4586,50 @@ POINT CEvent::GetLastMousePos()
// Traitement d'un événement. // Traitement d'un événement.
bool CEvent::TreatEvent(UINT message, WPARAM wParam, LPARAM lParam) bool CEvent::TreatEvent(const SDL_Event *event)
{ {
if ( m_bDemoPlay ) // démo en lecture ? if ( m_bDemoPlay ) // démo en lecture ?
{ {
if ( message == WM_KEYDOWN || // l'utilisateur clique ? if (event->type == SDL_KEYDOWN ||
message == WM_KEYUP || event->type == SDL_KEYUP ||
// message == WM_LBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) // is the user clicking?
// message == WM_RBUTTONDOWN ||
message == WM_LBUTTONUP ||
message == WM_RBUTTONUP )
{ {
DemoPlayStop(); DemoPlayStop ();
return true; return true;
} }
if ( message == WM_MOUSEMOVE ) // l'utilisateur bouge ?
{ if (event->type == SDL_MOUSEMOTION) // is the user moving?
return true; return true;
}
} }
return TreatEventBase(message, wParam, lParam); return TreatEventBase(event);
} }
// Traitement d'un événement. // Traitement d'un événement.
bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) bool CEvent::TreatEventBase(const SDL_Event *event)
{ {
POINT pos; POINT pos;
int fwKeys;
int i, sound; int i, sound;
char c; char c;
bool bEnable; bool bEnable;
pos = ConvLongToPos(lParam); //DemoRecEvent(message, wParam, lParam); XXX: use SDL_Event
fwKeys = static_cast<int> (wParam);
DemoRecEvent(message, wParam, lParam); if (!event)
return false;
switch( message ) switch (event->type)
{ {
case WM_KEYDOWN: case SDL_KEYDOWN:
if ( wParam >= 'A' && wParam <= 'Z' ) if ( event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z )
{ {
if ( m_posCheat == 0 ) // première lettre ? if ( m_posCheat == 0 ) // première lettre ?
{ {
m_rankCheat = -1; m_rankCheat = -1;
for ( i=0 ; i<9 ; i++ ) for ( i=0 ; i<9 ; i++ )
{ {
if ( (char)wParam == cheat_code[i][0] ) if ( (char) event->key.keysym.sym == cheat_code[i][0] )
{ {
m_rankCheat = i; m_rankCheat = i;
break; break;
@ -4643,7 +4640,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
{ {
c = cheat_code[m_rankCheat][m_posCheat]; c = cheat_code[m_rankCheat][m_posCheat];
if ( m_posCheat != 0 && m_rankCheat == 8 ) c++; // CONSTRUIRE ? if ( m_posCheat != 0 && m_rankCheat == 8 ) c++; // CONSTRUIRE ?
if ( (char)wParam == c ) if ( (char) event->key.keysym.sym == c )
{ {
m_posCheat ++; m_posCheat ++;
if ( cheat_code[m_rankCheat][m_posCheat] == 0 ) if ( cheat_code[m_rankCheat][m_posCheat] == 0 )
@ -4746,15 +4743,17 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
if ( m_phase == WM_PHASE_BYE ) if ( m_phase == WM_PHASE_BYE )
{ {
PostMessage(m_hWnd, WM_CLOSE, 0, 0); SDL_Event ev;
ev.type = SDL_QUIT;
SDL_PushEvent (&ev);
} }
switch( wParam ) switch (event->key.keysym.sym)
{ {
case VK_END: case SDLK_END:
DemoRecStop(); DemoRecStop();
return true; return true;
case VK_ESCAPE: case SDLK_ESCAPE:
if ( m_bRunMovie ) if ( m_bRunMovie )
{ {
StopMovie(); StopMovie();
@ -4799,11 +4798,13 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
if ( m_phase == WM_PHASE_BYE ) if ( m_phase == WM_PHASE_BYE )
{ {
PostMessage(m_hWnd, WM_CLOSE, 0, 0); SDL_Event ev;
ev.type = SDL_QUIT;
SDL_PushEvent (&ev);
break; break;
} }
return true; return true;
case VK_RETURN: case SDLK_RETURN:
if ( m_phase == WM_PHASE_PLAY || if ( m_phase == WM_PHASE_PLAY ||
m_phase == WM_PHASE_READ || m_phase == WM_PHASE_READ ||
m_phase == WM_PHASE_WRITE || m_phase == WM_PHASE_WRITE ||
@ -4837,27 +4838,27 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
return true; return true;
} }
return true; return true;
case VK_LEFT: case SDLK_LEFT:
//? DecorShift(-4,4); //? DecorShift(-4,4);
DecorShift(-2,2); DecorShift(-2,2);
return true; return true;
case VK_RIGHT: case SDLK_RIGHT:
//? DecorShift(4,-4); //? DecorShift(4,-4);
DecorShift(2,-2); DecorShift(2,-2);
return true; return true;
case VK_UP: case SDLK_UP:
//? DecorShift(-6,-6); //? DecorShift(-6,-6);
DecorShift(-3,-3); DecorShift(-3,-3);
return true; return true;
case VK_DOWN: case SDLK_DOWN:
//? DecorShift(6,6); //? DecorShift(6,6);
DecorShift(3,3); DecorShift(3,3);
return true; return true;
case VK_HOME: case SDLK_HOME:
pos = m_pDecor->GetHome(); pos = m_pDecor->GetHome();
m_pDecor->SetCoin(pos); m_pDecor->SetCoin(pos);
return true; return true;
case VK_SPACE: case SDLK_SPACE:
if ( m_bRunMovie ) if ( m_bRunMovie )
{ {
StopMovie(); StopMovie();
@ -4866,7 +4867,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
m_pDecor->FlipOutline(); m_pDecor->FlipOutline();
return true; return true;
case VK_PAUSE: case SDLK_PAUSE:
m_bPause = !m_bPause; m_bPause = !m_bPause;
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
@ -4880,8 +4881,16 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
} }
return true; return true;
case VK_CONTROL:
m_bCtrlDown = true; case SDLK_LSHIFT:
case SDLK_RSHIFT:
m_keymod |= KMOD_SHIFT;
break;
case SDLK_LCTRL:
case SDLK_RCTRL:
m_keymod |= KMOD_CTRL;
OutputDebugString ("CTRL: DOWN");
if ( m_phase == WM_PHASE_BUILD ) if ( m_phase == WM_PHASE_BUILD )
{ {
m_bFillMouse = true; m_bFillMouse = true;
@ -4892,7 +4901,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
m_bFillMouse = false; m_bFillMouse = false;
} }
return true; return true;
case VK_F1: case SDLK_F1:
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
// Montre ou cache les infos tout en haut. // Montre ou cache les infos tout en haut.
@ -4904,116 +4913,130 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
m_pDecor->SetInfoMode(!m_pDecor->GetInfoMode()); m_pDecor->SetInfoMode(!m_pDecor->GetInfoMode());
} }
return true; return true;
case VK_F9: case SDLK_F8:
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
m_pDecor->MemoPos(0, m_bCtrlDown); m_pDecor->MemoPos(0, !!(m_keymod & KMOD_CTRL));
} }
return true; return true;
case VK_F10: case SDLK_F10:
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
m_pDecor->MemoPos(1, m_bCtrlDown); m_pDecor->MemoPos(1, !!(m_keymod & KMOD_CTRL));
} }
return true; return true;
case VK_F11: case SDLK_F11:
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
m_pDecor->MemoPos(2, m_bCtrlDown); m_pDecor->MemoPos(2, !!(m_keymod & KMOD_CTRL));
} }
return true; return true;
case VK_F12: case SDLK_F12:
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
m_pDecor->MemoPos(3, m_bCtrlDown); m_pDecor->MemoPos(3, !!(m_keymod & KMOD_CTRL));
} }
return true; return true;
} }
break; break;
case WM_KEYUP: case SDL_KEYUP:
switch( wParam ) switch (event->key.keysym.sym)
{ {
case VK_CONTROL: case SDLK_LSHIFT:
m_bCtrlDown = false; case SDLK_RSHIFT:
m_keymod &= ~KMOD_SHIFT;
break;
case SDLK_LCTRL:
case SDLK_RCTRL:
m_keymod &= ~KMOD_CTRL;
OutputDebugString ("CTRL: UP");
m_bFillMouse = false; m_bFillMouse = false;
MouseSprite(GetMousePos()); MouseSprite(GetMousePos());
return true; return true;
} }
break; break;
case WM_LBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case WM_RBUTTONDOWN: if ( event->button.button != SDL_BUTTON_LEFT
m_bMousePress = true; && event->button.button != SDL_BUTTON_RIGHT)
break;
pos.x = event->button.x;
pos.y = event->button.y;
MouseSprite(pos); MouseSprite(pos);
//? DecorAutoShift(pos); //? DecorAutoShift(pos);
if ( EventButtons(message, wParam, lParam) ) return true; if ( EventButtons(*event, pos) ) return true;
if ( m_phase == WM_PHASE_BUILD ) if ( m_phase == WM_PHASE_BUILD )
{ {
if ( BuildDown(pos, fwKeys) ) return true; if ( BuildDown(pos, m_keymod) ) return true;
} }
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
if ( PlayDown(pos, fwKeys) ) return true; if ( PlayDown(pos, *event) ) return true;
} }
break; break;
case WM_MOUSEMOVE: case SDL_MOUSEMOTION:
if ( m_mouseType == MOUSETYPEWINPOS && pos.x = event->motion.x;
(pos.x != m_oldMousePos.x || pos.y = event->motion.y;
pos.y != m_oldMousePos.y ) )
{
m_oldMousePos = pos;
ClientToScreen(m_hWnd, &m_oldMousePos);
SetCursorPos(m_oldMousePos.x, m_oldMousePos.y); // (*)
}
m_oldMousePos = pos; m_oldMousePos = pos;
MouseSprite(pos); MouseSprite(pos);
if ( EventButtons(message, wParam, lParam) ) return true; if ( EventButtons(*event, pos) ) return true;
if ( m_phase == WM_PHASE_BUILD ) if ( m_phase == WM_PHASE_BUILD )
{ {
if ( BuildMove(pos, fwKeys) ) return true; if ( BuildMove(pos, m_keymod, *event) ) return true;
} }
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
if ( PlayMove(pos, fwKeys) ) return true; if ( PlayMove(pos, m_keymod) ) return true;
} }
break; break;
case WM_NCMOUSEMOVE: case SDL_MOUSEBUTTONUP:
if ( event->button.button != SDL_BUTTON_LEFT
&& event->button.button != SDL_BUTTON_RIGHT)
break; break;
case WM_LBUTTONUP: pos.x = event->button.x;
case WM_RBUTTONUP: pos.y = event->button.y;
m_bMousePress = false;
if ( EventButtons(message, wParam, lParam) ) return true; if ( EventButtons(*event, pos) ) return true;
if ( m_phase == WM_PHASE_BUILD ) if ( m_phase == WM_PHASE_BUILD )
{ {
if ( BuildUp(pos, fwKeys) ) return true; if ( BuildUp(pos) ) return true;
} }
if ( m_phase == WM_PHASE_PLAY ) if ( m_phase == WM_PHASE_PLAY )
{ {
if ( PlayUp(pos, fwKeys) ) return true; if ( PlayUp(pos, m_keymod) ) return true;
} }
if ( m_phase == WM_PHASE_BYE ) if ( m_phase == WM_PHASE_BYE )
{ {
PostMessage(m_hWnd, WM_CLOSE, 0, 0); SDL_Event ev;
ev.type = SDL_QUIT;
SDL_PushEvent (&ev);
} }
break; break;
case WM_PHASE_DEMO: case SDL_USEREVENT:
switch (event->user.code)
{
case WM_PHASE_DEMO:
m_demoNumber = 0; m_demoNumber = 0;
DemoPlayStart(); DemoPlayStart();
break; break;
case WM_PHASE_SCHOOL: case WM_PHASE_SCHOOL:
m_bSchool = true; m_bSchool = true;
m_bPrivate = false; m_bPrivate = false;
if ( ChangePhase(WM_PHASE_INFO) ) return true; if ( ChangePhase(WM_PHASE_INFO) ) return true;
break; break;
case WM_PHASE_MISSION: case WM_PHASE_MISSION:
m_bSchool = false; m_bSchool = false;
m_bPrivate = false; m_bPrivate = false;
if ( m_mission == 0 ) // première mission ? if ( m_mission == 0 ) // première mission ?
@ -5026,45 +5049,45 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_PHASE_PRIVATE: case WM_PHASE_PRIVATE:
m_bSchool = false; m_bSchool = false;
m_bPrivate = true; m_bPrivate = true;
if ( ChangePhase(WM_PHASE_INFO) ) return true; if ( ChangePhase(WM_PHASE_INFO) ) return true;
break; break;
case WM_PHASE_INTRO1: case WM_PHASE_INTRO1:
case WM_PHASE_INTRO2: case WM_PHASE_INTRO2:
case WM_PHASE_INIT: case WM_PHASE_INIT:
case WM_PHASE_HISTORY0: case WM_PHASE_HISTORY0:
case WM_PHASE_HISTORY1: case WM_PHASE_HISTORY1:
case WM_PHASE_INFO: case WM_PHASE_INFO:
case WM_PHASE_PLAY: case WM_PHASE_PLAY:
case WM_PHASE_READ: case WM_PHASE_READ:
case WM_PHASE_WRITE: case WM_PHASE_WRITE:
case WM_PHASE_WRITEp: case WM_PHASE_WRITEp:
case WM_PHASE_BUILD: case WM_PHASE_BUILD:
case WM_PHASE_BUTTON: case WM_PHASE_BUTTON:
case WM_PHASE_TERM: case WM_PHASE_TERM:
case WM_PHASE_STOP: case WM_PHASE_STOP:
case WM_PHASE_HELP: case WM_PHASE_HELP:
case WM_PHASE_MUSIC: case WM_PHASE_MUSIC:
case WM_PHASE_REGION: case WM_PHASE_REGION:
case WM_PHASE_SETUP: case WM_PHASE_SETUP:
case WM_PHASE_SETUPp: case WM_PHASE_SETUPp:
case WM_PHASE_PLAYMOVIE: case WM_PHASE_PLAYMOVIE:
case WM_PHASE_H0MOVIE: case WM_PHASE_H0MOVIE:
case WM_PHASE_H1MOVIE: case WM_PHASE_H1MOVIE:
case WM_PHASE_H2MOVIE: case WM_PHASE_H2MOVIE:
case WM_PHASE_WINMOVIE: case WM_PHASE_WINMOVIE:
case WM_PHASE_BYE: case WM_PHASE_BYE:
if ( ChangePhase(message) ) return true; if ( ChangePhase(event->user.code) ) return true;
break; break;
case WM_PHASE_UNDO: case WM_PHASE_UNDO:
m_pDecor->UndoBack(); // revient en arrière m_pDecor->UndoBack(); // revient en arrière
break; break;
case WM_PREV: case WM_PREV:
m_pDecor->SetInvincible(false); m_pDecor->SetInvincible(false);
m_pDecor->SetSuper(false); m_pDecor->SetSuper(false);
if ( m_bPrivate ) if ( m_bPrivate )
@ -5093,7 +5116,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_NEXT: case WM_NEXT:
m_pDecor->SetInvincible(false); m_pDecor->SetInvincible(false);
m_pDecor->SetSuper(false); m_pDecor->SetSuper(false);
if ( m_bPrivate ) if ( m_bPrivate )
@ -5126,7 +5149,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_DECOR1: case WM_DECOR1:
SetState(WM_DECOR1, 1); SetState(WM_DECOR1, 1);
SetState(WM_DECOR2, 0); SetState(WM_DECOR2, 0);
SetState(WM_DECOR3, 0); SetState(WM_DECOR3, 0);
@ -5134,7 +5157,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
SetState(WM_DECOR5, 0); SetState(WM_DECOR5, 0);
break; break;
case WM_DECOR2: case WM_DECOR2:
SetState(WM_DECOR1, 0); SetState(WM_DECOR1, 0);
SetState(WM_DECOR2, 1); SetState(WM_DECOR2, 1);
SetState(WM_DECOR3, 0); SetState(WM_DECOR3, 0);
@ -5142,7 +5165,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
SetState(WM_DECOR5, 0); SetState(WM_DECOR5, 0);
break; break;
case WM_DECOR3: case WM_DECOR3:
SetState(WM_DECOR1, 0); SetState(WM_DECOR1, 0);
SetState(WM_DECOR2, 0); SetState(WM_DECOR2, 0);
SetState(WM_DECOR3, 1); SetState(WM_DECOR3, 1);
@ -5150,7 +5173,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
SetState(WM_DECOR5, 0); SetState(WM_DECOR5, 0);
break; break;
case WM_DECOR4: case WM_DECOR4:
SetState(WM_DECOR1, 0); SetState(WM_DECOR1, 0);
SetState(WM_DECOR2, 0); SetState(WM_DECOR2, 0);
SetState(WM_DECOR3, 0); SetState(WM_DECOR3, 0);
@ -5158,7 +5181,7 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
SetState(WM_DECOR5, 0); SetState(WM_DECOR5, 0);
break; break;
case WM_DECOR5: case WM_DECOR5:
SetState(WM_DECOR1, 0); SetState(WM_DECOR1, 0);
SetState(WM_DECOR2, 0); SetState(WM_DECOR2, 0);
SetState(WM_DECOR3, 0); SetState(WM_DECOR3, 0);
@ -5166,85 +5189,85 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
SetState(WM_DECOR5, 1); SetState(WM_DECOR5, 1);
break; break;
case WM_PHASE_SKILL1: case WM_PHASE_SKILL1:
m_pDecor->SetSkill(0); m_pDecor->SetSkill(0);
SetState(WM_PHASE_SKILL1, true); SetState(WM_PHASE_SKILL1, true);
SetState(WM_PHASE_SKILL2, false); SetState(WM_PHASE_SKILL2, false);
break; break;
case WM_PHASE_SKILL2: case WM_PHASE_SKILL2:
m_pDecor->SetSkill(1); m_pDecor->SetSkill(1);
SetState(WM_PHASE_SKILL1, false); SetState(WM_PHASE_SKILL1, false);
SetState(WM_PHASE_SKILL2, true); SetState(WM_PHASE_SKILL2, true);
break; break;
case WM_BUTTON0: case WM_BUTTON0:
case WM_BUTTON1: case WM_BUTTON1:
case WM_BUTTON2: case WM_BUTTON2:
case WM_BUTTON3: case WM_BUTTON3:
case WM_BUTTON4: case WM_BUTTON4:
case WM_BUTTON5: case WM_BUTTON5:
case WM_BUTTON6: case WM_BUTTON6:
case WM_BUTTON7: case WM_BUTTON7:
case WM_BUTTON8: case WM_BUTTON8:
case WM_BUTTON9: case WM_BUTTON9:
case WM_BUTTON10: case WM_BUTTON10:
case WM_BUTTON11: case WM_BUTTON11:
case WM_BUTTON12: case WM_BUTTON12:
case WM_BUTTON13: case WM_BUTTON13:
case WM_BUTTON14: case WM_BUTTON14:
case WM_BUTTON15: case WM_BUTTON15:
case WM_BUTTON16: case WM_BUTTON16:
case WM_BUTTON17: case WM_BUTTON17:
case WM_BUTTON18: case WM_BUTTON18:
case WM_BUTTON19: case WM_BUTTON19:
case WM_BUTTON20: case WM_BUTTON20:
case WM_BUTTON21: case WM_BUTTON21:
case WM_BUTTON22: case WM_BUTTON22:
case WM_BUTTON23: case WM_BUTTON23:
case WM_BUTTON24: case WM_BUTTON24:
case WM_BUTTON25: case WM_BUTTON25:
case WM_BUTTON26: case WM_BUTTON26:
case WM_BUTTON27: case WM_BUTTON27:
case WM_BUTTON28: case WM_BUTTON28:
case WM_BUTTON29: case WM_BUTTON29:
case WM_BUTTON30: case WM_BUTTON30:
case WM_BUTTON31: case WM_BUTTON31:
case WM_BUTTON32: case WM_BUTTON32:
case WM_BUTTON33: case WM_BUTTON33:
case WM_BUTTON34: case WM_BUTTON34:
case WM_BUTTON35: case WM_BUTTON35:
case WM_BUTTON36: case WM_BUTTON36:
case WM_BUTTON37: case WM_BUTTON37:
case WM_BUTTON38: case WM_BUTTON38:
case WM_BUTTON39: case WM_BUTTON39:
ChangeButtons(message); ChangeButtons(event->user.code);
break; break;
case WM_READ0: case WM_READ0:
case WM_READ1: case WM_READ1:
case WM_READ2: case WM_READ2:
case WM_READ3: case WM_READ3:
case WM_READ4: case WM_READ4:
case WM_READ5: case WM_READ5:
case WM_READ6: case WM_READ6:
case WM_READ7: case WM_READ7:
case WM_READ8: case WM_READ8:
case WM_READ9: case WM_READ9:
Read(message); Read(event->user.code);
ChangePhase(WM_PHASE_PLAY); // joue ChangePhase(WM_PHASE_PLAY); // joue
break; break;
case WM_WRITE0: case WM_WRITE0:
case WM_WRITE1: case WM_WRITE1:
case WM_WRITE2: case WM_WRITE2:
case WM_WRITE3: case WM_WRITE3:
case WM_WRITE4: case WM_WRITE4:
case WM_WRITE5: case WM_WRITE5:
case WM_WRITE6: case WM_WRITE6:
case WM_WRITE7: case WM_WRITE7:
case WM_WRITE8: case WM_WRITE8:
case WM_WRITE9: case WM_WRITE9:
Write(message); Write(event->user.code);
if ( m_phase == WM_PHASE_WRITEp ) if ( m_phase == WM_PHASE_WRITEp )
{ {
ChangePhase(WM_PHASE_PLAY); // joue ChangePhase(WM_PHASE_PLAY); // joue
@ -5255,11 +5278,12 @@ bool CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_MOVIE: case WM_MOVIE:
StartMovie("movie\\essai.avi"); StartMovie("movie\\essai.avi");
ChangePhase(WM_PHASE_INIT); ChangePhase(WM_PHASE_INIT);
break; break;
} }
}
return false; return false;
} }
@ -5319,3 +5343,16 @@ void CEvent::IntroStep()
} }
} }
void CEvent::PushUserEvent (int code)
{
SDL_Event event;
event.type = SDL_USEREVENT;
event.user.code = code;
event.user.data1 = nullptr;
event.user.data2 = nullptr;
SDL_PushEvent (&event);
}

35
event.h
View File

@ -2,6 +2,11 @@
#pragma once #pragma once
#include "jauge.h"
#include "menu.h"
class CMovie;
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
typedef struct typedef struct
@ -77,13 +82,13 @@ public:
void SetMenu(int button, int menu); void SetMenu(int button, int menu);
bool DrawButtons(); bool DrawButtons();
int MousePosToSprite(POINT pos); MouseSprites MousePosToSprite(POINT pos);
void MouseSprite(POINT pos); void MouseSprite(POINT pos);
void WaitMouse(bool bWait); void WaitMouse(bool bWait);
void HideMouse(bool bHide); void HideMouse(bool bHide);
POINT GetLastMousePos(); POINT GetLastMousePos();
bool TreatEvent(UINT message, WPARAM wParam, LPARAM lParam); bool TreatEvent(const SDL_Event *event);
bool TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam); bool TreatEventBase(const SDL_Event *event);
void DecorAutoShift(POINT pos); void DecorAutoShift(POINT pos);
@ -91,8 +96,6 @@ public:
void StopMovie(); void StopMovie();
bool IsMovie(); bool IsMovie();
bool FlipObject();
void Read(int message); void Read(int message);
void Write(int message); void Write(int message);
@ -106,24 +109,27 @@ public:
void IntroStep(); void IntroStep();
public:
static void PushUserEvent (int code);
protected: protected:
void DrawTextCenter(int res, int x, int y, int font=0); void DrawTextCenter(int res, int x, int y, int font=0);
bool CreateButtons(); bool CreateButtons();
bool EventButtons(UINT message, WPARAM wParam, LPARAM lParam); bool EventButtons(const SDL_Event &event, POINT pos);
bool MouseOnButton(POINT pos); bool MouseOnButton(POINT pos);
int SearchPhase(UINT phase); int SearchPhase(UINT phase);
void DecorShift(int dx, int dy); void DecorShift(int dx, int dy);
bool PlayDown(POINT pos, int fwKeys); bool PlayDown(POINT pos, const SDL_Event &event);
bool PlayMove(POINT pos, int fwKeys); bool PlayMove(POINT pos, Uint16 mod);
bool PlayUp(POINT pos, int fwKeys); bool PlayUp(POINT pos, Uint16 mod);
void ChangeButtons(int message); void ChangeButtons(int message);
void BuildFloor(POINT cel, int insIcon); void BuildFloor(POINT cel, int insIcon);
void BuildWater(POINT cel, int insIcon); void BuildWater(POINT cel, int insIcon);
bool BuildDown(POINT pos, int fwKeys, bool bMix=true); bool BuildDown(POINT pos, Uint16 mod, bool bMix=true);
bool BuildMove(POINT pos, int fwKeys); bool BuildMove(POINT pos, Uint16 mod, const SDL_Event &event);
bool BuildUp(POINT pos, int fwKeys); bool BuildUp(POINT pos);
void PrivateLibelle(); void PrivateLibelle();
bool ReadLibelle(int world, bool bSchool, bool bHelp); bool ReadLibelle(int world, bool bSchool, bool bHelp);
@ -172,14 +178,13 @@ protected:
int m_menuPerso; int m_menuPerso;
POINT m_menuCel; POINT m_menuCel;
POINT m_oldMousePos; POINT m_oldMousePos;
bool m_bMousePress;
bool m_bMouseDown; bool m_bMouseDown;
bool m_bHili; bool m_bHili;
int m_fileWorld[10]; int m_fileWorld[10];
int m_fileTime[10]; int m_fileTime[10];
POINT m_posToolTips; POINT m_posToolTips;
char m_textToolTips[50]; char m_textToolTips[50];
int m_mouseSprite; MouseSprites m_mouseSprite;
bool m_bFillMouse; bool m_bFillMouse;
bool m_bWaitMouse; bool m_bWaitMouse;
bool m_bHideMouse; bool m_bHideMouse;
@ -211,7 +216,7 @@ protected:
size_t m_demoIndex; size_t m_demoIndex;
size_t m_demoEnd; size_t m_demoEnd;
int m_demoNumber; int m_demoNumber;
bool m_bCtrlDown; Uint16 m_keymod;
POINT m_debugPos; POINT m_debugPos;
int m_introTime; int m_introTime;
}; };

View File

@ -13,6 +13,7 @@
#include "menu.h" #include "menu.h"
#include "text.h" #include "text.h"
#include "misc.h" #include "misc.h"
#include "event.h"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -346,27 +347,39 @@ bool CMenu::IsExist()
// Traitement d'un événement. // Traitement d'un événement.
bool CMenu::TreatEvent(UINT message, WPARAM wParam, LPARAM lParam) bool CMenu::TreatEvent(const SDL_Event &event)
{ {
POINT pos; POINT pos;
if ( m_nbButtons == 0 ) return false; if ( m_nbButtons == 0 ) return false;
pos = ConvLongToPos(lParam); //pos = ConvLongToPos(lParam);
switch( message ) switch (event.type)
{ {
case WM_LBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case WM_RBUTTONDOWN: if ( event.button.button != SDL_BUTTON_LEFT
&& event.button.button != SDL_BUTTON_RIGHT)
break;
pos.x = event.button.x;
pos.y = event.button.y;
if ( MouseDown(pos) ) return true; if ( MouseDown(pos) ) return true;
break; break;
case WM_MOUSEMOVE: case SDL_MOUSEMOTION:
pos.x = event.motion.x;
pos.y = event.motion.y;
if ( MouseMove(pos) ) return true; if ( MouseMove(pos) ) return true;
break; break;
case WM_LBUTTONUP: case SDL_MOUSEBUTTONUP:
case WM_RBUTTONUP: if ( event.button.button != SDL_BUTTON_LEFT
&& event.button.button != SDL_BUTTON_RIGHT)
break;
pos.x = event.button.x;
pos.y = event.button.y;
if ( MouseUp(pos) ) return true; if ( MouseUp(pos) ) return true;
break; break;
} }
@ -431,7 +444,7 @@ void CMenu::Message()
{ {
if ( m_selRank != -1 ) if ( m_selRank != -1 )
{ {
PostMessage(m_hWnd, WM_BUTTON0+m_selRank, 0, 0); CEvent::PushUserEvent (WM_BUTTON0 + m_selRank);
} }
} }

2
menu.h
View File

@ -22,7 +22,7 @@ public:
bool IsExist(); bool IsExist();
void Message(); void Message();
bool TreatEvent(UINT message, WPARAM wParam, LPARAM lParam); bool TreatEvent(const SDL_Event &event);
protected: protected:
int Detect(POINT pos); int Detect(POINT pos);

View File

@ -12,7 +12,6 @@
// Variables globales // Variables globales
HINSTANCE g_hInstance; HINSTANCE g_hInstance;
int g_lastSprite = 0;
extern bool g_bFullScreen; // false si mode de test extern bool g_bFullScreen; // false si mode de test
extern int g_mouseType; extern int g_mouseType;
extern char g_CDPath[MAX_PATH]; extern char g_CDPath[MAX_PATH];
@ -44,34 +43,6 @@ void LoadString(UINT nID, char *pBuffer, int lgBuffer)
LoadString(g_hInstance, nID, pBuffer, lgBuffer); LoadString(g_hInstance, nID, pBuffer, lgBuffer);
} }
// Change le lutin de la souris.
void ChangeSprite(int sprite)
{
HCURSOR hCursor = nullptr;
if ( g_mouseType == MOUSETYPEGRA ) return;
if ( g_lastSprite == sprite ) return;
if ( sprite == SPRITE_ARROW ) hCursor = LoadCursor(g_hInstance, "IDC_ARROW");
if ( sprite == SPRITE_POINTER ) hCursor = LoadCursor(g_hInstance, "IDC_POINTER");
if ( sprite == SPRITE_MAP ) hCursor = LoadCursor(g_hInstance, "IDC_MAP");
if ( sprite == SPRITE_ARROWU ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWU");
if ( sprite == SPRITE_ARROWD ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWD");
if ( sprite == SPRITE_ARROWL ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWL");
if ( sprite == SPRITE_ARROWR ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWR");
if ( sprite == SPRITE_ARROWUL ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWUL");
if ( sprite == SPRITE_ARROWUR ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWUR");
if ( sprite == SPRITE_ARROWDL ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWDL");
if ( sprite == SPRITE_ARROWDR ) hCursor = LoadCursor(g_hInstance, "IDC_ARROWDR");
if ( sprite == SPRITE_WAIT ) hCursor = LoadCursor(g_hInstance, "IDC_WAIT");
if ( sprite == SPRITE_EMPTY ) hCursor = LoadCursor(g_hInstance, "IDC_EMPTY");
if ( sprite == SPRITE_FILL ) hCursor = LoadCursor(g_hInstance, "IDC_FILL");
g_lastSprite = sprite;
}
// Conversion de la position de la souris. // Conversion de la position de la souris.
POINT ConvLongToPos(LPARAM lParam) POINT ConvLongToPos(LPARAM lParam)

1
misc.h
View File

@ -6,7 +6,6 @@
extern void InitHInstance(HINSTANCE hInstance); extern void InitHInstance(HINSTANCE hInstance);
extern void OutputDebug(char *pMessage); extern void OutputDebug(char *pMessage);
extern void LoadString(UINT nID, char *pBuffer, int lgBuffer); extern void LoadString(UINT nID, char *pBuffer, int lgBuffer);
extern void ChangeSprite(int sprite);
extern POINT ConvLongToPos(LPARAM lParam); extern POINT ConvLongToPos(LPARAM lParam);

View File

@ -32,7 +32,6 @@ CPixmap::CPixmap()
m_bPalette = true; m_bPalette = true;
m_mouseSprite = SPRITE_WAIT; m_mouseSprite = SPRITE_WAIT;
MouseHotSpot();
m_mousePos.x = LXIMAGE/2; m_mousePos.x = LXIMAGE/2;
m_mousePos.y = LYIMAGE/2; m_mousePos.y = LYIMAGE/2;
m_mouseBackPos = m_mousePos; m_mouseBackPos = m_mousePos;
@ -53,7 +52,9 @@ CPixmap::CPixmap()
// initialize special effects structure // initialize special effects structure
ZeroMemory(&m_DDbltfx, sizeof(m_DDbltfx)); ZeroMemory(&m_DDbltfx, sizeof(m_DDbltfx));
m_DDbltfx.dwSize = sizeof(m_DDbltfx); m_DDbltfx.dwSize = sizeof(m_DDbltfx);
m_lpCurrentCursor = nullptr;
} }
// Destructeur. // Destructeur.
@ -966,7 +967,6 @@ bool CPixmap::DrawImage(int chDst, int channel, RECT rect, int mode)
if ( channel == CHBACK ) if ( channel == CHBACK )
{ {
MouseBackSave(); // sauve ce qui sera sous la souris
m_bBackDisplayed = false; m_bBackDisplayed = false;
} }
@ -1098,12 +1098,6 @@ void CPixmap::SetMousePosSprite(POINT pos, int sprite, bool bDemoPlay)
m_mousePos = pos; m_mousePos = pos;
m_mouseSprite = sprite; m_mouseSprite = sprite;
MouseHotSpot();
if ( !bDemoPlay )
{
MouseUpdate();
}
} }
// Positionne la souris. // Positionne la souris.
@ -1114,11 +1108,6 @@ void CPixmap::SetMousePos(POINT pos, bool bDemoPlay)
m_mousePos.y == pos.y ) return; m_mousePos.y == pos.y ) return;
m_mousePos = pos; m_mousePos = pos;
if ( !bDemoPlay )
{
MouseUpdate();
}
} }
// Change le lutin de la souris. // Change le lutin de la souris.
@ -1128,12 +1117,6 @@ void CPixmap::SetMouseSprite(int sprite, bool bDemoPlay)
if ( m_mouseSprite == sprite ) return; if ( m_mouseSprite == sprite ) return;
m_mouseSprite = sprite; m_mouseSprite = sprite;
MouseHotSpot();
if ( !bDemoPlay )
{
MouseUpdate();
}
SDL_SetCursor (m_lpSDLCursors[sprite - 1]); SDL_SetCursor (m_lpSDLCursors[sprite - 1]);
} }
@ -1145,90 +1128,6 @@ void CPixmap::MouseShow(bool bShow)
SDL_ShowCursor (bShow); SDL_ShowCursor (bShow);
} }
// Met à jour le dessin de la souris.
void CPixmap::MouseUpdate()
{
RECT oldRect, newRect, rcRect;
if ( m_lpDDSurface[CHBLUPI] == NULL ) return;
if ( m_mouseType != MOUSETYPEGRA ) return;
if ( m_mouseSprite == SPRITE_EMPTY ) return;
oldRect.left = m_mouseBackPos.x;
oldRect.top = m_mouseBackPos.y;
oldRect.right = m_mouseBackPos.x + DIMBLUPIX;
oldRect.bottom = m_mouseBackPos.y + DIMBLUPIY;
newRect.left = m_mousePos.x - m_mouseHotSpot.x;
newRect.top = m_mousePos.y - m_mouseHotSpot.y;
newRect.right = newRect.left + DIMBLUPIX;
newRect.bottom = newRect.top + DIMBLUPIY;
MouseBackRestore(); // enlève la souris dans m_lpDDSBack
MouseBackDraw(); // dessine la souris dans m_lpDDSBack
if ( m_bBackDisplayed )
{
if ( IntersectRect(&rcRect, &oldRect, &newRect) )
{
UnionRect(&rcRect, &oldRect, &newRect);
MouseQuickDraw(rcRect);
}
else
{
MouseQuickDraw(oldRect);
MouseQuickDraw(newRect);
}
}
}
// Dessine rapidement la souris dans l'écran.
// Il s'agit en fait de dessiner un petit morceau rectangulaire
// de m_lpDDSBack dans l'écran.
bool CPixmap::MouseQuickDraw(RECT rect)
{
HRESULT ddrval;
RECT DestRect;
if ( rect.left < 0 ) rect.left = 0;
if ( rect.right > LXIMAGE ) rect.right = LXIMAGE;
if ( rect.top < 0 ) rect.top = 0;
if ( rect.bottom > LYIMAGE ) rect.bottom = LYIMAGE;
// Get screen coordinates of client window for blit
DestRect = rect;
ClientToScreen(m_hWnd, (LPPOINT)&DestRect);
ClientToScreen(m_hWnd, (LPPOINT)&DestRect+1);
// do the blit from back surface
ddrval = m_lpDDSPrimary->Blt
(
&DestRect, // destination rect
m_lpDDSBack,
&rect, // source rect
DDBLT_WAIT,
&m_DDbltfx
);
SDL_Rect srcRect, dstRect;
srcRect.x =rect.left;
srcRect.y =rect.top;
srcRect.w =rect.right - rect.left;
srcRect.h =rect.bottom - rect.top;
dstRect.x = DestRect.left;
dstRect.y = DestRect.top;
dstRect.w = DestRect.right - DestRect.left;
dstRect.h = DestRect.bottom - DestRect.top;
//SDL_BlitSurface (m_lpSDLPrimary, &srcRect, m_lpSDLBack, &dstRect);
if ( ddrval == DDERR_SURFACELOST )
{
ddrval = RestoreAll();
}
if ( ddrval != DD_OK ) return false;
return true;
}
// Invalide la copie sous la souris. // Invalide la copie sous la souris.
void CPixmap::MouseInvalidate() void CPixmap::MouseInvalidate()
@ -1236,223 +1135,6 @@ void CPixmap::MouseInvalidate()
m_bMouseBack = false; m_bMouseBack = false;
} }
// Enlève la souris dans m_lpDDSBack.
void CPixmap::MouseBackClear()
{
if ( m_mouseType != MOUSETYPEGRA ) return;
MouseBackRestore(); // enlève la souris dans m_lpDDSBack
}
// Dessine la souris dans m_lpDDSBack.
void CPixmap::MouseBackDraw()
{
POINT dst;
RECT rcRect;
if ( m_lpDDSurface[CHBLUPI] == NULL ) return;
if ( m_mouseType != MOUSETYPEGRA ) return;
if ( m_mouseSprite == SPRITE_EMPTY ) return;
MouseBackSave(); // sauve ce qui sera sous la souris
dst.x = m_mousePos.x - m_mouseHotSpot.x;
dst.y = m_mousePos.y - m_mouseHotSpot.y;
rcRect = MouseRectSprite();
if ( dst.x < 0 )
{
rcRect.left -= dst.x;
dst.x = 0;
}
if ( dst.x+DIMBLUPIX > LXIMAGE )
{
rcRect.right -= (dst.x+DIMBLUPIX)-LXIMAGE;
}
if ( dst.y < 0 )
{
rcRect.top -= dst.y;
dst.y = 0;
}
if ( dst.y+DIMBLUPIY > LYIMAGE )
{
rcRect.bottom -= (dst.y+DIMBLUPIY)-LYIMAGE;
}
// Dessine le lutin dans m_lpDDSBack.
BltFast(m_lpDDSBack, nullptr, CHBLUPI, dst, rcRect, 0);
}
// Sauve le fond sous la souris.
// m_lpDDSMouse <- m_lpDDSBack
void CPixmap::MouseBackSave()
{
HRESULT ddrval;
POINT dst;
RECT rcRect;
if ( m_lpDDSurface[CHBLUPI] == NULL ) return;
if ( m_mouseType != MOUSETYPEGRA ) return;
if ( m_mouseSprite == SPRITE_EMPTY ) return;
m_mouseBackPos.x = m_mousePos.x - m_mouseHotSpot.x;
m_mouseBackPos.y = m_mousePos.y - m_mouseHotSpot.y;
m_bMouseBack = true;
dst.x = 0;
dst.y = 0;
rcRect.left = m_mouseBackPos.x;
rcRect.top = m_mouseBackPos.y;
rcRect.right = m_mouseBackPos.x + DIMBLUPIX;
rcRect.bottom = m_mouseBackPos.y + DIMBLUPIY;
if ( rcRect.left < 0 )
{
dst.x -= rcRect.left;
rcRect.left = 0;
}
if ( rcRect.right > LXIMAGE )
{
rcRect.right = LXIMAGE;
}
if ( rcRect.top < 0 )
{
dst.y -= rcRect.top;
rcRect.top = 0;
}
if ( rcRect.bottom > LYIMAGE )
{
rcRect.bottom = LYIMAGE;
}
while( true )
{
ddrval = m_lpDDSMouse->BltFast(dst.x, dst.y,
m_lpDDSBack,
&rcRect, DDBLTFAST_NOCOLORKEY);
SDL_Rect srcRect, dstRect;
srcRect.x = rcRect.left;
srcRect.y = rcRect.top;
srcRect.w = rcRect.right - rcRect.left;
srcRect.h = rcRect.bottom - rcRect.top;
dstRect = srcRect;
dstRect.x = dst.x;
dstRect.y = dst.y;
if ( ddrval == DD_OK ) break;
if ( ddrval == DDERR_SURFACELOST )
{
ddrval = RestoreAll();
if ( ddrval != DD_OK ) break;
}
if ( ddrval != DDERR_WASSTILLDRAWING ) break;
}
}
// Restitue le fond sous la souris.
// m_lpDDSBack <- m_lpDDSMouse
void CPixmap::MouseBackRestore()
{
HRESULT ddrval;
POINT dst;
RECT rcRect;
if ( m_lpDDSurface[CHBLUPI] == NULL ) return;
if ( !m_bMouseBack ) return;
dst.x = m_mouseBackPos.x;
dst.y = m_mouseBackPos.y;
rcRect.left = 0;
rcRect.top = 0;
rcRect.right = DIMBLUPIX;
rcRect.bottom = DIMBLUPIY;
if ( dst.x < 0 )
{
rcRect.left -= dst.x;
dst.x = 0;
}
if ( dst.x+DIMBLUPIX > LXIMAGE )
{
rcRect.right -= (dst.x+DIMBLUPIX)-LXIMAGE;
}
if ( dst.y < 0 )
{
rcRect.top -= dst.y;
dst.y = 0;
}
if ( dst.y+DIMBLUPIY > LYIMAGE )
{
rcRect.bottom -= (dst.y+DIMBLUPIY)-LYIMAGE;
}
while( true )
{
ddrval = m_lpDDSBack->BltFast(dst.x, dst.y,
m_lpDDSMouse,
&rcRect, DDBLTFAST_NOCOLORKEY);
SDL_Rect srcRect, dstRect;
srcRect.x = rcRect.left;
srcRect.y = rcRect.top;
srcRect.w = rcRect.right - rcRect.left;
srcRect.h = rcRect.bottom - rcRect.top;
dstRect = srcRect;
dstRect.x = dst.x;
dstRect.y = dst.y;
if ( ddrval == DD_OK ) break;
if ( ddrval == DDERR_SURFACELOST )
{
ddrval = RestoreAll();
if ( ddrval != DD_OK ) break;
}
if ( ddrval != DDERR_WASSTILLDRAWING ) break;
}
}
// Affiche le contenu de m_lpDDSMouse dans le
// coin sup/gauche.
void CPixmap::MouseBackDebug()
{
HRESULT ddrval;
RECT DestRect, MapRect;
// Get screen coordinates of client window for blit
GetClientRect(m_hWnd, &DestRect);
ClientToScreen(m_hWnd, (LPPOINT)&DestRect);
ClientToScreen(m_hWnd, (LPPOINT)&DestRect+1);
MapRect.left = 0;
MapRect.top = 0;
MapRect.right = DIMBLUPIX;
MapRect.bottom = DIMBLUPIY;
DestRect.right = DestRect.left + DIMBLUPIX;
DestRect.bottom = DestRect.top + DIMBLUPIY;
// do the blit from back surface
ddrval = m_lpDDSPrimary->Blt
(
&DestRect, // destination rect
m_lpDDSMouse,
&MapRect, // source rect
DDBLT_WAIT,
&m_DDbltfx
);
if ( ddrval == DDERR_SURFACELOST )
{
ddrval = RestoreAll();
}
}
// Retourne le rectangle correspondant au sprite // Retourne le rectangle correspondant au sprite
// de la souris dans CHBLUPI. // de la souris dans CHBLUPI.
@ -1486,45 +1168,6 @@ RECT CPixmap::MouseRectSprite()
return rcRect; return rcRect;
} }
// Initialise le hot spot selon le sprite en cours.
void CPixmap::MouseHotSpot()
{
int rank;
static int table_mouse_hotspot[MAXCURSORS * 2] =
{
30, 30, // SPRITE_ARROW
20, 15, // SPRITE_POINTER
31, 26, // SPRITE_MAP
25, 14, // SPRITE_ARROWU
24, 35, // SPRITE_ARROWD
15, 24, // SPRITE_ARROWL
35, 24, // SPRITE_ARROWR
18, 16, // SPRITE_ARROWUL
32, 18, // SPRITE_ARROWUR
17, 30, // SPRITE_ARROWDL
32, 32, // SPRITE_ARROWDR
30, 30, // SPRITE_WAIT
30, 30, // SPRITE_EMPTY
21, 51, // SPRITE_FILL
};
if ( m_mouseSprite >= SPRITE_ARROW &&
m_mouseSprite <= SPRITE_FILL )
{
rank = m_mouseSprite - SPRITE_ARROW; // rank <- 0..n
m_mouseHotSpot.x = table_mouse_hotspot[rank*2+0];
m_mouseHotSpot.y = table_mouse_hotspot[rank*2+1];
}
else
{
m_mouseHotSpot.x = 0;
m_mouseHotSpot.y = 0;
}
}
SDL_Point CPixmap::GetCursorHotSpot (int sprite) SDL_Point CPixmap::GetCursorHotSpot (int sprite)
{ {
static const int hotspots[MAXCURSORS * 2] = static const int hotspots[MAXCURSORS * 2] =
@ -1646,4 +1289,13 @@ void CPixmap::LoadCursors ()
// FIXME: change cursor first value to 0 // FIXME: change cursor first value to 0
m_lpSDLCursors[sprite - 1] = SDL_CreateColorCursor (surface, hotspot.x, hotspot.y); m_lpSDLCursors[sprite - 1] = SDL_CreateColorCursor (surface, hotspot.x, hotspot.y);
} }
}
void CPixmap::ChangeSprite (MouseSprites sprite)
{
if (m_lpCurrentCursor == m_lpSDLCursors[sprite - 1])
return;
SDL_SetCursor (m_lpSDLCursors[sprite - 1]);
m_lpCurrentCursor = m_lpSDLCursors[sprite - 1];
} }

View File

@ -55,9 +55,8 @@ public:
void SetMouseSprite(int sprite, bool bDemoPlay); void SetMouseSprite(int sprite, bool bDemoPlay);
void MouseShow(bool bShow); void MouseShow(bool bShow);
void MouseInvalidate(); void MouseInvalidate();
void MouseBackClear();
void MouseBackDraw();
void LoadCursors (); void LoadCursors ();
void ChangeSprite (MouseSprites sprite);
protected: protected:
HRESULT RestoreAll(); HRESULT RestoreAll();
@ -65,13 +64,7 @@ protected:
HRESULT BltFast(LPDIRECTDRAWSURFACE lpDD, SDL_Texture *lpSDL, HRESULT BltFast(LPDIRECTDRAWSURFACE lpDD, SDL_Texture *lpSDL,
int channel, POINT dst, RECT rcRect, int mode); int channel, POINT dst, RECT rcRect, int mode);
void MouseUpdate();
bool MouseQuickDraw(RECT rect);
void MouseBackSave();
void MouseBackRestore();
void MouseBackDebug();
RECT MouseRectSprite(); RECT MouseRectSprite();
void MouseHotSpot();
SDL_Point GetCursorHotSpot (int sprite); SDL_Point GetCursorHotSpot (int sprite);
SDL_Rect GetCursorRect (int sprite); SDL_Rect GetCursorRect (int sprite);
@ -86,7 +79,6 @@ protected:
POINT m_mousePos; POINT m_mousePos;
int m_mouseSprite; int m_mouseSprite;
POINT m_mouseHotSpot;
POINT m_mouseBackPos; POINT m_mouseBackPos;
bool m_bMouseBack; bool m_bMouseBack;
bool m_bBackDisplayed; bool m_bBackDisplayed;
@ -97,6 +89,7 @@ protected:
LPDIRECTDRAWSURFACE m_lpDDSBack; // DirectDraw back surface LPDIRECTDRAWSURFACE m_lpDDSBack; // DirectDraw back surface
SDL_Surface * m_lpSDLBack; SDL_Surface * m_lpSDLBack;
LPDIRECTDRAWSURFACE m_lpDDSMouse; // DirectDraw back surface LPDIRECTDRAWSURFACE m_lpDDSMouse; // DirectDraw back surface
SDL_Cursor * m_lpCurrentCursor;
SDL_Cursor * m_lpSDLCursors[MAXCURSORS]; SDL_Cursor * m_lpSDLCursors[MAXCURSORS];
SDL_Surface * m_lpSDLBlupi; SDL_Surface * m_lpSDLBlupi;
LPDIRECTDRAWPALETTE m_lpDDPal; // the primary surface palette LPDIRECTDRAWPALETTE m_lpDDPal; // the primary surface palette