public void RemoveMapObject(int x, int y, Cf3MapObjectBase p) { if (p == null) { return; } TL.Saturate(0, ref x, m_Width[1] - 1); TL.Saturate(0, ref y, m_Height[1] - 1); int i = GetIndex(x, y); var o = m_pObject[i]; if (o == p) { o = m_pObject[i] = p.m_pNext; } while (o != null) { if (o.m_pNext == p) { o.m_pNext = p.m_pNext; } o = o.m_pNext; } p.m_pNext = null; }
public void Dispose() { TL.DELETE_SAFE(ref stage); TL.DELETE_SAFE(ref map); Cf3Setting.theSetting.m_Gravity = oldgravity; Cf3Setting.theSetting.m_Hyper = oldhyper; }
public override void OnDraw(CDIB32 lp) { if (!IsValid()) { return; } SetViewPos(-16, -16); // バネ if (m_Spring2[(int)f3MapObjectDirection.DIR_FRONT] != 0) { int h = m_Spring2[(int)f3MapObjectDirection.DIR_FRONT]; lp.BltNatural(m_Graphic, m_nVX, m_nVY + 8 - h, new Rectangle(32, 64, 32, h)); } if (m_Spring2[(int)f3MapObjectDirection.DIR_LEFT] != 0) { int w = m_Spring2[(int)f3MapObjectDirection.DIR_LEFT]; lp.BltNatural(m_Graphic, m_nVX + 8 - w, m_nVY, new Rectangle(0, 64, w, 32)); } if (m_Spring2[(int)f3MapObjectDirection.DIR_RIGHT] != 0) { int w = m_Spring2[(int)f3MapObjectDirection.DIR_RIGHT]; lp.BltNatural(m_Graphic, m_nVX + 24, m_nVY, new Rectangle(32 - w, 64, w, 96)); } // 本体 int CX = 0, CY = (m_Direction == f3MapObjectDirection.DIR_LEFT ? 0 : 1); if (m_State == f3GeasprinState.STANDING) { } else if (m_State == f3GeasprinState.WALKING) { CX = 1 + (m_GX & 1); } else if (m_State == f3GeasprinState.FALLING) { CX = 5; } else if (m_State == f3GeasprinState.LAUGHING) { if (TL.IsIn(20, m_Delay, 40)) { CX = 3 + (m_Delay / 4 & 1); } else if (TL.IsIn(0, m_Delay, 20)) { CX = 4; } } else if (m_State == f3GeasprinState.BLOWN) { CX = 6; } else if (m_State == f3GeasprinState.FROZEN) { CX = ((m_Delay < 40 && ((m_Delay >> 1) & 1) != 0) ? 6 : 7); } var rc = new Rectangle(CX * 32, CY * 32, 32, 32); lp.BltNatural(m_Graphic, m_nVX, m_nVY, rc); }
protected void Reaction(Cf3MapObjectBase obj) { if (obj == null) { return; } obj.GetPos(out var objX, out var objY); switch (obj.GetMapObjectType()) { case f3MapObjectType.MOT_FUNYA: case f3MapObjectType.MOT_GEASPRIN: { if (m_Type != NDT.NDT_VERTICAL || m_State != NDS.NDS_STOP || m_Speed != 0) { return; } if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y + 15, objY, m_Y + 271)) { m_State = NDS.NDS_DOWN; } } break; } default: { return; } } }
public void GetViewPos(ref int x, ref int y, float scrollx = 1.0f, float scrolly = 1.0f) { int offx = (int)(m_ScrollRX - 320 / 2), offy = (int)(m_ScrollRY - 224 / 2 - 2); TL.Saturate(0, ref offx, m_Width[1] * 32 - 320); TL.Saturate(0, ref offy, m_Height[1] * 32 - 224); x -= (int)(offx * scrollx); y -= (int)(offy * scrolly); }
public void Reset() { m_keyPushed.Clear(); m_keyPressed.Clear(); m_nSize = 0; Seek(); TL.DELETE_SAFE(ref m_pPlayerState); }
public void Dispose() { KillAllMapObject(); GarbageMapObject(); m_pObject = null; m_Wind = null; m_MapData[2] = null; m_MapData[1] = null; m_MapData[0] = null; m_MapChip[2].Dispose(); m_MapChip[1].Dispose(); m_MapChip[0].Dispose(); TL.DELETE_SAFE(ref m_pDIBBuf); }
public static void OnDrawAll(CDIB32 lp) { int sx, sy, ex, ey; sx = sy = 0; m_pParent.GetViewPos(ref sx, ref sy); sx = (-sx) >> 5; sy = (-sy) >> 5; ex = sx + 320 / 32; ey = sy + 224 / 32; TL.Saturate(sx, ref ex, m_pParent.GetWidth() - 1); TL.Saturate(sy, ref ey, m_pParent.GetHeight() - 1); foreach (var it in m_pParent.GetMapObjects(sx - 1, sy - 1, ex + 1, ey + 1, f3MapObjectType.MOT_ICE)) { if (it.IsValid()) { it.OnDraw(lp); } } }
public void Reaction(Cf3MapObjectBase obj) { if (obj == null || obj == this) { return; } obj.GetPos(out var objX, out var objY); switch (obj.GetMapObjectType()) { case f3MapObjectType.MOT_FUNYA: { if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y - 16, objY, m_Y)) { // 踏まれた!! m_bBlinking = true; } } break; } case f3MapObjectType.MOT_NEEDLE: case f3MapObjectType.MOT_GEASPRIN: { if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y, objY, m_Y + 40)) { // 食べちゃった!! m_Level++; } } break; } default: { return; } } }
private void BreatheOut() { int p = (int)Math.Floor(m_ChargePower / 40.0f) + 1; TL.Saturate(1, ref p, m_nPower); int start = (int)(-m_Angle + (p - 1) * 16), angle; for (int i = 0; i < p; i++) { angle = start - 32 * i; new Cf3MapObjectIce( m_X + CSinTable.Sin(angle) * 16 / 65536, m_Y - CSinTable.Cos(angle) * 16 / 65536, m_DX + CSinTable.Sin(angle) * 6 / 65536, m_DY - CSinTable.Cos(angle) * 6 / 65536); } m_nPower -= p; m_State = f3fffState.BREATHEOUT; m_ChargePower = 10.0f; }
public override void Synergy() { if (!IsValid()) { return; } foreach (var it in m_pParent.GetMapObjects(m_nCX - 1, m_nCY, m_nCX + 1, m_nCY + 10, f3MapObjectType.MOT_FUNYA)) { if (it.IsValid()) { Reaction(it); } } foreach (var it in m_pParent.GetMapObjects(m_nCX - 1, m_nCY, m_nCX + 1, m_nCY + 10, f3MapObjectType.MOT_GEASPRIN)) { if (it.IsValid()) { Reaction(it); } } foreach (var it in m_pParent.GetMapObjects(m_nCX - 1, m_nCY - 1, m_nCX + 1, m_nCY + 1, f3MapObjectType.MOT_EELPITCHER)) { if (it.IsValid()) { it.GetPos(out var objX, out var objY); if (TL.IsIn(objX - 16, m_X, objX + 16)) { if (TL.IsIn(objY, m_Y, objY + 40)) { // 食べられちゃった!! m_Type = NDT.NDT_DEAD; new Cf3MapObjectEffect(m_X, m_Y, 0); } } } } }
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 override void OnMove() { if (--m_Life <= 0) { Kill(); } float Wind = m_pParent.GetWind((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32)); m_DX -= (m_DX - Wind) * FRICTION; m_DY += GRAVITY; m_DY -= m_DY * FRICTION; TL.Saturate(-13.0f, ref m_DX, 13.0f); TL.Saturate(-13.0f, ref m_DY, 13.0f); m_X += m_DX; int s = GetSize(); if (m_DX > 0) { // 右側当たり判定 if (m_pParent.GetHit((int)Math.Floor((m_X + s) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { if ((int)Math.Floor((m_X + s) / 32) != (int)Math.Floor((m_X + s - m_DX) / 32)) { m_DX *= -REFRECTION; m_X = (int)Math.Floor((m_X + s) / 32) * 32 - s; m_Life--; } } } else if (m_DX < 0) { // 左側当たり判定 if (m_pParent.GetHit((int)Math.Floor((m_X - s) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { if ((int)Math.Floor((m_X - s) / 32) != (int)Math.Floor((m_X - s - m_DX) / 32)) { m_DX *= -REFRECTION; m_X = (int)Math.Floor(m_X / 32) * 32 + s; m_Life--; } } } m_Y += m_DY; if (m_DY > 0) { // 下側当たり判定 if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + s) / 32), HIT.HIT_TOP)) { if ((int)Math.Floor((m_Y + s) / 32) != (int)Math.Floor((m_Y + s - m_DY) / 32)) { m_DY *= -REFRECTION; m_Y = (int)Math.Floor((m_Y + s) / 32) * 32 - s; m_Life--; } } } else if (m_DY < 0) { // 上側当たり判定 if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y - s) / 32), HIT.HIT_BOTTOM)) { if ((int)Math.Floor((m_Y - s) / 32) != (int)Math.Floor((m_Y - s - m_DY) / 32)) { m_DY *= -REFRECTION; m_Y = (int)Math.Floor(m_Y / 32) * 32 + s; m_Life--; } } } }
public override void GetViewPos(out int vx, out int vy) { if (m_pParent.IsPlayable()) { int tx = 0, ty = 0; if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { tx += 1; } if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { tx += 2; } if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { ty += 1; } if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_UP)) { ty += 2; } if (tx == 0) { ; } else if (tx == 1) { m_VOffsetToX = 100; } else if (tx == 2) { m_VOffsetToX = -100; } else if (tx == 3) { m_VOffsetToX = 0; } if (ty == 0) { ; } else if (ty == 1) { m_VOffsetToY = 50; } else if (ty == 2) { m_VOffsetToY = -50; } else if (ty == 3) { m_VOffsetToY = 0; } TL.BringClose(ref m_VOffsetX, m_VOffsetToX, 1 + (m_DX * m_VOffsetToX < 0 ? 1 : 0) + (m_VOffsetX * m_VOffsetToX < 0 ? 1 : 0)); TL.BringClose(ref m_VOffsetY, m_VOffsetToY, 1 + (m_DY * m_VOffsetToY < 0 ? 1 : 0) + (m_VOffsetY * m_VOffsetToY < 0 ? 1 : 0)); var ox = m_VOffsetX; var oy = m_VOffsetY; vx = (int)(m_X + ox); vy = (int)(m_Y + oy); } else { vx = (int)m_X; vy = (int)m_Y; } }
public void Dispose() { TL.DELETE_SAFE(ref m_pPlayerState); }
public override void OnMove() { if (!IsValid()) { return; } if (m_Delay > 0) { m_Delay--; } if (m_State == f3GeasprinState.WALKING) { if (m_Direction == f3MapObjectDirection.DIR_LEFT && m_pParent.GetHit((int)Math.Floor((m_X - 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { Blow(); } else if (m_Direction == f3MapObjectDirection.DIR_RIGHT && m_pParent.GetHit((int)Math.Floor((m_X + 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { Blow(); } else if (!m_pParent.GetHit((int)Math.Floor((m_X + 17 * (m_Direction == f3MapObjectDirection.DIR_LEFT ? -1 : 1)) / 32), (int)Math.Floor((m_Y + 17) / 32), HIT.HIT_TOP)) { Stop(); } else { if (m_Delay == 0) { m_Delay = WalkDelay; m_GX += (m_Direction == f3MapObjectDirection.DIR_LEFT ? -1 : 1); } } } else if (m_State == f3GeasprinState.STANDING) { if (!m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 17) / 32), HIT.HIT_TOP)) { Stop(); } else { if (m_Delay == 0) { Walk(); } } } else if (m_State == f3GeasprinState.FALLING) { if (m_Delay == 0) { m_DY += 2; TL.Saturate(-60, ref m_DY, 60); m_GY += m_DY; } m_X = m_GX * 8; m_Y = m_GY / 8; if (m_DY > 0 && m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 17) / 32), HIT.HIT_TOP)) { m_GY = (((int)Math.Floor((m_Y + 17) / 32) - 1) * 32 + 16) * 8; Laugh(); } else if (m_DY < 0 && m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y - 15) / 32), HIT.HIT_BOTTOM)) { m_GY = (m_GY + 127) & ~127; m_DY = 0; } } else if (m_State == f3GeasprinState.LAUGHING) { if (m_Delay == 0) { Stop(); } } else if (m_State == f3GeasprinState.BLOWN) { if (m_Direction == f3MapObjectDirection.DIR_LEFT && !m_pParent.GetHit((int)Math.Floor((m_X + 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { m_GX++; } else if (m_Direction == f3MapObjectDirection.DIR_RIGHT && !m_pParent.GetHit((int)Math.Floor((m_X - 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { m_GX--; } if (m_Delay == 0) { Stop(); } } else if (m_State == f3GeasprinState.BACK) { if (!m_pParent.GetHit((int)Math.Floor((m_X + 17 * (m_Direction != f3MapObjectDirection.DIR_LEFT ? -1 : 1)) / 32), (int)Math.Floor((m_Y + 17) / 32), HIT.HIT_TOP)) { } else if (m_Direction == f3MapObjectDirection.DIR_LEFT && !m_pParent.GetHit((int)Math.Floor((m_X + 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { m_GX++; } else if (m_Direction == f3MapObjectDirection.DIR_RIGHT && !m_pParent.GetHit((int)Math.Floor((m_X - 17) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { m_GX--; } if (m_Delay == 0) { Laugh(); } } else if (m_State == f3GeasprinState.FROZEN) { if (m_Delay == 0) { Stop(); } } else if (m_State == f3GeasprinState.DEAD) { Kill(); } if (m_Spring[(int)f3MapObjectDirection.DIR_FRONT] != 0) { m_Spring2[(int)f3MapObjectDirection.DIR_FRONT] = CApp.theApp.random(m_Spring[(int)f3MapObjectDirection.DIR_FRONT]); } if (m_Spring[(int)f3MapObjectDirection.DIR_LEFT] != 0) { m_Spring2[(int)f3MapObjectDirection.DIR_LEFT] = CApp.theApp.random(m_Spring[(int)f3MapObjectDirection.DIR_LEFT]); } if (m_Spring[(int)f3MapObjectDirection.DIR_RIGHT] != 0) { m_Spring2[(int)f3MapObjectDirection.DIR_RIGHT] = CApp.theApp.random(m_Spring[(int)f3MapObjectDirection.DIR_RIGHT]); } m_X = m_GX * 8; m_Y = m_GY / 8; if (m_Y > m_pParent.GetHeight() * 32 + 16) { Kill(); new Cf3MapObjectEffect(m_X, m_Y, 1); } }
public override void OnMove() { if (m_State == f3EelPitcherState.EELLEAF) { TL.BringClose(ref m_Y, m_RootY - m_Level * 32, 4.0f); m_DX = m_DX + (m_pParent.GetWind((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32)) - m_DX) * m_Level * 0.1f + (m_RootX - m_X) * 0.025f; TL.Saturate(-14.0f, ref m_DX, 14.0f); m_X += m_DX; if (m_pParent.GetHit((int)Math.Floor((m_X - 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } else if (m_pParent.GetHit((int)Math.Floor((m_X + 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } } else if (m_State == f3EelPitcherState.EELFROZEN) { if (--m_Delay == 0) { m_Y += 16; m_State = f3EelPitcherState.EELSEED; m_Delay = 200; new Cf3MapObjectEffect(m_X, m_Y, 0); } } else if (m_State == f3EelPitcherState.EELSEED) { TL.BringClose(ref m_DY, 8.0f, 1.0f); m_DX += (m_pParent.GetWind((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32)) - m_DX) * 0.2f; TL.Saturate(-14.0f, ref m_DX, 14.0f); m_X += m_DX; if (m_pParent.GetHit((int)Math.Floor((m_X - 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } else if (m_pParent.GetHit((int)Math.Floor((m_X + 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } m_Y += m_DY; if ((int)Math.Floor(m_Y / 32) != (int)Math.Floor((m_Y - m_DY) / 32)) { // 32ドット境界をまたいだ!! if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_TOP) || (int)Math.Floor(m_Y / 32) >= m_pParent.GetHeight()) { Seed(); } else { if (m_pParent.GetHit((int)Math.Floor((m_X - 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_RIGHT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } else if (m_pParent.GetHit((int)Math.Floor((m_X + 16) / 32), (int)Math.Floor(m_Y / 32), HIT.HIT_LEFT)) { m_DX = 0; m_X = (int)Math.Floor(m_X / 32) * 32 + 16; } } } } else if (m_State == f3EelPitcherState.EELBUD) { if (--m_Delay == 0) { m_State = f3EelPitcherState.EELLEAF; } } else if (m_State == f3EelPitcherState.EELDEAD) { Kill(); } }
public override void OnDraw(CDIB32 lp) { SetViewPos(-16, -16); int height = (int)(m_RootY - m_Y); Rectangle rc; var graphic = CResourceManager.ResourceManager.Get(RID.RID_EELPITCHER); if (m_State == f3EelPitcherState.EELLEAF || m_State == f3EelPitcherState.EELFROZEN) { int offset1 = (m_State == f3EelPitcherState.EELLEAF ? 0 : 96); int offset2 = (m_Direction == f3MapObjectDirection.DIR_LEFT ? 32 : 64); int offset3 = (m_bBlinking ? 32 : 0); // あたま rc = new Rectangle(offset1 + offset2, offset3, 32, height >= 16 ? 32 : height + 16); lp.Blt(graphic, m_nVX, m_nVY, rc); // 茎 if (height > 16) { int i, h, h2; h = (int)Math.Floor((m_RootY - m_Y) / (Math.Abs(m_RootY - m_Y) + 1) + 1); if (h > 32) { h = 32; } for (i = 16; i < height; i += h) { h2 = h <= height - i ? h : height - i; rc = new Rectangle(offset1, offset2, 32, h2); // +0.5fは小数点以下四捨五入のため SetViewPos(-16 + (m_RootX - m_X) * (i - 16) / (height - 16) + 0.5f, -16); lp.Blt(graphic, m_nVX, m_nVY + 16 + i, rc); } } SetViewPos(-16, -16); if (TL.IsIn(17, height, 32)) { // あご rc = new Rectangle(offset1 + offset2, 80, 32, height - 16); lp.Blt(graphic, m_nVX, m_nVY + 32, rc); } else if (TL.IsIn(33, height, 48)) { int height2 = height - 32; // ふくろ rc = new Rectangle(offset1 + offset2, 64, 32, height2); lp.Blt(graphic, m_nVX, m_nVY + 32, rc); // あご rc = new Rectangle(offset1 + offset2, 80, 32, 16); lp.Blt(graphic, m_nVX, m_nVY + height, rc); } else if (height > 48) { // ふくろ rc = new Rectangle(offset1 + offset2, 64, 32, 16); lp.Blt(graphic, m_nVX, m_nVY + 32, rc); // あご rc = new Rectangle(offset1 + offset2, 80, 32, 16); lp.Blt(graphic, m_nVX, m_nVY + 48, rc); } } else if (m_State == f3EelPitcherState.EELSEED) { rc = new Rectangle(0, 0, 32, 32); lp.Blt(graphic, m_nVX, m_nVY, rc); } }
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); } }
public override void Synergy() { if (!IsValid()) { return; } m_bBlinking = false; GetCPos(out var cx, out var cy); if (m_State == f3EelPitcherState.EELLEAF) { foreach (var it in m_pParent.GetMapObjects(cx - 2, cy - 2, cx + 2, cy + 2, f3MapObjectType.MOT_FUNYA)) { if (it.IsValid()) { Reaction(it); } } if (m_RootY - m_Y > 16) { foreach (var it in m_pParent.GetMapObjects(cx - 1, cy - 1, cx + 1, cy + 1, f3MapObjectType.MOT_ICE)) { if (it.IsValid()) { it.GetPos(out var objX, out var objY); if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y, objY, m_Y + 40)) { Freeze(); } } } } } } foreach (var it in m_pParent.GetMapObjects(cx - 1, cy - 1, cx + 1, cy + 1, f3MapObjectType.MOT_EELPITCHER)) { if (it.IsValid() && it != this) { it.GetPos(out var objX, out var objY); if (m_State == f3EelPitcherState.EELLEAF || m_State == f3EelPitcherState.EELFROZEN) { if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y, objY, m_Y + 16)) { if (((Cf3MapObjectEelPitcher)it).m_State != f3EelPitcherState.EELLEAF) { // 食べちゃった!! m_Level += ((Cf3MapObjectEelPitcher)it).m_Level; } else { // 食べられちゃった!! m_State = f3EelPitcherState.EELDEAD; } } } } else if (m_State == f3EelPitcherState.EELSEED) { if (TL.IsIn(objX - 16, m_X, objX + 16)) { if (TL.IsIn(objY, m_Y, objY + 16)) { if (((Cf3MapObjectEelPitcher)it).m_State != f3EelPitcherState.EELDEAD) { // 食べられちゃった!! m_State = f3EelPitcherState.EELDEAD; } else { // 食べちゃった!! m_Level += ((Cf3MapObjectEelPitcher)it).m_Level; } } } } } } foreach (var it in m_pParent.GetMapObjects(cx - 2, cy - 2, cx + 2, cy + 2, f3MapObjectType.MOT_GEASPRIN)) { if (it.IsValid()) { Reaction(it); } } foreach (var it in m_pParent.GetMapObjects(cx - 1, cy - 1, cx + 1, cy + 1, f3MapObjectType.MOT_NEEDLE)) { if (it.IsValid()) { Reaction(it); } } }
public void OnDraw(CDIB32 lp, bool bShowHit) { int x, y, z; int vx, vy; int sx, sy, ex, ey; Rectangle r; lp.Clear(0); if (m_MapData[0] != null) { float mx = 1; if (m_Width[1] - 10 > 0) { mx = (float)(m_Width[0] - 10) / (float)(m_Width[1] - 10); } float my = 1; if (m_Height[1] - 7 > 0) { my = (float)(m_Height[0] - 7) / (float)(m_Height[1] - 7); } sx = sy = 0; GetViewPos(ref sx, ref sy, mx, my); sx = (-sx) >> 5; sy = (-sy) >> 5; ex = sx + 320 / 32; ey = sy + 224 / 32; TL.Saturate(sx, ref ex, m_Width[0] - 1); TL.Saturate(sy, ref ey, m_Height[0] - 1); for (y = sy; y <= ey; y++) { for (x = sx; x <= ex; x++) { z = y * m_Width[0] + x; r = new Rectangle((m_MapData[0][z] & 0xf) * 32, (m_MapData[0][z] >> 4) * 32, 32, 32); vx = x * 32; vy = y * 32; GetViewPos(ref vx, ref vy, mx, my); lp.BltFast(m_MapChip[0], vx, vy, r); } } } if (m_MapData[1] != null) { CDIB32 pHit = null; if (bShowHit) { pHit = CDIB32.Create(); pHit.CreateSurface(384, 32); pHit.BltFast(CResourceManager.ResourceManager.Get(RID.RID_HIT), 0, 0); pHit.SubColorFast(CApp.theApp.random(0x1000000)); } sx = sy = 0; GetViewPos(ref sx, ref sy); sx = (-sx) >> 5; sy = (-sy) >> 5; ex = sx + 320 / 32; ey = sy + 224 / 32; TL.Saturate(sx, ref ex, m_Width[1] - 1); TL.Saturate(sy, ref ey, m_Height[1] - 1); for (y = sy; y <= ey; y++) { for (x = sx; x <= ex; x++) { z = y * m_Width[1] + x; r = new Rectangle((m_MapData[1][z] & 0xf) * 32, (m_MapData[1][z] >> 4) * 32, 32, 32); vx = x * 32; vy = y * 32; GetViewPos(ref vx, ref vy); if (m_MapData[0] != null) { lp.Blt(m_MapChip[1], vx, vy, r); } else { lp.BltFast(m_MapChip[1], vx, vy, r); } if (bShowHit) { // 当たり判定表示 if (GetHit(x, y, HIT.HIT_TOP)) { int f = (byte)m_Hit[GetMapData(1, x, y)] & ~0x1f; r = new Rectangle(f, 0, 32, 32); lp.BlendBlt(pHit, vx, vy, 0x808080, 0x7f7f7f, r); } if (GetHit(x, y, HIT.HIT_BOTTOM)) { r = new Rectangle(256, 0, 32, 32); lp.BlendBlt(pHit, vx, vy, 0x808080, 0x7f7f7f, r); } if (GetHit(x, y, HIT.HIT_LEFT)) { r = new Rectangle(288, 0, 32, 32); lp.BlendBlt(pHit, vx, vy, 0x808080, 0x7f7f7f, r); } if (GetHit(x, y, HIT.HIT_RIGHT)) { r = new Rectangle(320, 0, 32, 32); lp.BlendBlt(pHit, vx, vy, 0x808080, 0x7f7f7f, r); } if (GetHit(x, y, HIT.HIT_DEATH)) { r = new Rectangle(352, 0, 32, 32); lp.BlendBlt(pHit, vx, vy, 0x808080, 0x7f7f7f, r); } } } } if (bShowHit) { pHit.Dispose(); } } Cf3MapObjectBanana.OnDrawAll(lp); Cf3MapObjectmrframe.OnDrawAll(lp); if (m_MainChara != null) { m_MainChara.OnDraw(lp); } Cf3MapObjectGeasprin.OnDrawAll(lp); Cf3MapObjectNeedle.OnDrawAll(lp); Cf3MapObjectEelPitcher.OnDrawAll(lp); Cf3MapObjectIceSource.OnDrawAll(lp); Cf3MapObjectFire.OnDrawAll(lp); Cf3MapObjectIce.OnDrawAll(lp); Cf3MapObjectEffect.OnDrawAll(lp); Cf3MapObjectWind.OnDrawAll(lp); if (m_MapData[2] != null) { float mx = 1.0f; if (m_Width[1] - 10 > 0) { mx = (float)(m_Width[2] - 10) / (m_Width[1] - 10); } float my = 1.0f; if (m_Height[1] - 7 > 0) { my = (float)(m_Height[2] - 7) / (m_Height[1] - 7); } sx = sy = 0; GetViewPos(ref sx, ref sy, mx, my); sx = (-sx) >> 5; sy = (-sy) >> 5; ex = sx + 320 / 32; ey = sy + 224 / 32; TL.Saturate(sx, ref ex, m_Width[2] - 1); TL.Saturate(sy, ref ey, m_Height[2] - 1); for (y = sy; y <= ey; y++) { for (x = sx; x <= ex; x++) { z = y * m_Width[2] + x; r = new Rectangle((m_MapData[2][z] & 0xf) * 32, (m_MapData[2][z] >> 4) * 32, 32, 32); vx = (int)(x * 32 * mx); vy = (int)(y * 32 * my); GetViewPos(ref vx, ref vy, mx, my); lp.Blt(m_MapChip[2], vx, vy, r); } } } var lpSrc = lp; 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 ((m_nEffect & 4) != 0) { CPlaneTransBlt.FlushBlt1(lpDst, lpSrc, 0, 0, 128); TL.swap(ref lpSrc, ref lpDst); } if (lpDst == lp) { lpDst.BltFast(lpSrc, 0, 0); } }
public override void OnMove() { if (!IsValid()) { return; } if (m_Type == NDT.NDT_UNDEFINED) { // このタイミングで初期化 if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP)) { m_Type = NDT.NDT_HORIZONTAL; m_State = NDS.NDS_STOP; } else { m_Type = NDT.NDT_VERTICAL; m_StartY = m_Y; m_State = NDS.NDS_STOP; } } if (m_Type == NDT.NDT_HORIZONTAL) { if (m_State == NDS.NDS_STOP) { TL.BringClose(ref m_Speed, 0.0f, 1.0f); if (m_Speed == 0) { if (!m_pParent.GetHit((int)Math.Floor((m_X + 15) / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP) || m_pParent.GetHit((int)Math.Floor((m_X + 15) / 32), (int)Math.Floor((m_Y) / 32), HIT.HIT_LEFT)) { m_State = NDS.NDS_LEFT; } else { m_State = NDS.NDS_RIGHT; } } } else if (m_State == NDS.NDS_LEFT) { m_X -= 1; if (!m_pParent.GetHit((int)Math.Floor((m_X - 16) / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP) || m_pParent.GetHit((int)Math.Floor((m_X - 16) / 32), (int)Math.Floor((m_Y) / 32), HIT.HIT_RIGHT)) { m_State = NDS.NDS_STOP; m_Speed = 20; } } else if (m_State == NDS.NDS_RIGHT) { m_X += 1; if (!m_pParent.GetHit((int)Math.Floor((m_X + 15) / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP) || m_pParent.GetHit((int)Math.Floor((m_X + 15) / 32), (int)Math.Floor((m_Y) / 32), HIT.HIT_LEFT)) { m_State = NDS.NDS_STOP; m_Speed = 20; } } } else if (m_Type == NDT.NDT_VERTICAL) { if (m_State == NDS.NDS_STOP) { if (m_Speed != 0) { TL.BringClose(ref m_Speed, 0.0f, 1.0f); if (m_Speed == 0) { m_State = NDS.NDS_UP; } } } else if (m_State == NDS.NDS_UP) { TL.BringClose(ref m_Y, m_StartY, 1.0f); if (m_Y == m_StartY) { m_State = NDS.NDS_STOP; } } else if (m_State == NDS.NDS_DOWN) { m_Speed += 0.2f; TL.Saturate(0.0f, ref m_Speed, 10.0f); m_Y += m_Speed; if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP)) { m_Y = (float)Math.Floor((m_Y + 16) / 32) * 32 - 15; m_Speed = 20; m_State = NDS.NDS_STOP; } else if (m_Y > m_pParent.GetHeight() * 32 + 16) { m_Type = NDT.NDT_DEAD; new Cf3MapObjectEffect(m_X, m_Y, 1); } } } else if (m_Type == NDT.NDT_DEAD) { Kill(); } }
public override void Synergy() { if (!IsValid()) { 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()) { it.GetPos(out var objX, out var objY); if (TL.IsIn(objX - 16, m_X, objX + 16)) { if (TL.IsIn(objY, m_Y, objY + 40)) { // 食べられちゃった!! m_State = f3GeasprinState.DEAD; new Cf3MapObjectEffect(m_X, m_Y, 0); return; } } } } if (!IsFrozen()) { // ふにゃ foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_FUNYA)) { if (it.IsValid()) { Reaction(it); } } // ギヤバネ foreach (var it in m_pParent.GetMapObjects(m_nCX - 2, m_nCY - 2, m_nCX + 2, m_nCY + 2, f3MapObjectType.MOT_GEASPRIN)) { if (it != this && it.IsValid()) { it.GetPos(out var objX, out var objY); if (TL.IsIn(m_X - 8, objX, m_X + 8)) { if (TL.IsIn(m_Y - 32, objY, m_Y)) { // 踏まれた! Laugh(); m_Spring[(int)f3MapObjectDirection.DIR_FRONT] = 32; } else if (TL.IsIn(m_Y, objY, m_Y + 32)) { // 踏んだ! if (((Cf3MapObjectGeasprin)it).m_State != f3GeasprinState.FROZEN) { Jump(); } else { m_Y = objY - 32.125f; m_GY = (int)(m_Y * 8); Freeze(); } } } else if (TL.IsIn(m_X + 16, objX, m_X + 29)) { if (TL.IsIn(m_Y - 16, objY, m_Y + 16)) { // 右から来た! if (((Cf3MapObjectGeasprin)it).m_State != f3GeasprinState.FROZEN) { Blow(f3MapObjectDirection.DIR_RIGHT); m_Spring[(int)f3MapObjectDirection.DIR_RIGHT] = 32; } else { m_X = objX - 40; m_GX = (int)(m_X / 8); Freeze(); } } } else if (TL.IsIn(m_X - 29, objX, m_X - 16)) { if (TL.IsIn(m_Y - 16, objY, m_Y + 16)) { // 左から来た! if (((Cf3MapObjectGeasprin)it).m_State != f3GeasprinState.FROZEN) { Blow(f3MapObjectDirection.DIR_LEFT); m_Spring[(int)f3MapObjectDirection.DIR_LEFT] = 32; } else { m_X = objX + 40; m_GX = (int)(m_X / 8); Freeze(); } } } } } // 氷 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()) { it.GetPos(out var objX, out var objY); if ((objX - m_X) * (objX - m_X) + (objY - m_Y) * (objY - m_Y) < 256) { // あたった! Freeze(); } } } } }
protected void BreatheOut() { if (m_bOriginal && m_State == f3MainCharaState.SLEEPING) { CApp.theApp.GetBGM().MusicEffect(MENumber.MEN_AWAKE); } int p = (int)Math.Floor(m_ChargePower / 40.0f) + 1; TL.Saturate(1, ref p, m_nPower); var s = new temp_s[4]; if (m_Direction == f3MapObjectDirection.DIR_FRONT) { if ((p & 1) != 0) { s[0].x = 0.0f; s[0].y = -16.0f; s[0].dx = 0.0f; s[0].dy = -6.0f; s[1].x = 16.0f * SIN30; s[1].y = -16.0f * COS30; s[1].dx = 6.0f * SIN30; s[1].dy = -6.0f * COS30; s[2].x = -s[1].x; s[2].y = s[1].y; s[2].dx = -s[1].dx; s[2].dy = s[1].dy; } else { s[0].x = 16.0f * SIN15; s[0].y = -16.0f * COS15; s[0].dx = 6.0f * SIN15; s[0].dy = -6.0f * COS15; s[1].x = -s[0].x; s[1].y = s[0].y; s[1].dx = -s[0].dx; s[1].dy = s[0].dy; s[2].x = 16.0f * SIN45; s[2].y = -16.0f * COS45; s[2].dx = 6.0f * SIN45; s[2].dy = -6.0f * COS45; s[3].x = -s[2].x; s[3].y = s[2].y; s[3].dx = -s[2].dx; s[3].dy = s[2].dy; } } else { s[0].x = 16.0f * COS15; s[0].y = -16.0f * SIN15; s[0].dx = 6.0f * COS15; s[0].dy = -6.0f * SIN15; s[1].x = 16.0f * COS30; s[1].y = -16.0f * SIN30; s[1].dx = 6.0f * COS30; s[1].dy = -6.0f * SIN30; s[2].x = 16.0f * COS45; s[2].y = -16.0f * SIN45; s[2].dx = 6.0f * COS45; s[2].dy = -6.0f * SIN45; s[3].x = 16.0f * COS60; s[3].y = -16.0f * SIN60; s[3].dx = 6.0f * COS60; s[3].dy = -6.0f * SIN60; } for (int i = 0; i < p; i++) { if (m_Direction == f3MapObjectDirection.DIR_LEFT) { s[i].x = -s[i].x; s[i].dx = -s[i].dx; } new Cf3MapObjectIce(m_X + s[i].x, m_Y + s[i].y, m_DX + s[i].dx, m_DY + s[i].dy); } m_nPower -= p; m_State = f3MainCharaState.BREATHEOUT; m_ChargePower = 10.0f; }
public Cf3Map(Cf3StageFile lp, int stage, bool playable = true) { byte[] buf; string text; uint[] bgm = new uint[(int)BGMNumber.BGMN_SIZE]; m_pDIBBuf = CDIB32.Create(); m_pDIBBuf.CreateSurface(320, 240); m_Stage = (byte)stage; m_bPlayable = playable; Cf3MapObjectBase.SetParent(this); m_nGotBanana = m_nTotalBanana = 0; m_Wind = null; m_pObject = null; // キャラ m_MainChara = null; // タイトル m_Title = ""; if ((text = lp.GetStageDataString(GetChunkType(CT.CT_TL00, stage))) != null) { m_Title = text; } // マップチップ m_MapChip[0] = ReadMapChip(lp, 0); m_MapChip[1] = ReadMapChip(lp, 1); m_MapChip[2] = ReadMapChip(lp, 2); // 当たり判定 Array.Copy(m_defHit, m_Hit, 240); if ((buf = lp.GetStageData(CT.CT_HITS)) != null) { Array.Copy(buf, m_Hit, Math.Min(buf.Length, 240)); } // マップデータ(下層) if ((buf = lp.GetStageData(GetChunkType(CT.CT_M000, stage))) != null) { m_Width[0] = buf[0]; m_Height[0] = buf[1]; m_MapData[0] = new byte[m_Width[0] * m_Height[0]]; Array.Copy(buf, 2, m_MapData[0], 0, m_Width[0] * m_Height[0]); } else { m_MapData[0] = null; } // マップデータ(中層) if ((buf = lp.GetStageData(GetChunkType(CT.CT_M100, stage))) != null) { m_Width[1] = buf[0]; m_Height[1] = buf[1]; var stagesize = m_Width[1] * m_Height[1]; m_MapData[1] = new byte[stagesize]; m_Wind = new float[stagesize]; m_pObject = new Cf3MapObjectBase[stagesize]; var windmap = new byte[stagesize]; Array.Copy(buf, 2, m_MapData[1], 0, stagesize); int x, y, z, n; z = 0; for (y = 0; y < m_Height[1]; y++) { for (x = 0; x < m_Width[1]; x++) { windmap[z] = 0; n = m_MapData[1][z]; if (n >= 0xf0) { if (n == 0xf0) // 主人公 { if (m_MainChara == null) { m_MainChara = Cf3MapObjectMain.Create(x, y); } bgm[(int)BGMNumber.BGMN_GAMEFUNYA] += 99; } else if (n == 0xf1) // バナナ { new Cf3MapObjectBanana(x, y); bgm[(int)BGMNumber.BGMN_GAMEBANANA] += 1; m_nTotalBanana++; } else if (n == 0xf2) // とげとげ { new Cf3MapObjectNeedle(x, y); bgm[(int)BGMNumber.BGMN_GAMENEEDLE] += 4; } else if (n == 0xf3) // ギヤバネ左向き { new Cf3MapObjectGeasprin(x, y, f3MapObjectDirection.DIR_LEFT); bgm[(int)BGMNumber.BGMN_GAMEGEASPRIN] += 10; } else if (n == 0xf4) // ギヤバネ右向き { new Cf3MapObjectGeasprin(x, y, f3MapObjectDirection.DIR_RIGHT); bgm[(int)BGMNumber.BGMN_GAMEGEASPRIN] += 10; } else if (n == 0xf5) // 風ストップ { windmap[z] = 0xC; } else if (n == 0xf6) // 風左向き { windmap[z] = 0x1; bgm[(int)BGMNumber.BGMN_GAMEWIND] += 1; } else if (n == 0xf7) // 風右向き { windmap[z] = 0x2; bgm[(int)BGMNumber.BGMN_GAMEWIND] += 1; } else if (n == 0xf8) // ミスター・フレーム { new Cf3MapObjectmrframe(x, y); bgm[(int)BGMNumber.BGMN_GAMEMRFRAME] += 40; } else if (n == 0xf9) // ウナギカズラ { new Cf3MapObjectEelPitcher(x, y); bgm[(int)BGMNumber.BGMN_GAMEEELPITCHER] += 5; } else if (n == 0xfa) // 氷 { new Cf3MapObjectIceSource(x, y); bgm[(int)BGMNumber.BGMN_GAMEICE] += 8; } else if (n == 0xfb) // 火 { new Cf3MapObjectFire(x, y); bgm[(int)BGMNumber.BGMN_GAMEFIRE] += 8; } else if (n == 0xfc) // とげとげ { new Cf3MapObjectNeedle(x, y, 1); bgm[(int)BGMNumber.BGMN_GAMENEEDLE] += 4; } else if (n == 0xfd) // とげとげ { new Cf3MapObjectNeedle(x, y, 2); bgm[(int)BGMNumber.BGMN_GAMENEEDLE] += 4; } else if (n == 0xfe) // とげとげ { new Cf3MapObjectNeedle(x, y, 3); bgm[(int)BGMNumber.BGMN_GAMENEEDLE] += 4; } m_MapData[1][z] = 0; } else { if (GetHit(x, y, HIT.HIT_LEFT)) { windmap[z] = 0x4; } else { windmap[z] = 0; } if (GetHit(x, y, HIT.HIT_RIGHT)) { windmap[z] |= 0x8; } } z++; } } z = 0; var wind = 0.0f; int dx; for (y = 0; y < m_Height[1]; y++) { for (x = 0; x < m_Width[1]; x++) { if ((windmap[z] & 0x10) != 0) { } else { wind = 0.0f; for (dx = 0; x + dx < m_Width[1]; dx++) { if ((windmap[z + dx] & 0x4) != 0) { break; } if ((windmap[z + dx] & 0x1) != 0) { wind -= 1.0f; } if ((windmap[z + dx] & 0x2) != 0) { wind += 1.0f; } windmap[z + dx] |= 0x10; if ((windmap[z + dx] & 0x8) != 0) { break; } } if (TL.IsIn(-0.01f, wind, 0.01f)) { wind = 0.0f; } else { new Cf3MapObjectWind(x, y, dx, wind); } } m_Wind[z] = wind; z++; } } Cf3MapObjectBase.UpdateCPosAll(); } else { m_MapData[1] = null; } // マップデータ(上層) if ((buf = lp.GetStageData(GetChunkType(CT.CT_M200, stage))) != null) { m_Width[2] = buf[0]; m_Height[2] = buf[1]; m_MapData[2] = new byte[m_Width[2] * m_Height[2]]; Array.Copy(buf, 2, m_MapData[2], 0, m_Width[2] * m_Height[2]); } else { m_MapData[2] = null; } // BGM uint bgmm = 0; m_BGMNumber = BGMNumber.BGMN_SIRENT; for (int i = (int)BGMNumber.BGMN_SIRENT; i < (int)BGMNumber.BGMN_SIZE; i++) { if (bgmm < bgm[i]) { bgmm = bgm[i]; m_BGMNumber = (BGMNumber)i; } } m_ScrollX = m_ScrollY = 0; if (m_MainChara != null) { m_MainChara.GetPos(out m_ScrollRX, out m_ScrollRY); } }
public override void OnMove() { if (!IsValid()) { return; } if (!m_pParent.IsPlayable()) { return; } if (m_bFirst) { HitCheck(); m_bFirst = false; } float Wind = m_pParent.GetWind((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32)); float Friction = m_pParent.GetFriction((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 14) / 32)); float Gravity = GetGravity(); if (m_pParent.ItemCompleted()) { Smile(); } if (Cf3Setting.theSetting.m_Hyper != 0) { m_nPower = 4; } // 動かしま~す if (m_State == f3MainCharaState.STANDING || m_State == f3MainCharaState.SLEEPING || m_State == f3MainCharaState.BLINKING) { // 立ってるとき m_DX -= WINDFACTOR * (m_DX - Wind) * RUNFRICTION; TL.BringClose(ref m_DX, 0.0f, Friction); if (m_DX == 0) { m_Direction = f3MapObjectDirection.DIR_FRONT; } if (m_State == f3MainCharaState.STANDING && ++m_Sleepy >= 30 * 40 / 3) { Sleep(); } if (m_State == f3MainCharaState.BLINKING && --m_PoseCounter == 0) { m_State = f3MainCharaState.STANDING; } if (m_State == f3MainCharaState.STANDING && CApp.theApp.random(120) == 0) { Blink(); } if (m_PowerY <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_JUMP)) { StartJump(); } if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { Run(f3MapObjectDirection.DIR_LEFT); } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { Run(f3MapObjectDirection.DIR_RIGHT); } if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { Sit(); } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } if (!m_HitBottom) { Fall(); } } else if (m_State == f3MainCharaState.RUNNING) { // 走ってるとき int AXL = 0, AXR = 0; if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { AXL = 1; } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { AXR = 1; } m_DX -= Friction * (m_DX - Wind) * RUNFRICTION; m_DX += Friction * 2.0f * (AXR - AXL); if (AXL != 0 && AXR == 0) { m_Direction = f3MapObjectDirection.DIR_LEFT; } if (AXR != 0 && AXL == 0) { m_Direction = f3MapObjectDirection.DIR_RIGHT; } if (AXL == 0 && AXR == 0) { Stop(); } if (m_PowerY <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_JUMP)) { StartJump(); } if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { Sit(); } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } if (!m_HitBottom) { Fall(); } } else if (m_State == f3MainCharaState.WALKING) { // 歩いてるとき int AXL = 0, AXR = 0; if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { AXL = 1; } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { AXR = 1; } m_DX += WALKACCEL * (AXR - AXL); m_DX -= m_DX * WALKFRICTION; if (AXL != 0 && AXR == 0) { m_Direction = f3MapObjectDirection.DIR_LEFT; } if (AXR != 0 && AXL == 0) { m_Direction = f3MapObjectDirection.DIR_RIGHT; } if (AXL == 0 && AXR == 0) { m_Direction = f3MapObjectDirection.DIR_FRONT; } if (!m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { Stop(); } if (m_PowerY <= 0 && m_pInput.GetKeyPushed((int)F3KEY.F3KEY_JUMP)) { StartJump(); } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } if (!m_HitBottom) { Fall(); } } else if (m_State == f3MainCharaState.CHARGING) { // パワー充填中 if (m_ChargePower > 0) { m_ChargePower -= m_ChargeDec; if (m_ChargePower < 0) { m_ChargePower = 0; } } m_X -= m_DX; if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_DOWN)) { Sit(); } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } if (!m_pInput.GetKeyPressed((int)F3KEY.F3KEY_JUMP)) { Jump(); } if (!m_HitBottom) { Fall(); } } else if (m_State == f3MainCharaState.JUMPING) { // 空中 if (m_DY >= 0) { int AXL = 0, AXR = 0; if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { AXL = 1; } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { AXR = 1; } m_DX -= (m_DX - Wind) * JUMPFRICTIONX; m_DX += JUMPACCEL * (AXR - AXL); if (AXL != 0 && AXR == 0) { m_Direction = f3MapObjectDirection.DIR_LEFT; } if (AXR != 0 && AXL == 0) { m_Direction = f3MapObjectDirection.DIR_RIGHT; } } if (m_HitLeft || m_HitRight) { m_Direction = f3MapObjectDirection.DIR_FRONT; } m_DY += Gravity; if (m_DY >= 0) { if (m_PowerY >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { m_DY += Gravity * ADDGRAVITY; } m_DY -= m_DY * JUMPFRICTIONY; if (m_pInput.GetKeyPressed((int)F3KEY.F3KEY_UP)) { m_DY += Gravity; m_DY -= m_DY * JUMPFRICTIONY; } } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } if (m_HitBottom) { Land(); } } else if (m_State == f3MainCharaState.BREATHEIN) { // 冷気充填中 m_ChargePower += 1.0f; if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_LEFT)) { m_Direction = f3MapObjectDirection.DIR_LEFT; } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_RIGHT)) { m_Direction = f3MapObjectDirection.DIR_RIGHT; } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_UP)) { m_Direction = f3MapObjectDirection.DIR_FRONT; } if (m_HitBottom) { m_DX -= WINDFACTOR * (m_DX - Wind) * RUNFRICTION; TL.BringClose(ref m_DX, 0.0f, Friction); if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_DOWN)) { Sit(); } } else { m_ChargePower += 1.0f; if (m_DY >= 0) { m_DX -= (m_DX - Wind) * JUMPFRICTIONX; } m_DY += Gravity; if (m_DY >= 0) { m_DY -= m_DY * JUMPFRICTIONY; } } if (!m_pInput.GetKeyPressed((int)F3KEY.F3KEY_ATTACK)) { BreatheOut(); } } else if (m_State == f3MainCharaState.BREATHEOUT) { // 冷気放出!! m_ChargePower -= 1.0f; if (m_HitBottom) { m_DX -= WINDFACTOR * (m_DX - Wind) * RUNFRICTION; TL.BringClose(ref m_DX, 0.0f, Friction); } else { if (m_DY >= 0) { m_DX -= (m_DX - Wind) * JUMPFRICTIONX; } m_DY += Gravity; if (m_DY >= 0) { m_DY -= m_DY * JUMPFRICTIONY; } } if (m_ChargePower <= 0.0f) { if (m_nPower != 0) { if (m_HitBottom) { Land(); } else { Fall(); } } else { Tire(); } } } else if (m_State == f3MainCharaState.TIRED) { // ちかれたー! m_PoseCounter--; if (m_HitBottom) { m_DX -= WINDFACTOR * (m_DX - Wind) * RUNFRICTION; TL.BringClose(ref m_DX, 0.0f, Friction); } else { m_DX -= (m_DX - Wind) * JUMPFRICTIONX; if (m_HitLeft || m_HitRight) { m_Direction = f3MapObjectDirection.DIR_FRONT; } m_DY += Gravity; m_DY -= m_DY * JUMPFRICTIONY; } if (m_PoseCounter == 0) { Land(); } } else if (m_State == f3MainCharaState.FROZEN) { // 凍っちゃった… m_PoseCounter--; if (m_HitBottom) { m_DX -= WINDFACTOR * (m_DX - Wind) * RUNFRICTION / 5; TL.BringClose(ref m_DX, 0.0f, Friction / 5); } else { m_DX -= (m_DX - Wind) * JUMPFRICTIONX / 5; m_DY += Gravity * (1 + ADDGRAVITY); m_DY -= m_DY * JUMPFRICTIONY / 5; } if (m_PoseCounter == 0) { Land(); } } // 速度飽和(めり込み防止) TL.Saturate(-RUNMAX, ref m_DX, RUNMAX); TL.Saturate(-JUMPMAX, ref m_DY, FALLMAX); // 実際の移動+当たり判定 // 1回の移動ごとに当たり判定 // という手順ですり抜けバグは解消されるはず m_HitLeft = m_HitRight = m_HitTop = m_HitBottom = false; m_X += m_DX; HitCheck(); if (!m_HitTop && !m_HitBottom) { m_Y += m_DY; HitCheck(); } }
public void Reaction(Cf3MapObjectBase obj) { if (obj == null) { return; } obj.GetPos(out var objX, out var objY); switch (obj.GetMapObjectType()) { case f3MapObjectType.MOT_FUNYA: { if (TL.IsIn(m_X - 16, objX, m_X + 16)) { if (TL.IsIn(m_Y - 32, objY, m_Y)) { // 踏まれた! Laugh(); m_Spring[(int)f3MapObjectDirection.DIR_FRONT] = 32; if (!m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP)) { m_GY++; } } } else if (TL.IsIn(m_X + 16, objX, m_X + 29)) { if (TL.IsIn(m_Y - 16, objY, m_Y + 16)) { // 右から来た! if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP)) { Back(f3MapObjectDirection.DIR_RIGHT); } else { Laugh(); } m_Spring[(int)f3MapObjectDirection.DIR_RIGHT] = 32; } } else if (TL.IsIn(m_X - 29, objX, m_X - 16)) { if (TL.IsIn(m_Y - 16, objY, m_Y + 16)) { // 左から来た! if (m_pParent.GetHit((int)Math.Floor(m_X / 32), (int)Math.Floor((m_Y + 16) / 32), HIT.HIT_TOP)) { Back(f3MapObjectDirection.DIR_LEFT); } else { Laugh(); } m_Spring[(int)f3MapObjectDirection.DIR_LEFT] = 32; } } break; } default: { return; } } }