public override void Synergy() { if (m_State == f3MainCharaState.DEAD || m_State == f3MainCharaState.SMILING) { return; } m_OnEnemy = false; m_Power = m_PowerX = m_PowerY = 0.0f; // ギヤバネ foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_GEASPRIN)) { if (it.IsValid()) { it.GetPos(out var objX, out var objY); if (!((Cf3MapObjectGeasprin)it).IsFrozen()) { if (TL.IsIn(objX - 16, m_X, objX + 15)) { if (TL.IsIn(objY - 30, m_Y, objY + 16)) { if (m_bOriginal) { CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_GEASPRIN); } m_Y--; HighJump(); } } else if (TL.IsIn(objX + 16, m_X, objX + 29)) { if (TL.IsIn(objY - 16, m_Y, objY + 15)) { if (m_bOriginal) { CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_GEASPRIN); } m_DX = 10; } } else if (TL.IsIn(objX - 29, m_X, objX - 16)) { if (TL.IsIn(objY - 16, m_Y, objY + 15)) { if (m_bOriginal) { CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_GEASPRIN); } m_DX = -10; } } } else { if (TL.IsIn(objX - 16, m_X, objX + 15)) { if (TL.IsIn(objY - 30, m_Y, objY) && m_DY >= 0) { m_OnEnemy = true; m_Y = objY - 30; if (m_State == f3MainCharaState.JUMPING) { Land(); } } } else if (TL.IsIn(objX + 16, m_X, objX + 29)) { if (TL.IsIn(objY - 16, m_Y, objY + 15)) { m_X = objX + 30; m_DX = 0; } } else if (TL.IsIn(objX - 29, m_X, objX - 16)) { if (TL.IsIn(objY - 16, m_Y, objY + 15)) { m_X = objX - 30; m_DX = -0; } } } } } // とげとげ foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_NEEDLE)) { if (it.IsValid()) { it.GetPos(out var objX, out var objY); if ((objX - m_X) * (objX - m_X) + (objY - m_Y) * (objY - m_Y) < 256) { Die(); return; } } } // ウナギカズラ foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_EELPITCHER)) { if (it.IsValid() && ((Cf3MapObjectEelPitcher)it).IsLeaf()) { it.GetPos(out var objX, out var objY); if (TL.IsIn(objX - 16, m_X, objX + 16)) { if (TL.IsIn(objY - 14, m_Y, objY)) { if (m_DY >= 0) { m_OnEnemy = true; m_Y = objY - 14; if (m_State == f3MainCharaState.JUMPING) { Land(); } } } } } } if (m_State != f3MainCharaState.FROZEN) { // 氷 foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_ICE)) { if (it.IsValid() && ((Cf3MapObjectIce)it).GetSize() > 10) { it.GetPos(out var objX, out var objY); if ((objX - m_X) * (objX - m_X) + (objY - m_Y) * (objY - m_Y) < 256) { // あたった! Freeze(((Cf3MapObjectIce)it).GetSize()); } } } // 氷ゾーン foreach (var is_ in Cf3MapObjectIceSource.All()) { is_.GetPos(out var objX, out var objY); float dX = objX - m_X, dY = objY - m_Y, p = 1.0f / (dX * dX + dY * dY), p3 = (float)(p * Math.Sqrt(p)); m_Power += p; m_PowerX += dX * p3; m_PowerY += dY * p3; } // 炎ゾーン foreach (var fr in Cf3MapObjectFire.All()) { if (fr.IsActive()) { fr.GetPos(out var objX, out var objY); float dX = objX - m_X, dY = objY - m_Y, p = 1.0f / (dX * dX + dY * dY), p3 = (float)(p * Math.Sqrt(p)); m_Power -= p; m_PowerX -= dX * p3; m_PowerY -= dY * p3; } } if (m_Power > 1.0f / 256.0f) { Freeze(); } else if (m_Power > 1.0f / 4096.0f) { m_nPower = 4; m_PowerX = m_PowerY = 0.0f; } else if (m_Power < -1.0f / 256.0f) { Die(); } else if (m_Power < -1.0f / 4096.0f) { } else { m_PowerX = m_PowerY = 0.0f; } } // バナナ(BGMの調整用) if (m_pParent.GetMainChara() == this) { m_BananaDistance = MAXDISTANCE; float bd; int nBanana = 0, nPosition = 0; foreach (var bn in Cf3MapObjectBanana.All()) { if (bn.IsValid()) { bn.GetCPos(out var cx, out var cy); bd = (cx * 32 + 16 - m_X) * (cx * 32 + 16 - m_X) + (cy * 32 + 16 - m_Y) * (cy * 32 + 16 - m_Y); if (bd < m_BananaDistance) { m_BananaDistance = bd; } nBanana++; nPosition += cx - m_nCX; } } CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_BANANADISTANCE, m_BananaDistance); CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_BANANAPOSITION, nBanana != 0 ? (float)nPosition / nBanana : 0.0f); } if (m_OnEnemy) { HitCheck(); } }
public void CreateTemparatureMap(CDIB32 dib) { float objX, objY, dX, dY, fX, fY; var pixel = dib.GetPtr(); float offx = m_ScrollRX - 320 / 2, offy = m_ScrollRY - 224 / 2 - 2; TL.Saturate(0.0f, ref offx, m_Width[1] * 32 - 320.0f); TL.Saturate(0.0f, ref offy, m_Height[1] * 32 - 224.0f); uint i = 0; for (int y = 0; y < 224; y++) { for (int x = 0; x < 320; x++) { fX = x + offx; fY = y + offy; // GetViewPosとオフセットの掛け方が逆 var power = 0.0f; // 氷ゾーン foreach (var is_ in Cf3MapObjectIceSource.All()) { is_.GetPos(out objX, out objY); dX = objX - fX; dY = objY - fY; power += 1.0f / (dX * dX + dY * dY); } // 炎ゾーン foreach (var fr in Cf3MapObjectFire.All()) { if (fr.IsActive()) { fr.GetPos(out objX, out objY); dX = objX - fX; dY = objY - fY; power -= 1.0f / (dX * dX + dY * dY); } } if (power > 1.0f / 256.0f) { // 凍りつくゾーン pixel[i] = 0x008080; } else if (power > 1.0f / 4096.0f) { // パワーアップゾーン pixel[i] = 0x00ffff; } else if (power < -1.0f / 256.0f) { // 致死ゾーン pixel[i] = 0x800000; } else if (power < -1.0f / 4096.0f) { // 制限ゾーン pixel[i] = 0xff0000; } else { // 普通ゾーン pixel[i] = 0x000000; } i++; } } var lpSrc = dib; var lpDst = m_pDIBBuf; if ((m_nEffect & 1) != 0) { CPlaneTransBlt.MirrorBlt1(lpDst, lpSrc, 0, 0, 128); TL.swap(ref lpSrc, ref lpDst); } if ((m_nEffect & 2) != 0) { CPlaneTransBlt.MirrorBlt2(lpDst, lpSrc, 0, 0, 128); var rc = new Rectangle(0, 16, 320, 224); lpSrc.BltFast(lpDst, 0, 0, rc); } if (lpDst == dib) { lpDst.BltFast(lpSrc, 0, 0); } }