=== lever-free bodies in ov_SC03_091 sharing a callee or global with func_80186A8C (64 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_80184D6C (src/ov_SC03_091/ov_SC03_091_jr_8018326C.c:3744) shares 3: func_8012B178 func_8012B608 func_8012BEE8 ---
void func_80184D6C(s32 a0)
{
    extern void func_80185730();
    extern s32  func_8012B608(s32 a0, s32 a1, s32 a2);
    extern void func_8012B178(s32 a0, s32 a1);
    extern void func_8012CBF4(s32 a0);
    extern s32  func_8012BEE8(s32 a0);
    extern s32  func_801858AC();
    extern s32  func_80185800(s32 a0);
    extern void func_8012BE54(s32 a0);

    s32 sp10[2];
    s32 t;
    s32 r;

    func_80185730(sp10, a0, a0 + 0x102);
    t = sp10[0];
    *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = t;
    r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), t >> 16,
                       *(s16 *)(a0 + 0xFE));
    *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) =
        *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r;
    func_8012B178(a0, *(s32 *)(a0 + 0xE0));
    func_8012CBF4(a0);
    if (func_8012BEE8(a0)) {
        if (func_801858AC(a0) != 1) {
            if (func_80185800(a0) == 1) {
                if (((s32 (*)(s32))func_8012BE54)(a0) <= 0x8000) {
                    *(s16 *)(a0 + 0x2) = 8;
                } else {
                    *(s32 *)(a0 + 0x1C) = rand() % 60 + 0x78;
                    *(s16 *)(a0 + 0xFE) = rand() % 32 + 0xA;
                }
            }
        }
    }
}

--- func_80189B9C (src/ov_SC03_091/ov_SC03_091_jr_8018911C.c:3362) shares 3: func_8004787C func_8012B8E4 func_8012CBA4 ---
void func_80189B9C(s32 a0) {

    extern u8 D_801AEDA8[];
    extern u8 D_801BBAB0[];
    V8_80189B9C pad[2];
    V8_80189B9C sp20;
    V8_80189B9C sp28;
    s32 t;
    s32 r;
    s32 v;

    func_8012B1B4(a0, (s32)D_801AEDA8);
    *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10);
    *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF;

    if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) {
        *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38);
        *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C);
        *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40);
    }

    v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF);
    r = 0x30;
    sp20.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12);
    sp20.y = *(u16 *)(a0 + 0xA) - 0x20;
    v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF);
    sp20.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12);
    sp28.x = sp20.x;
    sp28.y = sp20.y + 0x60;
    sp28.z = sp20.z;

    if ((func_80133784(1, &sp20, (s32)&sp28) & 0x6000) == 0) {
        *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38);
        *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40);
    }

    t = func_8012BCCC(a0);
    if (t < 0x2401) {
        if (func_8012BDBC(a0, 0x200) == 1) {
            *(s16 *)(a0 + 0x2) = 0x11;
            func_8012A828(a0, (s32)D_801BBAB0);
        }
    }
    if (t > 0x40000) {
        *(s16 *)(a0 + 0x2) = 6;
    }
}

--- func_801896F4 (src/ov_SC03_091/ov_SC03_091_jr_8018911C.c:3128) shares 3: func_8004787C func_8012B8E4 func_8012CBA4 ---
void func_801896F4(s32 a0) {

    extern u8 D_801BBDF0[];
    extern u8 D_801BB770[];
    extern u8 D_801BBFF8[];
    s32 sp10[4];
    V8_801896F4 pad[2];
    V8_801896F4 sp30;
    V8_801896F4 sp38;
    s32 t;
    s32 r;
    s32 v;

    *(s16 *)(a0 + 0xFC) = *(u16 *)(a0 + 0xFC) + 1;
    sp10[0] = 0;
    sp10[1] = 0;
    sp10[2] = (*(s16 *)(a0 + 0xFC) * -0x20000) / 0x24;
    func_8012B1B4(a0, (s32)sp10);

    *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10);
    *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF;

    if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) {
        *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38);
        *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C);
        *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40);
    }

    v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF);
    r = 0x30;
    sp30.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12);
    sp30.y = *(u16 *)(a0 + 0xA) - 0x20;
    v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF);
    sp30.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12);
    sp38.x = sp30.x;
    sp38.y = sp30.y + 0x60;
    sp38.z = sp30.z;

    if ((func_80133784(1, &sp30, (s32)&sp38) & 0x6000) == 0) {
        *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38);
        *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40);
    }

    t = func_8012BCCC(a0);
    if (t < 0x1001) {
        if (func_8012BDBC(a0, 0x200) == 1) {
            s32 s;
            if ((rand() & 3) == 0) {
                func_8012A828(a0, (s32)D_801BBDF0);
                s = 0x5;
            } else {
                func_8012A828(a0, (s32)D_801BB770);
                s = 0xF;
            }
            *(s16 *)(a0 + 0x2) = s;
        }
    }
    if (t > 0x40000) {
        func_8012A828(a0, (s32)D_801BBFF8);
        *(s16 *)(a0 + 0x2) = 1;
        *(s16 *)(a0 + 0xFC) = 0;
        *(s16 *)(a0 + 0xFE) = 1;
    }
    if (*(s16 *)(a0 + 0xFC) == 0x24) {
        *(s16 *)(a0 + 0xFC) = 0;
    }
}

--- func_8017AE2C (src/ov_SC03_091/ov_SC03_091_jr_8017AE2C.c:2626) shares 3: func_8012B030 func_8012B178 func_8012B608 ---
void func_8017AE2C(s32 param_1) {
    s32 pv = param_1;
    s16 *g = &D_801D2638;

    switch (g[0]) {
    case 0:
    default:
        return;
    case 1:
        g[1] = (u16)g[1] - 1;
        if (g[1] <= 0) {
            *(u16 *)(*(s32 *)(pv + 0x20) + 0x12) = (u16)g[2];
            goto reset_both;
        }
        {
            s32 r = func_8012B608(*(s16 *)(*(s32 *)(pv + 0x20) + 0x12), g[2], 6);
            *(u16 *)(*(s32 *)(pv + 0x20) + 0x12) =
                *(u16 *)(*(s32 *)(pv + 0x20) + 0x12) + r;
        }
        return;
    case 2:
        func_8012B178(pv, (s32)g[4] << 8);
        func_8012AD80(pv);
        *(u16 *)(pv + 0xA) -= 8;
        func_8012B030((u8 *)pv);
        break;
    case 3:
        if (g[1] != 0) {
            if (g[5] != 0) {
                void *p = (void *)(pv + 4);
                if ((s16)func_80012A60(*(s16 *)(*(s32 *)(pv + 0x20) + 0x12),
                                       (s16)func_8012B744(p, &g[6])) < 0x100) {
                    g[1] = 0;
                }
                *(s16 *)(*(s32 *)(pv + 0x20) + 0x12) =
                    func_8012B744(p, &D_801D2644);
                func_8012B178(pv, 0xFFFA0000);
                func_8012AD80(pv);
                *(u16 *)(pv + 0xA) -= 8;
                func_8012B030((u8 *)pv);
                /* &D_801D2638+0xC == &D_801D2644; distinct rtx defeats gcc's address-CSE
                   so BE98's arg rematerializes instead of sharing the store's reg (byte-gate). */
                if (func_8012BE98(pv, (u16 *)((s32)&D_801D2638 + 0xC)) < 0x101) {
                    D_801D2638 = 0;
                    D_801D263A = 0;
                }
            }
            {
                s32 t = func_8012B744((void *)(pv + 4), &g[6]);
                s32 r = func_8012B608(*(s16 *)(*(s32 *)(pv + 0x20) + 0x12), t, g[3]);
                *(u16 *)(*(s32 *)(pv + 0x20) + 0x12) =
                    *(u16 *)(*(s32 *)(pv + 0x20) + 0x12) + r;
            }
            g[1] = (u16)g[1] - 1;
            if (g[1] > 0) {
                return;
            }
            g[1] = 0;
            return;
        }
        *(s16 *)(*(s32 *)(pv + 0x20) + 0x12) =
            func_8012B744((void *)(pv + 4), &D_801D2644);
        func_8012B178(pv, 0xFFFA0000);
        func_8012AD80(pv);
        *(u16 *)(pv + 0xA) -= 8;
        func_8012B030((u8 *)pv);
        /* see note above: distinct rtx for the same address defeats address-CSE. */
        if (func_8012BE98(pv, (u16 *)((s32)&D_801D2638 + 0xC)) < 0x101) {
            D_801D2638 = 0;
            D_801D263A = 0;
        }
        return;
    case 4:
        func_8012AD80(pv);
    }
    g[1] = (u16)g[1] - 1;
    if (g[1] > 0) {
        return;
    }
reset_both:
    g[0] = 0;
    g[1] = 0;
    return;
}

--- func_8018504C (src/ov_SC03_091/ov_SC03_091_jr_8018326C.c:3888) shares 3: func_8012B178 func_8012B8E4 func_8012BEE8 ---
void func_8018504C(s32 a0) {

    extern u8 D_801A5F78[];
    s32 sp10[4];   /* 0x10: the func_8012B77C "to" record — fields at +0x2/+0x6/+0xA */
    s32 sp20[2];   /* 0x20: the 8-byte out buffer shared by func_80185730 and func_8012B77C */
    s32 t;

    switch (*(u16 *)(a0 + 0x34)) {
    case 0:
        if (((s32 (*)(s32))func_8012CBF4)(a0) != 0) {
            *(s32 *)(a0 + 0x1C) = 0x1E;
            *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = 0;
            *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
            return;
        } else {
            if (*(s16 *)(a0 + 0x100) >= *(s16 *)(a0 + 0xA)) {
                return;
            }
            *(s16 *)(a0 + 0xA) = *(s16 *)(a0 + 0x100);
            *(s32 *)(a0 + 0x1C) = 0x1E;
            *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = 0;
            *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
            return;
        }

    case 1:
        *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 6);
        if (func_8012BEE8(a0) == 0) {
            return;
        }
        *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
        func_8012B200((u8 *)a0);
        *(s32 *)(a0 + 0x1C) = 0x20;
        func_8002D4C8(0x6FF, 0);
        return;

    case 2:
        func_80185730((s32)sp20, a0, (s32)D_801A5F78);
        t = sp20[0];
        *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = t;
        *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) = t >> 16;
        func_8012B178(a0, *(s32 *)(a0 + 0xE0) - 0x80000);
        func_8012CBF4(a0);
        if (func_80185704(a0) != 1) {
            if (func_8012BEE8(a0) == 0) {
                return;
            }
        }
        *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
        *(s16 *)((s32)sp10 + 0x2) = *(u16 *)(a0 + 0x88);
        *(s16 *)((s32)sp10 + 0x6) = *(u16 *)(a0 + 0x8A);
        *(s16 *)((s32)sp10 + 0xA) = *(u16 *)(a0 + 0x8C);
        func_8012B77C((s32)sp20, a0 + 4, (s32)sp10);
        t = sp20[0];
        *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = t;
        *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) = t >> 16;
        func_8012B2CC(a0);
        func_8012B178(a0, *(s32 *)(a0 + 0xE0) - 0x80000);
        *(s32 *)(a0 + 0x1C) = 0x80;
        return;

    case 3:
        func_8012CBF4(a0);
        if (func_8012BEE8(a0) == 0) {
            if (*(s16 *)(a0 + 0xA) >= *(s16 *)(a0 + 0x8A)) {
                return;
            }
        }
        *(s16 *)(a0 + 0xA) = *(u16 *)(a0 + 0x8A);
        *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = 0;
        *(s32 *)(a0 + 0x1C) = 0x3C;
        *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
        return;

    case 4:
        if (func_8012BEE8(a0) == 0) {
            return;
        }
        /* fall through */
    default:
        *(s16 *)(a0 + 0x2) = 4;
        return;
    }
}

--- func_80185430 (src/ov_SC03_091/ov_SC03_091_jr_8018326C.c:4091) shares 2: func_8012B178 func_8012BEE8 ---
void func_80185430(s32 a0)
{
    s32 sp10[6];   /* the func_8012B77C "to" record — fields at +0x2/+0x6/+0xA;
                    * sized 6 words (24B, not case2's 4) — the target's buf sits
                    * at sp+0x28, a full 24B above sp10's base at sp+0x10. */
    s32 sp28[2];   /* reused as both func_8012B0B4's dest and func_8012B77C's "out" */
    s32 t;
    s16 r;

    if (*(u16 *)(a0 + 0x34) == 0) {
        if (func_8012BEE8(a0) != 0) {
            r = rand();
            func_8012B0B4((unsigned int *)sp28, r % 0x1000, (r % 0x80) + 0xC0);

            t = sp28[0];
            *(s16 *)((s32)sp10 + 0x2) = t;
            *(s16 *)((s32)sp10 + 0x6) = *(s16 *)(a0 + 0xA) - 0x180;
            *(s16 *)((s32)sp10 + 0xA) = t >> 16;
            func_8012B77C((s32)sp28, a0 + 4, (s32)sp10);

            t = sp28[0];
            *(s16 *)(*(s32 *)(a0 + 0x20) + 0x10) = t;
            *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) = t >> 16;
            func_8012B200((u8 *)a0);
            func_8012B2CC(a0);
            func_8012B178(a0, *(s32 *)(a0 + 0xE0) - 0x20000);
            *(s16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
        }
    } else {
        func_8012CBF4(a0);
        if (func_8012E778(a0, 0xA000C8) == 0) {
            *(s16 *)(a0 + 0x2) = 0xA;
            *(s32 *)(a0 + 0x1C) = 0x80;
            func_8012E8A8((u8 *)a0);
        }
    }
}

