/* * Copyright (C) Volition, Inc. 1999. All rights reserved. * * All source code herein is the property of Volition, Inc. You may not sell * or otherwise commercially exploit the source or things you created based on the * source. * */ /* * $Logfile: /Freespace2/code/fred2/PlayerStartEditor.cpp $ * $Revision: 1.2 $ * $Date: 2006-06-02 09:52:42 $ * $Author: karajorma $ * * Player starting point editor dialog box handling code * * $Log: not supported by cvs2svn $ * Revision 1.1 2006/01/19 02:27:31 Goober5000 * import FRED2 back into fs2_open module * --Goober5000 * * Revision 1.4 2005/12/29 08:21:00 wmcoolmon * No my widdle FRED, I didn't forget about you ^_^ (codebase commit) * * Revision 1.3 2005/09/29 05:18:59 Goober5000 * the FRED stuff * --Goober5000 * * Revision 1.2 2002/08/15 01:06:34 penguin * Include filename reorg (to coordinate w/ fs2_open) * * Revision 1.1.1.1 2002/07/15 03:11:00 inquisitor * Initial FRED2 Checking * * * 4 2/23/99 7:03p Dave * Rewrote a horribly mangled and evil team loadout dialog. Bugs gone. * * * $NoKeywords: $ */ #include "stdafx.h" #include "FRED.h" #include "FREDDoc.h" #include "PlayerStartEditor.h" #include "mission/missionparse.h" #include "object/object.h" #include "Management.h" #include "weapon/weapon.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // player_start_editor dialog player_start_editor::player_start_editor(CWnd* pParent) : CDialog(player_start_editor::IDD, pParent) { //{{AFX_DATA_INIT(player_start_editor) m_delay = 0; m_weapon_pool = 0; m_ship_pool = 0; //}}AFX_DATA_INIT selected_team = 0; dlg_inited = 0; } void player_start_editor::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(player_start_editor) DDX_Control(pDX, IDC_POOL_SPIN, m_pool_spin); DDX_Control(pDX, IDC_DELAY_SPIN, m_delay_spin); DDX_Control(pDX, IDC_SPIN1, m_spin1); DDX_Control(pDX, IDC_SHIP_LIST, m_ship_list); DDX_Control(pDX, IDC_WEAPON_LIST, m_weapon_list); DDX_Control(pDX, IDC_SHIP_VARIABLES_LIST, m_ship_variable_list); DDX_Control(pDX, IDC_WEAPON_VARIABLES_LIST, m_weapon_variable_list); DDX_Control(pDX, IDC_SHIP_VARIABLES_COMBO, m_ship_quantity_variable); DDX_Control(pDX, IDC_WEAPON_VARIABLES_COMBO, m_weapon_quantity_variable); DDX_Text(pDX, IDC_DELAY, m_delay); DDX_Text(pDX, IDC_SHIP_POOL, m_ship_pool); DDX_Text(pDX, IDC_WEAPON_POOL, m_weapon_pool); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(player_start_editor, CDialog) //{{AFX_MSG_MAP(player_start_editor) ON_WM_INITMENU() ON_LBN_SELCHANGE(IDC_SHIP_LIST, OnSelchangeShipList) ON_LBN_SELCHANGE(IDC_WEAPON_LIST, OnSelchangeWeaponList) ON_EN_UPDATE(IDC_SHIP_POOL, OnUpdateShipPool) ON_EN_UPDATE(IDC_WEAPON_POOL, OnUpdateWeaponPool) ON_LBN_SELCHANGE(IDC_SHIP_VARIABLES_LIST, OnSelchangeShipVariablesList) ON_LBN_SELCHANGE(IDC_WEAPON_VARIABLES_LIST, OnSelchangeWeaponVariablesList) ON_CBN_SELCHANGE(IDC_SHIP_VARIABLES_COMBO, OnSelchangeShipVariablesCombo) ON_WM_CLOSE() ON_CBN_SELCHANGE(IDC_WEAPON_VARIABLES_COMBO, OnSelchangeWeaponVariablesCombo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // player_start_editor message handlers BOOL player_start_editor::OnInitDialog() { SetupShipAndWeaponPools(); // entry delay time m_delay = f2i(Entry_delay_time); // misc window crap CDialog::OnInitDialog(); theApp.init_window(&Player_wnd_data, this); m_spin1.SetRange(0, 99); m_pool_spin.SetRange(0, 9999); m_delay_spin.SetRange(0, 30); // regenerate all the controls reset_controls(); dlg_inited = 1; return TRUE; } void player_start_editor::SetupShipAndWeaponPools() { int i; int idx; // initialize ship pool data memset(static_ship_pool, -1, sizeof(int) * MAX_TVT_TEAMS * MAX_SHIP_CLASSES); memset(dynamic_ship_pool, -1, sizeof(int) * MAX_TVT_TEAMS * MAX_SEXP_VARIABLES); memset(static_ship_variable_pool, -1, sizeof(int) * MAX_TVT_TEAMS * MAX_SHIP_CLASSES); memset(dynamic_ship_variable_pool, -1, sizeof(int) * MAX_TVT_TEAMS * MAX_SEXP_VARIABLES); for(i=0; i 0) || (dynamic_ship_variable_pool[selected_team][i] != NOT_SET_BY_SEXP_VARIABLE)) { m_ship_variable_list.SetCheck(current_entry, TRUE); } else { m_ship_variable_list.SetCheck(current_entry, FALSE); } // Do weapons m_weapon_variable_list.AddString(Sexp_variables[i].variable_name); /**Rest of the weapons variable list goes here! */ // next current_entry++; } // Seeing as how we're looping through Sexp_variables we might as well fill the number variable combo boxes else if (Sexp_variables[i].type & SEXP_VARIABLE_NUMBER) { m_ship_quantity_variable.AddString(Sexp_variables[i].variable_name); m_weapon_quantity_variable.AddString(Sexp_variables[i].variable_name); } } // If at at the end of all this there are no entries, disable the variables windows. if (!current_entry) { m_ship_variable_list.EnableWindow(false); m_weapon_variable_list.EnableWindow(false); } // create a checklistbox for each "player" ship type m_ship_list.ResetContent(); ct = 0; for (i=0; i 0) || (static_ship_variable_pool[selected_team][i] != NOT_SET_BY_SEXP_VARIABLE)) { m_ship_list.SetCheck(ct, TRUE); } else { m_ship_list.SetCheck(ct, FALSE); } // next ct++; } } // create a checklistbox for each weapon ship type m_weapon_list.ResetContent(); ct = 0; for (i=0; i 0){ m_weapon_list.SetCheck(ct, TRUE); } else { m_weapon_list.SetCheck(ct, FALSE); } ct++; } } // be sure that nothing is selected m_ship_list.SetCurSel(-1); m_ship_variable_list.SetCurSel(-1); m_weapon_list.SetCurSel(-1); m_weapon_variable_list.SetCurSel(-1); m_ship_quantity_variable.SetCurSel(-1); m_weapon_quantity_variable.SetCurSel(-1); UpdateData(FALSE); } void player_start_editor::OnInitMenu(CMenu* pMenu) { int i; CMenu *m; // disable any items we should disable m = pMenu->GetSubMenu(0); // uncheck all menu items for (i = 0; i < Num_teams; i++ ){ m->CheckMenuItem(i, MF_BYPOSITION | MF_UNCHECKED); } for ( i = Num_teams; i < MAX_TVT_TEAMS; i++ ){ m->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); } // put a check next to the currently selected item m->CheckMenuItem(selected_team, MF_BYPOSITION | MF_CHECKED); CDialog::OnInitMenu(pMenu); } // switch between active teams BOOL player_start_editor::OnCommand(WPARAM wParam, LPARAM lParam) { int id; // select a team id = LOWORD(wParam); switch(id){ case ID_TEAM_1: selected_team = 0; reset_controls(); break; case ID_TEAM_2: selected_team = 1; reset_controls(); break; } // low level stuff return CDialog::OnCommand(wParam, lParam); } // ship list changed void player_start_editor::OnSelchangeShipList() { int selected; int ship_index; char ship_name[255] = ""; // If the ShipList is selected the variable ship list should be deselected m_ship_variable_list.SetCurSel(-1); // determine if we've selected something selected = m_ship_list.GetCurSel(); if (selected != -1) { // lookup the ship m_ship_list.GetText(m_ship_list.GetCurSel(), ship_name); ship_index = ship_info_lookup(ship_name); // if we have a valid ship type if(ship_index >= 0) { // if this item is checked if(m_ship_list.GetCheck(selected)) { if (static_ship_variable_pool[selected_team][ship_index] == NOT_SET_BY_SEXP_VARIABLE) { if (static_ship_pool[selected_team][ship_index] <= 0) { static_ship_pool[selected_team][ship_index] = 5; } m_ship_pool = static_ship_pool[selected_team][ship_index]; // Set the ship variable ComboBox to reflect that we are not using variables for this ship m_ship_quantity_variable.SetCurSel(0); } // If the number of ships was set by a variable else { Assert (Sexp_variables[static_ship_variable_pool[selected_team][ship_index]].type & SEXP_VARIABLE_NUMBER); m_ship_pool = atoi(Sexp_variables[static_ship_variable_pool[selected_team][ship_index]].text); int selected_variable = GetTypedVariableIndex(static_ship_variable_pool[selected_team][ship_index], false); m_ship_quantity_variable.SetCurSel(selected_variable + VARIABLES_COMBO_OFFSET); } } // otherwise zero the count else { static_ship_pool[selected_team][ship_index] = 0; m_ship_pool = 0; m_ship_quantity_variable.SetCurSel(0); } } else { Int3(); } } // update shtuff UpdateData(FALSE); } void player_start_editor::OnSelchangeShipVariablesList() { // If the ShipList is selected the variable ship list should be deselected m_ship_list.SetCurSel(-1); //Have we selected something? int selection = m_ship_variable_list.GetCurSel(); if (selection != -1) { // Is this a valid SEXP variable char sexp_variable_name[TOKEN_LENGTH]; m_ship_variable_list.GetText(selection, sexp_variable_name); int sexp_index = get_index_sexp_variable_name(sexp_variable_name); if (sexp_index > -1) { // The selection should the selection'th string variable in Sexp_variables[] Assert(selection == GetTypedVariableIndex(sexp_index, true)); // Is this item checked? if (m_ship_variable_list.GetCheck(selection)) { if (dynamic_ship_variable_pool[selected_team][sexp_index] == NOT_SET_BY_SEXP_VARIABLE) { if (dynamic_ship_pool[selected_team][sexp_index] <= 0) { dynamic_ship_pool[selected_team][sexp_index] = 5; } m_ship_pool = dynamic_ship_pool[selected_team][sexp_index]; m_ship_quantity_variable.SetCurSel(0); } else { Assert (Sexp_variables[dynamic_ship_variable_pool[selected_team][sexp_index]].type & SEXP_VARIABLE_NUMBER); m_ship_pool = atoi(Sexp_variables[dynamic_ship_variable_pool[selected_team][sexp_index]].text); int selected_variable = GetTypedVariableIndex(dynamic_ship_variable_pool[selected_team][sexp_index], false); m_ship_quantity_variable.SetCurSel(selected_variable + VARIABLES_COMBO_OFFSET); } } // Set everything to zero else { dynamic_ship_pool[selected_team][sexp_index] = NOT_SET_BY_SEXP_VARIABLE; m_ship_pool = 0; m_ship_quantity_variable.SetCurSel(0); } } else { Int3(); } } // update stuff UpdateData(FALSE); } void player_start_editor::OnSelchangeShipVariablesCombo() { // Get the new selection char variable_name[TOKEN_LENGTH]; char name[255] = ""; bool update_static_pool = false; bool update_dynamic_pool = false; m_ship_quantity_variable.GetLBText(m_ship_quantity_variable.GetCurSel(), variable_name); int sexp_index = get_index_sexp_variable_name(variable_name); Assert ((sexp_index > -1) || (!strcmp("Don't Use Variables", variable_name))); // See if the ship_list was selected int ship_index = GetSelectedShipListIndex(); if (ship_index >= 0) { static_ship_variable_pool[selected_team][ship_index] = sexp_index; update_static_pool = true; } // Maybe it's the ship_variables_list that is actually selected int ship_variable_index = GetSelectedShipVariableListIndex(); if (ship_variable_index >= 0 ) { dynamic_ship_variable_pool[selected_team][ship_variable_index] = sexp_index; update_dynamic_pool = true; } // Update the ship_pool if (update_static_pool || update_dynamic_pool) { int new_quantity = 5; if (sexp_index > -1) { Assert (Sexp_variables[sexp_index].type & SEXP_VARIABLE_NUMBER); new_quantity = atoi(Sexp_variables[sexp_index].text); } if (update_static_pool) { static_ship_pool[selected_team][ship_index] = new_quantity; } m_ship_pool = new_quantity; } // update stuff UpdateData(FALSE); } // weapon list changed void player_start_editor::OnSelchangeWeaponList() { int selected; int wi_index; char weapon_name[255] = ""; // Deselect the variables list when this one is selected m_weapon_quantity_variable.SetCurSel(-1); // determine if we've selected something selected = m_weapon_list.GetCurSel(); if (selected != -1) { // lookup the weapon m_weapon_list.GetText(m_weapon_list.GetCurSel(), weapon_name); wi_index = weapon_name_lookup(weapon_name); // if we have a valid weapon type if(wi_index >= 0){ // if this item is checked if(m_weapon_list.GetCheck(selected)) { if(weapon_pool[selected_team][wi_index] <= 0){ weapon_pool[selected_team][wi_index] = 100; m_weapon_pool = 100; } else { m_weapon_pool = weapon_pool[selected_team][wi_index]; } } // otherwise zero the count else { weapon_pool[selected_team][wi_index] = 0; m_weapon_pool = 0; } } else { Int3(); } } // update shtuff UpdateData(FALSE); } // cancel void player_start_editor::OnCancel() { theApp.record_window_data(&Player_wnd_data, this); CDialog::OnCancel(); } // ok void player_start_editor::OnOK() { int i, idx; // store player entry time delay Entry_delay_time = i2f(m_delay); // store ship pools for(i=0; i -1) { Team_data[i].ship_list[num_choices] = idx; strcpy(Team_data[i].ship_list_variables[num_choices], ""); // Now set the number of this class available if (static_ship_variable_pool[i][idx] == NOT_SET_BY_SEXP_VARIABLE) { Team_data[i].ship_count[num_choices] = static_ship_pool[i][idx]; strcpy(Team_data[i].ship_count_variables[num_choices], ""); } else { strcpy(Team_data[i].ship_count_variables[num_choices], Sexp_variables[static_ship_variable_pool[i][idx]].variable_name); Assert (Sexp_variables[static_ship_variable_pool[i][idx]].type & SEXP_VARIABLE_NUMBER); Team_data[i].ship_count[num_choices] = atoi(Sexp_variables[static_ship_variable_pool[i][idx]].text); } num_choices++; } } Team_data[i].number_choices = num_choices; } // store weapon pools for(i=0; iGetLBText(variable_list->GetCurSel(), variable_name); int variable_index = get_index_sexp_variable_name(variable_name); if (variable_index > -1) { char variable_value[TOKEN_LENGTH]; sprintf(variable_value, "%d", pool_value); Assert (Sexp_variables[variable_index].type & SEXP_VARIABLE_NUMBER); sexp_fred_modify_variable(variable_value, variable_name, variable_index, SEXP_VARIABLE_NUMBER); } } // ship pool count change void player_start_editor::OnUpdateShipPool() { if (!dlg_inited){ return; } UpdateData(TRUE); int si_index = GetSelectedShipListIndex(); // Update the pool if we have a valid ship type if(si_index >= 0) { static_ship_pool[selected_team][si_index] = m_ship_pool; // If this value came from a variable we should update its value UpdateQuantityVariable(&m_ship_quantity_variable, m_ship_pool); return ; } // Maybe it's the ship_variables_list that is actually selected int sexp_index = GetSelectedShipVariableListIndex(); // if we have a valid sexp_variable if(sexp_index >= 0) { dynamic_ship_pool[selected_team][sexp_index] = m_ship_pool; UpdateQuantityVariable(&m_ship_quantity_variable, m_ship_pool); } } // weapon pool count change void player_start_editor::OnUpdateWeaponPool() { int selected, wi_index; char weapon_name[255] = ""; if (!dlg_inited){ return; } UpdateData(TRUE); // if we have a ship selected and checked, update the pool selected = m_weapon_list.GetCurSel(); if((selected != -1) && m_weapon_list.GetCheck(selected)){ // lookup the ship m_weapon_list.GetText(m_weapon_list.GetCurSel(), weapon_name); wi_index = weapon_info_lookup(weapon_name); // if we have a valid ship type if(wi_index >= 0){ weapon_pool[selected_team][wi_index] = m_weapon_pool; } } } // Given a Sexp_Variable index, returns the index this would have in Sexp_variables if the array only had variables of // a certain type or -1 if the supplied index wasn't of the supplied type. int player_start_editor::GetTypedVariableIndex(int sexp_variables_index, bool string_variable) { // Loop through Sexp_variables until we have found the one corresponding to the argument int count = 0; for (int i=0; i < MAX_SEXP_VARIABLES; i++) { if (string_variable && (Sexp_variables[i].type & SEXP_VARIABLE_NUMBER)) { continue; } else if (!string_variable && (Sexp_variables[i].type & SEXP_VARIABLE_STRING)) { continue; } // The type is correct at least. Now lets see if the index is correct if (i == sexp_variables_index) { return count ; } count++; } return -1; } void player_start_editor::OnSelchangeWeaponVariablesList() { // TODO: Add your control notification handler code here } void player_start_editor::OnSelchangeWeaponVariablesCombo() { // TODO: Add your control notification handler code here }