1 // ShipSpecialDamage.cpp : implementation file
6 #include "shipspecialdamage.h"
14 static char THIS_FILE[] = __FILE__;
17 /////////////////////////////////////////////////////////////////////////////
18 // ShipSpecialDamage dialog
21 ShipSpecialDamage::ShipSpecialDamage(CWnd* pParent /*=NULL*/)
22 : CDialog(ShipSpecialDamage::IDD, pParent)
24 //{{AFX_DATA_INIT(ShipSpecialDamage)
29 void ShipSpecialDamage::DoDataExchange(CDataExchange* pDX)
31 CDialog::DoDataExchange(pDX);
32 //{{AFX_DATA_MAP(ShipSpecialDamage)
33 DDX_Check(pDX, IDC_ENABLE_SHOCKWAVE, m_shock_enabled);
34 DDX_Check(pDX, IDC_ENABLE_SPECIAL_EXP, m_special_exp_enabled);
35 DDX_Text(pDX, IDC_SPECIAL_INNER_RAD, m_inner_rad);
36 DDV_MinMaxInt(pDX, m_inner_rad, 10, 10000);
37 DDX_Text(pDX, IDC_SPECIAL_OUTER_RAD, m_outer_rad);
38 DDV_MinMaxInt(pDX, m_outer_rad, 11, 10000);
39 DDX_Text(pDX, IDC_SPECIAL_DAMAGE, m_damage);
40 DDV_MinMaxInt(pDX, m_damage, 0, 100000);
41 DDX_Text(pDX, IDC_SPECIAL_SHOCK_SPEED, m_shock_speed);
42 DDV_MinMaxInt(pDX, m_shock_speed, 10, 1000);
43 DDX_Text(pDX, IDC_SPECIAL_BLAST, m_blast);
44 DDV_MinMaxInt(pDX, m_blast, 0, 100000);
49 BEGIN_MESSAGE_MAP(ShipSpecialDamage, CDialog)
50 //{{AFX_MSG_MAP(ShipSpecialDamage)
51 ON_BN_CLICKED(IDC_ENABLE_SHOCKWAVE, OnEnableShockwave)
52 ON_BN_CLICKED(IDC_ENABLE_SPECIAL_EXP, OnEnableSpecialExp)
56 /////////////////////////////////////////////////////////////////////////////
57 // ShipSpecialDamage message handlers
59 void ShipSpecialDamage::OnEnableShockwave()
61 // TODO: Add your control notification handler code here
64 // enable/disable shock speed
67 void ShipSpecialDamage::OnEnableSpecialExp()
69 // TODO: Add your control notification handler code here
75 BOOL ShipSpecialDamage::OnInitDialog()
78 // TODO: Add extra initialization here
85 objp = GET_FIRST(&obj_used_list);
86 while (objp != END_OF_LIST(&obj_used_list)) {
87 if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
88 if (objp->flags & OF_MARKED) {
90 m_ship_num = objp->instance;
94 objp = GET_NEXT(objp);
97 if (Ships[m_ship_num].special_exp_index == -1) {
98 // get default_table_values
100 sip = &Ship_info[Ships[m_ship_num].ship_info_index];
102 m_inner_rad = (int)sip->inner_rad;
103 m_outer_rad = (int)sip->outer_rad;
104 m_damage = (int) sip->damage;
105 m_blast = (int) sip->blast;
106 m_shock_enabled = (int) sip->explosion_propagates;
107 m_shock_speed = (int) sip->shockwave_speed;
108 m_special_exp_enabled = FALSE;
110 if (m_inner_rad < 10) m_inner_rad = 10;
111 if (m_outer_rad < 11) m_outer_rad = 11;
112 if (m_shock_speed < 10) m_shock_speed = 10;
114 int index = Ships[m_ship_num].special_exp_index;
115 Assert( (index > 0) && (index < MAX_SEXP_VARIABLES-5) );
117 m_inner_rad = atoi(Sexp_variables[index++].text);
118 m_outer_rad = atoi(Sexp_variables[index++].text);
119 m_damage = atoi(Sexp_variables[index++].text);
120 m_blast = atoi(Sexp_variables[index++].text);
121 m_shock_enabled = atoi(Sexp_variables[index++].text);
122 m_shock_speed = atoi(Sexp_variables[index++].text);
123 m_special_exp_enabled = TRUE;
126 CDialog::OnInitDialog();
128 // maybe gray out lots of stuff
131 return TRUE; // return TRUE unless you set the focus to a control
132 // EXCEPTION: OCX Property Pages should return FALSE
135 void ShipSpecialDamage::DoGray()
137 GetDlgItem(IDC_SPECIAL_DAMAGE)->EnableWindow(m_special_exp_enabled);
138 GetDlgItem(IDC_SPECIAL_BLAST)->EnableWindow(m_special_exp_enabled);
139 GetDlgItem(IDC_SPECIAL_INNER_RAD)->EnableWindow(m_special_exp_enabled);
140 GetDlgItem(IDC_SPECIAL_OUTER_RAD)->EnableWindow(m_special_exp_enabled);
141 GetDlgItem(IDC_ENABLE_SHOCKWAVE)->EnableWindow(m_special_exp_enabled);
142 GetDlgItem(IDC_SPECIAL_SHOCK_SPEED)->EnableWindow(m_special_exp_enabled && m_shock_enabled);
146 void ShipSpecialDamage::OnCancel()
148 // TODO: Add extra cleanup here
153 void ShipSpecialDamage::OnOK()
157 // TODO: Add extra validation here
158 if (m_special_exp_enabled) {
162 if (m_inner_rad > m_outer_rad) {
163 MessageBox("Inner radius must be less than outer radius");
167 if (Ships[m_ship_num].special_exp_index == -1) {
168 // get free sexp_variables
169 start = sexp_variable_allocate_block(Ships[m_ship_num].ship_name, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_EXP);
171 MessageBox("Unable to allocate storage, try deleting Sexp variables");
174 Ships[m_ship_num].special_exp_index = start;
177 start = Ships[m_ship_num].special_exp_index;
183 sprintf(Sexp_variables[start+INNER_RAD].text, "%d", m_inner_rad);
184 sprintf(Sexp_variables[start+OUTER_RAD].text, "%d", m_outer_rad);
185 sprintf(Sexp_variables[start+DAMAGE].text, "%d", m_damage);
186 sprintf(Sexp_variables[start+BLAST].text, "%d", m_blast);
187 sprintf(Sexp_variables[start+PROPAGATE].text, "%d", m_shock_enabled);
188 sprintf(Sexp_variables[start+SHOCK_SPEED].text, "%d", m_shock_speed);
191 if (Ships[m_ship_num].special_exp_index != -1) {
196 sexp_variable_block_free(Ships[m_ship_num].ship_name, Ships[m_ship_num].special_exp_index, SEXP_VARIABLE_BLOCK |SEXP_VARIABLE_BLOCK_EXP);
198 // set index to no exp block
199 Ships[m_ship_num].special_exp_index = -1;