diff options
| author | Eugene Sandulenko | 2019-09-03 00:17:27 +0200 | 
|---|---|---|
| committer | Eugene Sandulenko | 2019-11-13 22:07:08 +0100 | 
| commit | 040513ae5d2655c0fe25c2a44c2263b0710fa565 (patch) | |
| tree | ba53b8f59802c945b8e8d9f07bd5af065b1febcd | |
| parent | f7459b027c6d44ff20755a4b0e7d031d317425a0 (diff) | |
| download | scummvm-rg350-040513ae5d2655c0fe25c2a44c2263b0710fa565.tar.gz scummvm-rg350-040513ae5d2655c0fe25c2a44c2263b0710fa565.tar.bz2 scummvm-rg350-040513ae5d2655c0fe25c2a44c2263b0710fa565.zip | |
GRIFFON: Added logic.cpp
| -rw-r--r-- | engines/griffon/engine.cpp | 2357 | ||||
| -rw-r--r-- | engines/griffon/griffon.h | 15 | ||||
| -rw-r--r-- | engines/griffon/logic.cpp | 2397 | ||||
| -rw-r--r-- | engines/griffon/module.mk | 1 | 
4 files changed, 2406 insertions, 2364 deletions
| diff --git a/engines/griffon/engine.cpp b/engines/griffon/engine.cpp index 4344b8d672..25f580e38a 100644 --- a/engines/griffon/engine.cpp +++ b/engines/griffon/engine.cpp @@ -42,43 +42,6 @@  namespace Griffon { -// memo - -/* - chests -  0 - regular flask - 11 - key chest - 14 - blue flask chest - 15 - lightning chest - 16 - armour chest - 17 - citadel master key - 18 - sword3 - 19 - shield3 - 20 - armour3 - -*/ - -// element tile locations -const int elementmap[15][20] = { -	{  2, 2, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, -	{  2, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, -	{  2, -1, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, -	{  2, -1, 2, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{  2, 2, 2, 2, 2, -1, -1, -1, 2, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, 2, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, 0, 0, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, -	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } -}; - -// CODE GOES HERE ------------------------------------------------------------- -  // copypaste from hRnd_CRT()  float GriffonEngine::RND() {  	/* return between 0 and 1 (but never 1) */ @@ -363,2325 +326,5 @@ void GriffonEngine::newGame() {  	mainLoop();  } -void GriffonEngine::updateAnims() { -	for (int i = 0; i <= _lastObj; i++) { -		int nframes = _objectInfo[i][0]; -		int o_animspd = _objectInfo[i][3]; -		float frame = _objectFrame[i][0]; -		int cframe = _objectFrame[i][1]; -		// _objectinfo[i][6] = 0; // ?? out of bounds - -		if (nframes > 1) { -			frame = frame + o_animspd / 50 * _fpsr; -			while (frame >= nframes) -				frame = frame - nframes; - -			cframe = (int)frame; // truncate fractional part -			if (cframe > nframes) -				cframe = nframes - 1; -			if (cframe < 0) -				cframe = 0; - -			_objectFrame[i][0] = frame; -			_objectFrame[i][1] = cframe; -		} -	} -} - -void GriffonEngine::updateY() { -	for (int i = 0; i <= 2400; i++) -		_ysort[i] = -1; - -	int ff = (int)(_player.py * 10); -	if (ff < 0) // HACKFIX or _ysort[yy] may go out of bounds -		ff = 0; -	_player.ysort = ff; -	_ysort[ff] = 0; - -	_firsty = 2400; -	_lasty = 0; - -	for (int i = 1; i <= _lastnpc; i++) { -		int yy = (int)(_npcinfo[i].y * 10); - -		do { -			if (_ysort[yy] == -1 || yy == 2400) -				break; -			yy = yy + 1; -		} while (1); - -		_ysort[yy] = i; -		if (yy < _firsty) -			_firsty = yy; -		if (yy > _lasty) -			_lasty = yy; -	} -} - -void GriffonEngine::updateNPCs() { -	for (int i = 1; i <= _lastnpc; i++) { -		if (_npcinfo[i].hp > 0) { -			//  is npc walking -			int pass = 0; -			if (_npcinfo[i].attacking == 0) -				pass = 1; -			if (_npcinfo[i].spriteset == kMonsterFireHydra) -				pass = 1; -			if (pass == 1) { -				int moveup = 0; -				int movedown = 0; -				int moveleft = 0; -				int moveright = 0; - -				float npx = _npcinfo[i].x; -				float npy = _npcinfo[i].y; - -				float onpx = npx; -				float onpy = npy; - -				float wspd = _npcinfo[i].walkspd / 4; - -				if (_npcinfo[i].spriteset == kMonsterDragon2) -					wspd = wspd * 2; -				int wdir = _npcinfo[i].walkdir; - -				int mode = _npcinfo[i].movementmode; - -				float xdif = _player.px - npx; -				float ydif = _player.py - npy; - -				if (abs(xdif) < 4 * 16 && abs(ydif) < 4 * 16 && mode < 3) -					mode = 0; -				if (_npcinfo[i].hp < _npcinfo[i].maxhp * 0.25) -					mode = 3; - -				if (_npcinfo[i].pause > _ticks) -					mode = -1; -				if (_npcinfo[i].spriteset == kMonsterOneWing && _npcinfo[i].castpause > _ticks) -					mode = -1; - -				if (mode == 3) { -					mode = 1; -					if (abs(xdif) < 4 * 16 && abs(ydif) < 4 * 16) -						mode = 3; -				} - -				bool checkpass = false; - -				// npc  AI CODE -				// -------------- - -				// *** aggressive -				if (mode == 0) { -					wspd = _npcinfo[i].walkspd / 2; - -					xdif = _player.px - npx; -					ydif = _player.py - npy; - -					if (abs(xdif) > abs(ydif)) { -						if (xdif < 4) -							wdir = 2; -						if (xdif > -4) -							wdir = 3; -					} else { -						if (ydif < 4) -							wdir = 0; -						if (ydif > -4) -							wdir = 1; -					} - -					if (xdif < 4) -						moveleft = 1; -					if (xdif > -4) -						moveright = 1; -					if (ydif < 4) -						moveup = 1; -					if (ydif > -4) -						movedown = 1; -				} -				// ******************* - -				// *** defensive -				if (mode == 1) { - -					int movingdir = _npcinfo[i].movingdir; - -					if (_npcinfo[i].ticks > _ticks + 100000) -						_npcinfo[i].ticks = _ticks; - -					if (_npcinfo[i].ticks < _ticks) { -						_npcinfo[i].ticks = _ticks + 2000; -						movingdir = (int)(RND() * 8); -						_npcinfo[i].movingdir = movingdir; -					} - -					if (movingdir == 0) { -						wdir = 2; // left -						moveup = 1; -						moveleft = 1; -					} else if (movingdir == 1) { -						wdir = 0; // up -						moveup = 1; -					} else if (movingdir == 2) { -						wdir = 3; // right -						moveup = 1; -						moveright = 1; -					} else if (movingdir == 3) { -						wdir = 3; // right -						moveright = 1; -					} else if (movingdir == 4) { -						wdir = 3; // right -						moveright = 1; -						movedown = 1; -					} else if (movingdir == 5) { -						wdir = 1; // down -						movedown = 1; -					} else if (movingdir == 6) { -						wdir = 2; // left -						movedown = 1; -						moveleft = 1; -					} else if (movingdir == 7) { -						wdir = 2; // left -						moveleft = 1; -					} - -					checkpass = true; -				} -				// ******************* - -				// *** run away -				if (mode == 3) { -					wspd = _npcinfo[i].walkspd / 2; - -					xdif = _player.px - npx; -					ydif = _player.py - npy; - -					if (abs(xdif) > abs(ydif)) { -						if (xdif < 4) -							wdir = 3; -						if (xdif > -4) -							wdir = 2; -					} else { -						if (ydif < 4) -							wdir = 1; -						if (ydif > -4) -							wdir = 0; -					} - -					if (xdif < 4) -						moveright = 1; -					if (xdif > -4) -						moveleft = 1; -					if (ydif < 4) -						movedown = 1; -					if (ydif > -4) -						moveup = 1; -				} -				// ******************* - -				// -------------- ?? move*** vs movin*** -				int movinup = 0; -				int movindown = 0; -				int movinleft = 0; -				int movinright = 0; - -				float xp = (npx / 2 + 6); -				float yp = (npy / 2 + 10); - -				if (_npcinfo[i].spriteset == kMonsterDragon2) -					wspd = wspd * 2; - -				float ii = wspd * _fpsr; -				if (ii < 1) -					ii = 1; - -				if (moveup) { -					int sx = xp; -					int sy = yp - ii; -					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -					uint32 dq = *temp; -					if (_npcinfo[i].spriteset == kMonsterFinalBoss) -						dq = 0; - -					if (dq == 0) -						movinup = 1; -					if (dq > 0) { -						sx = xp - ii; -						sy = yp - ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinup = 1; -							movinleft = 1; -						} -					} -					if (dq > 0) { -						sx = xp + ii; -						sy = yp - ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinup = 1; -							movinright = 1; -						} -					} -				} - -				if (movedown) { -					int sx = xp; -					int sy = yp + ii; -					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -					uint32 dq = *temp; -					if (_npcinfo[i].spriteset == kMonsterFinalBoss) -						dq = 0; -					if (dq == 0) -						movindown = 1; -					if (dq > 0) { -						sx = xp - ii; -						sy = yp + ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movindown = 1; -							movinleft = 1; -						} -					} -					if (dq > 0) { -						sx = xp + ii; -						sy = yp + ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movindown = 1; -							movinright = 1; -						} -					} -				} - -				if (moveleft) { -					int sx = xp - ii; -					int sy = yp; -					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -					uint32 dq = *temp; -					if (_npcinfo[i].spriteset == kMonsterFinalBoss) -						dq = 0; -					if (dq == 0) -						movinleft = 1; -					if (dq > 0) { -						sx = xp - ii; -						sy = yp - ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinleft = 1; -							movinup = 1; -						} -					} -					if (dq > 0) { -						sx = xp - ii; -						sy = yp + ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinleft = 1; -							movindown = 1; -						} -					} -				} - -				if (moveright) { -					int sx = xp + ii; -					int sy = yp; -					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -					uint32 dq = *temp; -					if (_npcinfo[i].spriteset == kMonsterFinalBoss) -						dq = 0; -					if (dq == 0) -						movinright = 1; -					if (dq > 0) { -						sx = xp + ii; -						sy = yp - ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinright = 1; -							movinup = 1; -						} -					} -					if (dq > 0) { -						sx = xp + ii; -						sy = yp + ii; -						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						dq = *temp; -						if (_npcinfo[i].spriteset == kMonsterFinalBoss) -							dq = 0; -						if (dq == 0) { -							movinright = 1; -							movindown = 1; -						} -					} -				} - -				if (movinup) -					npy = npy - wspd * _fpsr; -				if (movindown) -					npy = npy + wspd * _fpsr; -				if (movinleft) -					npx = npx - wspd * _fpsr; -				if (movinright) -					npx = npx + wspd * _fpsr; - -				if (checkpass) { -					pass = 0; -					if (npx >= _npcinfo[i].x1 * 16 - 8 && npx <= _npcinfo[i].x2 * 16 + 8 && npy >= _npcinfo[i].y1 * 16 - 8 && npy <= _npcinfo[i].y2 * 16 + 8) -						pass = 1; -					if (pass == 0) { -						npx = onpx; -						npy = onpy; -						_npcinfo[i].ticks = _ticks; -					} -				} - -				float aspd = wspd; - -				if (_npcinfo[i].spriteset == kMonsterDragon2) -					aspd = wspd / 2; - -				xp = (npx / 2 + 6); -				yp = (npy / 2 + 10); - -				int sx = xp; -				int sy = yp; -				uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -				uint32 bgc = *temp; - -				float anpx = npx + 12; -				float anpy = npy + 20; - -				int lx = (int)anpx / 16; -				int ly = (int)anpy / 16; - -				if (_triggerloc[lx][ly] > -1) -					bgc = 1; -				if (_npcinfo[i].spriteset == kMonsterFinalBoss) -					bgc = 0; - -				int rst = 0; - -				if (_npcinfo[i].spriteset == kMonsterFinalBoss) { -					if (npx < 40 || npx > 280 || npy < 36 || npy > 204) -						rst = 1; -				} - -				if (bgc > 0 || rst == 1) { -					npx = onpx; -					npy = onpy; -				} - -				_npcinfo[i].x = npx; -				_npcinfo[i].y = npy; - -				_npcinfo[i].walkdir = wdir; -				_npcinfo[i].moving = 0; - -				if (npx != onpx || npy != onpy) -					_npcinfo[i].moving = 1; - -				if (_npcinfo[i].moving == 1) { -					float frame = _npcinfo[i].frame; -					int cframe = _npcinfo[i].cframe; - -					frame = frame + aspd * _fpsr; -					while (frame >= 16) -						frame = frame - 16; - -					cframe = (int)(frame); -					if (cframe > 16) -						cframe = 16 - 1; -					if (cframe < 0) -						cframe = 0; - -					_npcinfo[i].frame = frame; -					_npcinfo[i].cframe = cframe; -				} - -				// spriteset1 specific -				if (_npcinfo[i].spriteset == kMonsterBabyDragon && _npcinfo[i].attackattempt < _ticks) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						if (abs(xdif) < 20 && abs(ydif) < 20) { -							_npcinfo[i].attackattempt = _ticks + 100; -							if ((int)(RND() * 2) == 0) { -								if (config.effects) { -									int snd = playSound(_sfx[kSndEnemyHit]); -									setChannelVolume(snd, config.effectsvol); -								} - -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; -							} -						} -					} -				} - -				bool dospell = false; - -				// onewing specific -				if (_npcinfo[i].spriteset == kMonsterOneWing) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						if (abs(xdif) < 24 && abs(ydif) < 24) { -							float dist = sqrt(xdif * xdif + ydif * ydif); - -							if ((dist) < 24) { -								if (config.effects) { -									int snd = playSound(_sfx[kSndBite]); -									setChannelVolume(snd, config.effectsvol); -								} - -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; - -								_npcinfo[i].headtargetx[0] = _player.px + 12; -								_npcinfo[i].headtargety[0] = _player.py - 4; -							} -						} - -					} - -					dospell = false; - -					if (_npcinfo[i].attacking == 0 && _npcinfo[i].castpause < _ticks) { -						_npcinfo[i].swayspd = _npcinfo[i].swayspd + _npcinfo[i].swayspd / 200 * _fpsr; -						if (_npcinfo[i].swayspd > 15) { -							dospell = true; -							_npcinfo[i].swayspd = 1; -						} - -						// sway code -						_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; -						if (_npcinfo[i].swayangle >= 360) -							_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; - -						_npcinfo[i].headtargetx[0] = _npcinfo[i].x + (24 - _npcinfo[i].swayspd / 2) * sin(3.14159 / 180 * _npcinfo[i].swayangle) + 12; -						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16 + 8 * sin(3.14159 * 2 / 180 * _npcinfo[i].swayangle); -					} - -					if (dospell) { -						_npcinfo[i].pause = _ticks + 3000; -						_npcinfo[i].attacknext = _ticks + 4500; -						_npcinfo[i].castpause = _ticks + 4500; - -						castSpell(3, _npcinfo[i].x, _npcinfo[i].y, _npcinfo[i].x, _npcinfo[i].y, i); - -						_npcinfo[i].headtargetx[0] = _npcinfo[i].x; -						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16; -					} - -					// targethead code -					xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; -					ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; - - -					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; -					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; - - -					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; -					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; - -					for (int f = 6; f >= 1; f--) { -						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; -						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; - -						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; -						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; - -						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx) / 3; -						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty) / 3; -					} -				} - -				// boss1 specific and blackknight -				if (_npcinfo[i].spriteset == kMonsterBoss1 || _npcinfo[i].spriteset == kMonsterBlackKnight) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						_npcinfo[i].attacking = 1; -						_npcinfo[i].attackframe = 0; - -						castSpell(1, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); -					} - -					if (_npcinfo[i].castpause < _ticks) { -						castSpell(6, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); -						_npcinfo[i].castpause = _ticks + 12000; -					} -				} - - -				// firehydra specific -				if (_npcinfo[i].spriteset == kMonsterFireHydra) { -					_npcinfo[i].swayspd = 4; - -					// sway code -					_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; -					if (_npcinfo[i].swayangle >= 360) -						_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; - -					for (int ff = 0; ff <= 2; ff++) { -						if (_npcinfo[i].hp > 10 * ff * 20) { -							if (_npcinfo[i].pause < _ticks && _npcinfo[i].attacking2[ff] == 0 && _npcinfo[i].attacknext2[ff] < _ticks) { -								npx = _npcinfo[i].x; -								npy = _npcinfo[i].y; - -								xdif = _player.px - npx; -								ydif = _player.py - npy; - -								if (abs(xdif) < 48 && abs(ydif) < 48) { -									float dist = sqrt(xdif * xdif + ydif * ydif); - -									if ((dist) < 36) { -										if (config.effects) { -											int snd = playSound(_sfx[kSndBite]); -											setChannelVolume(snd, config.effectsvol); -										} - -										_npcinfo[i].attacking = 1; -										_npcinfo[i].attacking2[ff] = 1; -										_npcinfo[i].attackframe2[ff] = 0; - -										_npcinfo[i].headtargetx[ff] = _player.px + 12; -										_npcinfo[i].headtargety[ff] = _player.py - 4; - -										_npcinfo[i].swayangle = 0; -									} -								} - -							} - -							if (_npcinfo[i].attacking2[ff] == 0) { -								_npcinfo[i].headtargetx[ff] = _npcinfo[i].x + 38 * sin(3.14159 / 180 * (_npcinfo[i].swayangle + 120 * ff)) + 12; -								_npcinfo[i].headtargety[ff] = _npcinfo[i].y - 46 + 16 + 16 * sin(3.14159 * 2 / 180 * (_npcinfo[i].swayangle + 120 * ff)); -							} - -							// targethead code -							xdif = _npcinfo[i].bodysection[10 * ff + 9].x - _npcinfo[i].headtargetx[ff]; -							ydif = _npcinfo[i].bodysection[10 * ff + 9].y - _npcinfo[i].headtargety[ff]; - -							_npcinfo[i].bodysection[10 * ff + 9].x = _npcinfo[i].bodysection[10 * ff + 9].x  - xdif * 0.4 * _fpsr; -							_npcinfo[i].bodysection[10 * ff + 9].y = _npcinfo[i].bodysection[10 * ff + 9].y  - ydif * 0.4 * _fpsr; - -							_npcinfo[i].bodysection[10 * ff].x = _npcinfo[i].x + 12 + 8 * cos(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); -							_npcinfo[i].bodysection[10 * ff].y = _npcinfo[i].y + 12 + 8 * sin(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); - -							for (int f = 8; f >= 1; f--) { -								xdif = _npcinfo[i].bodysection[ff * 10 + f + 1].x - _npcinfo[i].bodysection[ff * 10 + f - 1].x; -								ydif = _npcinfo[i].bodysection[ff * 10 + f + 1].y - _npcinfo[i].bodysection[ff * 10 + f - 1].y; - -								float tx = _npcinfo[i].bodysection[ff * 10 + f - 1].x + xdif / 2; -								float ty = _npcinfo[i].bodysection[ff * 10 + f - 1].y + ydif / 2; - -								_npcinfo[i].bodysection[ff * 10 + f].x = _npcinfo[i].bodysection[ff * 10 + f].x - (_npcinfo[i].bodysection[ff * 10 + f].x - tx) / 3; -								_npcinfo[i].bodysection[ff * 10 + f].y = _npcinfo[i].bodysection[ff * 10 + f].y - (_npcinfo[i].bodysection[ff * 10 + f].y - ty) / 3; -							} -						} -					} -				} - -				// spriteset6 specific -				if (_npcinfo[i].spriteset == kMonsterRedDragon && _npcinfo[i].attackattempt < _ticks) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						pass = 0; -						if (abs(xdif) < 48 && abs(ydif) < 6) -							pass = 1; -						if (abs(ydif) < 48 && abs(xdif) < 6) -							pass = 2; - -						if (pass > 0) { -							_npcinfo[i].attackattempt = _ticks + 100; -							if ((int)(RND() * 2) == 0) { -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; -								float nnxa = 0, nnya = 0, nnxb = 0, nnyb = 0; - -								if (pass == 1 && xdif < 0) { -									nnxa = npx - 8; -									nnya = npy + 4; -									nnxb = npx - 48 - 8; -									nnyb = npy + 4; -								} else if (pass == 1 && xdif > 0) { -									nnxa = npx + 16; -									nnya = npy + 4; -									nnxb = npx + 16 + 48; -									nnyb = npy + 4; -								} else if (pass == 2 && ydif < 0) { -									nnya = npy; -									nnxa = npx + 4; -									nnyb = npy - 48; -									nnxb = npx + 4; -								} else if (pass == 2 && ydif > 0) { -									nnya = npy + 20; -									nnxa = npx + 4; -									nnyb = npy + 20 + 48; -									nnxb = npx + 4; -								} - -								castSpell(7, nnxa, nnya, nnxb, nnyb, i); -							} -						} -					} -				} - -				// wizard1 specific -				if (_npcinfo[i].spriteset == kMonsterPriest) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						_npcinfo[i].attacking = 1; -						_npcinfo[i].attackframe = 0; - -						castSpell(9, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); -					} - -					if (_npcinfo[i].castpause < _ticks) { -						// castSpell 6, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i -						// _npcinfo[i].castpause = _ticks + 12000 -					} - -				} - -				// spriteset6 specific -				if (_npcinfo[i].spriteset == kMonsterYellowDragon && _npcinfo[i].attackattempt < _ticks) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						pass = 0; -						if (abs(xdif) < 56 && abs(ydif) < 6) -							pass = 1; -						if (abs(ydif) < 56 && abs(xdif) < 6) -							pass = 2; - -						if (pass > 0) { -							_npcinfo[i].attackattempt = _ticks + 100; -							if ((int)(RND() * 2) == 0) { -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; - -								float nnxa = 0, nnya = 0, nnxb = 0, nnyb = 0; -								if (pass == 1 && xdif < 0) { -									nnxa = npx - 8; -									nnya = npy + 4; -									nnxb = npx - 56 - 8; -									nnyb = npy + 4; -									_npcinfo[i].walkdir = 2; -								} else if (pass == 1 && xdif > 0) { -									nnxa = npx + 16; -									nnya = npy + 4; -									nnxb = npx + 16 + 56; -									nnyb = npy + 4; -									_npcinfo[i].walkdir = 3; -								} else if (pass == 2 && ydif < 0) { -									nnya = npy; -									nnxa = npx + 4; -									nnyb = npy - 56; -									nnxb = npx + 4; -									_npcinfo[i].walkdir = 0; -								} else if (pass == 2 && ydif > 0) { -									nnya = npy + 20; -									nnxa = npx + 4; -									nnyb = npy + 20 + 56; -									nnxb = npx + 4; -									_npcinfo[i].walkdir = 1; -								} - -								castSpell(7, nnxa, nnya, nnxb, nnyb, i); -							} -						} -					} -				} - -				// twowing specific -				if (_npcinfo[i].spriteset == kMonsterTwoWing) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].bodysection[7].x; -						npy = _npcinfo[i].bodysection[7].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						if (abs(xdif) < 24 && abs(ydif) < 24) { -							float dist = sqrt(xdif * xdif + ydif * ydif); - -							if ((dist) < 24) { -								if (config.effects) { -									int snd = playSound(_sfx[kSndBite]); -									setChannelVolume(snd, config.effectsvol); -								} - -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; - -								_npcinfo[i].headtargetx[0] = _player.px + 12; -								_npcinfo[i].headtargety[0] = _player.py - 4; -							} -						} - -					} - -					if (_npcinfo[i].attacking == 0 && _npcinfo[i].castpause < _ticks) { -						_npcinfo[i].swayspd = 4; - -						// sway code -						_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; -						if (_npcinfo[i].swayangle >= 360) -							_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; - -						_npcinfo[i].headtargetx[0] = _npcinfo[i].x + (24 - _npcinfo[i].swayspd / 2) * sin(3.14159 / 180 * _npcinfo[i].swayangle) + 12; -						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16 + 8 * sin(3.14159 * 2 / 180 * _npcinfo[i].swayangle); -					} - -					if (dospell) { -						_npcinfo[i].pause = _ticks + 3000; -						_npcinfo[i].attacknext = _ticks + 5000; -						_npcinfo[i].castpause = _ticks + 3000; - -						castSpell(3, _npcinfo[i].x, _npcinfo[i].y, _npcinfo[i].x, _npcinfo[i].y, i); - -						_npcinfo[i].headtargetx[0] = _npcinfo[i].x; -						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16; -					} - -					// targethead code -					xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; -					ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; - - -					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; -					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; - -					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; -					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; - -					for (int f = 6; f >= 1; f--) { -						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; -						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; - -						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; -						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; - -						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx) / 3; -						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty) / 3; -					} - -				} - -				// dragon2 specific -				if (_npcinfo[i].spriteset == kMonsterDragon2 && _npcinfo[i].attackattempt < _ticks) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						if (abs(xdif) < 32 && abs(ydif) < 32) { -							_npcinfo[i].attackattempt = _ticks + 100; -							if ((int)(RND() * 2) == 0) { -								if (config.effects) { -									int snd = playSound(_sfx[kSndEnemyHit]); -									setChannelVolume(snd, config.effectsvol); -								} - -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; -							} -						} -					} -				} - - -				// endboss specific -				if (_npcinfo[i].spriteset == kMonsterFinalBoss && _npcinfo[i].attackattempt < _ticks) { -					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { -						npx = _npcinfo[i].x; -						npy = _npcinfo[i].y; - -						xdif = _player.px - npx; -						ydif = _player.py - npy; - -						if (abs(xdif) < 38 && abs(ydif) < 38) { -							_npcinfo[i].attackattempt = _ticks + 100; -							if ((int)(RND() * 2) == 0) { -								if (config.effects) { -									int snd = playSound(_sfx[kSndIce]); -									setChannelVolume(snd, config.effectsvol); -								} -								_npcinfo[i].attacking = 1; -								_npcinfo[i].attackframe = 0; -							} -						} -					} -				} -			} - - -			float npx = _npcinfo[i].x; -			float npy = _npcinfo[i].y; - -			int xp = (npx / 2 + 6); -			int yp = (npy / 2 + 10); - -			rcSrc.left = xp - 1; -			rcSrc.top = yp - 1; -			rcSrc.setWidth(3); -			rcSrc.setHeight(3); - -			if (_npcinfo[i].pause < _ticks) -				_clipbg->fillRect(rcSrc, i); - - -			pass = 0; -			if (_npcinfo[i].attacking == 1) -				pass = 1; -			if (_npcinfo[i].spriteset == kMonsterFireHydra) { -				if (_npcinfo[i].attacking2[0] == 1) -					pass = 1; -				if (_npcinfo[i].attacking2[1] == 1) -					pass = 1; -				if (_npcinfo[i].attacking2[2] == 1) -					pass = 1; -			} - -			if (pass == 1) { -				int dist; -				float damage; -				// spriteset1 specific -				if (_npcinfo[i].spriteset == kMonsterBabyDragon) { -					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; -					if (_npcinfo[i].attackframe >= 16) { -						_npcinfo[i].attackframe = 0; -						_npcinfo[i].attacking = 0; -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -					} - -					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -					npx = _npcinfo[i].x; -					npy = _npcinfo[i].y; - -					float xdif = _player.px - npx; -					float ydif = _player.py - npy; - -					dist = 10; - -					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -						// _npcinfo[i].attackframe = 0; -						// _npcinfo[i].attacking = 0; - -						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); - -						if (_player.hp > 0) -							damagePlayer(damage); -					} -				} - -				if (_npcinfo[i].spriteset == kMonsterOneWing) { -					// targethead code -					float xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; -					float ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; - -					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; -					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; - -					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; -					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; - -					for (int f = 6; f >= 1; f--) { -						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; -						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; - -						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; -						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; - -						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx); -						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty); -					} - -					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; -					if (_npcinfo[i].attackframe >= 16) { -						_npcinfo[i].attackframe = 0; -						_npcinfo[i].attacking = 0; -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -					} - -					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -					npx = _npcinfo[i].bodysection[7].x; -					npy = (_npcinfo[i].bodysection[7].y + 16); - -					xdif = (_player.px + 12) - npx; -					ydif = (_player.py + 12) - npy; - -					dist = 8; - -					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -						// _npcinfo[i].attackframe = 0 -						// _npcinfo[i].attacking = 0 -						damage = (float)_npcinfo[i].attackdamage * (1.0 + (RND() * 0.5)); -						if (_player.hp > 0) -							damagePlayer(damage); -					} -				} - - -				// firehydra -				if (_npcinfo[i].spriteset == kMonsterFireHydra) { -					for (int ff = 0; ff <= 2; ff++) { -						if (_npcinfo[i].attacking2[ff] == 1) { -							float xdif = _npcinfo[i].bodysection[10 * ff + 9].x - _npcinfo[i].headtargetx[ff]; -							float ydif = _npcinfo[i].bodysection[10 * ff + 9].y - _npcinfo[i].headtargety[ff]; - -							_npcinfo[i].bodysection[10 * ff + 9].x = _npcinfo[i].bodysection[10 * ff + 9].x  - xdif * .2 * _fpsr; -							_npcinfo[i].bodysection[10 * ff + 9].y = _npcinfo[i].bodysection[10 * ff + 9].y  - ydif * .2 * _fpsr; - -							_npcinfo[i].bodysection[10 * ff].x = _npcinfo[i].x + 12 + 8 * cos(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); -							_npcinfo[i].bodysection[10 * ff].y = _npcinfo[i].y + 12 + 8 * sin(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); - -							for (int f = 8; f >= 1; f--) { -								xdif = _npcinfo[i].bodysection[ff * 10 + f + 1].x - _npcinfo[i].bodysection[ff * 10 + f - 1].x; -								ydif = _npcinfo[i].bodysection[ff * 10 + f + 1].y - _npcinfo[i].bodysection[ff * 10 + f - 1].y; - -								float tx = _npcinfo[i].bodysection[ff * 10 + f - 1].x + xdif / 2; -								float ty = _npcinfo[i].bodysection[ff * 10 + f - 1].y + ydif / 2; - -								_npcinfo[i].bodysection[ff * 10 + f].x = _npcinfo[i].bodysection[ff * 10 + f].x - (_npcinfo[i].bodysection[ff * 10 + f].x - tx) / 3; -								_npcinfo[i].bodysection[ff * 10 + f].y = _npcinfo[i].bodysection[ff * 10 + f].y - (_npcinfo[i].bodysection[ff * 10 + f].y - ty) / 3; -							} - -							_npcinfo[i].attackframe2[ff] = _npcinfo[i].attackframe2[ff] + _npcinfo[i].attackspd * _fpsr; -							if (_npcinfo[i].attackframe2[ff] >= 16) { -								_npcinfo[i].attackframe2[ff] = 0; -								_npcinfo[i].attacking2[ff] = 0; -								_npcinfo[i].attacknext2[ff] = _ticks + _npcinfo[i].attackdelay; -							} - -							_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -							npx = _npcinfo[i].bodysection[10 * ff + 9].x; -							npy = (_npcinfo[i].bodysection[10 * ff + 9].y + 16); - -							xdif = (_player.px + 12) - npx; -							ydif = (_player.py + 12) - npy; - -							dist = 8; - -							if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -								_npcinfo[i].attacknext2[ff] = _ticks + _npcinfo[i].attackdelay; -								// _npcinfo[i].attackframe2(ff) = 0 -								// _npcinfo[i].attacking2(ff) = 0 -								damage = (float)_npcinfo[i].attackdamage * (1.0 + RND() * 0.5); -								if (_player.hp > 0) -									damagePlayer(damage); -							} -						} -					} - -				} - -				// twowing specific -				if (_npcinfo[i].spriteset == kMonsterTwoWing) { -					// targethead code -					float xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; -					float ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; - -					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x - xdif * 0.4 * _fpsr; -					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y - ydif * 0.4 * _fpsr; - -					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; -					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; - -					for (int f = 6; f >= 1; f--) { -						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; -						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; - -						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; -						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; - -						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx); -						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty); -					} - -					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; -					if (_npcinfo[i].attackframe >= 16) { -						_npcinfo[i].attackframe = 0; -						_npcinfo[i].attacking = 0; -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -					} - -					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -					npx = _npcinfo[i].bodysection[7].x; -					npy = (_npcinfo[i].bodysection[7].y + 16); - -					xdif = (_player.px + 12) - npx; -					ydif = (_player.py + 12) - npy; - -					dist = 8; - -					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -						// _npcinfo[i].attackframe = 0 -						// _npcinfo[i].attacking = 0 -						damage = (float)_npcinfo[i].attackdamage * (1.0 + RND() * 0.5); -						if (_player.hp > 0) -							damagePlayer(damage); -					} -				} - -				// dragon 2 specific -				if (_npcinfo[i].spriteset == kMonsterDragon2) { - -					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; -					if (_npcinfo[i].attackframe >= 16) { -						_npcinfo[i].attackframe = 0; -						_npcinfo[i].attacking = 0; -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -					} - -					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -					npx = _npcinfo[i].x; -					npy = _npcinfo[i].y; - -					float xdif = _player.px - npx; -					float ydif = _player.py - npy; - -					dist = 16 + _npcinfo[i].attackframe; - -					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -						// _npcinfo[i].attackframe = 0 -						// _npcinfo[i].attacking = 0 -						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); -						if (_player.hp > 0) -							damagePlayer(damage); -					} -				} - -				// endboss specific -				if (_npcinfo[i].spriteset == kMonsterFinalBoss) { -					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; -					if (_npcinfo[i].attackframe >= 16) { -						_npcinfo[i].attackframe = 0; -						_npcinfo[i].attacking = 0; -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -					} - -					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); - -					npx = _npcinfo[i].x; -					npy = _npcinfo[i].y; - -					float xdif = _player.px - npx; -					float ydif = _player.py - npy; - -					dist = 36; - -					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { -						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; -						// _npcinfo[i].attackframe = 0 -						// _npcinfo[i].attacking = 0 -						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); -						if (_player.hp > 0) -							damagePlayer(damage); -					} -				} -			} -			// -------end fight code -		} -	} -} - -void GriffonEngine::updateSpells() { -	int foundel[5]; -	float npx, npy; -	long cl1, cl2, cl3; -	int ll[4][2]; - -	float xloc = 0, yloc = 0, xst, yst, xdif, ydif; - -	for (int i = 0; i < kMaxSpell; i++) { -		if (spellinfo[i].frame > 0) { -			int spellnum = spellinfo[i].spellnum; - -			// water -			if (spellnum == 0 && !_forcepause) { -				float fr = (32 - spellinfo[i].frame); - -				ll[0][0] = -2; -				ll[0][1] = -3; -				ll[1][0] = 2; -				ll[1][1] = -3; -				ll[2][0] = -4; -				ll[2][1] = -2; -				ll[3][0] = 4; -				ll[3][1] = -2; - -				for (int f = 0; f <= 3; f++) { -					if (fr > f * 4 && fr < f * 4 + 16) { -						float alf = 255; - -						if (fr < f * 4 + 8) { -							int fi = (int)((fr - f * 4) * 3) % 4; -							rcSrc.left = 32 + fi * 16; -							rcSrc.top = 80; -							rcSrc.setWidth(16); -							rcSrc.setHeight(16); - -							xloc = spellinfo[i].enemyx + 12 + ll[f][0] * 16; -							yloc = spellinfo[i].enemyy + 16 + ll[f][1] * 16; - -							rcDest.left = xloc; -							rcDest.top = yloc; - -							alf = 255 * ((fr - f * 4) / 8); -						} - -						if (fr >= f * 4 + 8) { -							int fi = 0; // ?? - -							if (f == 0 || f == 2) -								fi = 0; -							if (f == 1 || f == 3) -								fi = 1; -							rcSrc.left = 32 + fi * 16; -							rcSrc.top = 80; -							rcSrc.setWidth(16); -							rcSrc.setHeight(16); - -							xst = spellinfo[i].enemyx + 12 + ll[f][0] * 16; -							yst = spellinfo[i].enemyy + 16 + ll[f][1] * 16; - -							float xi = (spellinfo[i].enemyx - xst) * 2 / 8; -							float yi = (spellinfo[i].enemyy - yst) * 2 / 8; - -							float fl = (fr - f * 4 - 8) / 2; -							xloc = xst + xi * fl * fl; -							yloc = yst + yi * fl * fl; - -							rcDest.left = xloc; -							rcDest.top = yloc; - -							alf = 255; -						} - -						if (xloc > -16 && xloc < 304 && yloc > -16 && yloc < 224) { -							_spellimg->setAlpha(alf, true); -							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); -							_spellimg->setAlpha(255, true); - -							if (spellinfo[i].damagewho == 0) { -								for (int e = 1; e <= _lastnpc; e++) { - -									xdif = (xloc + 16) - (_npcinfo[e].x + 12); -									ydif = (yloc + 16) - (_npcinfo[e].y + 12); - -									if ((abs(xdif) < 16 && abs(ydif) < 16)) { -										float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; - -										if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { -											damageNPC(e, damage, 1); -											if (config.effects) { -												int snd = playSound(_sfx[kSndIce]); -												setChannelVolume(snd, config.effectsvol); -											} -										} -									} -								} -							} - -							// check for post damage -							if (nposts > 0) { -								for (int e = 0; e <= nposts - 1; e++) { -									xdif = (xloc + 16) - (postinfo[e][0] + 8); -									ydif = (yloc + 16) - (postinfo[e][1] + 8); - -									if ((abs(xdif) < 16 && abs(ydif) < 16)) { -										_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -										_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -										rcSrc.left = postinfo[e][0] / 2; -										rcSrc.top = postinfo[e][1] / 2; -										rcSrc.setWidth(8); -										rcSrc.setHeight(8); - -										_clipbg2->fillRect(rcSrc, 0); - -										addFloatIcon(99, postinfo[e][0], postinfo[e][1]); - -										if (config.effects) { -											int snd = playSound(_sfx[kSndIce]); -											setChannelVolume(snd, config.effectsvol); -										} -									} -								} -							} -						} -					} -				} -			} - -			// metal -			if (spellnum == 1 && !_forcepause) { -				int fr = (int)((32 - spellinfo[i].frame) * 4) % 3; - -				rcSrc.left = fr * 48; -				rcSrc.top = 0; -				rcSrc.setWidth(48); -				rcSrc.setHeight(48); - -				float c1 = (32 - spellinfo[i].frame) / 16; - -				float halfx = (spellinfo[i].homex - 12) + ((spellinfo[i].enemyx - 12) - (spellinfo[i].homex - 12)) / 2; -				float halfy = (spellinfo[i].homey - 12) + ((spellinfo[i].enemyy - 12) - (spellinfo[i].homey - 12)) / 2; - -				float wdth = (halfx - spellinfo[i].homex) * 1.2; -				float hight = (halfy - spellinfo[i].homey) * 1.2; - -				xloc = halfx + wdth * cos(3.14159 + 3.14159 * 2 * c1); -				yloc = halfy + hight * sin(3.14159 + 3.14159 * 2 * c1); - -				rcDest.left = xloc; -				rcDest.top = yloc; - -				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); - -				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; - -				if (spellinfo[i].damagewho == 0) { -					for (int e = 1; e <= _lastnpc; e++) { -						xdif = (xloc + 24) - (_npcinfo[e].x + 12); -						ydif = (yloc + 24) - (_npcinfo[e].y + 12); - -						if ((abs(xdif) < 24 && abs(ydif) < 24)) { -							float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; - -							if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { -								damageNPC(e, damage, 1); -								if (config.effects) { -									int snd = playSound(_sfx[kSndMetalHit]); -									setChannelVolume(snd, config.effectsvol); -								} -							} -						} -					} -				} - -				if (spellinfo[i].damagewho == 1) { -					// --------- boss 1 specific -					if (ABS(spellinfo[i].frame) < 0 && _npcinfo[spellinfo[i].npc].spriteset == kMonsterBoss1) { -						int npc = spellinfo[i].npc; -						_npcinfo[npc].attackframe = 0; -						_npcinfo[npc].attacking = 0; - -						_npcinfo[npc].pause = _ticks + 1000; -						_npcinfo[npc].attacknext = _ticks + 4000; -					} -					// --------------- - -					// --------- blackknight specific -					if (ABS(spellinfo[i].frame) < 0 && _npcinfo[spellinfo[i].npc].spriteset == kMonsterBlackKnight) { -						int npc = spellinfo[i].npc; -						_npcinfo[npc].attackframe = 0; -						_npcinfo[npc].attacking = 0; - -						_npcinfo[npc].pause = _ticks + 1000; -						_npcinfo[npc].attacknext = _ticks + 3500; -					} -					// --------------- - -					xdif = (xloc + 24) - (_player.px + 12); -					ydif = (yloc + 24) - (_player.py + 12); - -					if ((abs(xdif) < 24 && abs(ydif) < 24) && _player.pause < _ticks) { -						npx = _player.px; -						npy = _player.py; - -						float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); - -						if (_player.hp > 0) { -							damagePlayer(damage); -							if (config.effects) { -								int snd = playSound(_sfx[kSndMetalHit]); -								setChannelVolume(snd, config.effectsvol); -							} -						} -					} -				} - - -				// check for(int post damage -				if (nposts > 0) { -					for (int e = 0; e <= nposts - 1; e++) { -						xdif = (xloc + 24) - (postinfo[e][0] + 8); -						ydif = (yloc + 24) - (postinfo[e][1] + 8); - -						if ((abs(xdif) < 24 && abs(ydif) < 24)) { -							_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -							_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -							rcSrc.left = postinfo[e][0] / 2; -							rcSrc.top = postinfo[e][1] / 2; -							rcSrc.setWidth(8); -							rcSrc.setHeight(8); - -							_clipbg2->fillRect(rcSrc, 0); - -							addFloatIcon(99, postinfo[e][0], postinfo[e][1]); - -							if (config.effects) { -								int snd = playSound(_sfx[kSndMetalHit]); -								setChannelVolume(snd, config.effectsvol); -							} -						} -					} -				} -			} - -			// earth -			if (spellnum == 2 && !_forcepause) { -				float hght = 240 - spellinfo[i].enemyy; - -				for (int f = 8; f >= 0; f--) { - -					float fr = (32 - spellinfo[i].frame); - -					if (fr > f && fr < f + 16) { -						rcSrc.left = 32 * spellinfo[i].rockimg[f]; -						rcSrc.top = 48; -						rcSrc.setWidth(32); -						rcSrc.setHeight(32); - -						int scatter = 0; -						if (fr < 8 + f) { -							xloc = spellinfo[i].enemyx - 4; -							yloc = spellinfo[i].enemyy * (1 - cos(3.14159 / 2 * (fr - f) / 8)); // ^ 2; -							yloc *= yloc; -						} else { -							scatter = 1; -							xloc = spellinfo[i].enemyx - 4 - spellinfo[i].rockdeflect[f] * sin(3.14159 / 2 * ((fr - f) - 8) / 8); -							yloc = spellinfo[i].enemyy + hght * (1 - cos(3.14159 / 2 * ((fr - f) - 8) / 8)); -						} - -						rcDest.left = xloc; -						rcDest.top = yloc; - -						if (xloc > -16 && xloc < 304 && yloc > -16 && yloc < 224) { -							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); - -							if (scatter == 1) { -								if (spellinfo[i].damagewho == 0) { -									for (int e = 1; e <= _lastnpc; e++) { -										xdif = (xloc + 16) - (_npcinfo[e].x + 12); -										ydif = (yloc + 16) - (_npcinfo[e].y + 12); - -										if ((abs(xdif) < 16 && abs(ydif) < 16)) { -											float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; - -											if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { -												damageNPC(e, damage, 1); -												if (config.effects) { -													int snd = playSound(_sfx[kSndRocks]); -													setChannelVolume(snd, config.effectsvol); -												} -											} -										} -									} -								} - - -								// check for(int post damage -								if (nposts > 0) { -									for (int e = 0; e <= nposts - 1; e++) { -										xdif = (xloc + 16) - (postinfo[e][0] + 8); -										ydif = (yloc + 16) - (postinfo[e][1] + 8); - -										if ((abs(xdif) < 16 && abs(ydif) < 16)) { -											_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -											_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -											rcSrc.left = postinfo[e][0] / 2; -											rcSrc.top = postinfo[e][1] / 2; -											rcSrc.setWidth(8); -											rcSrc.setHeight(8); - -											_clipbg2->fillRect(rcSrc, 0); - -											addFloatIcon(99, postinfo[e][0], postinfo[e][1]); - -											if (config.effects) { -												int snd = playSound(_sfx[kSndRocks]); -												setChannelVolume(snd, config.effectsvol); -											} -										} -									} -								} -							} -						} -					} -				} - -				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; -			} - -			// crystal -			if (spellnum == 5) { - -				float fra = (32 - spellinfo[i].frame); -				int fr = (int)((spellinfo[i].frame) * 2) % 8; - -				rcSrc.left = fr * 32; -				rcSrc.top = 96 + 48; -				rcSrc.setWidth(32); -				rcSrc.setHeight(64); - -				rcDest.left = _player.px - 4; -				rcDest.top = _player.py + 16 - 48; - -				int f = 160; -				if (fra < 8) -					f = 192 * fra / 8; -				if (fra > 24) -					f = 192 * (1 - (fra - 24) / 8); - -				_spellimg->setAlpha(f, true); -				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); -				_spellimg->setAlpha(255, true); - -				spellinfo[i].frame = spellinfo[i].frame - 0.3 * _fpsr; -				if (spellinfo[i].frame < 0) { -					spellinfo[i].frame = 0; -					_forcepause = false; - -					npx = _player.px + 12; -					npy = _player.py + 20; - -					int lx = (int)npx / 16; -					int ly = (int)npy / 16; - -					for (int f1 = 0; f1 < 5; f1++) { // !! f < 5 -						foundel[f1] = 0; -					} - -					for (int xo = -2; xo <= 2; xo++) { -						for (int yo = -2; yo <= 2; yo++) { - -							int sx = lx + xo; -							int sy = ly + yo; - -							if (sx > -1 && sx < 20 && sy > -1 && sy < 15) { -								for (int l = 0; l <= 2; l++) { -									int curtile = _tileinfo[l][sx][sy][0]; -									int curtilel = _tileinfo[l][sx][sy][1]; - -									if (curtile > 0) { -										curtile = curtile - 1; -										int curtilex = curtile % 20; -										int curtiley = (curtile - curtilex) / 20; - -										int element = elementmap[curtiley][curtilex]; -										if (element > -1 && curtilel == 0) -											foundel[element + 1] = 1; -									} -								} - -								int o = _objectMap[sx][sy]; -								if (o > -1) { -									if (_objectInfo[o][4] == 1) -										foundel[2] = 1; -									if (o == 1 || o == 2) { -										foundel[2] = 1; -										foundel[4] = 1; -									} -								} -							} -						} -					} - -					char line[256]; -					strcpy(line, "Found... nothing..."); - -					for (int f1 = 0; f1 < 5; f1++) { -						if (foundel[f1] == 1 && _player.foundspell[f1] == 0) { -							_player.foundspell[f1] = 1; -							_player.spellcharge[f1] = 0; -							if (f1 == 1) -								strcpy(line, "Found... Water Essence"); -							if (f1 == 2) -								strcpy(line, "Found... Metal Essence"); -							if (f1 == 3) -								strcpy(line, "Found... Earth Essence"); -							if (f1 == 4) -								strcpy(line, "Found... Fire Essence"); -							break; -						} -					} - -					eventText(line); -				} -			} - -			// room fireballs -			if (spellnum == 6 && !_forcepause) { - -				if (spellinfo[i].frame > 16) { -					float fr = (32 - spellinfo[i].frame); - -					_spellimg->setAlpha(192 * sin(3.14159 * fr / 4), true); - -					rcSrc.left = 16 * (int)(RND() * 2); -					rcSrc.top = 80; -					rcSrc.setWidth(16); -					rcSrc.setHeight(16); - -					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { - -						xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; -						yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; - -						rcDest.left = xloc; -						rcDest.top = yloc; - -						_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); -					} - -					_spellimg->setAlpha(255, true); -				} else { -					_spellimg->setAlpha(192, true); - -					rcSrc.left = 16 * (int)(RND() * 2); -					rcSrc.top = 80; -					rcSrc.setWidth(16); -					rcSrc.setHeight(16); - -					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { -						float ax = spellinfo[i].fireballs[ff][0]; -						float ay = spellinfo[i].fireballs[ff][1]; -						float bx = _player.px + 4; -						float by = _player.py + 4; -						float d = sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay)); - -						float tx = (bx - ax) / d; -						float ty = (by - ay) / d; - -						spellinfo[i].fireballs[ff][2] += tx * 1.2 * _fpsr; -						spellinfo[i].fireballs[ff][3] += ty * 1.2 * _fpsr; - -						if (spellinfo[i].ballon[ff] == 1) { -							spellinfo[i].fireballs[ff][0] = ax + spellinfo[i].fireballs[ff][2] * 0.2 * _fpsr; -							spellinfo[i].fireballs[ff][1] = ay + spellinfo[i].fireballs[ff][3] * 0.2 * _fpsr; - -							xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; -							yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; - -							rcDest.left = xloc; -							rcDest.top = yloc; - -							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); -						} - -						if (xloc < -1 || yloc < -1 || xloc > 304 || yloc > 224) -							spellinfo[i].ballon[ff] = 0; -					} - -					_spellimg->setAlpha(255, true); -				} - -				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; - -				if (spellinfo[i].damagewho == 1) { -					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { -						if (spellinfo[i].ballon[ff] == 1) { -							xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; -							yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; - -							xdif = (xloc + 8) - (_player.px + 12); -							ydif = (yloc + 8) - (_player.py + 12); - -							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { -								float damage = _npcinfo[spellinfo[i].npc].spelldamage * (1 + RND() * 0.5) / 3; - -								if (_player.hp > 0) -									damagePlayer(damage); - -								if (config.effects) { -									int snd = playSound(_sfx[kSndFire]); -									setChannelVolume(snd, config.effectsvol); -								} -							} -						} -					} -				} -			} - -			// lightning bomb -			if (spellnum == 8) { - -				cl1 = _videobuffer->format.RGBToColor(0, 32, 204); -				cl2 = _videobuffer->format.RGBToColor(142, 173, 191); -				cl3 = _videobuffer->format.RGBToColor(240, 240, 240); - -				float px = _player.px + 12; -				float py = _player.py + 12; - -				int apx = px + (int)(RND() * 5 - 2); -				int apy = py + (int)(RND() * 5 - 2); - -				for (int f = 0; f <= 0; f++) { // ?? -					int y = apy; -					int orn = 0; -					for (int x = apx; x <= 319; x++) { -						int rn = (int)(RND() * 3); - -						if (orn == 0) -							y = y - 1; -						if (orn == 2) -							y = y + 1; - -						drawLine(_videobuffer, x, y - 1, x, y + 2, cl1); -						drawLine(_videobuffer, x, y, x, y + 1, cl3); - -						if (rn == 0) -							drawLine(_videobuffer, x, y + 1, x, y + 1, cl2); -						if (rn == 2) -							drawLine(_videobuffer, x, y, x, y, cl2); - -						orn = rn; - -						if (spellinfo[i].damagewho == 0) { -							for (int e = 1; e <= _lastnpc; e++) { - -								xdif = (x + 16) - (_npcinfo[e].x + 12); -								ydif = (y + 16) - (_npcinfo[e].y + 12); - -								if ((abs(xdif) < 8 && abs(ydif) < 8)) { -									float damage = 30 * (1 + RND() * 0.5); - -									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) -										damageNPC(e, damage, 1); -								} -							} -						} - -						// check for post damage -						if (nposts > 0) { -							for (int e = 0; e <= nposts - 1; e++) { -								xdif = (xloc + 16) - (postinfo[e][0] + 8); -								ydif = (yloc + 16) - (postinfo[e][1] + 8); - -								if ((abs(xdif) < 16 && abs(ydif) < 16)) { -									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -									rcSrc.left = postinfo[e][0] / 2; -									rcSrc.top = postinfo[e][1] / 2; -									rcSrc.setWidth(8); -									rcSrc.setHeight(8); - -									_clipbg2->fillRect(rcSrc, 0); - -									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); -								} -							} -						} -					} - -					y = apy; -					orn = 0; -					for (int x = apx; x >= 0; x--) { -						int rn = (int)(RND() * 3); - -						if (orn == 0) -							y = y - 1; -						if (orn == 2) -							y = y + 1; - -						drawLine(_videobuffer, x, y - 1, x, y + 2, cl1); -						drawLine(_videobuffer, x, y, x, y + 1, cl3); - -						if (rn == 0) -							drawLine(_videobuffer, x, y + 1, x, y + 1, cl2); -						if (rn == 2) -							drawLine(_videobuffer, x, y, x, y, cl2); - -						orn = rn; - -						if (spellinfo[i].damagewho == 0) { -							for (int e = 1; e <= _lastnpc; e++) { - -								xdif = (x + 16) - (_npcinfo[e].x + 12); -								ydif = (y + 16) - (_npcinfo[e].y + 12); - -								if ((abs(xdif) < 8 && abs(ydif) < 8)) { -									float damage = 30 * (1 + RND() * 0.5); - -									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) -										damageNPC(e, damage, 1); -								} -							} -						} - -						// check for post damage -						if (nposts > 0) { -							for (int e = 0; e <= nposts - 1; e++) { -								xdif = (xloc + 16) - (postinfo[e][0] + 8); -								ydif = (yloc + 16) - (postinfo[e][1] + 8); - -								if ((abs(xdif) < 16 && abs(ydif) < 16)) { -									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -									rcSrc.left = postinfo[e][0] / 2; -									rcSrc.top = postinfo[e][1] / 2; -									rcSrc.setWidth(8); -									rcSrc.setHeight(8); - -									_clipbg2->fillRect(rcSrc, 0); - -									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); -								} -							} -						} -					} - -					int x = apx; -					orn = 0; -					for (y = apy; y <= 239; y++) { -						int rn = (int)(RND() * 3); - -						if (orn == 0) -							x = x - 1; -						if (orn == 2) -							x = x + 1; - -						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); -						drawLine(_videobuffer, x, y, x + 1, y, cl3); - -						if (rn == 0) -							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); -						if (rn == 2) -							drawLine(_videobuffer, x, y, x, y, cl2); - -						orn = rn; - -						if (spellinfo[i].damagewho == 0) { -							for (int e = 1; e <= _lastnpc; e++) { -								xdif = (x + 16) - (_npcinfo[e].x + 12); -								ydif = (y + 16) - (_npcinfo[e].y + 12); - -								if ((abs(xdif) < 8 && abs(ydif) < 8)) { -									float damage = 30 * (1 + RND() * 0.5); - -									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) -										damageNPC(e, damage, 1); -								} -							} -						} - -						// check for post damage -						if (nposts > 0) { -							for (int e = 0; e <= nposts - 1; e++) { -								xdif = (xloc + 16) - (postinfo[e][0] + 8); -								ydif = (yloc + 16) - (postinfo[e][1] + 8); - -								if ((abs(xdif) < 16 && abs(ydif) < 16)) { -									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -									rcSrc.left = postinfo[e][0] / 2; -									rcSrc.top = postinfo[e][1] / 2; -									rcSrc.setWidth(8); -									rcSrc.setHeight(8); - -									_clipbg2->fillRect(rcSrc, 0); - -									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); -								} -							} -						} -					} - -					x = apx; -					orn = 0; -					for (y = apy; y >= 0; y--) { -						int rn = (int)(RND() * 3); - -						if (orn == 0) -							x = x - 1; -						if (orn == 2) -							x = x + 1; - -						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); -						drawLine(_videobuffer, x, y, x + 1, y, cl3); - -						if (rn == 0) -							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); -						if (rn == 2) -							drawLine(_videobuffer, x, y, x, y, cl2); - -						orn = rn; - -						if (spellinfo[i].damagewho == 0) { -							for (int e = 1; e <= _lastnpc; e++) { -								xdif = (x + 16) - (_npcinfo[e].x + 12); -								ydif = (y + 16) - (_npcinfo[e].y + 12); - -								if ((abs(xdif) < 8 && abs(ydif) < 8)) { -									float damage = 30 * (1 + RND() * 0.5); - -									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) -										damageNPC(e, damage, 1); -								} -							} -						} - -						// check for post damage -						if (nposts > 0) { -							for (int e = 0; e <= nposts - 1; e++) { -								xdif = (xloc + 16) - (postinfo[e][0] + 8); -								ydif = (yloc + 16) - (postinfo[e][1] + 8); - -								if ((abs(xdif) < 16 && abs(ydif) < 16)) { -									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -									rcSrc.left = postinfo[e][0] / 2; -									rcSrc.top = postinfo[e][1] / 2; -									rcSrc.setWidth(8); -									rcSrc.setHeight(8); - -									_clipbg2->fillRect(rcSrc, 0); - -									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); -								} -							} -						} -					} -				} - -				spellinfo[i].frame -= 0.5 * _fpsr; -				if (spellinfo[i].frame < 0) { -					spellinfo[i].frame = 0; -					_forcepause = false; -				} -			} - -			// wizard 1 lightning -			if (spellnum == 9) { - -				cl1 = _videobuffer->format.RGBToColor(0, 32, 204); -				cl2 = _videobuffer->format.RGBToColor(142, 173, 191); -				cl3 = _videobuffer->format.RGBToColor(240, 240, 240); - -				int px = spellinfo[i].enemyx + 12; -				int py = spellinfo[i].enemyy + 24; - -				int apx = px + (int)(RND() * 20 - 10); -				int apy = py + (int)(RND() * 20 - 10); - -				int x = apx; -				int orn = 0; -				for (int y = 0; y <= apy; y++) { -					if (y < 240) { -						int rn = (int)(RND() * 3); - -						if (orn == 0) -							x = x - 1; -						if (orn == 2) -							x = x + 1; - -						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); -						drawLine(_videobuffer, x, y, x + 1, y, cl3); - -						if (rn == 0) -							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); -						if (rn == 2) -							drawLine(_videobuffer, x, y, x, y, cl2); - -						orn = rn; - -						if (spellinfo[i].damagewho == 1) { - -							xdif = (x + 8) - (_player.px + 12); -							ydif = (y + 8) - (_player.py + 12); - -							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { -								float damage = ((float)_player.hp * 0.75) * (RND() * 0.5 + 0.5); -								if (damage < 5) -									damage = 5; - -								if (_npcinfo[spellinfo[i].npc].spriteset == kMonsterBatKitty) { -									if (damage < 50) -										damage = 40 + (int)(RND() * 40); -								} - -								if (_player.hp > 0) -									damagePlayer(damage); -							} -						} -					} -				} - -				spellinfo[i].frame -= 0.5 * _fpsr; -				if (spellinfo[i].frame < 0) { -					spellinfo[i].frame = 0; - -					_npcinfo[spellinfo[i].npc].attacking = 0; -					_npcinfo[spellinfo[i].npc].attacknext = _ticks + _npcinfo[spellinfo[i].npc].attackdelay; -				} -			} -		} -	} -} - - - -void GriffonEngine::updateSpellsUnder() { -	if (_forcepause) -		return; - -	for (int i = 0; i < kMaxSpell; i++) { -		if (spellinfo[i].frame > 0) { -			int spellnum = spellinfo[i].spellnum; - -			// water -			if (spellnum == 0) { -				int fra = (32 - spellinfo[i].frame); -				int fr = (int)((32 - spellinfo[i].frame) * 2) % 4; - -				rcSrc.left = fr * 48; -				rcSrc.top = 96; -				rcSrc.setWidth(48); -				rcSrc.setHeight(48); - -				rcDest.left = spellinfo[i].enemyx - 12; -				rcDest.top = spellinfo[i].enemyy - 8; - -				int f = 160; -				if (fra < 8) -					f = 160 * fra / 8; -				if (fra > 24) -					f = 160 * (1 - (fra - 24) / 8); - -				_spellimg->setAlpha(f, true); -				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); -				_spellimg->setAlpha(255, true); - -				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; - - -				for (f = 1; f <= _lastnpc; f++) { -					int xdif = spellinfo[i].enemyx - _npcinfo[f].x; -					int ydif = spellinfo[i].enemyy - _npcinfo[f].y; - -					float dist = sqrt((float)(xdif * xdif + ydif * ydif)); - -					if (dist > 20) -						dist = 20; - -					if (dist > 5) { -						float ratio = (1 - dist / 25); - -						float newx = _npcinfo[f].x + ratio * xdif / 3 * _fpsr; -						float newy = _npcinfo[f].y + ratio * ydif / 3 * _fpsr; - -						int sx = (newx / 2 + 6); -						int sy = (newy / 2 + 10); - -						unsigned int *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -						unsigned int dq = *temp; - -						if (dq == 0) { -							_npcinfo[f].x = newx; -							_npcinfo[f].y = newy; -							// _npcinfo[f].castpause = _ticks + 200; -						} else { -							int xpass = 0; -							int ypass = 0; - -							sx = (newx / 2 + 6); -							sy = (_npcinfo[f].y / 2 + 10); -							temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -							dq = *temp; - -							if (dq == 0) -								xpass = 1; - - -							sx = (_npcinfo[f].x / 2 + 6); -							sy = (newy / 2 + 10); -							temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -							dq = *temp; - -							if (dq == 0) -								ypass = 1; - -							if (ypass == 1) { -								newx = _npcinfo[f].x; -							} else if (xpass == 1) { -								newy = _npcinfo[f].y; -							} - -							if (xpass == 1 || ypass == 1) { -								_npcinfo[f].x = newx; -								_npcinfo[f].y = newy; -								// _npcinfo[f].castpause = _ticks + 200; -							} -						} -					} -				} -			} - -			// fire -			if (spellnum == 3) { -				float fr = (32 - spellinfo[i].frame); - -				fr = fr * fr * (1 - cos(3.14159 / 4 + 3.14159 / 4 * fr / 32)); - -				if (fr > 32) -					fr = 32; - -				float s = 8; -				if (spellinfo[i].frame < 8) -					s = spellinfo[i].frame; - -				int fra = (int)fr; - -				for (int f = 0; f <= 4; f++) { -					for (int x = 0; x <= fra; x += 2) { -						if (spellinfo[i].legalive[f] >= x) { -							_spellimg->setAlpha(192 * sin(3.14159 * x / 32) * s / 8, true); - -							float an = 360 / 5 * f + x / 32 * 180; - -							rcSrc.left = 16 * (int)(RND() * 2); -							rcSrc.top = 80; -							rcSrc.setWidth(16); -							rcSrc.setHeight(16); - -							float xloc = (float)(spellinfo[i].enemyx + 4 + x * 2 * cos(3.14159 / 180 * an) + (int)(RND() * 3) - 1); -							float yloc = (float)(spellinfo[i].enemyy + 4 + x * 2 * sin(3.14159 / 180 * an) + (int)(RND() * 3) - 1); -							rcDest.left = (int)xloc; -							rcDest.top = (int)yloc; - -							if (xloc > -1 && xloc < 304 && yloc > -1 && yloc < 224) { -								_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); - -								int sx = (xloc / 2 + 4); -								int sy = (yloc / 2 + 8); - -								unsigned int *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); -								unsigned int dq = *temp; - -								if (dq > 1000 && x > 4) -									spellinfo[i].legalive[f] = x; - -								if (spellinfo[i].damagewho == 0) { -									for (int e = 1; e <= _lastnpc; e++) { -										float xdif = (xloc + 8) - (_npcinfo[e].x + 12); -										float ydif = (yloc + 8) - (_npcinfo[e].y + 12); - -										if ((abs(xdif) < 8 && abs(ydif) < 8)) { -											float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; - -											if (_npcinfo[e].spriteset == kMonsterFireHydra) -												damage = -damage; -											if (_npcinfo[e].spriteset == kMonsterFinalBoss) -												damage = -damage; -											if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { -												damageNPC(e, damage, 1); -												if (config.effects) { -													int snd = playSound(_sfx[kSndFire]); -													setChannelVolume(snd, config.effectsvol); -												} -											} -										} -									} -								} - -								if (spellinfo[i].damagewho == 1) { -									float xdif = (xloc + 8) - (_player.px + 12); -									float ydif = (yloc + 8) - (_player.py + 12); - -									if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { -										float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); - -										if (_player.hp > 0) { -											damagePlayer(damage); - -											if (config.effects) { -												int snd = playSound(_sfx[kSndFire]); -												setChannelVolume(snd, config.effectsvol); -											} -										} -									} -								} - -								// check for post damage -								if (nposts > 0) { -									for (int e = 0; e <= nposts - 1; e++) { -										float xdif = (xloc + 8) - (postinfo[e][0] + 8); -										float ydif = (yloc + 8) - (postinfo[e][1] + 8); - -										if ((abs(xdif) < 8 && abs(ydif) < 8)) { -											_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; -											_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; - -											rcSrc.left = postinfo[e][0] / 2; -											rcSrc.top = postinfo[e][1] / 2; -											rcSrc.setWidth(8); -											rcSrc.setHeight(8); - -											_clipbg2->fillRect(rcSrc, 0); - -											if (config.effects) { -												int snd = playSound(_sfx[kSndFire]); -												setChannelVolume(snd, config.effectsvol); -											} - -											addFloatIcon(99, postinfo[e][0], postinfo[e][1]); -										} -									} -								} -							} -						} -					} -				} - -				_spellimg->setAlpha(255, true); - -				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; - - -			} - - -			// sprite 6 spitfire -			if (spellnum == 7) { -				float xspan = spellinfo[i].enemyx - spellinfo[i].homex; -				float yspan = spellinfo[i].enemyy - spellinfo[i].homey; -				float fr = (32 - spellinfo[i].frame); - -				for (int f = 0; f <= 7; f++) { -					int alpha = 0; -					float xx = 0; -					if (fr > f * 2 && fr < f * 2 + 16) -						xx = fr - f * 2; -					if (xx < 8) -						alpha = 255 * xx / 8; -					if (xx > 8) -						alpha = 255 * (1 - (xx - 8) / 8); -					float yy = 16 * sin(3.141592 / 2 * xx / 16) - 8; - -					if (alpha < 0) -						alpha = 0; -					if (alpha > 255) -						alpha = 255; - -					_spellimg->setAlpha(alpha, true); - -					rcSrc.left = 16 * (int)(RND() * 2); -					rcSrc.top = 80; -					rcSrc.setWidth(16); -					rcSrc.setHeight(16); - -					float xloc = spellinfo[i].homex + xspan / 7 * f; -					float yloc = spellinfo[i].homey + yspan / 7 * f - yy; - -					rcDest.left = xloc; -					rcDest.top = yloc; - -					if (xloc > -16 && xloc < 320 && yloc > -16 && yloc < 240) { -						_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); - -						if (spellinfo[i].damagewho == 1) { -							float xdif = (xloc + 8) - (_player.px + 12); -							float ydif = (yloc + 8) - (_player.py + 12); - -							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks && alpha > 64) { -								float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); - -								if (_player.hp > 0) { -									damagePlayer(damage); -									if (config.effects) { -										int snd = playSound(_sfx[kSndFire]); -										setChannelVolume(snd, config.effectsvol); -									} -								} - -							} -						} - -					} - -				} - -				_spellimg->setAlpha(255, true); -				spellinfo[i].frame = spellinfo[i].frame - 0.5 * _fpsr; -				if (spellinfo[i].frame < 0) -					spellinfo[i].frame = 0; - -				if (ABS(spellinfo[i].frame) < 0) { -					_npcinfo[spellinfo[i].npc].attacking = 0; -					_npcinfo[spellinfo[i].npc].attacknext = _ticks + _npcinfo[spellinfo[i].npc].attackdelay; -				} -			} -		} -	} -} -  } // end of namespace Griffon diff --git a/engines/griffon/griffon.h b/engines/griffon/griffon.h index 704d6f6570..f56ec878d0 100644 --- a/engines/griffon/griffon.h +++ b/engines/griffon/griffon.h @@ -325,15 +325,9 @@ private:  	// engine.cpp  	float RND(); -	void newGame();  	void mainLoop(); -	void updateAnims(); -	void updateY(); -	void updateNPCs(); -	void updateSpells(); -	void updateSpellsUnder(); -  	void updateEngine(); +	void newGame();  	// gfx.cpp  	void addFloatIcon(int ico, float xloc, float yloc); @@ -349,6 +343,13 @@ private:  	void checkTrigger();  	void processTrigger(int trignum); +	// logic.cpp +	void updateAnims(); +	void updateY(); +	void updateNPCs(); +	void updateSpells(); +	void updateSpellsUnder(); +  	// resources.cpp  	void initialize();  	Graphics::TransparentSurface *loadImage(const char *name, bool colorkey = false); diff --git a/engines/griffon/logic.cpp b/engines/griffon/logic.cpp new file mode 100644 index 0000000000..50ca72ce35 --- /dev/null +++ b/engines/griffon/logic.cpp @@ -0,0 +1,2397 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * + *              Originally written by Syn9 in FreeBASIC with SDL + *              http://syn9.thehideoutgames.com/index_backup.php + * + *            Ported to plain C for GCW-Zero handheld by Dmitry Smagin + *                http://github.com/dmitrysmagin/griffon_legend + * + * + *                 Programming/Graphics: Daniel "Syn9" Kennedy + *                     Music/Sound effects: David Turner + * + *                   Beta testing and gameplay design help: + *                    Deleter, Cha0s, Aether Fox, and Kiz + * + */ + +#include "griffon/griffon.h" +#include "griffon/config.h" + +namespace Griffon { + +// memo + +/* + chests +  0 - regular flask + 11 - key chest + 14 - blue flask chest + 15 - lightning chest + 16 - armour chest + 17 - citadel master key + 18 - sword3 + 19 - shield3 + 20 - armour3 + +*/ + +// element tile locations +const int elementmap[15][20] = { +	{  2, 2, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, +	{  2, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, +	{  2, -1, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 }, +	{  2, -1, 2, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{  2, 2, 2, 2, 2, -1, -1, -1, 2, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, 2, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, 0, 0, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, +	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } +}; + + +void GriffonEngine::updateAnims() { +	for (int i = 0; i <= _lastObj; i++) { +		int nframes = _objectInfo[i][0]; +		int o_animspd = _objectInfo[i][3]; +		float frame = _objectFrame[i][0]; +		int cframe = _objectFrame[i][1]; +		// _objectinfo[i][6] = 0; // ?? out of bounds + +		if (nframes > 1) { +			frame = frame + o_animspd / 50 * _fpsr; +			while (frame >= nframes) +				frame = frame - nframes; + +			cframe = (int)frame; // truncate fractional part +			if (cframe > nframes) +				cframe = nframes - 1; +			if (cframe < 0) +				cframe = 0; + +			_objectFrame[i][0] = frame; +			_objectFrame[i][1] = cframe; +		} +	} +} + +void GriffonEngine::updateY() { +	for (int i = 0; i <= 2400; i++) +		_ysort[i] = -1; + +	int ff = (int)(_player.py * 10); +	if (ff < 0) // HACKFIX or _ysort[yy] may go out of bounds +		ff = 0; +	_player.ysort = ff; +	_ysort[ff] = 0; + +	_firsty = 2400; +	_lasty = 0; + +	for (int i = 1; i <= _lastnpc; i++) { +		int yy = (int)(_npcinfo[i].y * 10); + +		do { +			if (_ysort[yy] == -1 || yy == 2400) +				break; +			yy = yy + 1; +		} while (1); + +		_ysort[yy] = i; +		if (yy < _firsty) +			_firsty = yy; +		if (yy > _lasty) +			_lasty = yy; +	} +} + +void GriffonEngine::updateNPCs() { +	for (int i = 1; i <= _lastnpc; i++) { +		if (_npcinfo[i].hp > 0) { +			//  is npc walking +			int pass = 0; +			if (_npcinfo[i].attacking == 0) +				pass = 1; +			if (_npcinfo[i].spriteset == kMonsterFireHydra) +				pass = 1; +			if (pass == 1) { +				int moveup = 0; +				int movedown = 0; +				int moveleft = 0; +				int moveright = 0; + +				float npx = _npcinfo[i].x; +				float npy = _npcinfo[i].y; + +				float onpx = npx; +				float onpy = npy; + +				float wspd = _npcinfo[i].walkspd / 4; + +				if (_npcinfo[i].spriteset == kMonsterDragon2) +					wspd = wspd * 2; +				int wdir = _npcinfo[i].walkdir; + +				int mode = _npcinfo[i].movementmode; + +				float xdif = _player.px - npx; +				float ydif = _player.py - npy; + +				if (abs(xdif) < 4 * 16 && abs(ydif) < 4 * 16 && mode < 3) +					mode = 0; +				if (_npcinfo[i].hp < _npcinfo[i].maxhp * 0.25) +					mode = 3; + +				if (_npcinfo[i].pause > _ticks) +					mode = -1; +				if (_npcinfo[i].spriteset == kMonsterOneWing && _npcinfo[i].castpause > _ticks) +					mode = -1; + +				if (mode == 3) { +					mode = 1; +					if (abs(xdif) < 4 * 16 && abs(ydif) < 4 * 16) +						mode = 3; +				} + +				bool checkpass = false; + +				// npc  AI CODE +				// -------------- + +				// *** aggressive +				if (mode == 0) { +					wspd = _npcinfo[i].walkspd / 2; + +					xdif = _player.px - npx; +					ydif = _player.py - npy; + +					if (abs(xdif) > abs(ydif)) { +						if (xdif < 4) +							wdir = 2; +						if (xdif > -4) +							wdir = 3; +					} else { +						if (ydif < 4) +							wdir = 0; +						if (ydif > -4) +							wdir = 1; +					} + +					if (xdif < 4) +						moveleft = 1; +					if (xdif > -4) +						moveright = 1; +					if (ydif < 4) +						moveup = 1; +					if (ydif > -4) +						movedown = 1; +				} +				// ******************* + +				// *** defensive +				if (mode == 1) { + +					int movingdir = _npcinfo[i].movingdir; + +					if (_npcinfo[i].ticks > _ticks + 100000) +						_npcinfo[i].ticks = _ticks; + +					if (_npcinfo[i].ticks < _ticks) { +						_npcinfo[i].ticks = _ticks + 2000; +						movingdir = (int)(RND() * 8); +						_npcinfo[i].movingdir = movingdir; +					} + +					if (movingdir == 0) { +						wdir = 2; // left +						moveup = 1; +						moveleft = 1; +					} else if (movingdir == 1) { +						wdir = 0; // up +						moveup = 1; +					} else if (movingdir == 2) { +						wdir = 3; // right +						moveup = 1; +						moveright = 1; +					} else if (movingdir == 3) { +						wdir = 3; // right +						moveright = 1; +					} else if (movingdir == 4) { +						wdir = 3; // right +						moveright = 1; +						movedown = 1; +					} else if (movingdir == 5) { +						wdir = 1; // down +						movedown = 1; +					} else if (movingdir == 6) { +						wdir = 2; // left +						movedown = 1; +						moveleft = 1; +					} else if (movingdir == 7) { +						wdir = 2; // left +						moveleft = 1; +					} + +					checkpass = true; +				} +				// ******************* + +				// *** run away +				if (mode == 3) { +					wspd = _npcinfo[i].walkspd / 2; + +					xdif = _player.px - npx; +					ydif = _player.py - npy; + +					if (abs(xdif) > abs(ydif)) { +						if (xdif < 4) +							wdir = 3; +						if (xdif > -4) +							wdir = 2; +					} else { +						if (ydif < 4) +							wdir = 1; +						if (ydif > -4) +							wdir = 0; +					} + +					if (xdif < 4) +						moveright = 1; +					if (xdif > -4) +						moveleft = 1; +					if (ydif < 4) +						movedown = 1; +					if (ydif > -4) +						moveup = 1; +				} +				// ******************* + +				// -------------- ?? move*** vs movin*** +				int movinup = 0; +				int movindown = 0; +				int movinleft = 0; +				int movinright = 0; + +				float xp = (npx / 2 + 6); +				float yp = (npy / 2 + 10); + +				if (_npcinfo[i].spriteset == kMonsterDragon2) +					wspd = wspd * 2; + +				float ii = wspd * _fpsr; +				if (ii < 1) +					ii = 1; + +				if (moveup) { +					int sx = xp; +					int sy = yp - ii; +					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +					uint32 dq = *temp; +					if (_npcinfo[i].spriteset == kMonsterFinalBoss) +						dq = 0; + +					if (dq == 0) +						movinup = 1; +					if (dq > 0) { +						sx = xp - ii; +						sy = yp - ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinup = 1; +							movinleft = 1; +						} +					} +					if (dq > 0) { +						sx = xp + ii; +						sy = yp - ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinup = 1; +							movinright = 1; +						} +					} +				} + +				if (movedown) { +					int sx = xp; +					int sy = yp + ii; +					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +					uint32 dq = *temp; +					if (_npcinfo[i].spriteset == kMonsterFinalBoss) +						dq = 0; +					if (dq == 0) +						movindown = 1; +					if (dq > 0) { +						sx = xp - ii; +						sy = yp + ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movindown = 1; +							movinleft = 1; +						} +					} +					if (dq > 0) { +						sx = xp + ii; +						sy = yp + ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movindown = 1; +							movinright = 1; +						} +					} +				} + +				if (moveleft) { +					int sx = xp - ii; +					int sy = yp; +					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +					uint32 dq = *temp; +					if (_npcinfo[i].spriteset == kMonsterFinalBoss) +						dq = 0; +					if (dq == 0) +						movinleft = 1; +					if (dq > 0) { +						sx = xp - ii; +						sy = yp - ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinleft = 1; +							movinup = 1; +						} +					} +					if (dq > 0) { +						sx = xp - ii; +						sy = yp + ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinleft = 1; +							movindown = 1; +						} +					} +				} + +				if (moveright) { +					int sx = xp + ii; +					int sy = yp; +					uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +					uint32 dq = *temp; +					if (_npcinfo[i].spriteset == kMonsterFinalBoss) +						dq = 0; +					if (dq == 0) +						movinright = 1; +					if (dq > 0) { +						sx = xp + ii; +						sy = yp - ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinright = 1; +							movinup = 1; +						} +					} +					if (dq > 0) { +						sx = xp + ii; +						sy = yp + ii; +						temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						dq = *temp; +						if (_npcinfo[i].spriteset == kMonsterFinalBoss) +							dq = 0; +						if (dq == 0) { +							movinright = 1; +							movindown = 1; +						} +					} +				} + +				if (movinup) +					npy = npy - wspd * _fpsr; +				if (movindown) +					npy = npy + wspd * _fpsr; +				if (movinleft) +					npx = npx - wspd * _fpsr; +				if (movinright) +					npx = npx + wspd * _fpsr; + +				if (checkpass) { +					pass = 0; +					if (npx >= _npcinfo[i].x1 * 16 - 8 && npx <= _npcinfo[i].x2 * 16 + 8 && npy >= _npcinfo[i].y1 * 16 - 8 && npy <= _npcinfo[i].y2 * 16 + 8) +						pass = 1; +					if (pass == 0) { +						npx = onpx; +						npy = onpy; +						_npcinfo[i].ticks = _ticks; +					} +				} + +				float aspd = wspd; + +				if (_npcinfo[i].spriteset == kMonsterDragon2) +					aspd = wspd / 2; + +				xp = (npx / 2 + 6); +				yp = (npy / 2 + 10); + +				int sx = xp; +				int sy = yp; +				uint32 *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +				uint32 bgc = *temp; + +				float anpx = npx + 12; +				float anpy = npy + 20; + +				int lx = (int)anpx / 16; +				int ly = (int)anpy / 16; + +				if (_triggerloc[lx][ly] > -1) +					bgc = 1; +				if (_npcinfo[i].spriteset == kMonsterFinalBoss) +					bgc = 0; + +				int rst = 0; + +				if (_npcinfo[i].spriteset == kMonsterFinalBoss) { +					if (npx < 40 || npx > 280 || npy < 36 || npy > 204) +						rst = 1; +				} + +				if (bgc > 0 || rst == 1) { +					npx = onpx; +					npy = onpy; +				} + +				_npcinfo[i].x = npx; +				_npcinfo[i].y = npy; + +				_npcinfo[i].walkdir = wdir; +				_npcinfo[i].moving = 0; + +				if (npx != onpx || npy != onpy) +					_npcinfo[i].moving = 1; + +				if (_npcinfo[i].moving == 1) { +					float frame = _npcinfo[i].frame; +					int cframe = _npcinfo[i].cframe; + +					frame = frame + aspd * _fpsr; +					while (frame >= 16) +						frame = frame - 16; + +					cframe = (int)(frame); +					if (cframe > 16) +						cframe = 16 - 1; +					if (cframe < 0) +						cframe = 0; + +					_npcinfo[i].frame = frame; +					_npcinfo[i].cframe = cframe; +				} + +				// spriteset1 specific +				if (_npcinfo[i].spriteset == kMonsterBabyDragon && _npcinfo[i].attackattempt < _ticks) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						if (abs(xdif) < 20 && abs(ydif) < 20) { +							_npcinfo[i].attackattempt = _ticks + 100; +							if ((int)(RND() * 2) == 0) { +								if (config.effects) { +									int snd = playSound(_sfx[kSndEnemyHit]); +									setChannelVolume(snd, config.effectsvol); +								} + +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; +							} +						} +					} +				} + +				bool dospell = false; + +				// onewing specific +				if (_npcinfo[i].spriteset == kMonsterOneWing) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						if (abs(xdif) < 24 && abs(ydif) < 24) { +							float dist = sqrt(xdif * xdif + ydif * ydif); + +							if ((dist) < 24) { +								if (config.effects) { +									int snd = playSound(_sfx[kSndBite]); +									setChannelVolume(snd, config.effectsvol); +								} + +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; + +								_npcinfo[i].headtargetx[0] = _player.px + 12; +								_npcinfo[i].headtargety[0] = _player.py - 4; +							} +						} + +					} + +					dospell = false; + +					if (_npcinfo[i].attacking == 0 && _npcinfo[i].castpause < _ticks) { +						_npcinfo[i].swayspd = _npcinfo[i].swayspd + _npcinfo[i].swayspd / 200 * _fpsr; +						if (_npcinfo[i].swayspd > 15) { +							dospell = true; +							_npcinfo[i].swayspd = 1; +						} + +						// sway code +						_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; +						if (_npcinfo[i].swayangle >= 360) +							_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; + +						_npcinfo[i].headtargetx[0] = _npcinfo[i].x + (24 - _npcinfo[i].swayspd / 2) * sin(3.14159 / 180 * _npcinfo[i].swayangle) + 12; +						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16 + 8 * sin(3.14159 * 2 / 180 * _npcinfo[i].swayangle); +					} + +					if (dospell) { +						_npcinfo[i].pause = _ticks + 3000; +						_npcinfo[i].attacknext = _ticks + 4500; +						_npcinfo[i].castpause = _ticks + 4500; + +						castSpell(3, _npcinfo[i].x, _npcinfo[i].y, _npcinfo[i].x, _npcinfo[i].y, i); + +						_npcinfo[i].headtargetx[0] = _npcinfo[i].x; +						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16; +					} + +					// targethead code +					xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; +					ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; + + +					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; +					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; + + +					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; +					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; + +					for (int f = 6; f >= 1; f--) { +						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; +						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; + +						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; +						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; + +						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx) / 3; +						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty) / 3; +					} +				} + +				// boss1 specific and blackknight +				if (_npcinfo[i].spriteset == kMonsterBoss1 || _npcinfo[i].spriteset == kMonsterBlackKnight) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						_npcinfo[i].attacking = 1; +						_npcinfo[i].attackframe = 0; + +						castSpell(1, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); +					} + +					if (_npcinfo[i].castpause < _ticks) { +						castSpell(6, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); +						_npcinfo[i].castpause = _ticks + 12000; +					} +				} + + +				// firehydra specific +				if (_npcinfo[i].spriteset == kMonsterFireHydra) { +					_npcinfo[i].swayspd = 4; + +					// sway code +					_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; +					if (_npcinfo[i].swayangle >= 360) +						_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; + +					for (int ff = 0; ff <= 2; ff++) { +						if (_npcinfo[i].hp > 10 * ff * 20) { +							if (_npcinfo[i].pause < _ticks && _npcinfo[i].attacking2[ff] == 0 && _npcinfo[i].attacknext2[ff] < _ticks) { +								npx = _npcinfo[i].x; +								npy = _npcinfo[i].y; + +								xdif = _player.px - npx; +								ydif = _player.py - npy; + +								if (abs(xdif) < 48 && abs(ydif) < 48) { +									float dist = sqrt(xdif * xdif + ydif * ydif); + +									if ((dist) < 36) { +										if (config.effects) { +											int snd = playSound(_sfx[kSndBite]); +											setChannelVolume(snd, config.effectsvol); +										} + +										_npcinfo[i].attacking = 1; +										_npcinfo[i].attacking2[ff] = 1; +										_npcinfo[i].attackframe2[ff] = 0; + +										_npcinfo[i].headtargetx[ff] = _player.px + 12; +										_npcinfo[i].headtargety[ff] = _player.py - 4; + +										_npcinfo[i].swayangle = 0; +									} +								} + +							} + +							if (_npcinfo[i].attacking2[ff] == 0) { +								_npcinfo[i].headtargetx[ff] = _npcinfo[i].x + 38 * sin(3.14159 / 180 * (_npcinfo[i].swayangle + 120 * ff)) + 12; +								_npcinfo[i].headtargety[ff] = _npcinfo[i].y - 46 + 16 + 16 * sin(3.14159 * 2 / 180 * (_npcinfo[i].swayangle + 120 * ff)); +							} + +							// targethead code +							xdif = _npcinfo[i].bodysection[10 * ff + 9].x - _npcinfo[i].headtargetx[ff]; +							ydif = _npcinfo[i].bodysection[10 * ff + 9].y - _npcinfo[i].headtargety[ff]; + +							_npcinfo[i].bodysection[10 * ff + 9].x = _npcinfo[i].bodysection[10 * ff + 9].x  - xdif * 0.4 * _fpsr; +							_npcinfo[i].bodysection[10 * ff + 9].y = _npcinfo[i].bodysection[10 * ff + 9].y  - ydif * 0.4 * _fpsr; + +							_npcinfo[i].bodysection[10 * ff].x = _npcinfo[i].x + 12 + 8 * cos(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); +							_npcinfo[i].bodysection[10 * ff].y = _npcinfo[i].y + 12 + 8 * sin(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); + +							for (int f = 8; f >= 1; f--) { +								xdif = _npcinfo[i].bodysection[ff * 10 + f + 1].x - _npcinfo[i].bodysection[ff * 10 + f - 1].x; +								ydif = _npcinfo[i].bodysection[ff * 10 + f + 1].y - _npcinfo[i].bodysection[ff * 10 + f - 1].y; + +								float tx = _npcinfo[i].bodysection[ff * 10 + f - 1].x + xdif / 2; +								float ty = _npcinfo[i].bodysection[ff * 10 + f - 1].y + ydif / 2; + +								_npcinfo[i].bodysection[ff * 10 + f].x = _npcinfo[i].bodysection[ff * 10 + f].x - (_npcinfo[i].bodysection[ff * 10 + f].x - tx) / 3; +								_npcinfo[i].bodysection[ff * 10 + f].y = _npcinfo[i].bodysection[ff * 10 + f].y - (_npcinfo[i].bodysection[ff * 10 + f].y - ty) / 3; +							} +						} +					} +				} + +				// spriteset6 specific +				if (_npcinfo[i].spriteset == kMonsterRedDragon && _npcinfo[i].attackattempt < _ticks) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						pass = 0; +						if (abs(xdif) < 48 && abs(ydif) < 6) +							pass = 1; +						if (abs(ydif) < 48 && abs(xdif) < 6) +							pass = 2; + +						if (pass > 0) { +							_npcinfo[i].attackattempt = _ticks + 100; +							if ((int)(RND() * 2) == 0) { +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; +								float nnxa = 0, nnya = 0, nnxb = 0, nnyb = 0; + +								if (pass == 1 && xdif < 0) { +									nnxa = npx - 8; +									nnya = npy + 4; +									nnxb = npx - 48 - 8; +									nnyb = npy + 4; +								} else if (pass == 1 && xdif > 0) { +									nnxa = npx + 16; +									nnya = npy + 4; +									nnxb = npx + 16 + 48; +									nnyb = npy + 4; +								} else if (pass == 2 && ydif < 0) { +									nnya = npy; +									nnxa = npx + 4; +									nnyb = npy - 48; +									nnxb = npx + 4; +								} else if (pass == 2 && ydif > 0) { +									nnya = npy + 20; +									nnxa = npx + 4; +									nnyb = npy + 20 + 48; +									nnxb = npx + 4; +								} + +								castSpell(7, nnxa, nnya, nnxb, nnyb, i); +							} +						} +					} +				} + +				// wizard1 specific +				if (_npcinfo[i].spriteset == kMonsterPriest) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						_npcinfo[i].attacking = 1; +						_npcinfo[i].attackframe = 0; + +						castSpell(9, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i); +					} + +					if (_npcinfo[i].castpause < _ticks) { +						// castSpell 6, _npcinfo[i].x, _npcinfo[i].y, _player.px, _player.py, i +						// _npcinfo[i].castpause = _ticks + 12000 +					} + +				} + +				// spriteset6 specific +				if (_npcinfo[i].spriteset == kMonsterYellowDragon && _npcinfo[i].attackattempt < _ticks) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						pass = 0; +						if (abs(xdif) < 56 && abs(ydif) < 6) +							pass = 1; +						if (abs(ydif) < 56 && abs(xdif) < 6) +							pass = 2; + +						if (pass > 0) { +							_npcinfo[i].attackattempt = _ticks + 100; +							if ((int)(RND() * 2) == 0) { +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; + +								float nnxa = 0, nnya = 0, nnxb = 0, nnyb = 0; +								if (pass == 1 && xdif < 0) { +									nnxa = npx - 8; +									nnya = npy + 4; +									nnxb = npx - 56 - 8; +									nnyb = npy + 4; +									_npcinfo[i].walkdir = 2; +								} else if (pass == 1 && xdif > 0) { +									nnxa = npx + 16; +									nnya = npy + 4; +									nnxb = npx + 16 + 56; +									nnyb = npy + 4; +									_npcinfo[i].walkdir = 3; +								} else if (pass == 2 && ydif < 0) { +									nnya = npy; +									nnxa = npx + 4; +									nnyb = npy - 56; +									nnxb = npx + 4; +									_npcinfo[i].walkdir = 0; +								} else if (pass == 2 && ydif > 0) { +									nnya = npy + 20; +									nnxa = npx + 4; +									nnyb = npy + 20 + 56; +									nnxb = npx + 4; +									_npcinfo[i].walkdir = 1; +								} + +								castSpell(7, nnxa, nnya, nnxb, nnyb, i); +							} +						} +					} +				} + +				// twowing specific +				if (_npcinfo[i].spriteset == kMonsterTwoWing) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].bodysection[7].x; +						npy = _npcinfo[i].bodysection[7].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						if (abs(xdif) < 24 && abs(ydif) < 24) { +							float dist = sqrt(xdif * xdif + ydif * ydif); + +							if ((dist) < 24) { +								if (config.effects) { +									int snd = playSound(_sfx[kSndBite]); +									setChannelVolume(snd, config.effectsvol); +								} + +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; + +								_npcinfo[i].headtargetx[0] = _player.px + 12; +								_npcinfo[i].headtargety[0] = _player.py - 4; +							} +						} + +					} + +					if (_npcinfo[i].attacking == 0 && _npcinfo[i].castpause < _ticks) { +						_npcinfo[i].swayspd = 4; + +						// sway code +						_npcinfo[i].swayangle = _npcinfo[i].swayangle + _npcinfo[i].swayspd * _fpsr; +						if (_npcinfo[i].swayangle >= 360) +							_npcinfo[i].swayangle = _npcinfo[i].swayangle - 360; + +						_npcinfo[i].headtargetx[0] = _npcinfo[i].x + (24 - _npcinfo[i].swayspd / 2) * sin(3.14159 / 180 * _npcinfo[i].swayangle) + 12; +						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16 + 8 * sin(3.14159 * 2 / 180 * _npcinfo[i].swayangle); +					} + +					if (dospell) { +						_npcinfo[i].pause = _ticks + 3000; +						_npcinfo[i].attacknext = _ticks + 5000; +						_npcinfo[i].castpause = _ticks + 3000; + +						castSpell(3, _npcinfo[i].x, _npcinfo[i].y, _npcinfo[i].x, _npcinfo[i].y, i); + +						_npcinfo[i].headtargetx[0] = _npcinfo[i].x; +						_npcinfo[i].headtargety[0] = _npcinfo[i].y - 36 + 16; +					} + +					// targethead code +					xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; +					ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; + + +					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; +					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; + +					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; +					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; + +					for (int f = 6; f >= 1; f--) { +						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; +						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; + +						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; +						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; + +						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx) / 3; +						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty) / 3; +					} + +				} + +				// dragon2 specific +				if (_npcinfo[i].spriteset == kMonsterDragon2 && _npcinfo[i].attackattempt < _ticks) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						if (abs(xdif) < 32 && abs(ydif) < 32) { +							_npcinfo[i].attackattempt = _ticks + 100; +							if ((int)(RND() * 2) == 0) { +								if (config.effects) { +									int snd = playSound(_sfx[kSndEnemyHit]); +									setChannelVolume(snd, config.effectsvol); +								} + +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; +							} +						} +					} +				} + + +				// endboss specific +				if (_npcinfo[i].spriteset == kMonsterFinalBoss && _npcinfo[i].attackattempt < _ticks) { +					if (_npcinfo[i].attacknext < _ticks && _npcinfo[i].pause < _ticks && _npcinfo[i].attacking == 0) { +						npx = _npcinfo[i].x; +						npy = _npcinfo[i].y; + +						xdif = _player.px - npx; +						ydif = _player.py - npy; + +						if (abs(xdif) < 38 && abs(ydif) < 38) { +							_npcinfo[i].attackattempt = _ticks + 100; +							if ((int)(RND() * 2) == 0) { +								if (config.effects) { +									int snd = playSound(_sfx[kSndIce]); +									setChannelVolume(snd, config.effectsvol); +								} +								_npcinfo[i].attacking = 1; +								_npcinfo[i].attackframe = 0; +							} +						} +					} +				} +			} + + +			float npx = _npcinfo[i].x; +			float npy = _npcinfo[i].y; + +			int xp = (npx / 2 + 6); +			int yp = (npy / 2 + 10); + +			rcSrc.left = xp - 1; +			rcSrc.top = yp - 1; +			rcSrc.setWidth(3); +			rcSrc.setHeight(3); + +			if (_npcinfo[i].pause < _ticks) +				_clipbg->fillRect(rcSrc, i); + + +			pass = 0; +			if (_npcinfo[i].attacking == 1) +				pass = 1; +			if (_npcinfo[i].spriteset == kMonsterFireHydra) { +				if (_npcinfo[i].attacking2[0] == 1) +					pass = 1; +				if (_npcinfo[i].attacking2[1] == 1) +					pass = 1; +				if (_npcinfo[i].attacking2[2] == 1) +					pass = 1; +			} + +			if (pass == 1) { +				int dist; +				float damage; +				// spriteset1 specific +				if (_npcinfo[i].spriteset == kMonsterBabyDragon) { +					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; +					if (_npcinfo[i].attackframe >= 16) { +						_npcinfo[i].attackframe = 0; +						_npcinfo[i].attacking = 0; +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +					} + +					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +					npx = _npcinfo[i].x; +					npy = _npcinfo[i].y; + +					float xdif = _player.px - npx; +					float ydif = _player.py - npy; + +					dist = 10; + +					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +						// _npcinfo[i].attackframe = 0; +						// _npcinfo[i].attacking = 0; + +						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); + +						if (_player.hp > 0) +							damagePlayer(damage); +					} +				} + +				if (_npcinfo[i].spriteset == kMonsterOneWing) { +					// targethead code +					float xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; +					float ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; + +					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x  - xdif * 0.4 * _fpsr; +					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y  - ydif * 0.4 * _fpsr; + +					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; +					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; + +					for (int f = 6; f >= 1; f--) { +						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; +						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; + +						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; +						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; + +						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx); +						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty); +					} + +					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; +					if (_npcinfo[i].attackframe >= 16) { +						_npcinfo[i].attackframe = 0; +						_npcinfo[i].attacking = 0; +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +					} + +					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +					npx = _npcinfo[i].bodysection[7].x; +					npy = (_npcinfo[i].bodysection[7].y + 16); + +					xdif = (_player.px + 12) - npx; +					ydif = (_player.py + 12) - npy; + +					dist = 8; + +					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +						// _npcinfo[i].attackframe = 0 +						// _npcinfo[i].attacking = 0 +						damage = (float)_npcinfo[i].attackdamage * (1.0 + (RND() * 0.5)); +						if (_player.hp > 0) +							damagePlayer(damage); +					} +				} + + +				// firehydra +				if (_npcinfo[i].spriteset == kMonsterFireHydra) { +					for (int ff = 0; ff <= 2; ff++) { +						if (_npcinfo[i].attacking2[ff] == 1) { +							float xdif = _npcinfo[i].bodysection[10 * ff + 9].x - _npcinfo[i].headtargetx[ff]; +							float ydif = _npcinfo[i].bodysection[10 * ff + 9].y - _npcinfo[i].headtargety[ff]; + +							_npcinfo[i].bodysection[10 * ff + 9].x = _npcinfo[i].bodysection[10 * ff + 9].x  - xdif * .2 * _fpsr; +							_npcinfo[i].bodysection[10 * ff + 9].y = _npcinfo[i].bodysection[10 * ff + 9].y  - ydif * .2 * _fpsr; + +							_npcinfo[i].bodysection[10 * ff].x = _npcinfo[i].x + 12 + 8 * cos(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); +							_npcinfo[i].bodysection[10 * ff].y = _npcinfo[i].y + 12 + 8 * sin(3.141592 * 2 * (_itemyloc / 16 + ff * 120 / 360)); + +							for (int f = 8; f >= 1; f--) { +								xdif = _npcinfo[i].bodysection[ff * 10 + f + 1].x - _npcinfo[i].bodysection[ff * 10 + f - 1].x; +								ydif = _npcinfo[i].bodysection[ff * 10 + f + 1].y - _npcinfo[i].bodysection[ff * 10 + f - 1].y; + +								float tx = _npcinfo[i].bodysection[ff * 10 + f - 1].x + xdif / 2; +								float ty = _npcinfo[i].bodysection[ff * 10 + f - 1].y + ydif / 2; + +								_npcinfo[i].bodysection[ff * 10 + f].x = _npcinfo[i].bodysection[ff * 10 + f].x - (_npcinfo[i].bodysection[ff * 10 + f].x - tx) / 3; +								_npcinfo[i].bodysection[ff * 10 + f].y = _npcinfo[i].bodysection[ff * 10 + f].y - (_npcinfo[i].bodysection[ff * 10 + f].y - ty) / 3; +							} + +							_npcinfo[i].attackframe2[ff] = _npcinfo[i].attackframe2[ff] + _npcinfo[i].attackspd * _fpsr; +							if (_npcinfo[i].attackframe2[ff] >= 16) { +								_npcinfo[i].attackframe2[ff] = 0; +								_npcinfo[i].attacking2[ff] = 0; +								_npcinfo[i].attacknext2[ff] = _ticks + _npcinfo[i].attackdelay; +							} + +							_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +							npx = _npcinfo[i].bodysection[10 * ff + 9].x; +							npy = (_npcinfo[i].bodysection[10 * ff + 9].y + 16); + +							xdif = (_player.px + 12) - npx; +							ydif = (_player.py + 12) - npy; + +							dist = 8; + +							if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +								_npcinfo[i].attacknext2[ff] = _ticks + _npcinfo[i].attackdelay; +								// _npcinfo[i].attackframe2(ff) = 0 +								// _npcinfo[i].attacking2(ff) = 0 +								damage = (float)_npcinfo[i].attackdamage * (1.0 + RND() * 0.5); +								if (_player.hp > 0) +									damagePlayer(damage); +							} +						} +					} + +				} + +				// twowing specific +				if (_npcinfo[i].spriteset == kMonsterTwoWing) { +					// targethead code +					float xdif = _npcinfo[i].bodysection[7].x - _npcinfo[i].headtargetx[0]; +					float ydif = _npcinfo[i].bodysection[7].y - _npcinfo[i].headtargety[0]; + +					_npcinfo[i].bodysection[7].x = _npcinfo[i].bodysection[7].x - xdif * 0.4 * _fpsr; +					_npcinfo[i].bodysection[7].y = _npcinfo[i].bodysection[7].y - ydif * 0.4 * _fpsr; + +					_npcinfo[i].bodysection[0].x = _npcinfo[i].x + 12; +					_npcinfo[i].bodysection[0].y = _npcinfo[i].y + 12; + +					for (int f = 6; f >= 1; f--) { +						xdif = _npcinfo[i].bodysection[f + 1].x - _npcinfo[i].bodysection[f - 1].x; +						ydif = _npcinfo[i].bodysection[f + 1].y - _npcinfo[i].bodysection[f - 1].y; + +						float tx = _npcinfo[i].bodysection[f - 1].x + xdif / 2; +						float ty = _npcinfo[i].bodysection[f - 1].y + ydif / 2; + +						_npcinfo[i].bodysection[f].x = _npcinfo[i].bodysection[f].x - (_npcinfo[i].bodysection[f].x - tx); +						_npcinfo[i].bodysection[f].y = _npcinfo[i].bodysection[f].y - (_npcinfo[i].bodysection[f].y - ty); +					} + +					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; +					if (_npcinfo[i].attackframe >= 16) { +						_npcinfo[i].attackframe = 0; +						_npcinfo[i].attacking = 0; +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +					} + +					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +					npx = _npcinfo[i].bodysection[7].x; +					npy = (_npcinfo[i].bodysection[7].y + 16); + +					xdif = (_player.px + 12) - npx; +					ydif = (_player.py + 12) - npy; + +					dist = 8; + +					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +						// _npcinfo[i].attackframe = 0 +						// _npcinfo[i].attacking = 0 +						damage = (float)_npcinfo[i].attackdamage * (1.0 + RND() * 0.5); +						if (_player.hp > 0) +							damagePlayer(damage); +					} +				} + +				// dragon 2 specific +				if (_npcinfo[i].spriteset == kMonsterDragon2) { + +					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; +					if (_npcinfo[i].attackframe >= 16) { +						_npcinfo[i].attackframe = 0; +						_npcinfo[i].attacking = 0; +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +					} + +					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +					npx = _npcinfo[i].x; +					npy = _npcinfo[i].y; + +					float xdif = _player.px - npx; +					float ydif = _player.py - npy; + +					dist = 16 + _npcinfo[i].attackframe; + +					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +						// _npcinfo[i].attackframe = 0 +						// _npcinfo[i].attacking = 0 +						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); +						if (_player.hp > 0) +							damagePlayer(damage); +					} +				} + +				// endboss specific +				if (_npcinfo[i].spriteset == kMonsterFinalBoss) { +					_npcinfo[i].attackframe = _npcinfo[i].attackframe + _npcinfo[i].attackspd * _fpsr; +					if (_npcinfo[i].attackframe >= 16) { +						_npcinfo[i].attackframe = 0; +						_npcinfo[i].attacking = 0; +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +					} + +					_npcinfo[i].cattackframe = (int)(_npcinfo[i].attackframe); + +					npx = _npcinfo[i].x; +					npy = _npcinfo[i].y; + +					float xdif = _player.px - npx; +					float ydif = _player.py - npy; + +					dist = 36; + +					if (abs(xdif) < dist && abs(ydif) < dist && _player.pause < _ticks) { +						_npcinfo[i].attacknext = _ticks + _npcinfo[i].attackdelay; +						// _npcinfo[i].attackframe = 0 +						// _npcinfo[i].attacking = 0 +						damage = (float)_npcinfo[i].attackdamage * (0.5 + RND() * 1.0); +						if (_player.hp > 0) +							damagePlayer(damage); +					} +				} +			} +			// -------end fight code +		} +	} +} + +void GriffonEngine::updateSpells() { +	int foundel[5]; +	float npx, npy; +	long cl1, cl2, cl3; +	int ll[4][2]; + +	float xloc = 0, yloc = 0, xst, yst, xdif, ydif; + +	for (int i = 0; i < kMaxSpell; i++) { +		if (spellinfo[i].frame > 0) { +			int spellnum = spellinfo[i].spellnum; + +			// water +			if (spellnum == 0 && !_forcepause) { +				float fr = (32 - spellinfo[i].frame); + +				ll[0][0] = -2; +				ll[0][1] = -3; +				ll[1][0] = 2; +				ll[1][1] = -3; +				ll[2][0] = -4; +				ll[2][1] = -2; +				ll[3][0] = 4; +				ll[3][1] = -2; + +				for (int f = 0; f <= 3; f++) { +					if (fr > f * 4 && fr < f * 4 + 16) { +						float alf = 255; + +						if (fr < f * 4 + 8) { +							int fi = (int)((fr - f * 4) * 3) % 4; +							rcSrc.left = 32 + fi * 16; +							rcSrc.top = 80; +							rcSrc.setWidth(16); +							rcSrc.setHeight(16); + +							xloc = spellinfo[i].enemyx + 12 + ll[f][0] * 16; +							yloc = spellinfo[i].enemyy + 16 + ll[f][1] * 16; + +							rcDest.left = xloc; +							rcDest.top = yloc; + +							alf = 255 * ((fr - f * 4) / 8); +						} + +						if (fr >= f * 4 + 8) { +							int fi = 0; // ?? + +							if (f == 0 || f == 2) +								fi = 0; +							if (f == 1 || f == 3) +								fi = 1; +							rcSrc.left = 32 + fi * 16; +							rcSrc.top = 80; +							rcSrc.setWidth(16); +							rcSrc.setHeight(16); + +							xst = spellinfo[i].enemyx + 12 + ll[f][0] * 16; +							yst = spellinfo[i].enemyy + 16 + ll[f][1] * 16; + +							float xi = (spellinfo[i].enemyx - xst) * 2 / 8; +							float yi = (spellinfo[i].enemyy - yst) * 2 / 8; + +							float fl = (fr - f * 4 - 8) / 2; +							xloc = xst + xi * fl * fl; +							yloc = yst + yi * fl * fl; + +							rcDest.left = xloc; +							rcDest.top = yloc; + +							alf = 255; +						} + +						if (xloc > -16 && xloc < 304 && yloc > -16 && yloc < 224) { +							_spellimg->setAlpha(alf, true); +							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); +							_spellimg->setAlpha(255, true); + +							if (spellinfo[i].damagewho == 0) { +								for (int e = 1; e <= _lastnpc; e++) { + +									xdif = (xloc + 16) - (_npcinfo[e].x + 12); +									ydif = (yloc + 16) - (_npcinfo[e].y + 12); + +									if ((abs(xdif) < 16 && abs(ydif) < 16)) { +										float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; + +										if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { +											damageNPC(e, damage, 1); +											if (config.effects) { +												int snd = playSound(_sfx[kSndIce]); +												setChannelVolume(snd, config.effectsvol); +											} +										} +									} +								} +							} + +							// check for post damage +							if (nposts > 0) { +								for (int e = 0; e <= nposts - 1; e++) { +									xdif = (xloc + 16) - (postinfo[e][0] + 8); +									ydif = (yloc + 16) - (postinfo[e][1] + 8); + +									if ((abs(xdif) < 16 && abs(ydif) < 16)) { +										_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +										_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +										rcSrc.left = postinfo[e][0] / 2; +										rcSrc.top = postinfo[e][1] / 2; +										rcSrc.setWidth(8); +										rcSrc.setHeight(8); + +										_clipbg2->fillRect(rcSrc, 0); + +										addFloatIcon(99, postinfo[e][0], postinfo[e][1]); + +										if (config.effects) { +											int snd = playSound(_sfx[kSndIce]); +											setChannelVolume(snd, config.effectsvol); +										} +									} +								} +							} +						} +					} +				} +			} + +			// metal +			if (spellnum == 1 && !_forcepause) { +				int fr = (int)((32 - spellinfo[i].frame) * 4) % 3; + +				rcSrc.left = fr * 48; +				rcSrc.top = 0; +				rcSrc.setWidth(48); +				rcSrc.setHeight(48); + +				float c1 = (32 - spellinfo[i].frame) / 16; + +				float halfx = (spellinfo[i].homex - 12) + ((spellinfo[i].enemyx - 12) - (spellinfo[i].homex - 12)) / 2; +				float halfy = (spellinfo[i].homey - 12) + ((spellinfo[i].enemyy - 12) - (spellinfo[i].homey - 12)) / 2; + +				float wdth = (halfx - spellinfo[i].homex) * 1.2; +				float hight = (halfy - spellinfo[i].homey) * 1.2; + +				xloc = halfx + wdth * cos(3.14159 + 3.14159 * 2 * c1); +				yloc = halfy + hight * sin(3.14159 + 3.14159 * 2 * c1); + +				rcDest.left = xloc; +				rcDest.top = yloc; + +				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); + +				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; + +				if (spellinfo[i].damagewho == 0) { +					for (int e = 1; e <= _lastnpc; e++) { +						xdif = (xloc + 24) - (_npcinfo[e].x + 12); +						ydif = (yloc + 24) - (_npcinfo[e].y + 12); + +						if ((abs(xdif) < 24 && abs(ydif) < 24)) { +							float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; + +							if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { +								damageNPC(e, damage, 1); +								if (config.effects) { +									int snd = playSound(_sfx[kSndMetalHit]); +									setChannelVolume(snd, config.effectsvol); +								} +							} +						} +					} +				} + +				if (spellinfo[i].damagewho == 1) { +					// --------- boss 1 specific +					if (ABS(spellinfo[i].frame) < 0 && _npcinfo[spellinfo[i].npc].spriteset == kMonsterBoss1) { +						int npc = spellinfo[i].npc; +						_npcinfo[npc].attackframe = 0; +						_npcinfo[npc].attacking = 0; + +						_npcinfo[npc].pause = _ticks + 1000; +						_npcinfo[npc].attacknext = _ticks + 4000; +					} +					// --------------- + +					// --------- blackknight specific +					if (ABS(spellinfo[i].frame) < 0 && _npcinfo[spellinfo[i].npc].spriteset == kMonsterBlackKnight) { +						int npc = spellinfo[i].npc; +						_npcinfo[npc].attackframe = 0; +						_npcinfo[npc].attacking = 0; + +						_npcinfo[npc].pause = _ticks + 1000; +						_npcinfo[npc].attacknext = _ticks + 3500; +					} +					// --------------- + +					xdif = (xloc + 24) - (_player.px + 12); +					ydif = (yloc + 24) - (_player.py + 12); + +					if ((abs(xdif) < 24 && abs(ydif) < 24) && _player.pause < _ticks) { +						npx = _player.px; +						npy = _player.py; + +						float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); + +						if (_player.hp > 0) { +							damagePlayer(damage); +							if (config.effects) { +								int snd = playSound(_sfx[kSndMetalHit]); +								setChannelVolume(snd, config.effectsvol); +							} +						} +					} +				} + + +				// check for(int post damage +				if (nposts > 0) { +					for (int e = 0; e <= nposts - 1; e++) { +						xdif = (xloc + 24) - (postinfo[e][0] + 8); +						ydif = (yloc + 24) - (postinfo[e][1] + 8); + +						if ((abs(xdif) < 24 && abs(ydif) < 24)) { +							_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +							_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +							rcSrc.left = postinfo[e][0] / 2; +							rcSrc.top = postinfo[e][1] / 2; +							rcSrc.setWidth(8); +							rcSrc.setHeight(8); + +							_clipbg2->fillRect(rcSrc, 0); + +							addFloatIcon(99, postinfo[e][0], postinfo[e][1]); + +							if (config.effects) { +								int snd = playSound(_sfx[kSndMetalHit]); +								setChannelVolume(snd, config.effectsvol); +							} +						} +					} +				} +			} + +			// earth +			if (spellnum == 2 && !_forcepause) { +				float hght = 240 - spellinfo[i].enemyy; + +				for (int f = 8; f >= 0; f--) { + +					float fr = (32 - spellinfo[i].frame); + +					if (fr > f && fr < f + 16) { +						rcSrc.left = 32 * spellinfo[i].rockimg[f]; +						rcSrc.top = 48; +						rcSrc.setWidth(32); +						rcSrc.setHeight(32); + +						int scatter = 0; +						if (fr < 8 + f) { +							xloc = spellinfo[i].enemyx - 4; +							yloc = spellinfo[i].enemyy * (1 - cos(3.14159 / 2 * (fr - f) / 8)); // ^ 2; +							yloc *= yloc; +						} else { +							scatter = 1; +							xloc = spellinfo[i].enemyx - 4 - spellinfo[i].rockdeflect[f] * sin(3.14159 / 2 * ((fr - f) - 8) / 8); +							yloc = spellinfo[i].enemyy + hght * (1 - cos(3.14159 / 2 * ((fr - f) - 8) / 8)); +						} + +						rcDest.left = xloc; +						rcDest.top = yloc; + +						if (xloc > -16 && xloc < 304 && yloc > -16 && yloc < 224) { +							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); + +							if (scatter == 1) { +								if (spellinfo[i].damagewho == 0) { +									for (int e = 1; e <= _lastnpc; e++) { +										xdif = (xloc + 16) - (_npcinfo[e].x + 12); +										ydif = (yloc + 16) - (_npcinfo[e].y + 12); + +										if ((abs(xdif) < 16 && abs(ydif) < 16)) { +											float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; + +											if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { +												damageNPC(e, damage, 1); +												if (config.effects) { +													int snd = playSound(_sfx[kSndRocks]); +													setChannelVolume(snd, config.effectsvol); +												} +											} +										} +									} +								} + + +								// check for(int post damage +								if (nposts > 0) { +									for (int e = 0; e <= nposts - 1; e++) { +										xdif = (xloc + 16) - (postinfo[e][0] + 8); +										ydif = (yloc + 16) - (postinfo[e][1] + 8); + +										if ((abs(xdif) < 16 && abs(ydif) < 16)) { +											_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +											_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +											rcSrc.left = postinfo[e][0] / 2; +											rcSrc.top = postinfo[e][1] / 2; +											rcSrc.setWidth(8); +											rcSrc.setHeight(8); + +											_clipbg2->fillRect(rcSrc, 0); + +											addFloatIcon(99, postinfo[e][0], postinfo[e][1]); + +											if (config.effects) { +												int snd = playSound(_sfx[kSndRocks]); +												setChannelVolume(snd, config.effectsvol); +											} +										} +									} +								} +							} +						} +					} +				} + +				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; +			} + +			// crystal +			if (spellnum == 5) { + +				float fra = (32 - spellinfo[i].frame); +				int fr = (int)((spellinfo[i].frame) * 2) % 8; + +				rcSrc.left = fr * 32; +				rcSrc.top = 96 + 48; +				rcSrc.setWidth(32); +				rcSrc.setHeight(64); + +				rcDest.left = _player.px - 4; +				rcDest.top = _player.py + 16 - 48; + +				int f = 160; +				if (fra < 8) +					f = 192 * fra / 8; +				if (fra > 24) +					f = 192 * (1 - (fra - 24) / 8); + +				_spellimg->setAlpha(f, true); +				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); +				_spellimg->setAlpha(255, true); + +				spellinfo[i].frame = spellinfo[i].frame - 0.3 * _fpsr; +				if (spellinfo[i].frame < 0) { +					spellinfo[i].frame = 0; +					_forcepause = false; + +					npx = _player.px + 12; +					npy = _player.py + 20; + +					int lx = (int)npx / 16; +					int ly = (int)npy / 16; + +					for (int f1 = 0; f1 < 5; f1++) { // !! f < 5 +						foundel[f1] = 0; +					} + +					for (int xo = -2; xo <= 2; xo++) { +						for (int yo = -2; yo <= 2; yo++) { + +							int sx = lx + xo; +							int sy = ly + yo; + +							if (sx > -1 && sx < 20 && sy > -1 && sy < 15) { +								for (int l = 0; l <= 2; l++) { +									int curtile = _tileinfo[l][sx][sy][0]; +									int curtilel = _tileinfo[l][sx][sy][1]; + +									if (curtile > 0) { +										curtile = curtile - 1; +										int curtilex = curtile % 20; +										int curtiley = (curtile - curtilex) / 20; + +										int element = elementmap[curtiley][curtilex]; +										if (element > -1 && curtilel == 0) +											foundel[element + 1] = 1; +									} +								} + +								int o = _objectMap[sx][sy]; +								if (o > -1) { +									if (_objectInfo[o][4] == 1) +										foundel[2] = 1; +									if (o == 1 || o == 2) { +										foundel[2] = 1; +										foundel[4] = 1; +									} +								} +							} +						} +					} + +					char line[256]; +					strcpy(line, "Found... nothing..."); + +					for (int f1 = 0; f1 < 5; f1++) { +						if (foundel[f1] == 1 && _player.foundspell[f1] == 0) { +							_player.foundspell[f1] = 1; +							_player.spellcharge[f1] = 0; +							if (f1 == 1) +								strcpy(line, "Found... Water Essence"); +							if (f1 == 2) +								strcpy(line, "Found... Metal Essence"); +							if (f1 == 3) +								strcpy(line, "Found... Earth Essence"); +							if (f1 == 4) +								strcpy(line, "Found... Fire Essence"); +							break; +						} +					} + +					eventText(line); +				} +			} + +			// room fireballs +			if (spellnum == 6 && !_forcepause) { + +				if (spellinfo[i].frame > 16) { +					float fr = (32 - spellinfo[i].frame); + +					_spellimg->setAlpha(192 * sin(3.14159 * fr / 4), true); + +					rcSrc.left = 16 * (int)(RND() * 2); +					rcSrc.top = 80; +					rcSrc.setWidth(16); +					rcSrc.setHeight(16); + +					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { + +						xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; +						yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; + +						rcDest.left = xloc; +						rcDest.top = yloc; + +						_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); +					} + +					_spellimg->setAlpha(255, true); +				} else { +					_spellimg->setAlpha(192, true); + +					rcSrc.left = 16 * (int)(RND() * 2); +					rcSrc.top = 80; +					rcSrc.setWidth(16); +					rcSrc.setHeight(16); + +					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { +						float ax = spellinfo[i].fireballs[ff][0]; +						float ay = spellinfo[i].fireballs[ff][1]; +						float bx = _player.px + 4; +						float by = _player.py + 4; +						float d = sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay)); + +						float tx = (bx - ax) / d; +						float ty = (by - ay) / d; + +						spellinfo[i].fireballs[ff][2] += tx * 1.2 * _fpsr; +						spellinfo[i].fireballs[ff][3] += ty * 1.2 * _fpsr; + +						if (spellinfo[i].ballon[ff] == 1) { +							spellinfo[i].fireballs[ff][0] = ax + spellinfo[i].fireballs[ff][2] * 0.2 * _fpsr; +							spellinfo[i].fireballs[ff][1] = ay + spellinfo[i].fireballs[ff][3] * 0.2 * _fpsr; + +							xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; +							yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; + +							rcDest.left = xloc; +							rcDest.top = yloc; + +							_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); +						} + +						if (xloc < -1 || yloc < -1 || xloc > 304 || yloc > 224) +							spellinfo[i].ballon[ff] = 0; +					} + +					_spellimg->setAlpha(255, true); +				} + +				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; + +				if (spellinfo[i].damagewho == 1) { +					for (int ff = 0; ff <= spellinfo[i].nfballs - 1; ff++) { +						if (spellinfo[i].ballon[ff] == 1) { +							xloc = spellinfo[i].fireballs[ff][0] + (int)(RND() * 3) - 1; +							yloc = spellinfo[i].fireballs[ff][1] + (int)(RND() * 3) - 1; + +							xdif = (xloc + 8) - (_player.px + 12); +							ydif = (yloc + 8) - (_player.py + 12); + +							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { +								float damage = _npcinfo[spellinfo[i].npc].spelldamage * (1 + RND() * 0.5) / 3; + +								if (_player.hp > 0) +									damagePlayer(damage); + +								if (config.effects) { +									int snd = playSound(_sfx[kSndFire]); +									setChannelVolume(snd, config.effectsvol); +								} +							} +						} +					} +				} +			} + +			// lightning bomb +			if (spellnum == 8) { + +				cl1 = _videobuffer->format.RGBToColor(0, 32, 204); +				cl2 = _videobuffer->format.RGBToColor(142, 173, 191); +				cl3 = _videobuffer->format.RGBToColor(240, 240, 240); + +				float px = _player.px + 12; +				float py = _player.py + 12; + +				int apx = px + (int)(RND() * 5 - 2); +				int apy = py + (int)(RND() * 5 - 2); + +				for (int f = 0; f <= 0; f++) { // ?? +					int y = apy; +					int orn = 0; +					for (int x = apx; x <= 319; x++) { +						int rn = (int)(RND() * 3); + +						if (orn == 0) +							y = y - 1; +						if (orn == 2) +							y = y + 1; + +						drawLine(_videobuffer, x, y - 1, x, y + 2, cl1); +						drawLine(_videobuffer, x, y, x, y + 1, cl3); + +						if (rn == 0) +							drawLine(_videobuffer, x, y + 1, x, y + 1, cl2); +						if (rn == 2) +							drawLine(_videobuffer, x, y, x, y, cl2); + +						orn = rn; + +						if (spellinfo[i].damagewho == 0) { +							for (int e = 1; e <= _lastnpc; e++) { + +								xdif = (x + 16) - (_npcinfo[e].x + 12); +								ydif = (y + 16) - (_npcinfo[e].y + 12); + +								if ((abs(xdif) < 8 && abs(ydif) < 8)) { +									float damage = 30 * (1 + RND() * 0.5); + +									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) +										damageNPC(e, damage, 1); +								} +							} +						} + +						// check for post damage +						if (nposts > 0) { +							for (int e = 0; e <= nposts - 1; e++) { +								xdif = (xloc + 16) - (postinfo[e][0] + 8); +								ydif = (yloc + 16) - (postinfo[e][1] + 8); + +								if ((abs(xdif) < 16 && abs(ydif) < 16)) { +									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +									rcSrc.left = postinfo[e][0] / 2; +									rcSrc.top = postinfo[e][1] / 2; +									rcSrc.setWidth(8); +									rcSrc.setHeight(8); + +									_clipbg2->fillRect(rcSrc, 0); + +									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); +								} +							} +						} +					} + +					y = apy; +					orn = 0; +					for (int x = apx; x >= 0; x--) { +						int rn = (int)(RND() * 3); + +						if (orn == 0) +							y = y - 1; +						if (orn == 2) +							y = y + 1; + +						drawLine(_videobuffer, x, y - 1, x, y + 2, cl1); +						drawLine(_videobuffer, x, y, x, y + 1, cl3); + +						if (rn == 0) +							drawLine(_videobuffer, x, y + 1, x, y + 1, cl2); +						if (rn == 2) +							drawLine(_videobuffer, x, y, x, y, cl2); + +						orn = rn; + +						if (spellinfo[i].damagewho == 0) { +							for (int e = 1; e <= _lastnpc; e++) { + +								xdif = (x + 16) - (_npcinfo[e].x + 12); +								ydif = (y + 16) - (_npcinfo[e].y + 12); + +								if ((abs(xdif) < 8 && abs(ydif) < 8)) { +									float damage = 30 * (1 + RND() * 0.5); + +									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) +										damageNPC(e, damage, 1); +								} +							} +						} + +						// check for post damage +						if (nposts > 0) { +							for (int e = 0; e <= nposts - 1; e++) { +								xdif = (xloc + 16) - (postinfo[e][0] + 8); +								ydif = (yloc + 16) - (postinfo[e][1] + 8); + +								if ((abs(xdif) < 16 && abs(ydif) < 16)) { +									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +									rcSrc.left = postinfo[e][0] / 2; +									rcSrc.top = postinfo[e][1] / 2; +									rcSrc.setWidth(8); +									rcSrc.setHeight(8); + +									_clipbg2->fillRect(rcSrc, 0); + +									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); +								} +							} +						} +					} + +					int x = apx; +					orn = 0; +					for (y = apy; y <= 239; y++) { +						int rn = (int)(RND() * 3); + +						if (orn == 0) +							x = x - 1; +						if (orn == 2) +							x = x + 1; + +						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); +						drawLine(_videobuffer, x, y, x + 1, y, cl3); + +						if (rn == 0) +							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); +						if (rn == 2) +							drawLine(_videobuffer, x, y, x, y, cl2); + +						orn = rn; + +						if (spellinfo[i].damagewho == 0) { +							for (int e = 1; e <= _lastnpc; e++) { +								xdif = (x + 16) - (_npcinfo[e].x + 12); +								ydif = (y + 16) - (_npcinfo[e].y + 12); + +								if ((abs(xdif) < 8 && abs(ydif) < 8)) { +									float damage = 30 * (1 + RND() * 0.5); + +									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) +										damageNPC(e, damage, 1); +								} +							} +						} + +						// check for post damage +						if (nposts > 0) { +							for (int e = 0; e <= nposts - 1; e++) { +								xdif = (xloc + 16) - (postinfo[e][0] + 8); +								ydif = (yloc + 16) - (postinfo[e][1] + 8); + +								if ((abs(xdif) < 16 && abs(ydif) < 16)) { +									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +									rcSrc.left = postinfo[e][0] / 2; +									rcSrc.top = postinfo[e][1] / 2; +									rcSrc.setWidth(8); +									rcSrc.setHeight(8); + +									_clipbg2->fillRect(rcSrc, 0); + +									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); +								} +							} +						} +					} + +					x = apx; +					orn = 0; +					for (y = apy; y >= 0; y--) { +						int rn = (int)(RND() * 3); + +						if (orn == 0) +							x = x - 1; +						if (orn == 2) +							x = x + 1; + +						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); +						drawLine(_videobuffer, x, y, x + 1, y, cl3); + +						if (rn == 0) +							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); +						if (rn == 2) +							drawLine(_videobuffer, x, y, x, y, cl2); + +						orn = rn; + +						if (spellinfo[i].damagewho == 0) { +							for (int e = 1; e <= _lastnpc; e++) { +								xdif = (x + 16) - (_npcinfo[e].x + 12); +								ydif = (y + 16) - (_npcinfo[e].y + 12); + +								if ((abs(xdif) < 8 && abs(ydif) < 8)) { +									float damage = 30 * (1 + RND() * 0.5); + +									if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) +										damageNPC(e, damage, 1); +								} +							} +						} + +						// check for post damage +						if (nposts > 0) { +							for (int e = 0; e <= nposts - 1; e++) { +								xdif = (xloc + 16) - (postinfo[e][0] + 8); +								ydif = (yloc + 16) - (postinfo[e][1] + 8); + +								if ((abs(xdif) < 16 && abs(ydif) < 16)) { +									_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +									_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +									rcSrc.left = postinfo[e][0] / 2; +									rcSrc.top = postinfo[e][1] / 2; +									rcSrc.setWidth(8); +									rcSrc.setHeight(8); + +									_clipbg2->fillRect(rcSrc, 0); + +									addFloatIcon(99, postinfo[e][0], postinfo[e][1]); +								} +							} +						} +					} +				} + +				spellinfo[i].frame -= 0.5 * _fpsr; +				if (spellinfo[i].frame < 0) { +					spellinfo[i].frame = 0; +					_forcepause = false; +				} +			} + +			// wizard 1 lightning +			if (spellnum == 9) { + +				cl1 = _videobuffer->format.RGBToColor(0, 32, 204); +				cl2 = _videobuffer->format.RGBToColor(142, 173, 191); +				cl3 = _videobuffer->format.RGBToColor(240, 240, 240); + +				int px = spellinfo[i].enemyx + 12; +				int py = spellinfo[i].enemyy + 24; + +				int apx = px + (int)(RND() * 20 - 10); +				int apy = py + (int)(RND() * 20 - 10); + +				int x = apx; +				int orn = 0; +				for (int y = 0; y <= apy; y++) { +					if (y < 240) { +						int rn = (int)(RND() * 3); + +						if (orn == 0) +							x = x - 1; +						if (orn == 2) +							x = x + 1; + +						drawLine(_videobuffer, x - 1, y, x + 2, y, cl1); +						drawLine(_videobuffer, x, y, x + 1, y, cl3); + +						if (rn == 0) +							drawLine(_videobuffer, x + 1, y, x + 1, y, cl2); +						if (rn == 2) +							drawLine(_videobuffer, x, y, x, y, cl2); + +						orn = rn; + +						if (spellinfo[i].damagewho == 1) { + +							xdif = (x + 8) - (_player.px + 12); +							ydif = (y + 8) - (_player.py + 12); + +							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { +								float damage = ((float)_player.hp * 0.75) * (RND() * 0.5 + 0.5); +								if (damage < 5) +									damage = 5; + +								if (_npcinfo[spellinfo[i].npc].spriteset == kMonsterBatKitty) { +									if (damage < 50) +										damage = 40 + (int)(RND() * 40); +								} + +								if (_player.hp > 0) +									damagePlayer(damage); +							} +						} +					} +				} + +				spellinfo[i].frame -= 0.5 * _fpsr; +				if (spellinfo[i].frame < 0) { +					spellinfo[i].frame = 0; + +					_npcinfo[spellinfo[i].npc].attacking = 0; +					_npcinfo[spellinfo[i].npc].attacknext = _ticks + _npcinfo[spellinfo[i].npc].attackdelay; +				} +			} +		} +	} +} + +void GriffonEngine::updateSpellsUnder() { +	if (_forcepause) +		return; + +	for (int i = 0; i < kMaxSpell; i++) { +		if (spellinfo[i].frame > 0) { +			int spellnum = spellinfo[i].spellnum; + +			// water +			if (spellnum == 0) { +				int fra = (32 - spellinfo[i].frame); +				int fr = (int)((32 - spellinfo[i].frame) * 2) % 4; + +				rcSrc.left = fr * 48; +				rcSrc.top = 96; +				rcSrc.setWidth(48); +				rcSrc.setHeight(48); + +				rcDest.left = spellinfo[i].enemyx - 12; +				rcDest.top = spellinfo[i].enemyy - 8; + +				int f = 160; +				if (fra < 8) +					f = 160 * fra / 8; +				if (fra > 24) +					f = 160 * (1 - (fra - 24) / 8); + +				_spellimg->setAlpha(f, true); +				_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); +				_spellimg->setAlpha(255, true); + +				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; + + +				for (f = 1; f <= _lastnpc; f++) { +					int xdif = spellinfo[i].enemyx - _npcinfo[f].x; +					int ydif = spellinfo[i].enemyy - _npcinfo[f].y; + +					float dist = sqrt((float)(xdif * xdif + ydif * ydif)); + +					if (dist > 20) +						dist = 20; + +					if (dist > 5) { +						float ratio = (1 - dist / 25); + +						float newx = _npcinfo[f].x + ratio * xdif / 3 * _fpsr; +						float newy = _npcinfo[f].y + ratio * ydif / 3 * _fpsr; + +						int sx = (newx / 2 + 6); +						int sy = (newy / 2 + 10); + +						unsigned int *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +						unsigned int dq = *temp; + +						if (dq == 0) { +							_npcinfo[f].x = newx; +							_npcinfo[f].y = newy; +							// _npcinfo[f].castpause = _ticks + 200; +						} else { +							int xpass = 0; +							int ypass = 0; + +							sx = (newx / 2 + 6); +							sy = (_npcinfo[f].y / 2 + 10); +							temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +							dq = *temp; + +							if (dq == 0) +								xpass = 1; + + +							sx = (_npcinfo[f].x / 2 + 6); +							sy = (newy / 2 + 10); +							temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +							dq = *temp; + +							if (dq == 0) +								ypass = 1; + +							if (ypass == 1) { +								newx = _npcinfo[f].x; +							} else if (xpass == 1) { +								newy = _npcinfo[f].y; +							} + +							if (xpass == 1 || ypass == 1) { +								_npcinfo[f].x = newx; +								_npcinfo[f].y = newy; +								// _npcinfo[f].castpause = _ticks + 200; +							} +						} +					} +				} +			} + +			// fire +			if (spellnum == 3) { +				float fr = (32 - spellinfo[i].frame); + +				fr = fr * fr * (1 - cos(3.14159 / 4 + 3.14159 / 4 * fr / 32)); + +				if (fr > 32) +					fr = 32; + +				float s = 8; +				if (spellinfo[i].frame < 8) +					s = spellinfo[i].frame; + +				int fra = (int)fr; + +				for (int f = 0; f <= 4; f++) { +					for (int x = 0; x <= fra; x += 2) { +						if (spellinfo[i].legalive[f] >= x) { +							_spellimg->setAlpha(192 * sin(3.14159 * x / 32) * s / 8, true); + +							float an = 360 / 5 * f + x / 32 * 180; + +							rcSrc.left = 16 * (int)(RND() * 2); +							rcSrc.top = 80; +							rcSrc.setWidth(16); +							rcSrc.setHeight(16); + +							float xloc = (float)(spellinfo[i].enemyx + 4 + x * 2 * cos(3.14159 / 180 * an) + (int)(RND() * 3) - 1); +							float yloc = (float)(spellinfo[i].enemyy + 4 + x * 2 * sin(3.14159 / 180 * an) + (int)(RND() * 3) - 1); +							rcDest.left = (int)xloc; +							rcDest.top = (int)yloc; + +							if (xloc > -1 && xloc < 304 && yloc > -1 && yloc < 224) { +								_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); + +								int sx = (xloc / 2 + 4); +								int sy = (yloc / 2 + 8); + +								unsigned int *temp = (uint32 *)_clipbg->getBasePtr(sx, sy); +								unsigned int dq = *temp; + +								if (dq > 1000 && x > 4) +									spellinfo[i].legalive[f] = x; + +								if (spellinfo[i].damagewho == 0) { +									for (int e = 1; e <= _lastnpc; e++) { +										float xdif = (xloc + 8) - (_npcinfo[e].x + 12); +										float ydif = (yloc + 8) - (_npcinfo[e].y + 12); + +										if ((abs(xdif) < 8 && abs(ydif) < 8)) { +											float damage = (float)_player.spelldamage * (1.0 + RND() * 0.5) * (float)spellinfo[i].strength; + +											if (_npcinfo[e].spriteset == kMonsterFireHydra) +												damage = -damage; +											if (_npcinfo[e].spriteset == kMonsterFinalBoss) +												damage = -damage; +											if (_npcinfo[e].hp > 0 && _npcinfo[e].pause < _ticks) { +												damageNPC(e, damage, 1); +												if (config.effects) { +													int snd = playSound(_sfx[kSndFire]); +													setChannelVolume(snd, config.effectsvol); +												} +											} +										} +									} +								} + +								if (spellinfo[i].damagewho == 1) { +									float xdif = (xloc + 8) - (_player.px + 12); +									float ydif = (yloc + 8) - (_player.py + 12); + +									if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks) { +										float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); + +										if (_player.hp > 0) { +											damagePlayer(damage); + +											if (config.effects) { +												int snd = playSound(_sfx[kSndFire]); +												setChannelVolume(snd, config.effectsvol); +											} +										} +									} +								} + +								// check for post damage +								if (nposts > 0) { +									for (int e = 0; e <= nposts - 1; e++) { +										float xdif = (xloc + 8) - (postinfo[e][0] + 8); +										float ydif = (yloc + 8) - (postinfo[e][1] + 8); + +										if ((abs(xdif) < 8 && abs(ydif) < 8)) { +											_objmapf[_curmap][(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = 1; +											_objectMap[(int)postinfo[e][0] / 16][(int)postinfo[e][1] / 16] = -1; + +											rcSrc.left = postinfo[e][0] / 2; +											rcSrc.top = postinfo[e][1] / 2; +											rcSrc.setWidth(8); +											rcSrc.setHeight(8); + +											_clipbg2->fillRect(rcSrc, 0); + +											if (config.effects) { +												int snd = playSound(_sfx[kSndFire]); +												setChannelVolume(snd, config.effectsvol); +											} + +											addFloatIcon(99, postinfo[e][0], postinfo[e][1]); +										} +									} +								} +							} +						} +					} +				} + +				_spellimg->setAlpha(255, true); + +				spellinfo[i].frame = spellinfo[i].frame - 0.2 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; + + +			} + + +			// sprite 6 spitfire +			if (spellnum == 7) { +				float xspan = spellinfo[i].enemyx - spellinfo[i].homex; +				float yspan = spellinfo[i].enemyy - spellinfo[i].homey; +				float fr = (32 - spellinfo[i].frame); + +				for (int f = 0; f <= 7; f++) { +					int alpha = 0; +					float xx = 0; +					if (fr > f * 2 && fr < f * 2 + 16) +						xx = fr - f * 2; +					if (xx < 8) +						alpha = 255 * xx / 8; +					if (xx > 8) +						alpha = 255 * (1 - (xx - 8) / 8); +					float yy = 16 * sin(3.141592 / 2 * xx / 16) - 8; + +					if (alpha < 0) +						alpha = 0; +					if (alpha > 255) +						alpha = 255; + +					_spellimg->setAlpha(alpha, true); + +					rcSrc.left = 16 * (int)(RND() * 2); +					rcSrc.top = 80; +					rcSrc.setWidth(16); +					rcSrc.setHeight(16); + +					float xloc = spellinfo[i].homex + xspan / 7 * f; +					float yloc = spellinfo[i].homey + yspan / 7 * f - yy; + +					rcDest.left = xloc; +					rcDest.top = yloc; + +					if (xloc > -16 && xloc < 320 && yloc > -16 && yloc < 240) { +						_spellimg->blit(*_videobuffer, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc); + +						if (spellinfo[i].damagewho == 1) { +							float xdif = (xloc + 8) - (_player.px + 12); +							float ydif = (yloc + 8) - (_player.py + 12); + +							if ((abs(xdif) < 8 && abs(ydif) < 8) && _player.pause < _ticks && alpha > 64) { +								float damage = (float)_npcinfo[spellinfo[i].npc].spelldamage * (1.0 + RND() * 0.5); + +								if (_player.hp > 0) { +									damagePlayer(damage); +									if (config.effects) { +										int snd = playSound(_sfx[kSndFire]); +										setChannelVolume(snd, config.effectsvol); +									} +								} + +							} +						} + +					} + +				} + +				_spellimg->setAlpha(255, true); +				spellinfo[i].frame = spellinfo[i].frame - 0.5 * _fpsr; +				if (spellinfo[i].frame < 0) +					spellinfo[i].frame = 0; + +				if (ABS(spellinfo[i].frame) < 0) { +					_npcinfo[spellinfo[i].npc].attacking = 0; +					_npcinfo[spellinfo[i].npc].attacknext = _ticks + _npcinfo[spellinfo[i].npc].attackdelay; +				} +			} +		} +	} +} + + +} // end of namespace Griffon diff --git a/engines/griffon/module.mk b/engines/griffon/module.mk index 43a198b99d..857fcd7667 100644 --- a/engines/griffon/module.mk +++ b/engines/griffon/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS := \  	gfx.o \  	griffon.o \  	input.o \ +	logic.o \  	resources.o \  	saveload.o \  	sound.o | 
