static void aINS_actor_draw_sub(GRAPH* graph, aINS_INSECT_ACTOR* insect, GAME* game, int draw_type, int alpha) {
    GAME_PLAY* play = (GAME_PLAY*)game;
    s16 angleX = insect->tools_actor.actor_class.shape_info.rotation.x;
    s16 angleY = insect->tools_actor.actor_class.shape_info.rotation.y;
    Gfx* gfx;

    if (insect->tools_actor.init_matrix == TRUE) {
        Matrix_put(&insect->tools_actor.matrix_work);
        Matrix_Position_Zero(&insect->tools_actor.actor_class.world.position);
        angleX = 0;
        angleY = angleX;

        switch (insect->type) {
            case aSOI_INSECT_TYPE_LONG_LOCUST:
            case aSOI_INSECT_TYPE_MIGRATORY_LOCUST:
            case aSOI_INSECT_TYPE_GRASSHOPPER:
                angleY = DEG2SHORT_ANGLE2(-90.0f);
                break;
            case aSOI_INSECT_TYPE_SPIDER:
                angleX = DEG2SHORT_ANGLE2(90.0f);
                break;
            case aSOI_INSECT_TYPE_FIREFLY:
            case aSOI_INSECT_TYPE_SPIRIT:
                break;
            default:
                angleX = DEG2SHORT_ANGLE2(90.0f);
                angleY = DEG2SHORT_ANGLE2(-180.0f);
                break;
        }

        Matrix_translate(insect->tools_actor.actor_class.world.position.x,
                         insect->tools_actor.actor_class.world.position.y + 2.0f,
                         insect->tools_actor.actor_class.world.position.z, 0);
        Matrix_RotateX(angleX, 1);
        Matrix_RotateY(angleY, 1);
    } else {
        Matrix_translate(insect->tools_actor.actor_class.world.position.x,
                         insect->tools_actor.actor_class.world.position.y + 2.0f,
                         insect->tools_actor.actor_class.world.position.z, 0);

        switch (insect->type) {
            case aSOI_INSECT_TYPE_MOLE_CRICKET:
                Matrix_RotateY(angleY, 1);
                Matrix_RotateX(angleX, 1);
                Matrix_RotateZ(insect->tools_actor.actor_class.shape_info.rotation.z, 1);
                break;
            case aSOI_INSECT_TYPE_SPIDER:
                switch (draw_type) {
                    case 2:
                        Matrix_RotateX(angleX, 1);
                        Matrix_RotateZ(insect->tools_actor.actor_class.shape_info.rotation.z, 1);
                        break;
                    default:
                        Matrix_RotateX(angleX, 1);
                        Matrix_RotateY(angleY, 1);
                        Matrix_RotateZ(insect->tools_actor.actor_class.shape_info.rotation.z, 1);
                        break;
                }
                break;
            default:
                Matrix_RotateX(angleX, 1);
                Matrix_RotateY(angleY, 1);
                Matrix_RotateZ(insect->tools_actor.actor_class.shape_info.rotation.z, 1);
                break;
        }
    }

    Matrix_scale(insect->tools_actor.actor_class.scale.x, insect->tools_actor.actor_class.scale.y,
                 insect->tools_actor.actor_class.scale.z, 1);

    OPEN_DISP(graph);
    gfx = NOW_POLY_XLU_DISP;

    gDPPipeSync(gfx++);
    gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);

    /* initialize settings for env and billboard mtx */
    switch (insect->type) {
        case aSOI_INSECT_TYPE_FIREFLY:
            gSPMatrix(gfx++, play->billboard_mtx_p, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
            gDPSetEnvColor(gfx++, 0, 255, 155, alpha);
            break;
        case aSOI_INSECT_TYPE_SPIRIT:
            gSPMatrix(gfx++, play->billboard_mtx_p, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
            gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
            break;
        default:
            gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
            break;
    }

    /* draw insect model */
    gSPDisplayList(gfx++, aINS_displayList[insect->type][draw_type]);

    SET_POLY_XLU_DISP(gfx);
    CLOSE_DISP(graph);
}

static void aINS_actor_draw(ACTOR* actorx, GAME* game) {
    GRAPH* graph = game->graph;
    aINS_CTRL_ACTOR* ctrl_actor = (aINS_CTRL_ACTOR*)actorx;
    aINS_INSECT_ACTOR* insect = ctrl_actor->insect_actor;
    int alpha;
    int i;
    int draw_type;

    Matrix_push();
    _texture_z_light_fog_prim_xlu(graph);

    for (i = 0; i < aINS_ACTOR_NUM; i++) {

        draw_type = ((int)insect->_1E0) << 1;
        if (insect->exist_flag == TRUE && insect->tools_actor.actor_class.drawn &&
            (insect->tools_actor.actor_class.state_bitfield &
             (ACTOR_STATE_NO_CULL | ACTOR_STATE_NO_DRAW_WHILE_CULLED)) ==
                (ACTOR_STATE_NO_CULL | ACTOR_STATE_NO_DRAW_WHILE_CULLED)) {
            if (insect->tools_actor.init_matrix == TRUE && insect->type != aSOI_INSECT_TYPE_SPIRIT) {
                draw_type = 0;
            }

            switch (insect->type) {
                case aSOI_INSECT_TYPE_FIREFLY:
                    draw_type = (int)insect->_1E0;
                    alpha = insect->alpha0 - insect->alpha2;

                    if (alpha < 0) {
                        alpha = 0;
                    }
                    break;
                default: {
                    u32 label;

                    alpha = insect->alpha0;
                    label = mPlib_Get_item_net_catch_label();
                    if (label != (u32)insect && Camera2_CheckCullingMode() &&
                        Camera2_CheckEnterCullingArea(insect->tools_actor.actor_class.world.position.x,
                                                      insect->tools_actor.actor_class.world.position.z, 60.0f)) {
                        alpha = 0;
                    }
                    break;
                }
            }

            aINS_actor_draw_sub(graph, insect, game, draw_type, alpha);

            switch (insect->type) {
                case aSOI_INSECT_TYPE_FIREFLY: {
                    draw_type = insect->_1E4;
                    alpha = insect->alpha1 - insect->alpha2;

                    if (alpha < 0) {
                        alpha = 0;
                    }

                    aINS_actor_draw_sub(graph, insect, game, draw_type, alpha);
                    break;
                }
                case aSOI_INSECT_TYPE_SPIRIT:
                    break;
                default:
                    aINS_actor_draw_sub(graph, insect, game, draw_type + 1, alpha);
                    break;
            }

            mAc_NormalActorShadow((ACTOR*)insect, (GAME_PLAY*)game, 1.0f);
            insect->tools_actor.init_matrix = FALSE;
        }

        insect++;
    }

    Matrix_pull();
}
