refactor: split refresh() into update() and read() to support loading character sheets from file