/*
 * Descent 3
 * Copyright (C) 2024 Parallax Software
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

// levelkeypad.cpp : implementation file
//

#include "stdafx.h"
#include "editor.h"
#include "levelkeypad.h"
#include "physics.h"
#include "levelgoal.h"
#include "boa.h"
#include "terrain.h"
#include "aiambient.h"
#include "objinfo.h"
#include "game.h"
#include "soundload.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// levelkeypad dialog

levelkeypad::levelkeypad(CWnd *pParent /*=NULL*/) : CKeypadDialog(levelkeypad::IDD, pParent) {
  //{{AFX_DATA_INIT(levelkeypad)
  // NOTE: the ClassWizard will add member initialization here
  //}}AFX_DATA_INIT
}

void levelkeypad::DoDataExchange(CDataExchange *pDX) {
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(levelkeypad)
  DDX_Control(pDX, IDC_LEVELGOALTRIGGER_COMBO, m_trigger_combo);
  DDX_Control(pDX, IDC_LEVELGOALOBJECT_COMBO, m_object_combo);
  DDX_Control(pDX, IDC_LEVELGOAL_ROOM_COMBO, m_room_combo);
  //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(levelkeypad, CDialog)
//{{AFX_MSG_MAP(levelkeypad)
ON_WM_PAINT()
ON_EN_KILLFOCUS(IDC_LEVEL_GRAVITY_EDIT, OnKillfocusLevelGravityEdit)
ON_BN_CLICKED(IDC_LEVEL_PREV_GOAL_BUTTON, OnLevelPrevGoalButton)
ON_BN_CLICKED(IDC_LEVEL_NEXT_GOAL_BUTTON, OnLevelNextGoalButton)
ON_BN_CLICKED(IDC_LEVEL_NEW_GOAL_BUTTON, OnLevelNewGoalButton)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_NAME_EDIT, OnKillfocusLevelGoalNameEdit)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_LOC_NAME_EDIT, OnKillfocusLevelGoalLocNameEdit)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_DESC_EDIT, OnKillfocusLevelGoalDescEdit)
ON_BN_CLICKED(IDC_LEVEL_GOAL_NEW_ITEM_BUTTON, OnLevelGoalNewItemButton)
ON_BN_CLICKED(IDC_LEVEL_GOAL_NEXT_ITEM_BUTTON, OnLevelGoalNextItemButton)
ON_BN_CLICKED(IDC_LEVEL_GOAL_PREV_ITEM_BUTTON, OnLevelGoalPrevItemButton)
ON_BN_CLICKED(IDC_LEVEL_GOAL_DELETE_ITEM_BUTTON, OnLevelGoalDeleteItemButton)
ON_BN_CLICKED(IDC_LEVEL_GOAL_ROOM_ITEM_RADIO, OnLevelGoalRoomItemRadio)
ON_BN_CLICKED(IDC_LEVEL_GOAL_CELL_ITEM_RADIO, OnLevelGoalCellItemRadio)
ON_BN_CLICKED(IDC_LEVEL_GOAL_OBJ_ITEM_RADIO, OnLevelGoalObjItemRadio)
ON_BN_CLICKED(IDC_GOAL_AUTO_COMPLETE_CHECK, OnGoalAutoCompleteCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_SEC_GOAL_CHECK, OnLevelGoalSecGoalCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_ENABLED_CHECK, OnLevelGoalEnabledCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_COMPLETED_CHECK, OnLevelGoalCompletedCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_TLG_CHECK, OnLevelGoalTlgCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_GDKL_CHECK, OnLevelGoalGdklCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_NLB_CHECK, OnLevelGoalNlbCheck)
ON_BN_CLICKED(IDC_LEVEL_GOAL_PASTE_OBJREF_ITEM_BUTTON, OnLevelGoalPasteObjrefItemButton)
ON_BN_CLICKED(IDC_LEVEL_GOAL_GOTO_ITEM_BUTTON, OnLevelGoalGotoItemButton)
ON_BN_CLICKED(IDC_LEVEL_DELETE_GOAL_BUTTON, OnLevelDeleteGoalButton)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_ITEM_EDIT, OnKillfocusLevelGoalItemEdit)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_PRIORITY_EDIT1, OnKillfocusLevelGoalPriorityEdit1)
ON_BN_CLICKED(IDC_LEVEL_GOAL_END_LEVEL_CHECK, OnLevelGoalEndLevelCheck)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_SIZE()
ON_CBN_SELENDOK(IDC_AMB_TYPE1, OnSelendokAmbType1)
ON_CBN_SELENDOK(IDC_AMB_TYPE2, OnSelendokAmbType2)
ON_CBN_SELENDOK(IDC_AMB_TYPE3, OnSelendokAmbType3)
ON_CBN_SELENDOK(IDC_AMB_TYPE4, OnSelendokAmbType4)
ON_CBN_SELENDOK(IDC_AMB_TYPE5, OnSelendokAmbType5)
ON_CBN_SELENDOK(IDC_AMB_TYPE6, OnSelendokAmbType6)
ON_EN_KILLFOCUS(IDC_AMB_MAX1, OnKillfocusAmbMax1)
ON_EN_KILLFOCUS(IDC_AMB_MAX2, OnKillfocusAmbMax2)
ON_EN_KILLFOCUS(IDC_AMB_MAX3, OnKillfocusAmbMax3)
ON_EN_KILLFOCUS(IDC_AMB_MAX4, OnKillfocusAmbMax4)
ON_EN_KILLFOCUS(IDC_AMB_MAX5, OnKillfocusAmbMax5)
ON_EN_KILLFOCUS(IDC_AMB_MAX6, OnKillfocusAmbMax6)
ON_EN_KILLFOCUS(IDC_AMB_MIN1, OnKillfocusAmbMin1)
ON_EN_KILLFOCUS(IDC_AMB_MIN2, OnKillfocusAmbMin2)
ON_EN_KILLFOCUS(IDC_AMB_MIN3, OnKillfocusAmbMin3)
ON_EN_KILLFOCUS(IDC_AMB_MIN4, OnKillfocusAmbMin4)
ON_EN_KILLFOCUS(IDC_AMB_MIN5, OnKillfocusAmbMin5)
ON_EN_KILLFOCUS(IDC_AMB_MIN6, OnKillfocusAmbMin6)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS1, OnKillfocusAmbNGroups1)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS2, OnKillfocusAmbNGroups2)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS3, OnKillfocusAmbNGroups3)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS4, OnKillfocusAmbNGroups4)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS5, OnKillfocusAmbNGroups5)
ON_EN_KILLFOCUS(IDC_AMB_N_GROUPS6, OnKillfocusAmbNGroups6)
ON_BN_CLICKED(IDC_AMB_OUTSIDE1, OnAmbOutside1)
ON_BN_CLICKED(IDC_AMB_OUTSIDE2, OnAmbOutside2)
ON_BN_CLICKED(IDC_AMB_OUTSIDE3, OnAmbOutside3)
ON_BN_CLICKED(IDC_AMB_OUTSIDE4, OnAmbOutside4)
ON_BN_CLICKED(IDC_AMB_OUTSIDE5, OnAmbOutside5)
ON_BN_CLICKED(IDC_AMB_OUTSIDE6, OnAmbOutside6)
ON_EN_KILLFOCUS(IDC_LEVEL_GOAL_COMPLETION_EDIT, OnKillfocusLevelGoalCompletionEdit)
ON_BN_CLICKED(IDC_LG_ACTIVATE_RADIO, OnLgActivateRadio)
ON_BN_CLICKED(IDC_LG_ENTER_RADIO, OnLgEnterRadio)
ON_BN_CLICKED(IDC_LG_DESTROYED_RADIO, OnLgDestroyedRadio)
ON_BN_CLICKED(IDC_LG_PPW_COLLIDE_RADIO, OnLgPpwCollideRadio)
ON_BN_CLICKED(IDC_LG_LC_RADIO, OnLgLcRadio)
ON_BN_CLICKED(IDC_LG_DALLAS_RADIO, OnLgDallasRadio)
ON_BN_CLICKED(IDC_TRIGGER_RADIO, OnTriggerRadio)
ON_BN_CLICKED(IDC_LEVEL_GOAL_MINE_RADIO, OnLevelGoalMineRadio)
ON_CBN_SELENDOK(IDC_LEVELGOAL_ROOM_COMBO, OnSelendokLevelgoalRoomCombo)
ON_CBN_SELENDOK(IDC_LEVELGOALOBJECT_COMBO, OnSelendokLevelgoalobjectCombo)
ON_CBN_SELENDOK(IDC_LEVELGOALTRIGGER_COMBO, OnSelendokLevelgoaltriggerCombo)
ON_EN_KILLFOCUS(IDC_EDIT57, OnKillfocusEdit57)
ON_BN_CLICKED(IDC_LEVEL_CEILING_EVERYWHERE, OnLevelCeilingEverywhere)
ON_EN_KILLFOCUS(IDC_LEVEL_CEILING_EDIT, OnKillfocusLevelCeilingEdit)
ON_CBN_SELENDOK(IDC_FFOS_COMBO, OnSelendokFfosCombo)
ON_CBN_SELENDOK(IDC_BGOS_COMBO, OnSelendokBgosCombo)
ON_EN_KILLFOCUS(IDC_FFT1_EDIT, OnKillfocusFft1Edit)
ON_EN_KILLFOCUS(IDC_FFT2_EDIT, OnKillfocusFft2Edit)
ON_CBN_SELENDOK(IDC_FFT1_COMBO, OnSelendokFft1Combo)
ON_CBN_SELENDOK(IDC_FFT2_COMBO, OnSelendokFft2Combo)
ON_EN_KILLFOCUS(IDC_FIXED_FFT1_EDIT, OnKillfocusFixedFft1Edit)
ON_CBN_SETFOCUS(IDC_FFT1_COMBO, OnSetfocusFft1Combo)
ON_CBN_SETFOCUS(IDC_FFT2_COMBO, OnSetfocusFft2Combo)
ON_BN_CLICKED(IDC_LEVEL_PIW, OnLevelPiw)
ON_EN_KILLFOCUS(IDC_FFT3_EDIT, OnKillfocusFft3Edit)
ON_CBN_SELENDOK(IDC_FFT3_COMBO, OnSelendokFft3Combo)
ON_CBN_SETFOCUS(IDC_FFT3_COMBO, OnSetfocusFft3Combo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// levelkeypad message handlers

void levelkeypad::OnPaint() {
  CPaintDC dc(this); // device context for painting

  if (!m_Active)
    return;

  UpdateDialog();
}

bool levelkeypad::ValidateCurrentGoal() {
  int num_goals = Level_goals.GetNumGoals();

  if (num_goals > 0) {
    if (m_current_goal < 0 || m_current_goal >= num_goals)
      m_current_goal = 0;

    return true;
  } else {
    m_current_goal = -1;
    return false;
  }
}

bool levelkeypad::ValidateCurrentItem() {
  if (ValidateCurrentGoal()) {
    int num_items = Level_goals.GoalGetNumItems(m_current_goal);
    if (num_items > 0) {
      if (m_current_item < 0 || m_current_item >= num_items)
        m_current_item = 0;

      return true;
    }
  }

  m_current_item = -1;
  return false;
}

void make_goal_dialog_text(char *big_text_message) {
  int i;
  int j;

  big_text_message[0] = '\0';

  int num_goals[2 * MAX_GOAL_LISTS];
  int goals[2 * MAX_GOAL_LISTS][MAX_LEVEL_GOALS];
  int p[2 * MAX_GOAL_LISTS][MAX_LEVEL_GOALS];

  for (i = 0; i < 2 * MAX_GOAL_LISTS; i++) {
    num_goals[i] = 0;
  }

  int n = Level_goals.GetNumGoals();

  for (i = 0; i < n; i++) {
    int priority;
    char list;
    int flags;

    Level_goals.GoalPriority(i, LO_GET_SPECIFIED, &priority);
    Level_goals.GoalGoalList(i, LO_GET_SPECIFIED, &list);
    Level_goals.GoalStatus(i, LO_GET_SPECIFIED, &flags, true);

    if (flags & LGF_SECONDARY_GOAL) {
      list += MAX_GOAL_LISTS;
    }

    int insert = num_goals[list];

    for (j = 0; j < num_goals[list]; j++) {
      if (priority < p[list][j]) {
        insert = j;
        break;
      }
    }

    for (j = num_goals[list]; j > insert; j--) {
      goals[list][j] = goals[list][j - 1];
      p[list][j] = p[list][j - 1];
    }

    goals[list][insert] = i;
    p[list][insert] = priority;

    num_goals[list]++;
  }

  for (i = 0; i < 2 * MAX_GOAL_LISTS; i++) {
    strcat(big_text_message, "\r\n---------------------\r\n");

    if (i < MAX_GOAL_LISTS) {
      char cur[50];
      sprintf(cur, "Primary List %d\r\n", i);
      strcat(big_text_message, cur);
    } else {
      char cur[50];
      sprintf(cur, "Secondary List %d\r\n", i - MAX_GOAL_LISTS);
      strcat(big_text_message, cur);
    }

    strcat(big_text_message, "---------------------\r\n");

    for (j = 0; j < num_goals[i]; j++) {
      char name[41];
      char p_text[5];

      strcat(big_text_message, "   ");
      Level_goals.GoalGetName(goals[i][j], name, 40);

      int flags;
      Level_goals.GoalStatus(goals[i][j], LO_GET_SPECIFIED, &flags, true);
      if (flags & LGF_TELCOM_LISTS) {
        strcat(big_text_message, "(Obj) ");
      }
      strcat(big_text_message, name);
      sprintf(p_text, " (%d)", p[i][j]);
      strcat(big_text_message, p_text);
      strcat(big_text_message, "\r\n");
    }
  }
}

//	call this to update all the text entries in the keypad.
void levelkeypad::UpdateDialog() {
  CButton *bbox;
  int flags;
  int lgflags;
  int priority;
  char g_list;
  char name[256];
  char iname[256];
  char desc[2560];
  char message[2560];
  int num_goals;
  int num_items = 0;
  int i;
  char big_text_message[MAX_LEVEL_GOALS * 5 * 40];

  char item_type;
  int item_handle;

  SendDlgItemMessage(IDC_BGOS_COMBO, CB_RESETCONTENT, 0, 0);
  for (i = 0; i < MAX_SOUNDS; i++) {
    if (Sounds[i].used)
      SendDlgItemMessage(IDC_BGOS_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)Sounds[i].name);
  }
  if (sound_override_glass_breaking != -1)
    SendDlgItemMessage(IDC_BGOS_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR)Sounds[sound_override_glass_breaking].name);
  else
    SendDlgItemMessage(IDC_BGOS_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "Default");

  if (force_field_bounce_texture[0] != -1)
    SendDlgItemMessage(IDC_FFT1_COMBO, CB_SELECTSTRING, 0,
                       (LPARAM)(LPCTSTR)GameTextures[force_field_bounce_texture[0]].name);
  else
    SendDlgItemMessage(IDC_FFT1_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  if (force_field_bounce_texture[1] != -1)
    SendDlgItemMessage(IDC_FFT2_COMBO, CB_SELECTSTRING, 0,
                       (LPARAM)(LPCTSTR)GameTextures[force_field_bounce_texture[1]].name);
  else
    SendDlgItemMessage(IDC_FFT2_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  if (force_field_bounce_texture[2] != -1)
    SendDlgItemMessage(IDC_FFT3_COMBO, CB_SELECTSTRING, 0,
                       (LPARAM)(LPCTSTR)GameTextures[force_field_bounce_texture[2]].name);
  else
    SendDlgItemMessage(IDC_FFT3_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");

  SendDlgItemMessage(IDC_FFOS_COMBO, CB_RESETCONTENT, 0, 0);
  for (i = 0; i < MAX_SOUNDS; i++) {
    if (Sounds[i].used)
      SendDlgItemMessage(IDC_FFOS_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)Sounds[i].name);
  }
  if (sound_override_force_field != -1)
    SendDlgItemMessage(IDC_FFOS_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR)Sounds[sound_override_force_field].name);
  else
    SendDlgItemMessage(IDC_FFOS_COMBO, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "Default");

  int idc_amb_type[6] = {IDC_AMB_TYPE1, IDC_AMB_TYPE2, IDC_AMB_TYPE3, IDC_AMB_TYPE4, IDC_AMB_TYPE5, IDC_AMB_TYPE6};

  int idc_chars[6][4] = {
      {IDC_AMB_N_GROUPS1, IDC_AMB_MAX1, IDC_AMB_MIN1}, {IDC_AMB_N_GROUPS2, IDC_AMB_MAX2, IDC_AMB_MIN2},
      {IDC_AMB_N_GROUPS3, IDC_AMB_MAX3, IDC_AMB_MIN3}, {IDC_AMB_N_GROUPS4, IDC_AMB_MAX4, IDC_AMB_MIN4},
      {IDC_AMB_N_GROUPS5, IDC_AMB_MAX5, IDC_AMB_MIN5}, {IDC_AMB_N_GROUPS6, IDC_AMB_MAX6, IDC_AMB_MIN6}};

  int idc_outside[6] = {IDC_AMB_OUTSIDE1, IDC_AMB_OUTSIDE2, IDC_AMB_OUTSIDE3,
                        IDC_AMB_OUTSIDE4, IDC_AMB_OUTSIDE5, IDC_AMB_OUTSIDE6};

  for (i = 0; i < 6; i++) {
    int j;
    uint8_t x;

    for (j = 1; j <= 3; j++) {
      a_life.GetALValue(i, j, &x);
      PrintToDlgItem(this, idc_chars[i][j - 1], "%d", (int)x);
    }

    int n_id = idc_outside[i];
    a_life.GetALValue(i, ALI_FLAGS, &x);

    bbox = (CButton *)GetDlgItem(n_id);
    bbox->SetCheck(x != 0);
  }

  for (i = 0; i < 6; i++) {
    int n_id = idc_amb_type[i];
    int j;
    int x;

    SendDlgItemMessage(n_id, CB_RESETCONTENT, 0, 0);
    SendDlgItemMessage(n_id, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "None");

    for (j = 0; j < MAX_OBJECT_IDS; j++) {
      if (Object_info[j].type != OBJ_NONE) {
        SendDlgItemMessage(n_id, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)Object_info[j].name);
      }
    }

    a_life.GetALValue(i, ALI_TYPE, &x);
    if (x >= 0 && x < MAX_OBJECT_IDS && Object_info[x].type != OBJ_NONE)
      SendDlgItemMessage(n_id, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR)Object_info[x].name);
    else
      SendDlgItemMessage(n_id, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR) "None");
  }

  Level_goals.LGStatus(LO_GET_SPECIFIED, &lgflags);

  if (ValidateCurrentGoal()) {
    num_goals = Level_goals.GetNumGoals();
    num_items = Level_goals.GoalGetNumItems(m_current_goal);

    Level_goals.GoalStatus(m_current_goal, LO_GET_SPECIFIED, &flags, true);
    Level_goals.GoalPriority(m_current_goal, LO_GET_SPECIFIED, &priority);
    Level_goals.GoalGoalList(m_current_goal, LO_GET_SPECIFIED, &g_list);

    Level_goals.GoalGetName(m_current_goal, name, sizeof(name));
    Level_goals.GoalGetItemName(m_current_goal, iname, sizeof(iname));
    Level_goals.GoalGetDesc(m_current_goal, desc, sizeof(desc));
    Level_goals.GoalGetCompletionMessage(m_current_goal, message, sizeof(message));

    make_goal_dialog_text(big_text_message);
  } else {
    num_goals = 0;
    num_items = 0;

    flags = 0;
    priority = 0;
    g_list = 0;

    strcpy(name, "No goals");
    strcpy(iname, "No goals");
    strcpy(desc, "No goals");
    strcpy(message, "No goals");

    strcpy(big_text_message, "No goals");
  }

  if (ValidateCurrentItem()) {
    Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_GET_SPECIFIED, &item_type, &item_handle, NULL);
  } else {
    item_type = LIT_OBJECT;
    item_handle = OBJECT_HANDLE_NONE;
  }

  PrintToDlgItem(this, IDC_FIXED_FFT1_EDIT, "%f", force_field_bounce_multiplier[0]);
  PrintToDlgItem(this, IDC_FFT2_EDIT, "%f", force_field_bounce_multiplier[1]);
  PrintToDlgItem(this, IDC_FFT3_EDIT, "%f", force_field_bounce_multiplier[2]);
  PrintToDlgItem(this, IDC_LEVEL_GRAVITY_EDIT, "%f", -Gravity_strength);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_NUM_GOALS_STATIC, "Number of goals: %d", num_goals);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_CUR_GOAL_STATIC, "Current goal: %d", m_current_goal + 1);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_NUM_ITEMS_STATIC, "Number of items: %d", num_items);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_CUR_ITEM_STATIC, "Current item: %d", m_current_item + 1);
  PrintToDlgItem(this, IDC_GOAL_TABLE_EDIT, big_text_message);
  PrintToDlgItem(this, IDC_LEVEL_CEILING_EDIT, "%f", Ceiling_height);

  //	IDC_LEVEL_PREV_GOAL_BUTTON
  //	IDC_LEVEL_NEXT_GOAL_BUTTON
  //	IDC_LEVEL_NEW_GOAL_BUTTON
  PrintToDlgItem(this, IDC_LEVEL_GOAL_NAME_EDIT, "%s", name);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_LOC_NAME_EDIT, "%s", iname);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_DESC_EDIT, "%s", desc);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_COMPLETION_EDIT, "%s", message);
  //	IDC_LEVEL_GOAL_NEW_ITEM_BUTTON
  //	IDC_LEVEL_GOAL_NEXT_ITEM_BUTTON
  //	IDC_LEVEL_GOAL_PREV_ITEM_BUTTON
  //	IDC_LEVEL_GOAL_DELETE_ITEM_BUTTON
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_ROOM_ITEM_RADIO);
  bbox->SetCheck(item_type == LIT_INTERNAL_ROOM);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_CELL_ITEM_RADIO);
  bbox->SetCheck(item_type == LIT_TERRAIN_CELL);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_OBJ_ITEM_RADIO);
  bbox->SetCheck(item_type == LIT_OBJECT);
  bbox = (CButton *)GetDlgItem(IDC_TRIGGER_RADIO);
  bbox->SetCheck(item_type == LIT_TRIGGER);
  //	bbox = (CButton *)GetDlgItem(IDC_GOAL_AUTO_COMPLETE_CHECK);
  //	bbox->SetCheck(flags & LGF_AUTO_COMPLETION);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_SEC_GOAL_CHECK);
  bbox->SetCheck(flags & LGF_SECONDARY_GOAL);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_ENABLED_CHECK);
  bbox->SetCheck(flags & LGF_ENABLED);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_COMPLETED_CHECK);
  bbox->SetCheck(flags & LGF_COMPLETED);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_TLG_CHECK);
  bbox->SetCheck(flags & LGF_TELCOM_LISTS);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_GDKL_CHECK);
  bbox->SetCheck(flags & LGF_GB_DOESNT_KNOW_LOC);
  bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_NLB_CHECK);
  bbox->SetCheck(flags & LGF_NOT_LOC_BASED);
  //	bbox = (CButton *)GetDlgItem(IDC_LEVEL_GOAL_END_LEVEL_CHECK);
  //	bbox->SetCheck(lgflags & LGF_AUTO_END_LEVEL);

  bbox = (CButton *)GetDlgItem(IDC_LG_ACTIVATE_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_ACTIVATE);

  bbox = (CButton *)GetDlgItem(IDC_LG_ENTER_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_ENTER);

  bbox = (CButton *)GetDlgItem(IDC_LEVEL_CEILING_EVERYWHERE);
  bbox->SetCheck(FVI_always_check_ceiling);

  bbox = (CButton *)GetDlgItem(IDC_LEVEL_PIW);
  bbox->SetCheck(Level_powerups_ignore_wind);

  bbox = (CButton *)GetDlgItem(IDC_LG_DESTROYED_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_DESTROY);

  bbox = (CButton *)GetDlgItem(IDC_LG_PPW_COLLIDE_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_PLAYER_WEAPON);

  bbox = (CButton *)GetDlgItem(IDC_LG_LC_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_PLAYER);

  bbox = (CButton *)GetDlgItem(IDC_LG_DALLAS_RADIO);
  bbox->SetCheck((flags & LGF_COMP_MASK) == LGF_COMP_DALLAS);

  if (item_type == LIT_OBJECT)
    m_object_combo.SetSelected(item_handle);
  else
    m_object_combo.SetSelected(-1);

  if (item_type == LIT_INTERNAL_ROOM)
    m_room_combo.SetSelected(item_handle);
  else
    m_room_combo.SetSelected(-1);

  if (item_type == LIT_TRIGGER)
    m_trigger_combo.SetSelected(item_handle);
  else
    m_trigger_combo.SetSelected(-1);

  //	IDC_LEVEL_GOAL_PASTE_OBJREF_ITEM_BUTTON
  //	IDC_LEVEL_GOAL_GOTO_ITEM_BUTTON
  //	IDC_LEVEL_DELETE_GOAL_BUTTON
  //	PrintToDlgItem(this, IDC_LEVEL_GOAL_ITEM_EDIT, "%d", item_handle);
  PrintToDlgItem(this, IDC_LEVEL_GOAL_PRIORITY_EDIT1, "%d", priority);
  PrintToDlgItem(this, IDC_EDIT57, "%d", g_list);
}

void levelkeypad::UpdateKeypad(int mask) {
  if (mask & KUF_LEVEL_LOADED) {
    m_trigger_combo.Init(-1);
    m_object_combo.Init(OBJ_NONE, OBJECT_HANDLE_NONE);
    m_room_combo.Init(-1);

    m_current_goal = m_current_item = 0;

    UpdateDialog();
  }
}

void levelkeypad::OnKillfocusLevelGravityEdit() {
  char str[21];
  ((CEdit *)GetDlgItem(IDC_LEVEL_GRAVITY_EDIT))->GetWindowText(str, 20);

  Gravity_strength = -atof(str);

  UpdateDialog();
}

BOOL levelkeypad::OnInitDialog() {
  CDialog::OnInitDialog();
  m_room_combo.Init(-1);
  m_trigger_combo.Init(-1);
  m_object_combo.Init(OBJ_NONE, OBJECT_HANDLE_NONE);
  UpdateDialog();

  int i;
  SendDlgItemMessage(IDC_FFT1_COMBO, CB_RESETCONTENT, 0, 0);
  SendDlgItemMessage(IDC_FFT2_COMBO, CB_RESETCONTENT, 0, 0);
  SendDlgItemMessage(IDC_FFT3_COMBO, CB_RESETCONTENT, 0, 0);

  SendDlgItemMessage(IDC_FFT1_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  SendDlgItemMessage(IDC_FFT2_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  SendDlgItemMessage(IDC_FFT3_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");

  for (i = 0; i < MAX_TEXTURES; i++) {
    if (GameTextures[i].used) {
      SendDlgItemMessage(IDC_FFT1_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
      SendDlgItemMessage(IDC_FFT2_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
      SendDlgItemMessage(IDC_FFT3_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
    }
  }

  return TRUE; // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

void levelkeypad::OnLevelPrevGoalButton() {
  int num_goals = Level_goals.GetNumGoals();

  if (m_current_goal > 0) {
    m_current_goal--;
  } else {
    m_current_goal = num_goals - 1;
  }
  m_current_item = 0;

  UpdateDialog();
}

void levelkeypad::OnLevelNextGoalButton() {
  int num_goals = Level_goals.GetNumGoals();

  if (m_current_goal < num_goals - 1) {
    m_current_goal++;
  } else {
    m_current_goal = 0;
  }
  m_current_item = 0;

  UpdateDialog();
}

void levelkeypad::OnLevelNewGoalButton() {
  m_current_goal = Level_goals.AddGoal(true);
  m_current_item = 0;

  UpdateDialog();

  OnLevelGoalNewItemButton();
}

void levelkeypad::OnLevelDeleteGoalButton() {
  Level_goals.DeleteGoal(m_current_goal);
  m_current_goal = 0;
  m_current_item = 0;

  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelGoalNameEdit() {
  char str[256];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_NAME_EDIT))->GetWindowText(str, 255);
  Level_goals.GoalSetName(m_current_goal, str);

  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelGoalLocNameEdit() {
  char str[256];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_LOC_NAME_EDIT))->GetWindowText(str, 255);
  Level_goals.GoalSetItemName(m_current_goal, str);

  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelGoalDescEdit() {
  char str[2560];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_DESC_EDIT))->GetWindowText(str, 2559);
  Level_goals.GoalSetDesc(m_current_goal, str);

  UpdateDialog();
}

void levelkeypad::OnLevelGoalNewItemButton() {
  int item;

  item = Level_goals.GoalAddItem(m_current_goal);
  if (item != -1) {
    m_current_item = item;
  } else {
    OutrageMessageBox(MBOX_OK, "Sorry: No more items are allowed for this goal.  See Chris.");
  }

  UpdateDialog();
}

void levelkeypad::OnLevelGoalNextItemButton() {
  if (m_current_item < Level_goals.GoalGetNumItems(m_current_goal) - 1)
    m_current_item++;
  else
    m_current_item = 0;

  UpdateDialog();
}

void levelkeypad::OnLevelGoalPrevItemButton() {
  if (m_current_item > 0)
    m_current_item--;
  else
    m_current_item = Level_goals.GoalGetNumItems(m_current_goal) - 1;

  UpdateDialog();
}

void levelkeypad::OnLevelGoalDeleteItemButton() {
  if (Level_goals.GoalGetNumItems(m_current_goal)) {
    Level_goals.GoalDeleteItem(m_current_goal, m_current_item);
    m_current_item = 0;
  }

  UpdateDialog();
}

void levelkeypad::OnLevelGoalRoomItemRadio() {
  char type = LIT_INTERNAL_ROOM;
  int handle = -1;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, &type, &handle, NULL);

  UpdateDialog();
}

void levelkeypad::OnLevelGoalCellItemRadio() {
  char type = LIT_TERRAIN_CELL;
  int handle = -1;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, &type, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnLevelGoalObjItemRadio() {
  char type = LIT_OBJECT;
  int handle = -1;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, &type, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnTriggerRadio() {
  char type = LIT_TRIGGER;
  int handle = -1;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, &type, &handle, NULL);

  UpdateDialog();
}

void levelkeypad::OnLevelGoalMineRadio() {
  char type = LIT_ANY_MINE;
  int handle = -1;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, &type, &handle, NULL);

  UpdateDialog();
}

void levelkeypad::DoGoalFlagToggle(int flag) {
  char op = LO_CLEAR_SPECIFIED;
  int flags;
  bool f_set;

  Level_goals.GoalStatus(m_current_goal, LO_GET_SPECIFIED, &flags, true);
  f_set = ((flags & flag) == 0);

  if (f_set) {
    op = LO_SET_SPECIFIED;
  }

  Level_goals.GoalStatus(m_current_goal, op, &flag, true);
  UpdateDialog();
}

void levelkeypad::OnGoalAutoCompleteCheck() { DoGoalFlagToggle(LGF_COMPLETED); }

void levelkeypad::OnLevelGoalSecGoalCheck() { DoGoalFlagToggle(LGF_SECONDARY_GOAL); }

void levelkeypad::OnLevelGoalEnabledCheck() { DoGoalFlagToggle(LGF_ENABLED); }

void levelkeypad::OnLevelGoalCompletedCheck() { DoGoalFlagToggle(LGF_COMPLETED); }

void levelkeypad::OnLevelGoalTlgCheck() { DoGoalFlagToggle(LGF_TELCOM_LISTS); }

void levelkeypad::OnLevelGoalGdklCheck() { DoGoalFlagToggle(LGF_GB_DOESNT_KNOW_LOC); }

void levelkeypad::OnLevelGoalNlbCheck() { DoGoalFlagToggle(LGF_NOT_LOC_BASED); }

void levelkeypad::OnLevelGoalPasteObjrefItemButton() {
  int handle = Copied_object_id;

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, NULL, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnLevelGoalGotoItemButton() {
  char type;
  int handle;

  if (Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_GET_SPECIFIED, &type, &handle, NULL)) {
    bool valid = false;
    vector pnt;
    int roomnum;

    MakeBOA();

    switch (type) {
    case LIT_OBJECT: {
      object *obj = ObjGet(handle);
      if (obj) {
        pnt = obj->pos;
        roomnum = obj->roomnum;
        valid = true;
      }
    } break;
    case LIT_INTERNAL_ROOM: {
      if (handle >= 0 && handle <= Highest_room_index && Rooms[handle].used) {
        pnt = Rooms[handle].path_pnt;
        roomnum = handle;
        valid = true;
      }
    } break;
    case LIT_TERRAIN_CELL: {
      if (handle >= 0 && handle < TERRAIN_WIDTH * TERRAIN_DEPTH) {
        ComputeTerrainSegmentCenter(&pnt, handle);
        roomnum = MAKE_ROOMNUM(handle);
        valid = true;
      }
    } break;
    }

    if (valid) {
      ObjSetPos(Viewer_object, &pnt, roomnum, NULL, false);
      Viewer_moved = 1;
    } else {
      OutrageMessageBox(MBOX_OK, "Cannot move viewer: This item is not valid.");
    }
  } else {
    OutrageMessageBox(MBOX_OK, "Cannot move viewer: This item is not defined.");
  }

  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelGoalItemEdit() {
  int handle;
  char str[256];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_ITEM_EDIT))->GetWindowText(str, 255);
  sscanf(str, "%d", &handle);

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, NULL, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelGoalPriorityEdit1() {
  int priority;
  char str[256];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_PRIORITY_EDIT1))->GetWindowText(str, 255);
  sscanf(str, "%d", &priority);

  Level_goals.GoalPriority(m_current_goal, LO_SET_SPECIFIED, &priority);
  UpdateDialog();
}

void levelkeypad::OnLevelGoalEndLevelCheck() {
  int flag = 0; // LGF_AUTO_END_LEVEL;
  char op = LO_CLEAR_SPECIFIED;
  int flags;
  bool f_set;

  Level_goals.LGStatus(LO_GET_SPECIFIED, &flags);
  f_set = ((flags & flag) == 0);

  if (f_set) {
    op = LO_SET_SPECIFIED;
  }

  Level_goals.LGStatus(op, &flag);
  UpdateDialog();
}

void levelkeypad::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) {
  CKeypadDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void levelkeypad::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) {
  CKeypadDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void levelkeypad::OnSize(UINT nType, int cx, int cy) { CKeypadDialog::OnSize(nType, cx, cy); }

void levelkeypad::SetAmbType(int i, int n_id) {
  int cur;
  char name[200];

  cur = SendDlgItemMessage(n_id, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(n_id, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  int obj_id = FindObjectIDName(name);
  a_life.SetALValue(i, ALI_TYPE, &obj_id);

  UpdateDialog();
}

void levelkeypad::OnSelendokAmbType1() { SetAmbType(0, IDC_AMB_TYPE1); }

void levelkeypad::OnSelendokAmbType2() { SetAmbType(1, IDC_AMB_TYPE2); }

void levelkeypad::OnSelendokAmbType3() { SetAmbType(2, IDC_AMB_TYPE3); }

void levelkeypad::OnSelendokAmbType4() { SetAmbType(3, IDC_AMB_TYPE4); }

void levelkeypad::OnSelendokAmbType5() { SetAmbType(4, IDC_AMB_TYPE5); }

void levelkeypad::OnSelendokAmbType6() { SetAmbType(5, IDC_AMB_TYPE6); }

void levelkeypad::SetAmbCharVal(char index, char item, int n_id) {
  int ival;
  uint8_t val;
  char str[256];

  ((CEdit *)GetDlgItem(n_id))->GetWindowText(str, 255);
  sscanf(str, "%d", &ival);
  val = ival;

  a_life.SetALValue(index, item, &val);
  UpdateDialog();
}

void levelkeypad::OnKillfocusAmbMax1() { SetAmbCharVal(0, ALI_MAX, IDC_AMB_MAX1); }

void levelkeypad::OnKillfocusAmbMax2() { SetAmbCharVal(1, ALI_MAX, IDC_AMB_MAX2); }

void levelkeypad::OnKillfocusAmbMax3() { SetAmbCharVal(2, ALI_MAX, IDC_AMB_MAX3); }

void levelkeypad::OnKillfocusAmbMax4() { SetAmbCharVal(3, ALI_MAX, IDC_AMB_MAX4); }

void levelkeypad::OnKillfocusAmbMax5() { SetAmbCharVal(4, ALI_MAX, IDC_AMB_MAX5); }

void levelkeypad::OnKillfocusAmbMax6() { SetAmbCharVal(5, ALI_MAX, IDC_AMB_MAX6); }

void levelkeypad::OnKillfocusAmbMin1() { SetAmbCharVal(0, ALI_MIN, IDC_AMB_MIN1); }

void levelkeypad::OnKillfocusAmbMin2() { SetAmbCharVal(1, ALI_MIN, IDC_AMB_MIN2); }

void levelkeypad::OnKillfocusAmbMin3() { SetAmbCharVal(2, ALI_MIN, IDC_AMB_MIN3); }

void levelkeypad::OnKillfocusAmbMin4() { SetAmbCharVal(3, ALI_MIN, IDC_AMB_MIN4); }

void levelkeypad::OnKillfocusAmbMin5() { SetAmbCharVal(4, ALI_MIN, IDC_AMB_MIN5); }

void levelkeypad::OnKillfocusAmbMin6() { SetAmbCharVal(5, ALI_MIN, IDC_AMB_MIN6); }

void levelkeypad::OnKillfocusAmbNGroups1() { SetAmbCharVal(0, ALI_TOTAL, IDC_AMB_N_GROUPS1); }

void levelkeypad::OnKillfocusAmbNGroups2() { SetAmbCharVal(1, ALI_TOTAL, IDC_AMB_N_GROUPS2); }

void levelkeypad::OnKillfocusAmbNGroups3() { SetAmbCharVal(2, ALI_TOTAL, IDC_AMB_N_GROUPS3); }

void levelkeypad::OnKillfocusAmbNGroups4() { SetAmbCharVal(3, ALI_TOTAL, IDC_AMB_N_GROUPS4); }

void levelkeypad::OnKillfocusAmbNGroups5() { SetAmbCharVal(4, ALI_TOTAL, IDC_AMB_N_GROUPS5); }

void levelkeypad::OnKillfocusAmbNGroups6() { SetAmbCharVal(5, ALI_TOTAL, IDC_AMB_N_GROUPS6); }

void levelkeypad::OnAmbOutside1() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE1);
  x = bbox->GetCheck();

  a_life.SetALValue(0, ALI_FLAGS, &x);
}

void levelkeypad::OnAmbOutside2() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE2);
  x = bbox->GetCheck();

  a_life.SetALValue(1, ALI_FLAGS, &x);
}

void levelkeypad::OnAmbOutside3() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE3);
  x = bbox->GetCheck();

  a_life.SetALValue(2, ALI_FLAGS, &x);
}

void levelkeypad::OnAmbOutside4() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE4);
  x = bbox->GetCheck();

  a_life.SetALValue(3, ALI_FLAGS, &x);
}

void levelkeypad::OnAmbOutside5() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE5);
  x = bbox->GetCheck();

  a_life.SetALValue(4, ALI_FLAGS, &x);
}

void levelkeypad::OnAmbOutside6() {
  CButton *bbox;
  uint8_t x;

  bbox = (CButton *)GetDlgItem(IDC_AMB_OUTSIDE6);
  x = bbox->GetCheck();

  a_life.SetALValue(5, ALI_FLAGS, &x);
}

void levelkeypad::OnKillfocusLevelGoalCompletionEdit() {
  char str[2560];

  ((CEdit *)GetDlgItem(IDC_LEVEL_GOAL_COMPLETION_EDIT))->GetWindowText(str, 2559);
  Level_goals.GoalSetCompletionMessage(m_current_goal, str);

  UpdateDialog();
}

void levelkeypad::OnLgActivateRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_ACTIVATE;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnLgEnterRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_ENTER;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnLgDestroyedRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_DESTROY;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnLgPpwCollideRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_PLAYER_WEAPON;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnLgLcRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_PLAYER;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnLgDallasRadio() {
  int flags = LGF_COMP_MASK;
  Level_goals.GoalStatus(m_current_goal, LO_CLEAR_SPECIFIED, &flags, true);

  flags = LGF_COMP_DALLAS;
  Level_goals.GoalStatus(m_current_goal, LO_SET_SPECIFIED, &flags, true);
}

void levelkeypad::OnSelendokLevelgoalRoomCombo() {
  int handle = m_room_combo.GetSelected();

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, NULL, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnSelendokLevelgoalobjectCombo() {
  int handle = m_object_combo.GetSelected();

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, NULL, &handle, NULL);
  UpdateDialog();
}

void levelkeypad::OnSelendokLevelgoaltriggerCombo() {
  int handle = m_trigger_combo.GetSelected();

  Level_goals.GoalItemInfo(m_current_goal, m_current_item, LO_SET_SPECIFIED, NULL, &handle, NULL);
  UpdateDialog();
}
/*
void levelkeypad::OnKillfocusLevelGoalListEdit()
{
        int int_g_list;
        char g_list;
        char str[256];

        ((CEdit *) GetDlgItem(IDC_LEVEL_GOAL_LIST_EDIT))->GetWindowText(str,255);
        sscanf(str, "%d", &int_g_list);

        g_list = (char)int_g_list;

        Level_goals.GoalGoalList(m_current_goal, LO_SET_SPECIFIED, &g_list);
        UpdateDialog();
}
*/

void levelkeypad::OnKillfocusEdit57() {
  int int_g_list;
  char g_list;
  char str[256];

  ((CEdit *)GetDlgItem(IDC_EDIT57))->GetWindowText(str, 255);
  sscanf(str, "%d", &int_g_list);

  g_list = (char)int_g_list;

  Level_goals.GoalGoalList(m_current_goal, LO_SET_SPECIFIED, &g_list);
  UpdateDialog();
}
void levelkeypad::OnLevelCeilingEverywhere() {
  if (FVI_always_check_ceiling)
    FVI_always_check_ceiling = false;
  else
    FVI_always_check_ceiling = true;

  UpdateDialog();
}

void levelkeypad::OnKillfocusLevelCeilingEdit() {
  char str[21];
  ((CEdit *)GetDlgItem(IDC_LEVEL_CEILING_EDIT))->GetWindowText(str, 20);

  Ceiling_height = atof(str);

  UpdateDialog();
}

void levelkeypad::OnSelendokFfosCombo() {
  char name[200];

  int cur = SendDlgItemMessage(IDC_FFOS_COMBO, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(IDC_FFOS_COMBO, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  if (stricmp(name, "Default") != 0)
    sound_override_force_field = FindSoundName(name);
  else
    sound_override_force_field = -1;

  UpdateDialog();
}

void levelkeypad::OnSelendokBgosCombo() {
  char name[200];

  int cur = SendDlgItemMessage(IDC_BGOS_COMBO, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(IDC_BGOS_COMBO, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  if (stricmp(name, "Default") != 0)
    sound_override_glass_breaking = FindSoundName(name);
  else
    sound_override_glass_breaking = -1;

  UpdateDialog();
}

void levelkeypad::OnKillfocusFft1Edit() {}

void levelkeypad::OnKillfocusFft2Edit() {
  char str[21];
  ((CEdit *)GetDlgItem(IDC_FFT2_EDIT))->GetWindowText(str, 20);

  force_field_bounce_multiplier[1] = atof(str);

  UpdateDialog();
}

void levelkeypad::OnSelendokFft1Combo() {
  char name[200];

  int cur = SendDlgItemMessage(IDC_FFT1_COMBO, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(IDC_FFT1_COMBO, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  if (stricmp(name, "Not Assigned") != 0)
    force_field_bounce_texture[0] = FindTextureName(name);
  else
    force_field_bounce_texture[0] = -1;

  UpdateDialog();
}

void levelkeypad::OnSelendokFft2Combo() {
  char name[200];

  int cur = SendDlgItemMessage(IDC_FFT2_COMBO, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(IDC_FFT2_COMBO, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  if (stricmp(name, "Not Assigned") != 0)
    force_field_bounce_texture[1] = FindTextureName(name);
  else
    force_field_bounce_texture[1] = -1;

  UpdateDialog();
}

void levelkeypad::OnKillfocusFixedFft1Edit() {
  char str[21];
  ((CEdit *)GetDlgItem(IDC_FIXED_FFT1_EDIT))->GetWindowText(str, 20);

  force_field_bounce_multiplier[0] = atof(str);

  UpdateDialog();
}

void levelkeypad::OnSetfocusFft1Combo() {
  int i;

  SendDlgItemMessage(IDC_FFT1_COMBO, CB_RESETCONTENT, 0, 0);
  SendDlgItemMessage(IDC_FFT1_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  for (i = 0; i < MAX_TEXTURES; i++) {
    if (GameTextures[i].used) {
      SendDlgItemMessage(IDC_FFT1_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
    }
  }
}

void levelkeypad::OnSetfocusFft2Combo() {
  int i;

  SendDlgItemMessage(IDC_FFT2_COMBO, CB_RESETCONTENT, 0, 0);
  SendDlgItemMessage(IDC_FFT2_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  for (i = 0; i < MAX_TEXTURES; i++) {
    if (GameTextures[i].used) {
      SendDlgItemMessage(IDC_FFT2_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
    }
  }
}

void levelkeypad::OnLevelPiw() {
  if (Level_powerups_ignore_wind)
    Level_powerups_ignore_wind = false;
  else
    Level_powerups_ignore_wind = true;

  UpdateDialog();
}

void levelkeypad::OnKillfocusFft3Edit() {
  char str[21];
  ((CEdit *)GetDlgItem(IDC_FFT3_EDIT))->GetWindowText(str, 20);

  force_field_bounce_multiplier[2] = atof(str);

  UpdateDialog();
}

void levelkeypad::OnSelendokFft3Combo() {
  char name[200];

  int cur = SendDlgItemMessage(IDC_FFT3_COMBO, CB_GETCURSEL, 0, 0);
  SendDlgItemMessage(IDC_FFT3_COMBO, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);

  if (stricmp(name, "Not Assigned") != 0)
    force_field_bounce_texture[2] = FindTextureName(name);
  else
    force_field_bounce_texture[2] = -1;

  UpdateDialog();
}

void levelkeypad::OnSetfocusFft3Combo() {
  int i;

  SendDlgItemMessage(IDC_FFT3_COMBO, CB_RESETCONTENT, 0, 0);
  SendDlgItemMessage(IDC_FFT3_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) "Not Assigned");
  for (i = 0; i < MAX_TEXTURES; i++) {
    if (GameTextures[i].used) {
      SendDlgItemMessage(IDC_FFT3_COMBO, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)GameTextures[i].name);
    }
  }
}
