Files
fs2open.github.com/fred2/shipspecialhitpoints.cpp
Goober5000 6692540cbf add more autosaving in FRED
FRED has an autosave feature but it wasn't invoked in too many places.  This adds autosaving whenever a major dialog is closed, unless it was closed by hitting Cancel.  NB: Autosave is not yet implemented in qtFRED.

Also, `addvariabledlg` incorrectly referred to `OnOk` instead of `OnOK` and `CMessageEditorDlg` incorrectly referred to `OnOK` instead of `OnOk`, so this fixes those and distinguishes `OnOk` by renaming it `OnButtonOk` to be consistent with the event editor and other dialogs.
2023-12-06 17:55:26 -05:00

221 lines
5.1 KiB
C++

// ShipSpecialHitpoints.cpp : implementation file
//
#include "stdafx.h"
#include "fred.h"
#include "ShipSpecialHitpoints.h"
#include "globalincs/linklist.h"
#include "parse/sexp.h"
#include "FREDDoc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// ShipSpecialHitpoints dialog
ShipSpecialHitpoints::ShipSpecialHitpoints(CWnd* pParent /*=NULL*/)
: CDialog(ShipSpecialHitpoints::IDD, pParent)
{
//{{AFX_DATA_INIT(ShipSpecialHitpoints)
//}}AFX_DATA_INIT
}
void ShipSpecialHitpoints::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ShipSpecialHitpoints)
DDX_Check(pDX, IDC_ENABLE_SPECIAL_HITPOINTS, m_special_hitpoints_enabled);
DDX_Check(pDX, IDC_ENABLE_SPECIAL_SHIELD, m_special_shield_enabled);
DDX_Text(pDX, IDC_SPECIAL_SHIELDS, m_shields);
DDV_MinMaxInt(pDX, m_shields, -1, INT_MAX);
DDX_Text(pDX, IDC_SPECIAL_HULL, m_hull);
DDV_MinMaxInt(pDX, m_hull, 1, INT_MAX);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ShipSpecialHitpoints, CDialog)
//{{AFX_MSG_MAP(ShipSpecialHitpoints)
ON_BN_CLICKED(IDC_ENABLE_SPECIAL_HITPOINTS, OnEnableSpecialHitpoints)
ON_BN_CLICKED(IDC_ENABLE_SPECIAL_SHIELD, OnEnableSpecialShieldpoints)
ON_BN_CLICKED(ID_OK, OnButtonOk)
ON_BN_CLICKED(ID_CANCEL, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// ShipSpecialHitpoints message handlers
void ShipSpecialHitpoints::OnEnableSpecialHitpoints()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
DoGray();
}
void ShipSpecialHitpoints::OnEnableSpecialShieldpoints()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
DoGray();
}
BOOL ShipSpecialHitpoints::OnInitDialog()
{
// get ship num
object *objp;
num_selected_ships = 0;
objp = GET_FIRST(&obj_used_list);
while (objp != END_OF_LIST(&obj_used_list)) {
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
if (objp->flags[Object::Object_Flags::Marked]) {
m_selected_ships[num_selected_ships] = objp->instance;
num_selected_ships++;
}
}
objp = GET_NEXT(objp);
}
Assert(num_selected_ships);
Assert (Objects[cur_object_index].flags[Object::Object_Flags::Marked]);
m_ship_num = Objects[cur_object_index].instance;
// get the details from the first ship
//hull
if (Ships[m_ship_num].special_hitpoints) {
m_hull = Ships[m_ship_num].special_hitpoints;
m_special_hitpoints_enabled = TRUE;
}
else {
// get default_table_values
ship_info *sip;
sip = &Ship_info[Ships[m_ship_num].ship_info_index];
m_hull = (int)sip->max_hull_strength;
m_special_hitpoints_enabled = FALSE;
if (m_hull < 1) m_hull = 10;
}
//shields
if (Ships[m_ship_num].special_shield > 0){
m_shields = Ships[m_ship_num].special_shield;
m_special_shield_enabled = TRUE;
}
else {
// get default_table_values
ship_info *sip;
sip = &Ship_info[Ships[m_ship_num].ship_info_index];
m_shields = (int)sip->max_shield_strength;
m_special_shield_enabled = FALSE;
if (m_shields < 0) {
m_shields = 0;
}
}
CDialog::OnInitDialog();
// maybe gray out lots of stuff
DoGray();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void ShipSpecialHitpoints::DoGray()
{
GetDlgItem(IDC_SPECIAL_SHIELDS)->EnableWindow(m_special_shield_enabled);
GetDlgItem(IDC_SPECIAL_HULL)->EnableWindow(m_special_hitpoints_enabled);
}
void ShipSpecialHitpoints::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void ShipSpecialHitpoints::OnButtonOk()
{
float temp_max_hull_strength;
int new_shield_strength, new_hull_strength;
int i;
UpdateData(TRUE);
// TODO: Add extra validation here
if (m_special_hitpoints_enabled) {
// Don't update anything if the hull strength is invalid
if (m_hull < 1) {
return;
}
// set to update
set_modified();
new_hull_strength = m_hull;
//Ships[m_ship_num].special_hitpoints = m_hull;
}
else {
// set to update
set_modified();
new_hull_strength = 0;
}
if (m_special_shield_enabled) {
// Don't update anything if the hull strength is invalid
if (m_shields < 0) {
return;
}
// set to update
set_modified();
new_shield_strength = m_shields;
//Ships[m_ship_num].special_shield = m_shields;
}
else {
// set to update
set_modified();
new_shield_strength = -1;
}
for ( i=0; i<num_selected_ships; i++) {
// set the special hitpoints/shield
Ships[m_selected_ships[i]].special_hitpoints = new_hull_strength;
Ships[m_selected_ships[i]].special_shield = new_shield_strength;
// calc kamikaze stuff
if (Ships[m_selected_ships[i]].special_hitpoints)
{
temp_max_hull_strength = (float)Ships[m_selected_ships[i]].special_hitpoints;
}
else
{
temp_max_hull_strength = Ship_info[Ships[m_selected_ships[i]].ship_info_index].max_hull_strength;
}
Ai_info[Ships[m_selected_ships[i]].ai_index].kamikaze_damage = std::min(1000, 200 + (int)(temp_max_hull_strength / 4.0f));
}
CDialog::OnOK();
}