aboutsummaryrefslogtreecommitdiff
path: root/project/src/lib-szs-create.c
diff options
context:
space:
mode:
authorWiimm <wiimm@wiimm.de>2021-02-03 16:42:38 +0100
committerWiimm <wiimm@wiimm.de>2021-02-03 16:42:38 +0100
commit69894f75254cd630e2e4fe1422044c6b7d6adb5f (patch)
tree139b93491a16987905c53c4e10bc8b44034de278 /project/src/lib-szs-create.c
parenta3d605bc52ba3e53720d0dee29a470661b35a1c2 (diff)
SZS 2.23a
Diffstat (limited to 'project/src/lib-szs-create.c')
-rw-r--r--project/src/lib-szs-create.c165
1 files changed, 120 insertions, 45 deletions
diff --git a/project/src/lib-szs-create.c b/project/src/lib-szs-create.c
index a766c7f..e622e17 100644
--- a/project/src/lib-szs-create.c
+++ b/project/src/lib-szs-create.c
@@ -17,7 +17,7 @@
* This file is part of the SZS project. *
* Visit https://szs.wiimm.de/ for project details and sources. *
* *
- * Copyright (c) 2011-2020 by Dirk Clemens <wiimm@wiimm.de> *
+ * Copyright (c) 2011-2021 by Dirk Clemens <wiimm@wiimm.de> *
* *
***************************************************************************
* *
@@ -57,6 +57,8 @@
#include "lib-image.h"
#include "lib-object.h"
#include "lib-checksum.h"
+#include "lib-common.h"
+#include "lib-bzip2.h"
#include "crypt.h"
#include "setup.inc"
@@ -106,6 +108,7 @@ static const alter_file_t * ShallRemoveFile ( ccp fname )
static bool AddSlotFiles ( szs_file_t *szs, struct szs_norm_t * norm )
{
+// [[norm]]
DASSERT(szs);
bool dirty = false;
if ( szs->fform_arch == FF_U8 || szs->fform_arch == FF_WU8 )
@@ -1103,8 +1106,6 @@ enumError LoadObjFileListSZS
}
}
- //DetectSpecialKMP(&kmp,szs->kmp_special);
-
//--- slot analysis: 31+71, 62
@@ -1252,6 +1253,7 @@ void FindSpecialFilesSZS
{
szs->course_kcl_data = szs->data + file->offset;
szs->course_kcl_size = file->size;
+ LOG_SHA1(szs->course_kcl_data,szs->course_kcl_size,"course.kcl");
}
else if ( !szs->course_kmp_data && !strcasecmp(fname,"course.kmp") )
{
@@ -1262,7 +1264,7 @@ void FindSpecialFilesSZS
{
szs->course_lex_data = szs->data + file->offset;
szs->course_lex_size = file->size;
- szs->szs_special[HAVESZS_COURSE_LEX] = true;
+ szs->have.szs[HAVESZS_COURSE_LEX] = HFM_MODIFIED;
}
else if ( !szs->course_model_data && !strcasecmp(fname,"course_model.brres") )
{
@@ -1310,9 +1312,17 @@ void FindSpecialFilesSZS
{
uint i;
for ( i = 0; i < HAVESZS__N; i++ )
- if ( !szs->szs_special[i] && !strcasecmp(fname,have_szs_file[i]) )
+ if ( !strcasecmp(fname,have_szs_file[i]) )
{
- szs->szs_special[i] = true;
+ const BZ2Manager_t *bm = GetCommonBZ2Manager(have_szs_fform[i]);
+ const have_file_mode_t hfm =
+ bm
+ && file->size == bm->size
+ && !memcmp( file->data ? file->data : szs->data + file->offset,
+ bm->data, bm->size )
+ ? HFM_ORIGINAL : HFM_MODIFIED;
+ if ( szs->have.szs[i] < hfm )
+ szs->have.szs[i] = hfm;
break;
}
}
@@ -1325,7 +1335,7 @@ void FindSpecialFilesSZS
///////////////////////////////////////////////////////////////////////////////
ccp CreateSpecialFileInfo
- ( szs_file_t * szs, bool add_value, ccp return_if_empty )
+ ( szs_file_t * szs, uint select, bool add_value, ccp return_if_empty )
{
DASSERT(szs);
@@ -1336,7 +1346,7 @@ ccp CreateSpecialFileInfo
{
uint i, val = 0;
for ( i = 0; i < HAVESZS__N; i++ )
- if ( szs->szs_special[i] )
+ if ( 1 << szs->have.szs[i] & select )
val |= 1 << i;
dest = snprintfE( dest, buf+sizeof(buf), "%u=" , val );
}
@@ -1344,7 +1354,7 @@ ccp CreateSpecialFileInfo
uint i;
ccp sep = "";
for ( i = 0; i < HAVESZS__N; i++ )
- if ( szs->szs_special[i] )
+ if ( 1 << szs->have.szs[i] & select )
{
dest = StringCat2E(dest,buf+sizeof(buf),sep,have_szs_name[i]);
sep = ",";
@@ -1369,6 +1379,7 @@ static int norm_collect_func
if (term)
return 0;
+// [[norm]]
szs_norm_t * norm = it->param;
DASSERT(norm);
@@ -1400,9 +1411,9 @@ static int norm_collect_func
lex_t lex;
u8 *data = it->szs->data + it->off;
enumError err = ScanRawLEX(&lex,true,data,it->size,0);
- if ( !err && PatchLEX(&lex) && CreateRawLEX(&lex) == ERR_OK )
+ if ( !err && PatchLEX(&lex,&it->szs->have) && CreateRawLEX(&lex) == ERR_OK )
{
- if (!lex.have_lex)
+ if (!lex.have_sect)
{
PATCH_ACTION_LOG("Remove","SZS","%s\n","course.lex");
return 0;
@@ -1515,6 +1526,7 @@ bool NormalizeExSZS
ResetFileSZS(szs,false);
+// [[norm]]
szs_norm_t norm;
memset(&norm,0,sizeof(norm));
norm.rm_aiparam = rm_aiparam;
@@ -1524,7 +1536,7 @@ bool NormalizeExSZS
if (autoadd)
AddMissingFiles(szs,0,0,&norm,2);
AddSlotFiles(szs,&norm);
- AddTestLEX(szs,&norm);
+ AddSectionsLEX(szs,&norm,&szs->have);
SortSubFilesSZS(szs,SORT_AUTO);
uint old_size = szs->size;
@@ -1711,7 +1723,7 @@ static int add_missing_file
if ( is_course_lex )
{
InitializeLEX(&lex);
- if ( PatchLEX(&lex) && CreateRawLEX(&lex) == ERR_OK )
+ if ( PatchLEX(&lex,&am->szs->have) && CreateRawLEX(&lex) == ERR_OK )
size = lex.raw_data_size;
}
@@ -1778,6 +1790,7 @@ int AddMissingFileSZS
int log_indent // >-1: print log with indention
)
{
+// [[norm]]
DASSERT(szs);
DASSERT(fname);
DASSERT(fform);
@@ -1801,6 +1814,7 @@ enumError AddMissingFiles
int log_indent // >-1: print log with indention
)
{
+// [[norm]]
DASSERT(szs);
DASSERT( sd || norm );
@@ -1855,9 +1869,12 @@ enumError AddMissingFiles
///////////////////////////////////////////////////////////////////////////////
-void AddTestLEX ( szs_file_t *szs, szs_norm_t *norm )
+void AddSectionsLEX ( szs_file_t *szs, szs_norm_t *norm, const szs_have_t * have )
{
+// [[norm]]
DASSERT(szs);
+ bool add_course_lex = false;
+
if (HaveActivePatchTestLEX())
{
lex_test_t temp;
@@ -1865,8 +1882,20 @@ void AddTestLEX ( szs_file_t *szs, szs_norm_t *norm )
bool empty;
PatchTestLEX(&temp,&empty);
if ( !empty || force_lex_test )
- AddMissingFileSZS(szs,"course.lex",FF_LEX,norm,verbose<1?-1:0);
+ add_course_lex = true;
}
+
+ if ( HavePatchFeaturesLEX() && have && have->valid )
+ {
+ features_szs_t fs;
+ SetupFeaturesSZS(&fs,have,true);
+ if ( GetFeaturesStatusSZS(&fs) > 1 )
+ add_course_lex = true;
+ ResetFeaturesSZS(&fs);
+ }
+
+ if (add_course_lex)
+ AddMissingFileSZS(szs,"course.lex",FF_LEX,norm,verbose<1?-1:0);
}
//
@@ -2528,9 +2557,9 @@ static int transform_collect_func
{
lex_t lex;
enumError err = ScanRawLEX(&lex,true,data,it->size,0);
- if ( !err && PatchLEX(&lex) && CreateRawLEX(&lex) == ERR_OK )
+ if ( !err && PatchLEX(&lex,&szs->have) && CreateRawLEX(&lex) == ERR_OK )
{
- if (!lex.have_lex)
+ if (!lex.have_sect)
{
LEX_ACTION_LOG(false,"Remove LEX, old_size %u.\n",it->size);
@@ -2562,8 +2591,8 @@ static int transform_collect_func
}
*dirty = 1;
}
- PRINT("PATCH/LEX: modified=%d, have_lex:%x\n",
- lex.modified, lex.have_lex );
+ PRINT("PATCH/LEX: modified=%d, have_lex:%x,%x\n",
+ lex.modified, lex.have_sect, lex.have_feat );
ResetLEX(&lex);
}
break;
@@ -2618,6 +2647,8 @@ static int transform_collect_func
bool PatchSZS ( szs_file_t * szs )
{
DASSERT(szs);
+ CalcHaveSZS(szs);
+
const bool patch_lex = HaveActivePatchLEX();
#ifdef TEST
static int done = 0;
@@ -2652,6 +2683,30 @@ bool PatchSZS ( szs_file_t * szs )
return dirty != 0;
}
+///////////////////////////////////////////////////////////////////////////////
+
+bool CanBeATrackSZS ( szs_file_t * szs )
+{
+ FindSpecialFilesSZS(szs,false);
+ return szs->course_kcl_data
+ && szs->course_kmp_data
+ && ( szs->course_model_data || szs->course_d_model_data );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void CalcHaveSZS ( szs_file_t * szs )
+{
+ DASSERT(szs);
+ if ( szs->data && !szs->have.valid && CanBeATrackSZS(szs) )
+ {
+ szs_file_t temp;
+ CopySZS(&temp,true,szs);
+ szs->have = temp.have;
+ ResetSZS(&temp);
+ }
+}
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// SetupExtendedSZS ///////////////
@@ -3288,9 +3343,14 @@ int CheckSZS
int i;
for ( i = 0; i < HAVESZS__N; i++ )
- if (szs->szs_special[i])
+ {
+ if ( szs->have.szs[i] >= HFM_MODIFIED )
print_check_error( &chk, CMOD_HINT,
"Special file: ./%s\n",have_szs_file[i]);
+ else if ( szs->have.szs[i] >= HFM_ORIGINAL )
+ print_check_error( &chk, CMOD_HINT,
+ "Original file: ./%s\n",have_szs_file[i]);
+ }
//--- test optional files
@@ -3308,7 +3368,7 @@ int CheckSZS
const DbFileFILE_t *ptr = DbFileFILE + i;
#ifdef TEST0
print_check_error( &chk, CMOD_HINT,
- "Optional file [%02x]: ./%s\n",
+ "Optional file [%02x]: ./%s\n",
szs->used_file->d[i], ptr->file );
#else
print_check_error( &chk, CMOD_HINT,
@@ -3347,7 +3407,7 @@ int CheckSZS
if ( !(found_flags & DBF_REQUIRED2) )
print_check_error( &chk, CMOD_WARNING,
- "Missing file: ./course_model.brres (or '_d' variant)\n" );
+ "Missing file: ./course_model.brres (or '_d' variant)\n" );
int i;
const DbFileFILE_t *ptr = DbFileFILE;
@@ -3360,7 +3420,7 @@ int CheckSZS
{
if (!IsFileOptionalSZS(szs,ptr))
print_check_error( &chk, CMOD_WARNING,
- "Missing file: ./%s\n", ptr->file );
+ "Missing file: ./%s\n", ptr->file );
}
}
@@ -4803,6 +4863,11 @@ void InitializeAnalyseSZS ( analyse_szs_t * as )
TRACE_SIZEOF(slot_info_t);
TRACE_SIZEOF(kmp_finish_t);
TRACE_SIZEOF(kmp_usedpos_t);
+ TRACE_SIZEOF(szs_have_t);
+ TRACE_SIZEOF(szs_have_t);
+ TRACE_SIZEOF(have_file_mode_t);
+ TRACE_SIZEOF(szs_special_t);
+ TRACE_SIZEOF(kmp_special_t);
TRACE("-\n");
}
#endif
@@ -4844,6 +4909,13 @@ void AnalyseSZS
const u_usec_t start_usec = GetTimerUSec();
+ analyse_szs_t as0;
+ if (!as)
+ {
+ as = &as0;
+ init_sa = true;
+ }
+
DASSERT(as);
if (init_sa)
InitializeAnalyseSZS(as);
@@ -4878,7 +4950,8 @@ void AnalyseSZS
lex_t lex;
InitializeLEX(&lex);
ScanLEX(&lex,false,szs->course_lex_data,szs->course_lex_size);
- szs->have_lex = lex.have_lex;
+ szs->have.lex_sect = lex.have_sect;
+ szs->have.lex_feat = lex.have_feat;
SetupLexInfo(&as->lexinfo,&lex);
ResetLEX(&lex);
}
@@ -4992,30 +5065,30 @@ void AnalyseSZS
ResetPFlagScenarios(&ap);
}
- DetectSpecialKMP(&kmp,szs->kmp_special);
- if ( szs->kmp_special[HAVEKMP_WOODBOX_HT]
- || szs->kmp_special[HAVEKMP_MUSHROOM_CAR]
- || szs->kmp_special[HAVEKMP_PENGUIN_POS]
- || szs->kmp_special[HAVEKMP_EPROP_SPEED]
+ DetectSpecialKMP(&kmp,szs->have.kmp);
+ if ( szs->have.kmp[HAVEKMP_WOODBOX_HT]
+ || szs->have.kmp[HAVEKMP_MUSHROOM_CAR]
+ || szs->have.kmp[HAVEKMP_PENGUIN_POS]
+ || szs->have.kmp[HAVEKMP_EPROP_SPEED]
)
{
ct_dest = StringCopyE(ct_dest,ct_end,",gobj");
}
- if ( szs->kmp_special[HAVEKMP_X_PFLAGS]
- || szs->kmp_special[HAVEKMP_X_COND]
- || szs->kmp_special[HAVEKMP_X_DEFOBJ]
- || szs->kmp_special[HAVEKMP_X_RANDOM]
+ if ( szs->have.kmp[HAVEKMP_X_PFLAGS]
+ || szs->have.kmp[HAVEKMP_X_COND]
+ || szs->have.kmp[HAVEKMP_X_DEFOBJ]
+ || szs->have.kmp[HAVEKMP_X_RANDOM]
)
{
ct_dest = StringCopyE(ct_dest,ct_end,",xpf");
}
- if (szs->kmp_special[HAVEKMP_COOB_R])
+ if (szs->have.kmp[HAVEKMP_COOB_R])
ct_dest = StringCopyE(ct_dest,ct_end,",coob-r");
- if (szs->kmp_special[HAVEKMP_COOB_K])
+ if (szs->have.kmp[HAVEKMP_COOB_K])
ct_dest = StringCopyE(ct_dest,ct_end,",coob-k");
- if (szs->kmp_special[HAVEKMP_UOOB])
+ if (szs->have.kmp[HAVEKMP_UOOB])
ct_dest = StringCopyE(ct_dest,ct_end,",uoob");
ResetKMP(&kmp);
@@ -5024,22 +5097,22 @@ void AnalyseSZS
valid_track = false;
- if ( szs->szs_special[HAVESZS_ITEM_SLOT_TABLE] )
+ if ( szs->have.szs[HAVESZS_ITEM_SLOT_TABLE] >= HFM_MODIFIED )
ct_dest = StringCopyE(ct_dest,ct_end,",itemslot");
- if ( szs->szs_special[HAVESZS_OBJFLOW] )
+ if ( szs->have.szs[HAVESZS_OBJFLOW] >= HFM_MODIFIED )
ct_dest = StringCopyE(ct_dest,ct_end,",objflow");
- if ( szs->szs_special[HAVESZS_GHT_ITEM]
- || szs->szs_special[HAVESZS_GHT_ITEM_OBJ]
- || szs->szs_special[HAVESZS_GHT_KART]
- || szs->szs_special[HAVESZS_GHT_KART_OBJ]
+ if ( szs->have.szs[HAVESZS_GHT_ITEM] >= HFM_MODIFIED
+ || szs->have.szs[HAVESZS_GHT_ITEM_OBJ] >= HFM_MODIFIED
+ || szs->have.szs[HAVESZS_GHT_KART] >= HFM_MODIFIED
+ || szs->have.szs[HAVESZS_GHT_KART_OBJ] >= HFM_MODIFIED
)
{
ct_dest = StringCopyE(ct_dest,ct_end,",geohit");
}
- if ( szs->szs_special[HAVESZS_MINIGAME] )
+ if ( szs->have.szs[HAVESZS_MINIGAME] >= HFM_MODIFIED )
ct_dest = StringCopyE(ct_dest,ct_end,",minigame");
@@ -5100,8 +5173,10 @@ void AnalyseSZS
if (szs->warn_bits)
ct_dest = StringCat2E(ct_dest,ct_end,",warn=",GetWarnSZSNames(szs->warn_bits,'+'));
- as->valid_track = valid_track;
- as->duration_usec = GetTimerUSec() - start_usec;
+ szs->have.valid = true;
+ as->have = szs->have;
+ as->valid_track = valid_track;
+ as->duration_usec = GetTimerUSec() - start_usec;
}
//