146 for (
int i = 0; i < 3; i++) {
159 const char *szEntryName)
165 if (!CompileFromBuf_LogWarn<StdCompilerINIRead>(*
this, Source,
Name.getData()))
187 pComp->
Name(
"Material");
245 "TextureOverlay",
""));
253 "BlastShiftTo",
""));
255 "InMatConvert",
""));
257 "InMatConvertTo",
""));
262 "AboveTempConvertTo",
""));
266 "BelowTempConvertTo",
""));
278 "Reaction", std::vector<C4MaterialReaction>()));
295 i.ResolveScriptFuncs(
Name);
302 C4MaterialMap::C4MaterialMap() : DefReactConvert(&mrfConvert), DefReactPoof(&mrfPoof), DefReactCorrode(&mrfCorrode), DefReactIncinerate(&mrfIncinerate), DefReactInsert(&mrfInsert)
321 char entryname[256+1];
328 if (!pNewMap)
return 0;
334 if (cnt >= mat_num) {
335 Log(
"Internal Error: More materials loaded than expected. Make sure your material file names are unique (ignoring case).");
339 if (!pNewMap[cnt].
Load(hGroup,entryname))
340 {
delete [] pNewMap;
return 0; }
342 if (
Get(pNewMap[cnt].Name) ==
MNone)
347 for (int32_t i = 0; i <
Num; i++)
349 pNewMap[cnt+i] =
Map[i];
368 for (cnt=0; cnt<
Num; cnt++)
384 for (int32_t iMatPXS=-1; iMatPXS<
Num; iMatPXS++)
387 for (int32_t iMatLS=-1; iMatLS<
Num; iMatLS++)
395 else if (pMatPXS && pMatLS)
421 for (cnt=0; cnt<
Num; cnt++)
424 const char *szTextureOverlay =
nullptr;
426 if (
Map[cnt].sTextureOverlay.getLength())
433 DebugLogF(
"Error in overlay of material %s: Flag C4MatOv_None ignored because a custom overlay (%s) was specified!",
Map[cnt].Name, szTextureOverlay);
442 if (!szTextureOverlay)
443 szTextureOverlay =
"none";
450 if (
Map[cnt].sPXSGfx.getLength())
465 for (int32_t cnt2=-1; cnt2<
Num; cnt2++) {
536 for (cnt=0; cnt<
Num; cnt++)
538 if (
Map[cnt].sBlastShiftTo.getLength())
540 if (
Map[cnt].sInMatConvertTo.getLength())
542 if (
Map[cnt].sBelowTempConvertTo.getLength())
544 if (
Map[cnt].sAboveTempConvertTo.getLength())
551 {
LogFatal(
FormatString(R
"(Earth material "%s" not found!)", szEarthMaterial).getData()); return false; }
569 if (pReact && pReact->
fReverse) std::swap(iPXSMat, iLSMat);
576 char *mapbuf =
new char [1000];
579 for (int32_t cnt=0; cnt<
Num; cnt++)
597 if (!(csearch =
SSearch(mapbuf.
getData(),
"[Enumeration]"))) {
return false; }
608 csearch+=
SLen(cmatname);
619 if (iMat>=
Num)
return false;
623 for (cmat=iMat; cmat<
Num; cmat++)
627 if (cmat>=
Num)
return false;
630 if (cmat == iMat)
return true;
653 if (!Inside<int32_t>(iPXSMat, -1,
Num-1))
return nullptr;
654 if (!Inside<int32_t>(iLandscapeMat, -1,
Num-1))
return nullptr;
659 static void Smoke(int32_t tx, int32_t ty, int32_t level)
667 bool mrfInsertCheck(int32_t &iX, int32_t &iY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
bool *pfPosChanged,
bool no_slide =
false)
670 if (pfPosChanged) *pfPosChanged =
true;
674 int32_t max_upwards = 3;
675 bool was_pushed_upwards =
false;
679 was_pushed_upwards =
true;
688 if (fYDir)
return false;
698 Smoke(iX, iY, 4 +
Random(3));
702 int32_t iSlideX = iX, iSlideY = iY;
708 if (iPxsMat == iLsMat || was_pushed_upwards)
713 if (was_pushed_upwards)
732 if (fYDir <= 0) fXDir = 0;
741 bool mrfUserCheck(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
744 if ((1<<evEvent) & ~pReaction->
iExecMask)
return false;
747 if (!
mrfInsertCheck(iX, iY, fXDir, fYDir, iPxsMat, iLsMat, pfPosChanged))
753 bool C4MaterialMap::mrfConvert(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
755 if (pReaction->
fUserDefined)
if (!
mrfUserCheck(pReaction, iX, iY, iLSPosX, iLSPosY, fXDir, fYDir, iPxsMat, iLsMat, evEvent, pfPosChanged))
return false;
767 if (!iDepth ||
GBackMat(iX, iY - iDepth) == iLsMat)
776 if (pfPosChanged) *pfPosChanged =
true;
790 bool C4MaterialMap::mrfPoof(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
792 if (pReaction->
fUserDefined)
if (!
mrfUserCheck(pReaction, iX, iY, iLSPosX, iLSPosY, fXDir, fYDir, iPxsMat, iLsMat, evEvent, pfPosChanged))
return false;
798 if (!
Random(3)) Smoke(iX,iY,3);
806 if (!
mrfInsertCheck(iX, iY, fXDir, fYDir, iPxsMat, iLsMat, pfPosChanged,
true))
811 if (!
Random(3)) Smoke(iX,iY,3);
819 bool C4MaterialMap::mrfCorrode(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
821 if (pReaction->
fUserDefined)
if (!
mrfUserCheck(pReaction, iX, iY, iLSPosX, iLSPosY, fXDir, fYDir, iPxsMat, iLsMat, evEvent, pfPosChanged))
return false;
830 bool fDoCorrode;
int d100 =
Random(100);
841 Smoke(iX, iY, 3 +
Random(3));
853 if (!
mrfInsertCheck(iX, iY, fXDir, fYDir, iPxsMat, iLsMat, pfPosChanged))
857 bool fDoCorrode;
int d100 =
Random(100);
882 bool C4MaterialMap::mrfIncinerate(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
895 if (!
mrfInsertCheck(iX, iY, fXDir, fYDir, iPxsMat, iLsMat, pfPosChanged))
908 bool C4MaterialMap::mrfInsert(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
910 if (pReaction->
fUserDefined)
if (!
mrfUserCheck(pReaction, iX, iY, iLSPosX, iLSPosY, fXDir, fYDir, iPxsMat, iLsMat, evEvent, pfPosChanged))
return false;
920 if (!
mrfInsertCheck(iX, iY, fXDir, fYDir, iPxsMat, iLsMat, pfPosChanged))
935 bool C4MaterialMap::mrfScript(
C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY,
C4Real &fXDir,
C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat,
MaterialInteractionEvent evEvent,
bool *pfPosChanged)
938 if (!
mrfUserCheck(pReaction, iX, iY, iLSPosX, iLSPosY, fXDir, fYDir, iPxsMat, iLsMat, evEvent, pfPosChanged))
945 int32_t iXDir1, iYDir1, iXDir2, iYDir2;
946 C4AulParSet pars(iX, iY, iLSPosX, iLSPosY, iXDir1 =
fixtoi(fXDir, 100), iYDir1 =
fixtoi(fYDir, 100), iPxsMat, iLsMat,
int(evEvent));
953 iPxsMat = pars[6].getInt();
954 int32_t iX2 = pars[0].getInt(), iY2 = pars[1].getInt();
955 iXDir2 = pars[4].getInt(); iYDir2 = pars[5].getInt();
956 if (iX!=iX2 || iY!=iY2 || iXDir1!=iXDir2 || iYDir1!=iYDir2)
959 if (pfPosChanged) *pfPosChanged =
true;
#define C4CFN_MaterialFiles
C4AulScriptEngine ScriptEngine
bool DensitySolid(int32_t dens)
const int32_t C4MaxMaterial
bool DensitySemiSolid(int32_t dens)
int32_t GBackMat(int32_t x, int32_t y)
bool DensityLiquid(int32_t dens)
const char * LoadResStr(const char *id)
bool Log(const char *szMessage)
bool LogFatal(const char *szMessage)
bool DebugLogF(const char *strMessage ...)
const ReactionFuncMapEntry ReactionFuncMap[]
bool mrfInsertCheck(int32_t &iX, int32_t &iY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, bool *pfPosChanged, bool no_slide=false)
C4MaterialMap MaterialMap
C4MaterialReactionFunc pFunc
bool mrfUserCheck(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
bool MatValid(int32_t mat)
BYTE Mat2PixColDefault(int32_t mat)
bool(* C4MaterialReactionFunc)(struct C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
int32_t MatDensity(int32_t mat)
C4Fixed itofix(int32_t x)
int fixtoi(const C4Fixed &x)
const C4TargetRect TargetRect0(0, 0, 0, 0, 0, 0)
const char * SSearch(const char *szString, const char *szIndex)
bool IsIdentifier(char cChar)
const char * SAdvanceSpace(const char *szSPos)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
void SCopyIdentifier(const char *szSource, char *sTarget, int iMaxL)
bool SEqual(const char *szStr1, const char *szStr2)
size_t SLen(const char *sptr)
StdArrayDefaultAdapt< T, D > mkArrayAdaptDM(T(&array)[size], const D &rDefault)
StdSTLContainerAdapt< C > mkSTLContainerAdapt(C &rTarget, StdCompiler::Sep eSep=StdCompiler::SEP_SEP)
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
#define toC4CStr(szString)
StdStrBuf FormatString(const char *szFmt,...)
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
C4PropListStatic * GetPropList()
void Set(C4Surface &rSfc)
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
int EntryCount(const char *wildcard=nullptr)
StdStrBuf GetFullName() const
bool Add(const char *filename, const char *entry_name)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
void ResetSearch(bool reload_contents=false)
int32_t ExtractMaterial(int32_t fx, int32_t fy, bool distant_first)
int32_t GetDensity(int32_t x, int32_t y) const
bool FindMatSlide(int32_t &fx, int32_t &fy, int32_t ydir, int32_t mdens, int32_t mslide) const
void CheckInstabilityRange(int32_t tx, int32_t ty)
bool InsertMaterial(int32_t mat, int32_t *tx, int32_t *ty, int32_t vx=0, int32_t vy=0, bool query_only=false)
bool ClearPix(int32_t tx, int32_t ty)
bool Incinerate(int32_t x, int32_t y, int32_t cause_player)
StdCopyStrBuf sBelowTempConvertTo
StdCopyStrBuf sBlastShiftTo
C4MaterialCoreShape MapChunkType
int32_t Blast2ObjectRatio
void CompileFunc(StdCompiler *pComp)
std::vector< C4MaterialReaction > CustomReactionList
StdCopyStrBuf sAboveTempConvertTo
int32_t InMatConvertDepth
StdCopyStrBuf sTextureOverlay
int32_t AboveTempConvertDir
bool Load(C4Group &hGroup, const char *szEntryName)
StdCopyStrBuf sInMatConvert
int32_t Dig2ObjectCollect
StdCopyStrBuf sInMatConvertTo
int32_t BelowTempConvertDir
void UpdateScriptPointers()
int32_t AboveTempConvertTo
int32_t BelowTempConvertTo
C4MaterialReaction DefReactConvert
bool SaveEnumeration(C4Group &hGroup)
C4MaterialReaction DefReactPoof
C4MaterialReaction DefReactIncinerate
bool HasMaterials(C4Group &hGroup) const
static bool mrfPoof(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
C4MaterialReaction * GetReactionUnsafe(int32_t iPXSMat, int32_t iLandscapeMat)
static bool mrfScript(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
bool SortEnumeration(int32_t iMat, const char *szMatName)
C4MaterialReaction * GetReaction(int32_t iPXSMat, int32_t iLandscapeMat)
void SetMatReaction(int32_t iPXSMat, int32_t iLSMat, C4MaterialReaction *pReact)
static bool mrfConvert(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
void UpdateScriptPointers()
static bool mrfInsert(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
bool LoadEnumeration(C4Group &hGroup)
static bool mrfIncinerate(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
C4MaterialReaction DefReactInsert
C4MaterialReaction ** ppReactionMap
int32_t Get(const char *szMaterial)
C4MaterialReaction DefReactCorrode
int32_t Load(C4Group &hGroup)
bool CrossMapMaterials(const char *szEarthMaterial)
static bool mrfCorrode(C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
bool Create(int32_t mat, C4Real ix, C4Real iy, C4Real ixdir=Fix0, C4Real iydir=Fix0)
C4AulFunc * GetFunc(C4PropertyName k) const
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
const char * GetTextureName() const
const char * GetMaterialName() const
int32_t GetIndex(const char *szMaterial, const char *szTexture, bool fAddIfNotExist=true, const char *szErrorIfFailed=nullptr)
int32_t GetIndexMatTex(const char *szMaterialTexture, const char *szDefaultTexture=nullptr, bool fAddIfNotExist=true, const char *szErrorIfFailed=nullptr)
const char * GetTexture(int32_t iIndex)
const C4TexMapEntry * GetEntry(int32_t iIndex) const
void Value(const T &rStruct)
virtual void NameEnd(bool fBreak=false)
virtual bool isDeserializer()
virtual bool Name(const char *szName)
const char * getData() const
static bool NoReaction(struct C4MaterialReaction *pReaction, int32_t &iX, int32_t &iY, int32_t iLSPosX, int32_t iLSPosY, C4Real &fXDir, C4Real &fYDir, int32_t &iPxsMat, int32_t iLsMat, MaterialInteractionEvent evEvent, bool *pfPosChanged)
C4MaterialReactionFunc pFunc
StdCopyStrBuf sConvertMat
void CompileFunc(StdCompiler *pComp)
void ResolveScriptFuncs(const char *szMatName)
class C4SoundInstance * StartSoundEffectAt(const char *, int32_t, int32_t, int32_t, int32_t, int32_t, class C4SoundModifier *)