aboutsummaryrefslogtreecommitdiff
path: root/project/src/lib-kcl.c
diff options
context:
space:
mode:
authorWiimm <wiimm@wiimm.de>2022-05-13 19:22:13 +0200
committerWiimm <wiimm@wiimm.de>2022-05-13 19:22:13 +0200
commit568365f5bdd4dc71a156ca963d89ac002f405a34 (patch)
tree730d0311536d8fd46a56b74e2c8cac028e778243 /project/src/lib-kcl.c
parent9ae8841ec4720e74173e2f72fac33f0848bbf435 (diff)
SZS v2.27a
Diffstat (limited to 'project/src/lib-kcl.c')
-rw-r--r--project/src/lib-kcl.c104
1 files changed, 77 insertions, 27 deletions
diff --git a/project/src/lib-kcl.c b/project/src/lib-kcl.c
index 6c4de32..4a25173 100644
--- a/project/src/lib-kcl.c
+++ b/project/src/lib-kcl.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-2021 by Dirk Clemens <wiimm@wiimm.de> *
+ * Copyright (c) 2011-2022 by Dirk Clemens <wiimm@wiimm.de> *
* *
***************************************************************************
* *
@@ -148,6 +148,7 @@ static const KeywordTab_t opt_kcl_tab[] =
{ KCLMD_CONV_FACEUP, "CONV-FACEUP", "CONVFACEUP", 0 },
{ KCLMD_WEAK_WALLS, "WEAK-WALLS", "WEAKWALLS", 0 },
+ { KCLMD_CLR_VISUAL, "CLR-VISUAL", "CLRVISUAL", 0 },
{ KCLMD_NEW, "NEW", 0, 0 },
{ KCLMD_SORT, "SORT", 0, 0 },
@@ -568,41 +569,88 @@ uint n_user_color = 0;
///////////////////////////////////////////////////////////////////////////////
-void InitializeKCL ( kcl_t * kcl )
+kcl_flag_t * CreatePatchFlagKCL
+(
+ // returns NULL or N_KCL_FLAG elements
+
+ kcl_mode_t kcl_mode, // relevant: KCLMD_CLR_VISUAL | KCLMD_WEAK_WALLS
+ SlotMode_t slot_mode, // relevant: SLOTMD_ICE_TO_WATER | SLOTMD_WATER_TO_ICE
+ bool null_on_orig // TRUE: return NULL on no flag modifications
+)
{
- //--- one time setup
+ kcl_flag_t *flag = MALLOC( N_KCL_FLAG * sizeof(*flag) );
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
+ flag[i] = i;
- static int done = 0;
- if (!done)
+ if ( opt_slot & (SLOTMD_ICE_TO_WATER|SLOTMD_WATER_TO_ICE) )
{
- ++done;
- if ( opt_slot & (SLOTMD_ICE_TO_WATER|SLOTMD_WATER_TO_ICE) )
- {
- SetupPatchKclFlag();
- const u16 search = opt_slot & SLOTMD_ICE_TO_WATER ? 0x0070 : 0x0030;
-
- uint i;
- for ( i = 0; i < N_KCL_FLAG; i++ )
- if ( ( patch_kcl_flag[i] & 0x00ff ) == search )
- patch_kcl_flag[i] = patch_kcl_flag[i] ^ 0x0040;
+ const u16 search = opt_slot & SLOTMD_ICE_TO_WATER ? 0x0070 : 0x0030;
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
+ if ( ( flag[i] & 0x00ff ) == search )
+ flag[i] = flag[i] ^ 0x0040;
+ }
- PurgePatchKclFlag();
+ if ( kcl_mode & KCLMD_WEAK_WALLS )
+ {
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
+ {
+ const int type = GET_KCL_TYPE(i);
+ if ( type >= 0 && kcl_type[type].attrib & KCLT_C_WALL )
+ flag[i] |= 0x8000;
}
+ }
- if ( KCL_MODE & KCLMD_WEAK_WALLS )
+ if ( kcl_mode & KCLMD_CLR_VISUAL )
+ {
+ static u16 tab[32] =
{
- SetupPatchKclFlag();
- uint i;
- for ( i = 0; i < N_KCL_FLAG; i++ )
+ 0xe01f,0xe01f,0xe01f,0xe01f, 0xe01f,0xe01f,0xe0ff,0xe0ff,
+ 0xe0ff,0xe0ff,0xe01f,0xe0ff, 0x601f,0x60ff,0x60ff,0x601f,
+ 0xe01f,0xe0ff,0xffff,0xe0ff, 0xe01f,0xe0ff,0xe01f,0xe01f,
+ 0x001f,0xffff,0xe01f,0xffff, 0xe0ff,0xe0ff,0x601f,0x60ff,
+ };
+
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
+ flag[i] &= tab[i&31];
+ }
+
+ if (null_on_orig)
+ {
+ bool have_patch = false;
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
+ if ( flag[i] != i )
{
- const int type = GET_KCL_TYPE(i);
- if ( type >= 0 && kcl_type[type].attrib & KCLT_C_WALL )
- patch_kcl_flag[i] |= 0x8000;
+ have_patch = true;
+ break;
}
- PurgePatchKclFlag();
+ if (!have_patch)
+ {
+ FREE(flag);
+ flag = 0;
}
}
+ return flag;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void InitializeKCL ( kcl_t * kcl )
+{
+ //--- one time setup
+
+ static int done = 0;
+ if (!done++)
+ {
+ SetupPatchKclFlag();
+ kcl_flag_t *flag = CreatePatchFlagKCL(KCL_MODE,opt_slot,false);
+ DASSERT(flag);
+ memcpy(patch_kcl_flag,flag,sizeof(*patch_kcl_flag)*N_KCL_FLAG);
+ FREE(flag);
+ PurgePatchKclFlag();
+ }
+
+
//--- object setup
DASSERT(kcl);
@@ -6767,7 +6815,7 @@ bool TransformKCL
/////////////// Patch KCL ///////////////
///////////////////////////////////////////////////////////////////////////////
-u16 *patch_kcl_flag = 0; // NULL or 'N_KCL_FLAG' elements
+kcl_flag_t *patch_kcl_flag = 0; // NULL or 'N_KCL_FLAG' elements
///////////////////////////////////////////////////////////////////////////////
@@ -6810,8 +6858,7 @@ void ResetPatchKclFlag()
patch_kcl_flag = MALLOC( N_KCL_FLAG * sizeof(*patch_kcl_flag) );
}
- uint i;
- for ( i = 0; i < N_KCL_FLAG; i++ )
+ for ( int i = 0; i < N_KCL_FLAG; i++ )
patch_kcl_flag[i] = i;
}
@@ -7615,6 +7662,9 @@ int CheckKCL
DASSERT(kcl);
PRINT("CheckKCL(%d)\n",mode);
+ if ( disable_checks > 0 )
+ return 0;
+
//--- setup