20
20
21
21
#include "doomstat.h"
22
22
#include "doomtype.h"
23
+ #include "g_game.h"
23
24
#include "i_printf.h"
24
25
#include "m_array.h"
25
26
#include "m_misc.h"
@@ -77,6 +78,7 @@ typedef struct
77
78
{
78
79
md5_digest_t checksum ;
79
80
option_t * options ;
81
+ demo_version_t complevel ;
80
82
} comp_record_t ;
81
83
82
84
static comp_record_t * comp_database ;
@@ -125,6 +127,18 @@ void G_ParseCompDatabase(void)
125
127
I_Printf (VB_ERROR , "COMPDB: wrong key %s" , md5 );
126
128
continue ;
127
129
}
130
+
131
+ record .complevel = DV_MBF21 ;
132
+ const char * complevel = JS_GetStringValue (level , "complevel" );
133
+ if (complevel )
134
+ {
135
+ demo_version_t new_complevel = G_GetNamedComplevel (complevel );
136
+ if (new_complevel != DV_NONE )
137
+ {
138
+ record .complevel = new_complevel ;
139
+ }
140
+ }
141
+
128
142
json_t * js_options = JS_GetObject (level , "options" );
129
143
json_t * js_option = NULL ;
130
144
JS_ArrayForEach (js_option , js_options )
@@ -184,19 +198,23 @@ static void GetLevelCheckSum(int lump, md5_checksum_t* cksum)
184
198
185
199
void G_ApplyLevelCompatibility (int lump )
186
200
{
187
- if (demorecording || demoplayback || netgame || !mbf21 )
188
- {
189
- return ;
190
- }
191
-
192
201
static boolean restore_comp ;
193
202
static int old_comp [COMP_TOTAL ];
194
203
195
204
if (restore_comp )
196
205
{
206
+ if (demo_version != DV_MBF21 )
207
+ {
208
+ demo_version = DV_MBF21 ;
209
+ G_ReloadDefaults (true);
210
+ }
197
211
memcpy (comp , old_comp , sizeof (* comp ));
198
212
restore_comp = false;
199
213
}
214
+ else if (demorecording || demoplayback || netgame || !mbf21 )
215
+ {
216
+ return ;
217
+ }
200
218
201
219
md5_checksum_t cksum ;
202
220
@@ -212,6 +230,20 @@ void G_ApplyLevelCompatibility(int lump)
212
230
memcpy (old_comp , comp , sizeof (* comp ));
213
231
restore_comp = true;
214
232
233
+ demo_version_t new_demover = record -> complevel ;
234
+ if (new_demover != DV_MBF21 )
235
+ {
236
+ demo_version = new_demover ;
237
+ G_ReloadDefaults (true);
238
+ I_Printf (VB_INFO , "Automatically setting compatibility level \"%s\"" ,
239
+ G_GetCurrentComplevelName ());
240
+ }
241
+
242
+ if (!mbf21 )
243
+ {
244
+ return ;
245
+ }
246
+
215
247
option_t * option ;
216
248
array_foreach (option , record -> options )
217
249
{
0 commit comments