mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-12 07:50:53 +02:00
Initial commit.
This commit is contained in:
+746
@@ -0,0 +1,746 @@
|
||||
/*-----------------------------------------------------------------------**
|
||||
** Diablo
|
||||
**
|
||||
** Cursor file
|
||||
**
|
||||
** (C)1995 Condor, Inc. All rights reserved.
|
||||
**
|
||||
**-----------------------------------------------------------------------**
|
||||
** $Header: /Diablo/CURSOR.CPP 4 2/12/97 10:48a Dbrevik2 $
|
||||
**-----------------------------------------------------------------------**
|
||||
**
|
||||
** File Routines
|
||||
**-----------------------------------------------------------------------*/
|
||||
|
||||
#include "diablo.h"
|
||||
#pragma hdrstop
|
||||
#include "sound.h"
|
||||
#include "engine.h"
|
||||
#include "gendung.h"
|
||||
#include "control.h"
|
||||
#include "items.h"
|
||||
#include "player.h"
|
||||
#include "monster.h"
|
||||
#include "objects.h"
|
||||
#include "cursor.h"
|
||||
#include "debug.h"
|
||||
#include "scrollrt.h"
|
||||
#include "inv.h"
|
||||
#include "trigs.h"
|
||||
#include "lighting.h"
|
||||
#include "missiles.h"
|
||||
#include "town.h"
|
||||
#include "towners.h"
|
||||
#include "quests.h"
|
||||
#include "doom.h"
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
** externs
|
||||
**-----------------------------------------------------------------------*/
|
||||
BOOL IsTracking();
|
||||
void savecrsr_reset();
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
** Global variables
|
||||
**-----------------------------------------------------------------------*/
|
||||
int curs;
|
||||
int cursW, cursH;
|
||||
int icursW, icursH;
|
||||
int icursW28, icursH28;
|
||||
int cursmx, cursmy;
|
||||
int cursmonst;
|
||||
char cursobj;
|
||||
char cursitem;
|
||||
char cursinvitem;
|
||||
char cursplr;
|
||||
BYTE *pCursCels;
|
||||
BYTE *pCursCels2;
|
||||
static int oldcursmonst;
|
||||
|
||||
|
||||
const int CursorWidth [ITEM_LAST_ID+12] = {
|
||||
// Null, Glove Pointer, Identify, Repair, Recharge, Disarm, Oil, Telekenesis, Resurrect, Target, Heal Other, Watch
|
||||
0, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 23,
|
||||
// Inv 1x1
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
// Inv 1x2
|
||||
28, 28, 28, 28, 28, 28,
|
||||
// Inv 1x3
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
// Inv 2x2
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56,
|
||||
// Inv 2x3
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56,
|
||||
|
||||
// New 1x1
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
|
||||
// New 2x2
|
||||
56, 56,
|
||||
|
||||
// New 1x3
|
||||
28, 28, 28,
|
||||
|
||||
// New 2x3
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56,
|
||||
|
||||
};
|
||||
|
||||
const int CursorHeight[ITEM_LAST_ID+12] = {
|
||||
// Null, Glove Pointer, Identify, Repair, Recharge, Disarm, Oil, Telekenesis, Resurrect, Target, Heal Other, Watch
|
||||
0, 29, 32, 32, 32, 32, 32, 32, 32, 32, 32, 35,
|
||||
// Inv 1x1
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
// Inv 1x2
|
||||
56, 56, 56, 56, 56, 56,
|
||||
// Inv 1x3
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
// Inv 2x2
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
||||
56, 56, 56, 56, 56,
|
||||
// Inv 2x3
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84,
|
||||
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||
|
||||
56, 56,
|
||||
|
||||
84, 84, 84,
|
||||
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
|
||||
84, 84, 84, 84,
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void InitCursor() {
|
||||
app_assert(! pCursCels);
|
||||
pCursCels = LoadFileInMemSig("Data\\Inv\\Objcurs.CEL",NULL,'CRSR');
|
||||
pCursCels2 = LoadFileInMemSig("Data\\Inv\\Objcurs2.CEL",NULL,'CRSR');
|
||||
savecrsr_reset();
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void FreeCursor() {
|
||||
DiabloFreePtr(pCursCels);
|
||||
DiabloFreePtr(pCursCels2);
|
||||
savecrsr_reset();
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void SetICursor(int i) {
|
||||
icursW = CursorWidth[i];
|
||||
icursH = CursorHeight[i];
|
||||
icursW28 = icursW / 28;
|
||||
icursH28 = icursH / 28;
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void SetCursor(int i) {
|
||||
curs = i;
|
||||
cursW = CursorWidth[curs];
|
||||
cursH = CursorHeight[curs];
|
||||
SetICursor(i);
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void NewCursor(int i) {
|
||||
SetCursor(i);
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void InitLevelCursor() {
|
||||
SetCursor(GLOVE_CURS);
|
||||
cursmx = ViewX;
|
||||
cursmy = ViewY;
|
||||
oldcursmonst = -1;
|
||||
cursmonst = -1;
|
||||
cursobj = -1;
|
||||
cursitem = -1;
|
||||
cursplr = -1;
|
||||
savecrsr_reset();
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
|
||||
void CheckTown() {
|
||||
for (int i = 0; i < nummissiles; i++) {
|
||||
int mx = missileactive[i];
|
||||
if (missile[mx]._mitype == MIT_TOWN) {
|
||||
if (((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy)) ||
|
||||
((cursmx == missile[mx]._mix) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 2) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 2) && (cursmy == missile[mx]._miy - 2)) ||
|
||||
((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy - 2)) ||
|
||||
((cursmx == missile[mx]._mix) && (cursmy == missile[mx]._miy))) {
|
||||
trigflag = TRUE;
|
||||
ClearPanel();
|
||||
strcpy(infostr, "Town Portal");
|
||||
sprintf(tempstr, "from %s", plr[missile[mx]._misource]._pName);
|
||||
AddPanelString(tempstr, TEXT_CENTER);
|
||||
cursmx = missile[mx]._mix;
|
||||
cursmy = missile[mx]._miy;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void CheckRportal() {
|
||||
for (int i = 0; i < nummissiles; i++) {
|
||||
int mx = missileactive[i];
|
||||
if (missile[mx]._mitype == MIT_RPORTAL) {
|
||||
if (((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy)) ||
|
||||
((cursmx == missile[mx]._mix) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 2) && (cursmy == missile[mx]._miy - 1)) ||
|
||||
((cursmx == missile[mx]._mix - 2) && (cursmy == missile[mx]._miy - 2)) ||
|
||||
((cursmx == missile[mx]._mix - 1) && (cursmy == missile[mx]._miy - 2)) ||
|
||||
((cursmx == missile[mx]._mix) && (cursmy == missile[mx]._miy))) {
|
||||
trigflag = TRUE;
|
||||
ClearPanel();
|
||||
strcpy(infostr, "Portal to");
|
||||
if (!(setlevel)) strcpy(tempstr, "The Unholy Altar");
|
||||
else strcpy(tempstr, "level 15");
|
||||
AddPanelString(tempstr, TEXT_CENTER);
|
||||
cursmx = missile[mx]._mix;
|
||||
cursmy = missile[mx]._miy;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*
|
||||
**-----------------------------------------------------------------------*/
|
||||
void CheckCursMove() {
|
||||
int mx,my;
|
||||
int offsetx,offsety,gridx,gridy;
|
||||
char co,ci,cp;
|
||||
int cm;
|
||||
BOOL minusy, plusx;
|
||||
BOOL lefthalf;
|
||||
int newMouseX;
|
||||
int newMouseY;
|
||||
|
||||
int pvar6tmp, pvar7tmp;
|
||||
long xo, yo;
|
||||
|
||||
newMouseX = MouseX;
|
||||
newMouseY = MouseY;
|
||||
|
||||
// Convert screen point to map position
|
||||
if (chrflag || questlog) {
|
||||
if (newMouseX >= TOTALX/4) newMouseX -= TOTALX/4;
|
||||
else newMouseX = 0;
|
||||
}
|
||||
else if (invflag || sbookflag) {
|
||||
if (newMouseX <= TOTALX/2) newMouseX += TOTALX/4;
|
||||
else newMouseX = 0;
|
||||
}
|
||||
|
||||
// if the mouse outside the gamemap area, but
|
||||
// the mouse is in tracking mode, then pretend
|
||||
// that the mouse is actually in the gamemap
|
||||
if (newMouseY > 351 && IsTracking())
|
||||
newMouseY = 351;
|
||||
|
||||
if (!svgamode)
|
||||
{
|
||||
newMouseX >>= 1;
|
||||
newMouseY >>= 1;
|
||||
}
|
||||
|
||||
// Offset mouse position by the scroll offset, to align it with tile grid
|
||||
newMouseX -= ScrollInfo._sxoff;
|
||||
newMouseY -= ScrollInfo._syoff;
|
||||
|
||||
// THIS IS A HACK
|
||||
// Here, we predict the next scroll increment, so the mouse position is
|
||||
// where it would be during the next frame.
|
||||
// This is a fix -- without this, the following sometimes happens:
|
||||
// The user holds down the mouse button, and the walk path alternates
|
||||
// between two different directions, because the cursor is sampled just before
|
||||
// player reaches his next square.
|
||||
xo = plr[myplr]._pVar6 >> 8;
|
||||
yo = plr[myplr]._pVar7 >> 8;
|
||||
pvar6tmp = plr[myplr]._pVar6 + plr[myplr]._pxvel;
|
||||
pvar7tmp = plr[myplr]._pVar7 + plr[myplr]._pyvel;
|
||||
xo -= (pvar6tmp >> 8);
|
||||
yo -= (pvar7tmp >> 8);
|
||||
if ((myplr == myplr) && (ScrollInfo._sdir != SCRL_NONE)) {
|
||||
newMouseX -= xo;
|
||||
newMouseY -= yo;
|
||||
}
|
||||
|
||||
if (newMouseX < 0)
|
||||
newMouseX = 0;
|
||||
if (newMouseX >= TOTALX)
|
||||
newMouseX = TOTALX;
|
||||
if (newMouseY < 0)
|
||||
newMouseY = 0;
|
||||
if (newMouseY >= TOTALY)
|
||||
newMouseY = TOTALY;
|
||||
|
||||
// Calculate position in square grid
|
||||
gridx = newMouseX >> 6;
|
||||
gridy = newMouseY >> 5;
|
||||
|
||||
// Calculate offset in that square
|
||||
offsetx = newMouseX & 63;
|
||||
offsety = newMouseY & 31;
|
||||
|
||||
// Convert from square grid to diamond grid
|
||||
mx = gridx + gridy + ViewX - (svgamode ? 10:5);
|
||||
my = gridy - gridx + ViewY;
|
||||
|
||||
if (minusy = (offsety < (offsetx >> 1))) {
|
||||
my--;
|
||||
}
|
||||
if (plusx = (offsety >= (32 - (offsetx >> 1)))) {
|
||||
mx++;
|
||||
}
|
||||
|
||||
if (mx < 0) mx = 0;
|
||||
if (mx >= DMAXX) mx = DMAXX - 1;
|
||||
if (my < 0) my = 0;
|
||||
if (my >= DMAXY) my = DMAXY - 1;
|
||||
|
||||
lefthalf = (minusy && plusx) || ((minusy || plusx) && offsetx < 32);
|
||||
|
||||
oldcursmonst = cursmonst;
|
||||
cursmonst = -1;
|
||||
cursobj = -1;
|
||||
cursitem = -1;
|
||||
if (cursinvitem != -1)
|
||||
drawsbarflag = TRUE;
|
||||
cursinvitem = -1;
|
||||
cursplr = -1;
|
||||
uitemflag = FALSE;
|
||||
panelflag = FALSE;
|
||||
trigflag = FALSE;
|
||||
|
||||
if (plr[myplr]._pInvincible) return; // Dead?
|
||||
|
||||
// Skip if I have an item
|
||||
if ((curs >= ICSTART) || (spselflag)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
return;
|
||||
}
|
||||
|
||||
if (MouseY > 352) {
|
||||
CheckPanelInfo();
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawmapofdoom) return;
|
||||
|
||||
if ((invflag) && (MouseX > 320)) {
|
||||
cursinvitem = CheckInvHLight();
|
||||
return;
|
||||
}
|
||||
if (sbookflag && (MouseX > 320))
|
||||
return;
|
||||
|
||||
if ((chrflag || questlog) && (MouseX < 320)) return;
|
||||
|
||||
if (leveltype != 0) {
|
||||
if (oldcursmonst != -1) {
|
||||
if (!lefthalf && (dMonster[mx+2][my+1] != 0) && (dFlags[mx+2][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+2][my+1] > 0) cm = dMonster[mx+2][my+1] - 1;
|
||||
else cm = -(dMonster[mx+2][my+1] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 2;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dMonster[mx+1][my+2] != 0) && (dFlags[mx+1][my+2] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my+2] > 0) cm = dMonster[mx+1][my+2] - 1;
|
||||
else cm = -(dMonster[mx+1][my+2] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 2;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx+2][my+2] != 0) && (dFlags[mx+2][my+2] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+2][my+2] > 0) cm = dMonster[mx+2][my+2] - 1;
|
||||
else cm = -(dMonster[mx+2][my+2] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 2;
|
||||
cursmy = my + 2;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!lefthalf && (dMonster[mx+1][my] != 0) && (dFlags[mx+1][my] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my] > 0) cm = dMonster[mx+1][my] - 1;
|
||||
else cm = -(dMonster[mx+1][my] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dMonster[mx][my+1] != 0) && (dFlags[mx][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx][my+1] > 0) cm = dMonster[mx][my+1] - 1;
|
||||
else cm = -(dMonster[mx][my+1] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx][my] != 0) && (dFlags[mx][my] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx][my] > 0) cm = dMonster[mx][my] - 1;
|
||||
else cm = -(dMonster[mx][my] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_FLR)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx+1][my+1] != 0) && (dFlags[mx+1][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my+1] > 0) cm = dMonster[mx+1][my+1] - 1;
|
||||
else cm = -(dMonster[mx+1][my+1] + 1);
|
||||
if (cm == oldcursmonst) {
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cursmonst != -1) {
|
||||
if (monster[cursmonst]._mFlags & MFLAG_INVISIBLE) {
|
||||
cursmonst = -1;
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
}
|
||||
}
|
||||
if ((cursmonst != -1)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_MKILLER) != 0)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_BERSERK) == 0)
|
||||
) cursmonst = -1;
|
||||
|
||||
if (cursmonst != -1) return;
|
||||
}
|
||||
if (!lefthalf && (dMonster[mx+2][my+1] != 0) && (dFlags[mx+2][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+2][my+1] > 0) cm = dMonster[mx+2][my+1] - 1;
|
||||
else cm = -(dMonster[mx+2][my+1] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 2;
|
||||
cursmy = my + 1;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dMonster[mx+1][my+2] != 0) && (dFlags[mx+1][my+2] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my+2] > 0) cm = dMonster[mx+1][my+2] - 1;
|
||||
else cm = -(dMonster[mx+1][my+2] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 2;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx+2][my+2] != 0) && (dFlags[mx+2][my+2] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+2][my+2] > 0) cm = dMonster[mx+2][my+2] - 1;
|
||||
else cm = -(dMonster[mx+2][my+2] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_TOP)) {
|
||||
cursmx = mx + 2;
|
||||
cursmy = my + 2;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if (!lefthalf && (dMonster[mx+1][my] != 0) && (dFlags[mx+1][my] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my] > 0) cm = dMonster[mx+1][my] - 1;
|
||||
else cm = -(dMonster[mx+1][my] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dMonster[mx][my+1] != 0) && (dFlags[mx][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx][my+1] > 0) cm = dMonster[mx][my+1] - 1;
|
||||
else cm = -(dMonster[mx][my+1] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx][my] != 0) && (dFlags[mx][my] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx][my] > 0) cm = dMonster[mx][my] - 1;
|
||||
else cm = -(dMonster[mx][my] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_FLR)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if ((dMonster[mx+1][my+1] != 0) && (dFlags[mx+1][my+1] & BFLAG_VISIBLE)) {
|
||||
if (dMonster[mx+1][my+1] > 0) cm = dMonster[mx+1][my+1] - 1;
|
||||
else cm = -(dMonster[mx+1][my+1] + 1);
|
||||
if (((monster[cm]._mhitpoints >> HP_SHIFT) > 0) && (monster[cm].MData->mSelFlag & MSEL_MID)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
cursmonst = cm;
|
||||
}
|
||||
}
|
||||
if (cursmonst != -1) {
|
||||
if (monster[cursmonst]._mFlags & MFLAG_INVISIBLE) {
|
||||
cursmonst = -1;
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
}
|
||||
}
|
||||
if ((cursmonst != -1)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_MKILLER) != 0)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_BERSERK) == 0)
|
||||
) cursmonst = -1;
|
||||
} else {
|
||||
if (!lefthalf && (dMonster[mx+1][my] > 0)) {
|
||||
cursmonst = dMonster[mx+1][my] - 1;
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
}
|
||||
if (lefthalf && (dMonster[mx][my+1] > 0)) {
|
||||
cursmonst = dMonster[mx][my+1] - 1;
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
}
|
||||
if (dMonster[mx][my] > 0) {
|
||||
cursmonst = dMonster[mx][my] - 1;
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
}
|
||||
if (dMonster[mx+1][my+1] > 0) {
|
||||
cursmonst = dMonster[mx+1][my+1] - 1;
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
}
|
||||
if (!towner[cursmonst]._tSelFlag) cursmonst = -1;
|
||||
}
|
||||
|
||||
if (cursmonst == -1) {
|
||||
if (!lefthalf && (dPlayer[mx+1][my] != 0)) {
|
||||
if (dPlayer[mx+1][my] > 0) cp = dPlayer[mx+1][my] - 1;
|
||||
else cp = -(dPlayer[mx+1][my] + 1);
|
||||
if ((cp != myplr) && (plr[cp]._pHitPoints != 0)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
cursplr = cp;
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dPlayer[mx][my+1] != 0)) {
|
||||
if (dPlayer[mx][my+1] > 0) cp = dPlayer[mx][my+1] - 1;
|
||||
else cp = -(dPlayer[mx][my+1] + 1);
|
||||
if ((cp != myplr) && (plr[cp]._pHitPoints != 0)) {
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
cursplr = cp;
|
||||
}
|
||||
}
|
||||
if (dPlayer[mx][my] != 0) {
|
||||
if (dPlayer[mx][my] > 0) cp = dPlayer[mx][my] - 1;
|
||||
else cp = -(dPlayer[mx][my] + 1);
|
||||
if (cp != myplr) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursplr = cp;
|
||||
}
|
||||
}
|
||||
if (dFlags[mx][my] & BFLAG_DEADPLR) {
|
||||
for (int i = 0; i < MAX_PLRS; i++) {
|
||||
if ((plr[i]._px == mx) && (plr[i]._py == my) && (i != myplr)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursplr = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (curs == RESURRECT_CURS) {
|
||||
for (int j = -1; j < 2; j++) {
|
||||
for (int k = -1; k < 2; k++) {
|
||||
if (dFlags[mx+j][my+k] & BFLAG_DEADPLR) {
|
||||
for (int i = 0; i < MAX_PLRS; i++) {
|
||||
if ((plr[i]._px == mx+j) && (plr[i]._py == my+k) && (i != myplr)) {
|
||||
cursmx = mx+j;
|
||||
cursmy = my+k;
|
||||
cursplr = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dPlayer[mx+1][my+1] != 0) {
|
||||
if (dPlayer[mx+1][my+1] > 0) cp = dPlayer[mx+1][my+1] - 1;
|
||||
else cp = -(dPlayer[mx+1][my+1] + 1);
|
||||
if ((cp != myplr) && (plr[cp]._pHitPoints != 0)) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
cursplr = cp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((cursmonst == -1) && (cursplr == -1)) {
|
||||
if (!lefthalf && (dObject[mx+1][my] != 0)) {
|
||||
if (dObject[mx+1][my] > 0) co = dObject[mx+1][my] - 1;
|
||||
else co = -(dObject[mx+1][my] + 1);
|
||||
if (object[co]._oSelFlag >= OSEL_TOP) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
cursobj = co;
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dObject[mx][my+1] != 0)) {
|
||||
if (dObject[mx][my+1] > 0) co = dObject[mx][my+1] - 1;
|
||||
else co = -(dObject[mx][my+1] + 1);
|
||||
if (object[co]._oSelFlag >= OSEL_TOP) {
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
cursobj = co;
|
||||
}
|
||||
}
|
||||
if (dObject[mx][my] != 0) {
|
||||
if (dObject[mx][my] > 0) co = dObject[mx][my] - 1;
|
||||
else co = -(dObject[mx][my] + 1);
|
||||
if ((object[co]._oSelFlag == OSEL_FLR) || (object[co]._oSelFlag == OSEL_ALL)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursobj = co;
|
||||
}
|
||||
}
|
||||
if (dObject[mx+1][my+1] != 0) {
|
||||
if (dObject[mx+1][my+1] > 0) co = dObject[mx+1][my+1] - 1;
|
||||
else co = -(dObject[mx+1][my+1] + 1);
|
||||
if (object[co]._oSelFlag >= OSEL_TOP) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
cursobj = co;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((cursplr == -1) && (cursobj == -1) && (cursmonst == -1)) {
|
||||
if (!lefthalf && (dItem[mx+1][my] > 0)) {
|
||||
ci = dItem[mx+1][my] - 1;
|
||||
if (item[ci]._iSelFlag >= ISEL_TOP) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my;
|
||||
cursitem = ci;
|
||||
}
|
||||
}
|
||||
if (lefthalf && (dItem[mx][my+1] > 0)) {
|
||||
ci = dItem[mx][my+1] - 1;
|
||||
if (item[ci]._iSelFlag >= ISEL_TOP) {
|
||||
cursmx = mx;
|
||||
cursmy = my + 1;
|
||||
cursitem = ci;
|
||||
}
|
||||
}
|
||||
if (dItem[mx][my] > 0) {
|
||||
ci = dItem[mx][my] - 1;
|
||||
if ((item[ci]._iSelFlag == ISEL_FLR) || (item[ci]._iSelFlag == ISEL_ALL)) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
cursitem = ci;
|
||||
}
|
||||
}
|
||||
if (dItem[mx+1][my+1] > 0) {
|
||||
ci = dItem[mx+1][my+1] - 1;
|
||||
if (item[ci]._iSelFlag >= ISEL_TOP) {
|
||||
cursmx = mx + 1;
|
||||
cursmy = my + 1;
|
||||
cursitem = ci;
|
||||
}
|
||||
}
|
||||
if (cursitem == -1) {
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
CheckTrigForce();
|
||||
CheckTown();
|
||||
CheckRportal();
|
||||
}
|
||||
}
|
||||
if (curs == IDENTIFY_CURS) {
|
||||
cursobj = -1;
|
||||
cursmonst = -1;
|
||||
cursitem = -1;
|
||||
cursmx = mx;
|
||||
cursmy = my;
|
||||
}
|
||||
|
||||
if ((cursmonst != -1)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_MKILLER) != 0)
|
||||
&& ((monster[cursmonst]._mFlags & MFLAG_BERSERK) == 0)
|
||||
) cursmonst = -1;
|
||||
}
|
||||
Reference in New Issue
Block a user