File: missiongoals.h

package info (click to toggle)
freespace2 3.7.4%2Brepack-1.1
  • links: PTS, VCS
  • area: non-free
  • in suites: bullseye
  • size: 22,268 kB
  • sloc: cpp: 393,535; ansic: 4,106; makefile: 1,091; xml: 181; sh: 137
file content (178 lines) | stat: -rw-r--r-- 7,145 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
/*
 * 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"

struct ai_goal;
struct ai_info;

// defines for types of primary and secondary missions

#define	MAX_GOALS			30		// maximum number of goals for any given mission

// 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 {
	char	name[NAME_LENGTH];			// used for storing status of goals in player file
	int  	type;								// primary/secondary/bonus
	int	satisfied;						// has this goal been satisfied
	char	message[MAX_GOAL_TEXT];		//	Brief description, such as "Destroy all vile aliens!"
	int	rating;							//	Some importance figure or something.
	int	formula;							//	Index in Sexp_nodes of this Sexp.
	int	score;							// score for this goal
	int	flags;							// MGF_
	int	team;								// which team is this objective for.
} mission_goal;

extern mission_goal Mission_goals[MAX_GOALS];	// structure for the goals of this mission
extern int	Num_goals;									// number of goals for this mission

// structures and defines for mission events

#define MAX_MISSION_EVENTS		512
#define MISSION_EVENTS_WARN	100

// defined for event states.  We will also use the satisfied/failed for saving event information
// in campaign save file
#define EVENT_UNBORN			0  // event can't be evaluated yet
#define EVENT_CURRENT		1  // event can currently be evaluated, but not satisfied or failed yet
#define EVENT_SATISFIED		2
#define EVENT_FAILED			3
#define EVENT_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 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 {
	char	name[NAME_LENGTH];	// used for storing status of events in player file
	int	formula;					// index into sexpression array for this formula
	int	result;					// result of most recent evaluation of event
	int	repeat_count;			// number of times to test this goal
	int trigger_count;			// number of times to allow this goal to trigger
	int	interval;				// interval (in seconds) at which an evaulation is repeated once true.
	int	timestamp;				// set at 'interval' seconds when we start to eval.
	int	score;					// score for this event
	int	chain_delay;
	int	flags;
	char	*objective_text;
	char	*objective_key_text;
	int	count;					// object count for directive display
	int	satisfied_time;			// 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)
	int	born_on_date;			// timestamp at which event was born
	int	team;						// for multiplayer games

	// event log stuff
	int mission_log_flags;		// 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_argument_buffer;
	SCP_vector<SCP_string> backup_log_buffer;
	int	previous_result;		// result of previous evaluation of event

} mission_event;

extern int Num_mission_events;
extern mission_event Mission_events[MAX_MISSION_EVENTS];
extern int 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;

// prototypes
void	mission_init_goals( 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_ai_goal_achievable( ai_goal *aigp );	// determines if an AI goal is achievable
void	mission_add_ai_goal( int sexp, ai_info *aip );	// adds a goal onto the given ai_info structure
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);

// functions used to change goal validity status
void mission_goal_mark_invalid( char *name );
void mission_goal_mark_valid( char *name );

// 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();

int mission_get_event_status(int event);
void mission_event_shutdown();
void mission_goal_validation_change( int goal_num, int valid );

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

void mission_goal_exit();

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