Exemple #1
0
        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;
        }
Exemple #2
0
 public void Dispose()
 {
     TL.DELETE_SAFE(ref stage);
     TL.DELETE_SAFE(ref map);
     Cf3Setting.theSetting.m_Gravity = oldgravity;
     Cf3Setting.theSetting.m_Hyper   = oldhyper;
 }
Exemple #3
0
        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);
        }
Exemple #4
0
        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;
            }
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
 public void Reset()
 {
     m_keyPushed.Clear();
     m_keyPressed.Clear();
     m_nSize = 0;
     Seek();
     TL.DELETE_SAFE(ref m_pPlayerState);
 }
Exemple #7
0
 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);
 }
Exemple #8
0
        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);
                }
            }
        }
Exemple #9
0
        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;
            }
            }
        }
Exemple #10
0
        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;
        }
Exemple #11
0
 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);
                 }
             }
         }
     }
 }
Exemple #12
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();
     }
 }
Exemple #13
0
        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--;
                    }
                }
            }
        }
Exemple #14
0
 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;
     }
 }
Exemple #15
0
 public void Dispose()
 {
     TL.DELETE_SAFE(ref m_pPlayerState);
 }
Exemple #16
0
 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);
     }
 }
Exemple #17
0
 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();
     }
 }
Exemple #18
0
        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);
            }
        }
Exemple #19
0
        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);
            }
        }
Exemple #20
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);
         }
     }
 }
Exemple #21
0
        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);
            }
        }
Exemple #22
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();
     }
 }
Exemple #23
0
 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();
                 }
             }
         }
     }
 }
Exemple #24
0
        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;
        }
Exemple #25
0
        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);
            }
        }
Exemple #26
0
        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();
            }
        }
Exemple #27
0
        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;
            }
            }
        }