=== lever-free bodies in ov_SC02_031 sharing a callee or global with func_8017E73C (79 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_8017E538 (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:4809) shares 6: D_801B7834 func_8012A828 func_8012BB3C func_80146A6C func_8017ECEC func_8017ED60 ---
void func_8017E538(s32 a0) {

    extern void (*D_801889D8[])(void);
    extern s16 D_801B7828;
    extern s32 D_801B7834;
    extern s32 D_801B783C;
    s32 v0;
    s32 v1;

    v0 = *(s32 *)(a0 + 0x1C);
    v1 = -1;
    v0 = v0 - 1;
    *(s32 *)(a0 + 0x1C) = v0;

    if (v0 == v1) {
        s32 t;
        s16 i;
        s32 ret;
        s32 ang;

        func_8012A828(a0, (void *)&D_801889D8);

        t = *(u16 *)(a0 + 0x10A) + 1;
        *(u16 *)(a0 + 0x10A) = t;

        if ((t & 3) != 0) {
            if (*(s16 *)(a0 + 0x104) == 0) {
                s32 r = rand();
                s32 x;
                s32 y;

                x = *(s16 *)(a0 + 0x88) - 0x200;
                x += (r & 0x7F) << 3;
                D_801B7834 = x << 16;

                y = *(s16 *)(a0 + 0x8C) - 0x200;
                y += (u32)(r & 0x7F00) >> 5;
                D_801B783C = y << 16;
            } else {
                func_8017ED60((s16 *)a0);
                *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) =
                    *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + 0xC00;
            }
        } else {
            for (i = 0; i < 2; i++) {
                ((s32 *)&D_801B7834)[i] = ((s32 *)&D_801B7828)[i];
            }
        }

        i = 8;
        if (*(s16 *)(a0 + 0x108) >= 0xD) {
            i = 2;
        }

        ret = func_8012BB3C(a0 + 4, (s32)&D_801B7834,
                            *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), i);
        *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) =
            *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + ret;

        ang = -3 - *(u16 *)(a0 + 0x104);
        func_8017ECEC(a0, ang, 0x50);

        if (*(s16 *)(a0 + 0x104) != 0) {
            func_80146A6C(2, (void *)a0, 0, 0, 0, 2, 0);
        }

        *(s16 *)(a0 + 0x108) = 0;
        *(u16 *)(a0 + 2) = *(u16 *)(a0 + 2) + 1;
    } else {
        s16 d = *(s16 *)(a0 + 0x102);

        if (d != 0) {
            s32 r2 = func_8012B8E4(a0, d);

            *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) =
                *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r2;
        }
    }
}

--- func_8017EB30 (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:5105) shares 5: D_80188950 func_8012A828 func_8012B200 func_8012CBA4 func_80146A6C ---
void func_8017EB30(s32 a0) {

    extern u8 D_80188950[];
    s32 v1;
    s32 v0;
    s32 p;

    func_80178970();

    if (*(s16 *)(a0 + 0x108) < 0x10) {
        if (*(s16 *)(a0 + 0xFE) != 0) {
            v1 = ((s32 (*)(s32))func_8012CBA4)(a0);
        } else {
            v1 = ((s32 (*)(s32))func_8012CBF4)(a0);
        }
        if ((v1 & 0x8000) != 0) {
            *(u16 *)(a0 + 0x108) = *(u16 *)(a0 + 0x108) + 1;
        }
        if ((v1 & 0x2000) != 0) {
            *(s16 *)(a0 + 0xFE) = 1;
        } else {
            *(s16 *)(a0 + 0xFE) = 0;
        }
    } else {
        func_8012AD80(a0);
    }

    if ((*(s32 *)(a0 + 0x1C) & 7) == 0) {
        func_80146A6C(2, (void *)a0, 0, 0, 0, 2, 0);
    }
    if ((*(s32 *)(a0 + 0x1C) & 0xF) == 0) {
        func_8002D4C8(0x828, 0);
    }

    v0 = *(s32 *)(a0 + 0x1C) - 1;
    *(s32 *)(a0 + 0x1C) = v0;
    if (v0 != -1) {
        if (func_8012E778(a0, 0x8000A8) != 0) {
            return;
        }
    }

    *(s16 *)(a0 + 0x10A) = 1;
    func_8012B200((u8 *)a0);
    func_8012A828(a0, D_80188950);

    *(s16 *)(a0 + 0x104) = 0;
    *(s16 *)(a0 + 0x102) = 0xA;
    p = *(s32 *)(a0 + 0x20);
    *(s32 *)(p + 4) |= 0x80000000;

    func_801439C0(*(s32 *)(a0 + 0xCC));

    *(s32 *)(a0 + 0x1C) = 0x14;
    *(s16 *)(a0 + 0x2) = 6;
}

--- func_8017F124 (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:5392) shares 2: func_8012A828 func_80146A6C ---
void func_8017F124(s32 a0) {

    extern void (*D_801889D8[])(void);
    s32 v0, v1;
    s32 stack[3];

    func_80178970();

    v0 = *(s32*)((s32)a0 + 0x1C);
    v1 = -1;
    v0 = v0 - 1;
    *(s32*)((s32)a0 + 0x1C) = v0;

    if (v0 != v1) {
        v0 = func_8012CBCC(a0);
        if ((v0 & 0x2000) == 0) {
            return;
        }
    }

    func_80146A6C(2, (void*)a0, 0, 0, 0, 0, 0);
    func_8012A828(a0, (void*)&D_801889D8);

    v1 = *(s32*)((s32)a0 + 0x20);
    v0 = *(u16*)((s32)v1 + 0x12);
    v0 = v0 + 0xB00;
    *(u16*)((s32)v1 + 0x12) = v0;

    stack[0] = 0;
    stack[1] = 0;
    stack[2] = 0xFFF40000;

    func_8012B2CC(a0);
    func_8012B14C(a0, (s32)stack);

    *(u16*)((s32)a0 + 0xFE) = 1;
    *(s32*)((s32)a0 + 0x1C) = 0x40;
    *(u16*)((s32)a0 + 0x2) = 5;
}

--- func_8017E39C (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:4738) shares 2: D_80188950 func_8012A828 ---
void func_8017E39C(void *a0) {

    extern u8 D_80078E78[];
    extern s16 D_801B7828;
    extern u8  D_80188C14[];
    extern u8  D_80188AE8[];
    extern u8  D_80188950[];
    extern u8  D_80188B1C[];
    extern s32 D_801B782C;
    extern s32 D_801B7830;
    /* §17 base-pointer cache: the D_80078E78 base is read ONCE at +0x1A but the original
       still pinned it in callee-saved $s1 across the first call -- that only happens when
       the base is a pointer LOCAL, not a direct D_80078E78[0x1A] (which folds %lo per use). */
    u8 *p = D_80078E78;
    s32 t;

    if ((u8)func_80029178(D_80188C14[*(s16 *)((s32)a0 + 0x70)]) != 0 ||
        (*(s16 *)((s32)a0 + 0x70) == 4 && (u32)func_80029504() < 0xC8)) {
        func_8012CAE4(a0);
        return;
    }

    t = *(u16 *)(p + 0x1A);
    if (t < 0x12C || t > 0x527) {
        if (*(s32 *)((s32)a0 + 0x20) != 0) {
            return;
        }
        if (func_8012C354((s32)a0, (s32)D_80188AE8) == 0) {
            return;
        }
        *(u16 *)((s32)a0 + 0x5C) |= 0x10;
        func_8012A828((s32)a0, D_80188950);
        *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x2C) |= 0x10;
        *(s32 *)&D_801B7828 = *(s16 *)((s32)a0 + 0x88) << 16;
        D_801B782C = *(s16 *)((s32)a0 + 0x8A) << 16;
        D_801B7830 = *(s16 *)((s32)a0 + 0x8C) << 16;
        *(s32 *)((s32)a0 + 0xCC) = func_80143970((s32)a0);
        *(s16 *)((s32)a0 + 0xFC) = 0;
        *(s32 *)((s32)a0 + 0x1C) = 0x10;
        *(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1;
    } else {
        if (*(s32 *)((s32)a0 + 0x20) != 0) {
            return;
        }
        if (func_8012C354((s32)a0, (s32)D_80188B1C) == 0) {
            return;
        }
        *(s16 *)((s32)a0 + 0xAE) = -4;
        *(s32 *)((s32)a0 + 0xCC) = func_80143970((s32)a0);
        *(u16 *)((s32)a0 + 0x2) = 7;
    }
}

--- func_80182CF4 (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:7344) shares 2: func_8012BD14 func_8016F1AC ---
void func_80182CF4(s32 a0) {
    u16 v;
    s32 t;

    if ((func_80029178(0x9C) & 0xFF) != 0) {
        *(u16 *)(a0 + 2) = 2;
        *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x80;
        *(u8 *)(*(s32 *)(a0 + 0xD0) + 0x27) = 0x81;
        return;
    }
    if (((s32 (*)(s32))func_8012BD14)(a0) < 0x401 || (u32)(*(u16 *)(a0 + 0x34) - 1) < 2) {
        switch (*(u16 *)(a0 + 0x34)) {
        case 0:
            if ((func_80029178(0x8A) & 0xFF) == 0) {
                func_801746DC();
                func_80178B18(a0, &D_80189028);
                *(u16 *)(a0 + 0x34) = 2;
            } else {
                func_801746DC();
                func_80178B18(a0, &D_80189038);
                *(u16 *)(a0 + 0x34) += 1;
            }
            break;
        case 1:
            if (func_801789AC(a0) == 1) {
                ((void (*)(s32))func_80178D18)(a0);
                *(u16 *)(a0 + 0x34) = 3;
            }
            break;
        case 2:
            if (func_801789AC(a0) == 1) {
                ((void (*)(s32))func_80178D18)(a0);
                *(u16 *)(a0 + 0x34) = 4;
            }
            break;
        case 3:
            if ((*(u16 *)(a0 + 0xFE) & 1) == 0 && func_8014CB58() == 2) {
                func_8014B598(2, &D_801888B0);
                t = func_8014CB2C();
                if (func_8016F1AC() == 0) {
                    if (*(u16 *)(a0 + 0xFE) & 8) {
                        *(s32 *)(a0 + 0x1C) += 1;
                    }
                } else {
                    if ((*(u16 *)(a0 + 0xFE) & 8) == 0) {
                        *(u16 *)(a0 + 0xFE) |= 8;
                        *(s32 *)(a0 + 0x1C) = 0;
                        func_80175454();
                    }
                    if (*(u16 *)(a0 + 0xFE) & 8) {
                        *(s32 *)(a0 + 0x1C) += 1;
                    }
                }
                if ((*(u16 *)(a0 + 0xFE) & 4) == 0 && *(s32 *)(a0 + 0x1C) == 0x5A) {
                    *(u16 *)(a0 + 0xFE) |= 4;
                    func_800D0CA0(0);
                }
                if ((t & 0x8000007F) == 0x80000002) {
                    v = *(u16 *)(a0 + 0x34) + 1;
                    *(s32 *)(a0 + 0x1C) = 0x3C;
                    *(u16 *)(a0 + 0xFE) |= 1;
                    *(u16 *)(a0 + 0x34) = v;
                }
            }
            break;
        }
        if ((func_80029178(0x8A) & 0xFF) == 0) {
            return;
        }
        /* func_80183098(a0) written out on all three paths: gcc cross-jumps the common
           tail but leaves the three $a0 arg-setups, which then fill the three branch
           delay slots. */
        if (func_8014CB58() == 2) {
            func_80183044(a0);
            func_80183098(a0);
        } else {
            *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x80;
            func_80183098(a0);
        }
    } else {
        if ((func_80029178(0x8A) & 0xFF) == 0) {
            return;
        }
        *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x80;
        func_80183098(a0);
    }
    if (*(u16 *)(a0 + 0xFE) & 1 && func_8012BEE8(a0) != 0) {
        func_8016F0AC();
        *(u16 *)(func_8012E544(0x13B) + 0xFC) = 1;
        *(u16 *)(a0 + 0xFE) &= ~1;
        func_8002959C();
    }
}

--- func_80183458 (src/ov_SC02_031/ov_SC02_031_jr_8017AE2C.c:7645) shares 2: func_8012BD14 func_8016F1AC ---
void func_80183458(s32 a0) {
    u16 v;
    s32 t;

    if (((s32 (*)(s32))func_8012BD14)(a0) < 0x401 || (u32)(*(u16 *)(a0 + 0x34) - 1) < 2) {
        switch (*(u16 *)(a0 + 0x34)) {
        case 0:
            if ((func_80029178(0x8D) & 0xFF) == 0) {
                func_80178B18(a0, &D_8018939C);
                *(u16 *)(a0 + 0x34) = 2;
            } else {
                func_80178B18(a0, &D_801893AC);
                *(u16 *)(a0 + 0x34) += 1;
            }
            break;
        case 1:
            if (func_801789AC(a0) == 1) {
                ((void (*)(s32))func_80178D18)(a0);
                *(u16 *)(a0 + 0x34) = 3;
            }
            break;
        case 2:
            if (func_801789AC(a0) == 1) {
                ((void (*)(s32))func_80178D18)(a0);
                *(u16 *)(a0 + 0x34) = 4;
            }
            break;
        case 3:
            if (func_8014CB58() == 5) {
                func_8014B598(5, &D_801888B0);
                if (func_8016F1AC() == 0) {
                    if (*(u16 *)(a0 + 0x100) & 4) {
                        *(s32 *)(a0 + 0x1C) += 1;
                    }
                } else {
                    if ((*(u16 *)(a0 + 0x100) & 4) == 0) {
                        *(u16 *)(a0 + 0x100) |= 4;
                        *(s32 *)(a0 + 0x1C) = 0;
                        func_80175454();
                        if (func_80181EF0() == 0) {
                            func_8017F4E8();
                        }
                    }
                    if (*(u16 *)(a0 + 0x100) & 4) {
                        *(s32 *)(a0 + 0x1C) += 1;
                    }
                }
                if ((*(u16 *)(a0 + 0x100) & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x5A) {
                    *(u16 *)(a0 + 0x100) |= 2;
                    func_800D0CA0(0);
                }
                if ((*(u16 *)(a0 + 0x100) & 1) == 0) {
                    t = func_8014CB2C();
                    if ((t & 0x8000007F) == 0x80000005) {
                        v = *(u16 *)(a0 + 0x34) + 1;
                        *(s32 *)(a0 + 0x1C) = 0x20;
                        *(u16 *)(a0 + 0x100) |= 1;
                        *(u16 *)(a0 + 0x34) = v;
                    }
                }
            }
            break;
        }
        if ((func_80029178(0x8D) & 0xFF) == 0) {
            return;
        }
        /* func_80183A74(a0) written out on all three paths: cross_jump merges the
           common tail and leaves the three $a0 arg-setups filling the delay slots. */
        if (func_8014CB58() == 5) {
            func_80183A20(a0);
            func_80183A74(a0);
        } else {
            *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0xA1;
            func_80183A74(a0);
        }
    } else {
        if ((func_80029178(0x8D) & 0xFF) == 0) {
            return;
        }
        *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0xA1;
        func_80183A74(a0);
    }
    if (*(u16 *)(a0 + 0x100) & 1 && func_8012BEE8(a0) != 0) {
        func_8016F0AC();
        if (func_80181EF0() != 0) {
            D_801B7990 = (s16) M2C_FIELD(D_801151D4, s32 *, 0x48);
            D_801B7992 = (s16) M2C_FIELD(D_801151D4, s32 *, 0x4C);
            D_801B7994 = (s16) M2C_FIELD(D_801151D4, s32 *, 0x50);
            D_801B7998 = (s16) M2C_FIELD(D_801151D4, s32 *, 0x3C);
            D_801B799A = (s16) M2C_FIELD(D_801151D4, s32 *, 0x40);
            D_801B799C = (s16) M2C_FIELD(D_801151D4, s32 *, 0x44);
            *(u16 *)(a0 + 2) = 3;
            *(u16 *)(a0 + 0x34) = 0;
            *(s32 *)(a0 + 0x1C) = 0x10;
            func_80178B18(a0, &D_801893BC);
            if ((func_80029178(0x11D) & 0xFF) == 0) {
                func_8002959C();
            }
        } else {
            /* NO explicit temp for the 0x100 flags here: an `u16 v = flags; ... (v &
               0xFFF8) | 0x10` spelling makes the loaded value a SECOND short-lived
               quantity, which loses $v0 to the `3` constant (andi $v0,$v1 instead of
               the target's in-place andi $v0,$v0). The direct read-modify-write keeps
               one long quantity in $v0 and puts the 3 in $v1. */
            *(u16 *)(a0 + 0x34) = 3;
            *(u16 *)(a0 + 0x100) = (*(u16 *)(a0 + 0x100) & 0xFFF8) | 0x10;
            ((void (*)(void))func_80175414)();
        }
        *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0xA1;
        *(u8 *)(*(s32 *)(a0 + 0xD0) + 0x27) = 0xA2;
    }
}

