Files
Hellfire/TRACK.CPP
T
Justin Marshall 101266ab72 Initial commit.
2026-04-27 10:35:40 -07:00

115 lines
3.3 KiB
C++

//******************************************************************
// track.cpp
//******************************************************************
#include "diablo.h"
#pragma hdrstop
#include "storm/h/storm.h"
#include "msg.h"
#include "items.h"
#include "gendung.h"
#include "player.h"
#include "cursor.h"
//******************************************************************
// compiler constants
//******************************************************************
#define STOP_ON_MOUSEUP 0 // 0 in final
#define TRACKING_CURSOR 0 // 1 in final
//******************************************************************
// private
//******************************************************************
// track state on/off
static BOOL sgbMouseDown;
static BYTE sgbTrackMode;
// time tracking last performed
#define TRACK_START_DELAY 250 // milliseconds
#define TRACK_LOOP_DELAY 300 // milliseconds
static long sglTrackTime;
//******************************************************************
//******************************************************************
void TrackMouse() {
// don't track if the mouse isn't down
if (! sgbMouseDown) return;
// don't track if the cursor is out of range
if (cursmx < 0) return;
if (cursmx >= DMAXX - 1) return;
if (cursmy < 0) return;
if (cursmy >= DMAXY - 1) return;
// don't track if the player isn't in a stand state or late walk
if (plr[myplr]._pVar8 <= 6 && plr[myplr]._pmode != PM_STAND) return;
// don't track if mouse still on same target
if (cursmx == plr[myplr]._ptargx && cursmy == plr[myplr]._ptargy) return;
// don't track if it hasn't been long enough since we last tracked
long lCurrTime = (long) GetTickCount();
long lDelta = lCurrTime - sglTrackTime;
if (lDelta < TRACK_LOOP_DELAY) return;
sglTrackTime = lCurrTime;
// track!
NetSendCmdLoc(TRUE,CMD_WALKXY,cursmx,cursmy);
if (! sgbTrackMode) {
sgbTrackMode = TRUE;
#if TRACKING_CURSOR
if (curs == GLOVE_CURS) SetCursor(TARGET_CURS);
#endif
}
}
//******************************************************************
//******************************************************************
void TrackInit(BOOL bMouseDown) {
// are we already in desired state?
if (sgbMouseDown == bMouseDown) return;
sgbMouseDown = bMouseDown;
if (sgbMouseDown) {
// indicate we haven't moved from click mode to track mode yet
sgbTrackMode = FALSE;
// make next track time occur after TRACK_START_DELAY
// instead of TRACK_LOOP_DELAY
sglTrackTime = (long) GetTickCount();
sglTrackTime += TRACK_START_DELAY;
sglTrackTime -= TRACK_LOOP_DELAY;
// start tracking immediately by pumping a command into queue
NetSendCmdLoc(TRUE,CMD_WALKXY,cursmx,cursmy);
}
else if (sgbTrackMode) {
// turn off track mode
sgbTrackMode = FALSE;
#if STOP_ON_MOUSEUP
// the user clicked on a map coordinate and held the mouse down
// long enough to indicate tracking rather than clicking, so
// since the mouse is up, stop the player at current coordinate
NetSendCmdLoc(TRUE,CMD_WALKXY,plr[myplr]._pfutx,plr[myplr]._pfuty);
#endif
// restore cursor
#if TRACKING_CURSOR
if (curs == TARGET_CURS) SetCursor(GLOVE_CURS);
#endif
}
}
//******************************************************************
//******************************************************************
BOOL IsTracking() {
return sgbTrackMode;
}