/* CRIAL
  SERIALIZER_BEGIN
    mpkutil_pack_str(packer, "$name");
    mpkutil_pack_str(packer, $code);
  END
  DESERIALIZER_BEGIN
    const char* v;
    size_t      vlen;
    if (!mpkutil_get_str(
          mpkutil_get_map_item_by_str(root, "$name"), &v, &vlen) ||
        strncmp(v, $code, vlen) != 0 || $code[vlen] != 0) {
      goto FAIL;
    }
  END
  PROPERTY subclass = "character"

  SERIALIZER_BEGIN
    mpkutil_pack_str(packer, "$name");
    LOCOMMON_MSGPACK_PACK_ANY(packer, &base->$code);
  END
  DESERIALIZER_BEGIN
    if (!LOCOMMON_MSGPACK_UNPACK_ANY(
          mpkutil_get_map_item_by_str(root, "$name"), &base->$code)) {
      goto FAIL;
    }
  END
  PROPERTY id                    = super.super.id
  PROPERTY pos                   = super.super.pos
  PROPERTY velocity              = super.velocity
  PROPERTY type                  = param.type
  PROPERTY recipient             = param.recipient
  PROPERTY last_state_changed    = param.last_state_changed
  PROPERTY last_strategy_changed = param.last_strategy_changed
  PROPERTY ground                = param.ground
  PROPERTY on_ground             = param.on_ground
  PROPERTY direction             = param.direction
  PROPERTY movement              = param.movement
  PROPERTY gravity               = param.gravity
  PROPERTY knockback             = param.knockback
  PROPERTY last_knockback        = param.last_knockback
  PROPERTY last_bullet_hit       = param.last_bullet_hit
  PROPERTY anchor_pos            = param.anchor.pos
  PROPERTY anchor_vec            = param.anchor.vec

  SERIALIZER_BEGIN
    const $code v = base->param.$name;
    mpkutil_pack_str(packer, "$name");
    LOCOMMON_MSGPACK_PACK_ANY(packer, &v);
  END
  DESERIALIZER_BEGIN
    $code v;
    if (!LOCOMMON_MSGPACK_UNPACK_ANY(
          mpkutil_get_map_item_by_str(root, "$name"), &v)) {
      goto FAIL;
    }
    base->param.$name = v;
  END
  PROPERTY state    = lochara_state_t
  PROPERTY strategy = lochara_strategy_t
*/
