static void mMsg_SetMatrix(mMsg_Window_c* msg_p, GAME* game, int mode) {
  GRAPH* graph = game->graph;
  f32 scale = msg_p->window_scale;
  f32 center_x = ( msg_p->center_x - (SCREEN_WIDTH_F * 0.5f)) * 16.0f;
  f32 center_y = (-msg_p->center_y + (SCREEN_HEIGHT_F * 0.5f)) * 16.0f;

  Matrix_push();
  Matrix_translate(center_x, center_y, 0.0f, 1);
  Matrix_scale(scale, scale, scale, 1);

  OPEN_DISP(graph);

  if (mode == mFont_MODE_FONT) {
    gSPMatrix(NOW_FONT_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
  }
  else {
    gSPMatrix(NOW_POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
  }

  CLOSE_DISP(graph);
}

static void mMsg_UnSetMatrix() {
  Matrix_pull();
}

static void mMsg_DrawNameWindow(mMsg_Window_c* msg_p, GAME* game, int mode) {
  GRAPH* graph = game->graph;

  OPEN_DISP(graph);

  if (mode == mFont_MODE_FONT) {
    gDPSetPrimColor(NOW_FONT_DISP++, 0, 255, msg_p->name_background_color.r, msg_p->name_background_color.g, msg_p->name_background_color.b, 255);
    gSPDisplayList(NOW_FONT_DISP++, con_kaiwaname_modelT);
  }
  else {
    gDPSetPrimColor(NOW_POLY_OPA_DISP++, 0, 255, msg_p->name_background_color.r, msg_p->name_background_color.g, msg_p->name_background_color.b, 255);
    gSPDisplayList(NOW_POLY_OPA_DISP++, con_kaiwaname_modelT);
  }

  CLOSE_DISP(graph);
}

static void mMsg_DrawWindowClientName(mMsg_Window_c* msg_p, GAME* game, int mode) {
  u8 name[ANIMAL_NAME_LEN];

  mNpc_GetNpcWorldName(name, msg_p->client_actor_p);
  mFont_SetLineStrings_AndSpace(
    game,
    name, msg_p->client_name_len,
    msg_p->nameplate_x, msg_p->nameplate_y,
    msg_p->name_text_color.r, msg_p->name_text_color.g, msg_p->name_text_color.b, msg_p->name_text_color.a,
    FALSE,
    TRUE,
    TRUE,
    1.0f, 1.0f,
    mode
  );
}

static void mMsg_DrawWindowTurnButton(mMsg_Window_c* msg_p, GAME* game, int mode) {
  if (msg_p->show_continue_button != FALSE && msg_p->lock_continue == FALSE) {
    mFont_SetMarkChar(
      game,
      mFont_MARKTYPE_NEXT,
      257.0f, 136.0f,
      msg_p->continue_button_color.r, msg_p->continue_button_color.g, msg_p->continue_button_color.b, msg_p->continue_button_color.a,
      FALSE,
      1.0f, 1.0f,
      mode
    );
  }
}

static void mMsg_DrawWindowBody(mMsg_Window_c* msg_p, GAME* game, int mode) {
  GRAPH* graph = game->graph;
  rgba_t* window_background_color = &msg_p->window_background_color;

  OPEN_DISP(graph);

  if (mode == mFont_MODE_FONT) {
    gSPDisplayList(NOW_FONT_DISP++, mMsg_init_disp);
    gDPSetPrimColor(NOW_FONT_DISP++, 0, 255, window_background_color->r, window_background_color->g, window_background_color->b, window_background_color->a);
    gSPDisplayList(NOW_FONT_DISP++, con_kaiwa2_modelT);

    if (msg_p->show_actor_name) {
      mMsg_DrawNameWindow(msg_p, game, mode);
      mMsg_DrawWindowClientName(msg_p, game, mode);
    }

    mMsg_DrawWindowTurnButton(msg_p, game, mode);
  }
  else {
    gSPDisplayList(NOW_POLY_OPA_DISP++, mMsg_init_disp);
    gDPSetPrimColor(NOW_POLY_OPA_DISP++, 0, 255, window_background_color->r, window_background_color->g, window_background_color->b, window_background_color->a);
    gSPDisplayList(NOW_POLY_OPA_DISP++, con_kaiwa2_modelT);

    if (msg_p->show_actor_name) {
      mMsg_DrawNameWindow(msg_p, game, mode);
      mMsg_DrawWindowClientName(msg_p, game, mode);
    }

    mMsg_DrawWindowTurnButton(msg_p, game, mode);
  }

  CLOSE_DISP(graph);
}
