File: missiongoals.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (202 lines) | stat: -rw-r--r-- 8,781 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
 * 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.
 *
*/ 



#ifndef _MISSIONGOAL_H
#define _MISSIONGOAL_H

#include "globalincs/globals.h"
#include "globalincs/pstypes.h"
#include "io/timer.h"

struct ai_goal;
struct ai_info;

// defines for types of primary and secondary missions

// defines for types of goals.  We will use part of the int field of the mission_goal struct
// as a bit field for goal flags

#define	PRIMARY_GOAL		0
#define	SECONDARY_GOAL		1
#define	BONUS_GOAL			2

// defines for bitfields of type, (and mask to get the type field quickly)
#define	INVALID_GOAL		(1 << 16)			// is this goal valid or not?
#define	GOAL_TYPE_MASK		(0xffff)				// mask to get us the type

// defines for goal status.  These status are also used in campaign file for marking goal status
// in campaign save file
#define	GOAL_FAILED			0		// status of goal
#define	GOAL_COMPLETE		1		
#define	GOAL_INCOMPLETE	2

#define	PRIMARY_GOALS_COMPLETE		1
#define	PRIMARY_GOALS_INCOMPLETE	0
#define	PRIMARY_GOALS_FAILED			-1

extern const char *Goal_type_text(int n);

// structures for primary and secondary goals

#define	MAX_GOAL_TEXT	128

#define	MGF_NO_MUSIC	(1<<0)		// don't play any event music when goal is achieved

typedef struct mission_goal {
	SCP_string name;                        // used for storing status of goals in player file
	int  type = PRIMARY_GOAL;               // primary/secondary/bonus
	int  satisfied = GOAL_INCOMPLETE;       // has this goal been satisfied
	SCP_string message;                     //	Brief description, such as "Destroy all vile aliens!"
	int	 formula = -1;                      //	Index in Sexp_nodes of this Sexp.
	int  score = 0;                         // score for this goal
	int  flags = 0;                         // MGF_
	int  team = 0;                          // which team is this objective for (defaults to the first team)
} mission_goal;
extern SCP_vector<mission_goal> Mission_goals;	// structure for the goals of this mission

// structures and defines for mission events

// defined for event states.  We will also use the satisfied/failed for saving event information
// in campaign save file
enum class EventStatus : int
{
	UNBORN = 0,		// event can't be evaluated yet
	CURRENT = 1,	// event can currently be evaluated, but not satisfied or failed yet
	SATISFIED = 2,
	FAILED = 3,
	INCOMPLETE = 4	// used in campaign save file.  used when event isn't satisfied yet
};

#define MEF_CURRENT					(1 << 0)		// is event current or past current yet?
#define MEF_DIRECTIVE_SPECIAL		(1 << 1)		// used to mark a directive as true even though not fully satisfied
#define MEF_DIRECTIVE_TEMP_TRUE		(1 << 2)		// this directive is temporarily true.
#define MEF_USING_TRIGGER_COUNT		(1 << 3)		// Karajorma - use trigger count as well as repeat count to determine how many repeats this event has
#define MEF_USE_MSECS				(1 << 4)		// Goober5000 - interval and chain delay are in milliseconds, not seconds
#define MEF_TIMESTAMP_HAS_INTERVAL	(1 << 5)		// Goober5000 - flag to simulate Volition's gloriously buggy hack
#define MEF_EVENT_IS_DONE			(1 << 6)		// Goober5000 - originally indicated by setting formula to -1

#define MAX_MISSION_EVENT_LOG_FLAGS		9			// this must be changed if a mission log flag is added below

#define MLF_SEXP_TRUE				(1 << 0)
#define MLF_SEXP_FALSE				(1 << 1)
//#define MLF_SEXP_KNOWN_TRUE			(1 << 2)
#define MLF_SEXP_KNOWN_FALSE		(1 << 3)		
#define MLF_FIRST_REPEAT_ONLY		(1 << 4)
#define MLF_LAST_REPEAT_ONLY		(1 << 5)
#define MLF_FIRST_TRIGGER_ONLY		(1 << 6)
#define MLF_LAST_TRIGGER_ONLY		(1 << 7)	
#define MLF_STATE_CHANGE			(1 << 8)	

#define MLF_ALL_REPETITION_FLAGS (MLF_FIRST_REPEAT_ONLY | MLF_LAST_REPEAT_ONLY | MLF_FIRST_TRIGGER_ONLY | MLF_LAST_TRIGGER_ONLY) 

typedef struct mission_event {
	SCP_string name;                                    // used for storing status of events in player file
	int  formula = -1;                                  // index into sexpression array for this formula
	int  result = 0;                                    // result of most recent evaluation of event
	int  repeat_count = 1;                              // number of times to test this goal
	int  trigger_count = 1;                             // number of times to allow this goal to trigger
	int  interval = 1;                                  // interval (in seconds) at which an evaulation is repeated once true.
	TIMESTAMP timestamp = TIMESTAMP::invalid();         // set at 'interval' seconds when we start to eval.
	int  score = 0;                                     // score for this event
	int  chain_delay = -1;
	int  flags = 0;                                     // MEF_*
	SCP_string objective_text;
	SCP_string objective_key_text;
	int	count = 0;                                      // object count for directive display
	TIMESTAMP satisfied_time = TIMESTAMP::invalid();    // this is used to temporarily mark the directive as satisfied when the event isn't (e.g. for a destroyed wave when there are more waves later)
	TIMESTAMP born_on_date = TIMESTAMP::invalid();      // timestamp at which event was born
	int team = -1;                                      // for multiplayer games

	// event log stuff
	int mission_log_flags = 0;                          // flags that are used to determing which events are written to the log
	SCP_vector<SCP_string> event_log_buffer;
	SCP_vector<SCP_string> event_log_variable_buffer;
	SCP_vector<SCP_string> event_log_container_buffer;
	SCP_vector<SCP_string> event_log_argument_buffer;
	SCP_vector<SCP_string> backup_log_buffer;
	int	previous_result = 0;                            // result of previous evaluation of event

} mission_event;
extern SCP_vector<mission_event> Mission_events;

extern TIMESTAMP Mission_goal_timestamp;
extern int Event_index;  // used by sexp code to tell what event it came from
extern bool Log_event;
extern bool Snapshot_all_events;


// only used in FRED
struct event_annotation
{
	void *handle = nullptr;			// the handle of the tree node in the event editor.  This is an HTREEITEM in FRED and TBD in qtFRED.
	int item_image = -1;			// the previous image of the tree node (replaced by a comment icon when there is a comment)
	SCP_list<int> path;				// a way to find the node that the annotation represents:
									// the first number is the event, the second number is the node on the first layer, etc.
	SCP_string comment;
	ubyte r = 255;
	ubyte g = 255;
	ubyte b = 255;
};
extern SCP_vector<event_annotation> Event_annotations;


// prototypes
void mission_goals_and_events_init( void );
void	mission_show_goals_init();
void	mission_show_goals_close();
void	mission_show_goals_do_frame(float frametime);	// displays goals on screen
void	mission_eval_goals();									// evaluate player goals
int	mission_evaluate_primary_goals(void);	// determine if the primary goals for the mission are complete -- returns one of the above defines
int	mission_goals_met();

// function used by single and multiplayer code to change the status on goals	
void	mission_goal_status_change( int goal_num, int new_status);

// function used to change goal validity status
void mission_goal_mark_valid( const char *name, bool valid );

// function used to mark all goals as invalid, and incomplete goals as invalid.
extern void mission_goal_fail_all();
extern void mission_goal_fail_incomplete();

void mission_goal_fetch_num_resolved(int desired_type, int *num_resolved, int *total, int team = -1);
int mission_goals_incomplete(int desired_type, int team = -1);
void mission_goal_mark_objectives_complete();
void mission_goal_mark_events_complete();

EventStatus mission_get_event_status(int event);
void mission_goal_validation_change( int goal_num, bool valid );

// mark an event as directive special
void mission_event_set_directive_special(int event);
void mission_event_unset_directive_special(int event);

// Cyborg - set the directive completion sound timestamp
void mission_event_set_completion_sound_timestamp();

// Maybe play a directive success sound... need to poll since the sound is delayed from when
// the directive is actually satisfied.
void mission_maybe_play_directive_success_sound();

void mission_goal_exit();

int mission_goal_find_sexp_tree(int root_node);
int mission_event_find_sexp_tree(int root_node);

int mission_goal_lookup(const char *name);
int mission_event_lookup(const char *name);

int ML_objectives_init(int x, int y, int w, int h);
void ML_objectives_close();
void ML_objectives_do_frame(int scroll_offset);
void ML_render_objectives_key();			// renders objectives key on ingame objectives screen

#endif