dxx-rebirth/common/main/cntrlcen.h
Chris Taylor 4cc801f42f Remove calls to window_close(Game_wind) when game finished or over
Replace calls to window_close(Game_wind) with returning window_event_result::close to game handler. Applies to when DoEndGame() is called, DoGameOver() is called, aborting in the kmatrix screen (multiplayer game) during AdvanceLevel() and playing one demo frame causes playback to stop in GameProcessFrame(). Closing a window within its handler is problematic - it can result in an unstable state.
2017-01-08 21:08:50 +08:00

140 lines
3.9 KiB
C++

/*
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING.txt.
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below.
* See COPYING.txt for license details.
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* Header for cntrlcen.c
*
*/
#pragma once
#include <physfs.h>
#ifdef __cplusplus
#include "fwd-object.h"
#include "pack.h"
#include "fwd-segment.h"
#include "fwd-window.h"
#include "fwd-partial_range.h"
#define MAX_CONTROLCEN_LINKS 10
struct control_center_triggers : public prohibit_void_ptr<control_center_triggers>
{
short num_links;
array<segnum_t, MAX_CONTROLCEN_LINKS> seg;
array<short, MAX_CONTROLCEN_LINKS> side;
};
extern control_center_triggers ControlCenterTriggers;
#ifdef dsx
#include "vecmat.h"
struct reactor {
#if defined(DXX_BUILD_DESCENT_II)
int model_num;
#endif
int n_guns;
/* Location of the gun on the reactor model */
array<vms_vector, MAX_CONTROLCEN_GUNS> gun_points;
/* Orientation of the gun on the reactor model */
array<vms_vector, MAX_CONTROLCEN_GUNS> gun_dirs;
};
// fills in arrays gun_points & gun_dirs, returns the number of guns read
void read_model_guns(const char *filename, reactor &);
namespace dsx {
#if defined(DXX_BUILD_DESCENT_I)
constexpr unsigned MAX_REACTORS = 1;
constexpr unsigned Num_reactors = 1;
#elif defined(DXX_BUILD_DESCENT_II)
constexpr unsigned MAX_REACTORS = 7;
#define DEFAULT_CONTROL_CENTER_EXPLOSION_TIME 30 // Note: Usually uses Alan_pavlish_reactor_times, but can be overridden in editor.
extern unsigned Num_reactors;
extern int Base_control_center_explosion_time; // how long to blow up on insane
extern int Reactor_strength;
/*
* reads n reactor structs from a PHYSFS_File
*/
void reactor_read_n(PHYSFS_File *fp, partial_range_t<reactor *> r);
#endif
extern array<reactor, MAX_REACTORS> Reactors;
static inline int get_reactor_model_number(int id)
{
#if defined(DXX_BUILD_DESCENT_I)
return id;
#elif defined(DXX_BUILD_DESCENT_II)
return Reactors[id].model_num;
#endif
}
static inline reactor &get_reactor_definition(int id)
{
#if defined(DXX_BUILD_DESCENT_I)
(void)id;
return Reactors[0];
#elif defined(DXX_BUILD_DESCENT_II)
return Reactors[id];
#endif
}
}
namespace dcx {
//@@extern int N_controlcen_guns;
extern int Control_center_been_hit;
extern int Control_center_player_been_seen;
extern int Control_center_next_fire_time;
extern int Control_center_present;
extern objnum_t Dead_controlcen_object_num;
}
namespace dsx {
// do whatever this thing does in a frame
void do_controlcen_frame(vobjptridx_t obj);
// Initialize control center for a level.
// Call when a new level is started.
void init_controlcen_for_level();
void calc_controlcen_gun_point(object &obj);
void do_controlcen_destroyed_stuff(objptridx_t objp);
window_event_result do_controlcen_dead_frame();
}
#endif
namespace dcx {
extern fix Countdown_timer;
extern int Control_center_destroyed, Countdown_seconds_left, Total_countdown_time;
}
/*
* reads n control_center_triggers structs from a PHYSFS_File
*/
void control_center_triggers_read(control_center_triggers *cct, PHYSFS_File *fp);
void control_center_triggers_write(const control_center_triggers *cct, PHYSFS_File *fp);
#endif