/* * 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 . */ // 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 "pserror.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); } } }