the cutting room mirror

Sonic the Hedgehog 4

This article has a talk page!
view on tcrf.net

This is a sub-page of Development:Sonic the Hedgehog 4: Episode I.

To do:

  • More commented out code.

'...But what does it mean?'
This game has text or audio that needs to be translated. If you are fluent with this language, please read our translation guidelines and then submit a translation!

The demo version has some unused code.

Developmer Comments#

/*****************************************************************************/
/*      Sonic4_AppMain.cpp          Author : Syuichi Gotou                   */
/*            Copyright(c) 2009 Dimps CORP. All Rights Reserved.             */
/*---------------------------------------------------------------------------*/
/* iPhone アプリケーションメイン                                             */
/*---------------------------------------------------------------------------*/
/* Date          Ver    Comment                                              */
/* 090630-       0.01   first version                                        */
/*****************************************************************************/

Commented Code#

Enemy#

        //// パケット送信
        //GmEnemyPacketSet( pWork, pPlayer, GMD_ENEMY_STATE_DAMAGE);

        //// プレイヤー特殊跳ね返り
        //if ( pPlayer && ply_work->obj_work.obj_type == GMD_OBJTYPE_PLAYER) {
        //  GmPlayerAtkReactionRefInit( pPlayer );
        //  return;
        //}


Enemy Packet.

Player#

// #endif of #if defined(MTD_DEBUG)  // デバッグ版

//  g_obj.drawflag |= NND_DRAWOBJ_FRAGPARALIGHT1 | NND_DRAWOBJ_SHADER_VERTEXBLEND;
//  g_obj.load_drawflag |= NND_DRAWOBJ_FRAGPARALIGHT1 | NND_DRAWOBJ_SHADER_VERTEXBLEND;

//  g_obj.drawflag |= (NND_DRAWOBJ_MATCTRL_DIFFUSE | NND_DRAWOBJ_MATCTRL_AMBIENT);
//  g_obj.drawflag |= (NND_DRAWOBJ_MATCTRL_ALPHA | NND_DRAWOBJ_MATCTRL_BLEND);
//  g_obj.drawflag |= NND_DRAWOBJ_MATCTRL_TEXOFFSET;


//  if (!GmMainIsCreateDHB()) {
//     ply_work->gmk_flag &= ~GMD_PLGF_DH_BOARD;
//  }

    // プレイヤー中心へ移動完了◆
//    GmMapCamExternOpExitX((MTE_GE2_TYPE)ply_work->camera_no);
//    GmMapCamExternOpExitY((MTE_GE2_TYPE)ply_work->camera_no);

    // タイマ等初期化
    //ply_work->lFrontWallPosY = 0;
    //ply_work->lFrontWallPosZ = 0;
//    ply_work->tension_combo_timer = 0;
//    ply_work->tension_combo = 0;


    // SE
    //GmSoundPlaySE("Damage1");
    //GmSoundPlaySE("Damage2");     針◆
    //GmSoundPlaySE("Damage3");     水
//  // 針ダメージの時、針の音を鳴らす
//  if ( pDamage->hit_flag & GMD_OBJ_RECT_HIT_FLAG_NEEDLE ) {
//      GmSoundPlayArcSe( &ply_work->h_snd_se, Game_SE, SE_Toge );
//  }

//  /* テンション設定 */
//  if ( !(ply_work->player_flag & GMD_PLF_BARRIER ) ) {
//  // テンション減少
//      GmPlayerTensionGet( ply_work, -GMD_PLAYER_TRICK_DAMAGE );
//      GmFixSetTensionAct((s16)(ply_work->tension >> GMD_PLAYER_TENSION_SHIFT), GMD_FIX_TENSION_DEC_ANIM_VIBRATION);
//  }

    /* ダメージ設定 */
    


====Sonic Rush leftover code====

//ply_work->hover_timer = GMD_PL_BLAZE_HOVER_TIME;


//  // SE
//  switch ( ply_work->char_no ) {
//  default:
//      // Voice
//      GmSoundPlayArcSe( &ply_work->h_snd_se, Game_SE, SE_Owa );
//      break;
//  case GSD_PLAYER_BLAZE:
//      // Voice
//      GmSoundPlayArcSe( &ply_work->h_snd_se, Game_SE, SE_Ups );
//      break;
//  }


A possible leftover snippet of code from Sonic Rush, based on the mentions of Blaze the Cat and her hovering ability. Given Sonic the Hedgehog 4: Episode I reuses Sonic Rush's physics engine, it's not very out of place.

Stage Select#

//#include "dbgPadEmu.hpp" //フリックの操作とデバッグパッドが混線する


Probably to include a debug pad.

//  u32 has_emerald[24];                                //!< 各ステージで取得したエメラルドの情報


This is supposed to be info determining how many Chaos Emeralds are obtained in a stage.

//mppAchievementSupport::get()->event_LoseRingCounterClear();//sss - bad


commented, because it was "bad".

                /*
                if(true) {//test2 time att
                    main_work->record_time[iii] = 6000+iii;
                    main_work->hi_score[iii] = 5000+iii;
                }*/


A commented "Time Attack" test, which shows the record time and the high score.

s32 dmStgSlctGetRevisedStageNo(s32 idx, s32 diff, s32 zone_no)
{
    s32 result;
    s32 src = 0;
    s32 dst = 0;
    
    result = (int)idx + diff;

    src = dm_stgslct_zone_act_num_tbl[zone_no][0];
    dst = src + dm_stgslct_zone_act_num_tbl[zone_no][1];
    
    // 先頭から一つ戻ると最後に移動
    if (result < src) {
        result = (int)(dst - 1);
    }
    
    // 最後から一つ進むと先頭に移動
    if (result >= dst) {
        result = src;
    }
    
    MTM_ASSERT(result >= src && result < dst);
    
    return result;
}
*/


===Motobug===

    //ObjObjectAction3dNNModelLoad(obj_work, &ene_work->obj_3d,
    //          NULL/*data_work*/, NULL/*model_data_path*/,
    //          IDB_ENE_MOTORA_MDL_ENE_MOTORA_ZNO/*index*/,
    //          ObjDataGet(GMD_DWORK_NO_ENEMY_MOTORA_MODEL)->pData/*archive*/,
    //          NULL/*tex_data_path*/, ObjDataGet(GMD_DWORK_NO_ENEMY_MOTORA_TEX)->pData,
    //          NND_DRAWOBJ_SHADER_USER_PROFILE_TOON);
    


===Burrobot=== Japanese name, "Mogurin". Referred to as "Mogu".

Prototype

Final

//GmEneComActionSetDependHFlip(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_FRIP_ZNM, IDB_ENE_MOGU_MTN_ENE_MOGU_FRIP_L_ZNM);
GmEneComActionSet3DNNBlendDependHFlip(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_FRIP_ZNM, IDB_ENE_MOGU_MTN_ENE_MOGU_FRIP_L_ZNM);
//ObjDrawObjectActionSet(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_FRIP_ZNM);


    // 移動速度設定
    //obj_work->spd.x = 0;


A parameter for Speed X.

//ObjDrawObjectActionSet(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_FW_ZNM);


//      len = FX_F32_TO_FX32( GMD_ENE_MOGU_LENGTH_SEARCH_PLAYER * GMD_ENE_MOGU_LENGTH_SEARCH_PLAYER )+1;


//ObjDrawObjectActionSet(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_MOVE_ZNM);


//      ObjDrawObjectActionSet(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_JUMP_02_ZNM);


//      obj_work->ppFunc = gmEneMoguWalkInit;


    //GmEneComActionSetDependHFlip(obj_work, IDB_ENE_MOGU_MTN_ENE_MOGU_MOVE_ZNM, IDB_ENE_MOGU_MTN_ENE_MOGU_MOVE_L_ZNM);


/*
    obj_work->move_flag &= ~OBD_MOVE_FRONT;

    // 移動速度設定
    if (obj_work->disp_flag & OBD_DISP_HFLIP) {
        obj_work->spd.x = -GMD_ENE_MOGU_MOVE_SPD_X;
    }
    else {
        obj_work->spd.x = GMD_ENE_MOGU_MOVE_SPD_X;
    }
*/


Again, more X Speed parameters.

            /*
            ランダムで泡発生
            efct_work = GmEfctCmnEsCreate(&ply_work->obj_work, GME_EFCT_CMN_IDX_BUBBLE);
            // 親クリア
            efct_work->efct_com.obj_work.parent_obj = NULL;
            */


An unused effect that appears to create sets of bubbles.

    //obj_work->move_flag |= OBD_MOVE_NOMOVE | OBD_MOVE_NOCOL;  // 移動無し 地形あたり無し
    //obj_work->disp_flag |= OBD_DISP_NODIRFLIP;


// 地形あたり
//ObjObjectFieldRectSet(obj_work, -4, -8, 4, -2);


    //ObjObjectFieldRectSet(obj_work, -4, -8, 4, -2);


    //rect_work->ppDef = gmGmkSpringDefFunc;
    //rect_work->ppHit = NULL;
    //ObjRectAtkSet(rect_work, 0/*flag*/, 0/*power*/);
    //ObjRectDefSet(rect_work, GMD_OBJ_RECT_DEF_FLAG_WEAK_BODYATK, GMD_OBJ_RECT_DEF_POWER_DEFAULT);
    


//static void   gmEneMoguFwInit(OBS_OBJECT_WORK *obj_work);
//static void   gmEneMoguFwMain(OBS_OBJECT_WORK *obj_work);


BukuBuku#

//  GMS_EFFECT_3DES_WORK*   efct_work;
//  efct_work = GmEfctEneEsCreate( obj_work, GME_EFCT_ENE_IDX_E10_BUKUBUKU);
    //efct_work = GmEfctCmnEsCreate( obj_work, GME_EFCT_CMN_IDX_BUBBLE);
//  efct_work->efct_com.obj_work.pos.x = obj_work->pos.x;
//  efct_work->efct_com.obj_work.pos.y = obj_work->pos.y;

    /*
    // 尾っぽにつける
    if (obj_work->disp_flag & OBD_DISP_HFLIP) {
        GmComEfctSetDispOffsetF(efct_work, 15.f, 0.f, 0.f);
//      GmEffect3DESAddDispOffset(efct_work, 80.0f, 0.0f, 0.0f);
//      efct_work->efct_com.obj_work.pos.x += FX_F32_TO_FX32( 50 );
    }else{
        GmComEfctSetDispOffsetF(efct_work, -15.f, 0.f, 0.f);
//      GmEffect3DESAddDispOffset(efct_work, -80.0f, 0.0f, 0.0f);
//      efct_work->efct_com.obj_work.pos.x -= FX_F32_TO_FX32( 50 );
    }
    efct_work->efct_com.obj_work.ppFunc = gmEneBukuEfctBubbleMain;
    efct_work->efct_com.obj_work.move_flag &= ~OBD_MOVE_NOMOVE;
//  efct_work->obj_3des.flag |= OBD_ACTFLAG_3D_ES_PARTICLE_DEPEND;
    */


This badnik is supposed to have tail effects.

Boss2 (Casino Street Eggman)#

//static void gmBoss2BodyCatchChangeNeedleModeTimer( void );


    //ѓ^Ѓ[ѓ“”»’и
    /*if ( gmBoss2BodyPinBallCheckTurn(body_work) ){
        Angle16 dest_angle;
        BOOL flag_positive;

        //‰E‚ЙЊь‚©‚¤
        if ( obj_work->disp_flag & OBD_DISP_HFLIP ){
            obj_work->disp_flag &= ~OBD_DISP_HFLIP;
            dest_angle = GMD_BOSS2_ANGLE_RIGHT;
            flag_positive = TRUE;
        }
        //Ќ¶‚ЙЊь‚©‚¤
        else {
            obj_work->disp_flag |= OBD_DISP_HFLIP;
            dest_angle = GMD_BOSS2_ANGLE_LEFT;
            flag_positive = FALSE;
        }

        //•ыЊь“]Љ·
        gmBoss2BodyInitTurn(
                body_work, 
                dest_angle,
                GMD_BOSS2_BODY_PINBALL_FRAME_TURN, 
                flag_positive );
    }
    Float frame = gmBoss2BodyUpdateTurn(body_work);
    
    //ѓ^Ѓ[ѓ“’†
    if ( 0 < frame ){
        return;
    }*/

    //Њь‚«
    


/*void gmBoss2EffScatterSetParamSpin( OBS_OBJECT_WORK* obj_work )
{
    GMS_BOSS2_EFFECT_SCATTER_WORK* scatter_work = (GMS_BOSS2_EFFECT_SCATTER_WORK*)obj_work;

    //‰с“]
    nnMakeUnitQuaternion( &scatter_work->spin_quat );
    for (Sint32 i = 0; i < 2; ++i) {
        
        // ѓ‰ѓ“ѓ_ѓЂ‚И‰с“]ЋІ‚рђЭ’и
        NNS_VECTOR spin_axis;
        Float rand_z = FX_FX32_TO_F32( AkMathRandFx() );
        Angle16 rand_angle = AKM_DEGtoA16( 360.0f * FX_FX32_TO_F32(AkMathRandFx()) );
        AkMathGetRandomUnitVector( &spin_axis, rand_z, rand_angle );
        
        AMS_QUAT diff_rot;
        nnMakeRotateAxisQuaternion(
                &diff_rot, 
                spin_axis.x, 
                spin_axis.y, 
                spin_axis.z,
                AKM_DEGtoA32(5.0f) );
        nnMultiplyQuaternion( &scatter_work->spin_quat, &diff_rot, &scatter_work->spin_quat );
    }
}*/
    


===Boss4Chibi (Eggman's Mini Eggmans)===

//#define   T_FUNC_SUB(func, w)     {static void func(GMS_BOSS4_CAP_WORK*); w->proc_update = func;}


    // ワーク設定
    // TODO : 未実装
    
    // ライフ無し
    
    // 地形当たり無し
    //obj_work->move_flag   |= OBD_MOVE_NOCOL;
    


Appears to be object work parameters. It's never finished.

    /*
    ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_BODY].flag  = OBD_RECT_GROUP | OBD_RECT_NODAMAGE | OBD_RECT_NOHIT_UP | OBD_RECT_NOAUTO_ENABLEOFF;
    ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_BODY].ppHit = gmBoss4ChibiDefHitFunc;
    ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_BODY].flag |= OBD_RECT_ENABLE;
    ObjRectGroupSet( &ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_BODY], GMD_OBJ_RECT_GROUP_PLAYER, GMD_OBJ_RECT_TARGET_GROUPFLAG_ENEMY );
    */
//  ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_BODY].flag &= ~OBD_RECT_ENABLE;

    // TODO : 食らい当たり設定     仮
//  ObjRectWorkSet(&ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_DEF], -24, -24, 24, 24);
//  ene_3d->ene_com.rect_work[GMD_ENEMY_RECT_DEF].ppDef = gmBoss4CapsuleDamageDefFunc;
    


A setting for hit and run.

            // 爆発時間を0に設定(足しこむ方式)
//          chibi_work->wait = 0;
            // 鉄球のなにもしない処理切り替え
//          T_FUNC( gmBoss4ChibiBomb2, obj_work );      


Explosion parameters, presumably for Pinch Mode of the boss?