#include "game_types.h"

/* Sub_0800F608 @ 0x0800F608 (real 196B) -- guarded sqrt sweep plus free chain. Mirrors src/matched/Sub_0800F608.c. */
/* Tags word 6, sweeps 5 node slots (0x984/0x988/0x98C/2448/0x994) running
   Math_Sqrt(node + short, lane, 3) over non-null nodes, links 0x141C,
   frees by flag, retags, and frees children when flag bit 0 is set. */
extern int Math_Sqrt(int a, int b, int c);
extern void FreeIfFlagSet(int *p, int flags);
extern void Object_FreeIfFlag(int *p, int flags);
extern void Mem_FreeAndChildren(int *p);

static void sqrt_node(int *n)
{
    Math_Sqrt((int)n + *(short *)((char *)n[1] + 8),
              (int)((int *)n[1])[3], 3);
}

void Sub_0800F608(int *a, int b)
{
    int *n;
    a[6] = 0x02000AA0;
    n = *(int **)((char *)a + 0x984);
    if (n != 0)
        sqrt_node(n);
    n = *(int **)((char *)a + 0x988);
    if (n != 0)
        sqrt_node(n);
    n = *(int **)((char *)a + 0x98C);
    if (n != 0)
        sqrt_node(n);
    n = *(int **)((char *)a + 2448);
    if (n != 0)
        sqrt_node(n);
    n = *(int **)((char *)a + 0x994);
    if (n != 0)
        sqrt_node(n);
    *(int *)((char *)a + 0x141C) = 0x02000B10;
    FreeIfFlagSet((int *)((char *)a + 0xA34), 2);
    Object_FreeIfFlag((int *)((char *)a + 2464), 2);
    a[6] = 0x02000AD8;
    if ((b & 1) != 0)
        Mem_FreeAndChildren(a);
}
