diff --git a/R/read_log.R b/R/read_log.R new file mode 100644 index 0000000000000000000000000000000000000000..37cea6b1843df35b5c42efae78b28029b5fecb2c --- /dev/null +++ b/R/read_log.R @@ -0,0 +1,72 @@ +#' Read log file +#' +#' @param path log file path +#' @return Parsed tibble of log file in \code{path} +#' @export +#' @examples +#' rcg <- read_log("data/20220405162804-HELIOS_base_3-vs-enemy_2.rcg") +#' rcl <- read_log("data/20220304142841-HELIOS_base_1-vs-ThunderLeague_1.rcl") +read_log <- function(path) { + ext <- path |> path() |> path_ext() + + if (ext == "rcg") { + return(read_rcg(path)) + } + if (ext == "rcl") { + return(read_rcl(path)) + } + + stop("Not supported format: ", path) +} + +#' @rdname read_log +#' @export +read_rcg <- function(path) { + rcg <- path |> + read_file() |> + parse_json(simplifyVector = TRUE, flatten = TRUE) |> + as_tibble() |> + filter(type == "show") |> + select(time,stime,players, ball.x, ball.y, ball.vx, ball.vy) |> + unnest(players) |> + select(time:capacity, ball.x:ball.vy) |> + rename(step = time) |> + rename_with(stringr::str_replace, pattern = "\\.", replacement = "_") + + return(rcg) +} + +#' @rdname read_log +#' @export +read_rcl <- function(path) { + rcl <- path |> + read_lines() |> + as_tibble() |> + mutate( + step = value |> stringr::str_extract("\\d+") |> as.numeric(), + agent = value |> stringr::str_extract("\\w+_([0-9]{1,2}|Coach)(?!\\))"), + team = agent |> stringr::str_remove("_([0-9]{1,2}|Coach)"), + unum = agent |> stringr::str_extract("([0-9]{1,2}|Coach)$"), + commands = value |> + stringr::str_extract("\\(.+\\)$") |> + purrr::map(~ .x |> + stringr::str_split("\\(|\\)", simplify = TRUE) |> + stringr::str_trim() |> + purrr::discard(~ .x == "")), + ) |> + unnest(commands) |> + mutate( + commands = commands |> stringr::str_split("\\ ", n = 2), + command = commands |> purrr::map_chr(1), + args = commands |> purrr::map(~ .x[-1]), + ) |> + select( + step, + team, + unum, + command, + args + ) + + return(rcl) +}