From 56805d24fd3dc07b8b16c5d07e0d52fa1d023e51 Mon Sep 17 00:00:00 2001 From: "Walter D. Pullen" <31943358+CruiserOne@users.noreply.github.com> Date: Thu, 31 Aug 2023 19:34:56 -0700 Subject: [PATCH] Upload all version 3.4 source files --- Daedalus.sln | 25 ++ Daedalus.vcproj | 334 ++++++++++++++++++++++ Daedalus.vcxproj | 134 +++++++++ Makefile | 35 +++ changes.doc | Bin 58368 -> 53248 bytes color.cpp | 54 +++- color.h | 10 +- command.cpp | 128 ++++++++- create.cpp | 12 +- create2.cpp | 57 +++- create3.cpp | 345 ++++++++++++++++++++--- daedalus.cpp | 97 +++++-- daedalus.def | 8 +- daedalus.doc | Bin 488448 -> 498176 bytes daedalus.h | 25 +- daedalus.rc | 332 ++++++++++++---------- daeicon1.ico | Bin 19030 -> 20742 bytes daeicon5.ico | Bin 0 -> 19030 bytes daeicon6.ico | Bin 0 -> 2734 bytes draw.cpp | 12 +- draw.h | 17 +- draw2.cpp | 93 +++++- game.cpp | 6 +- graphics.cpp | 155 ++++++++-- graphics.h | 8 +- inside.cpp | 76 +++-- labyrnth.cpp | 125 ++++++--- maze.cpp | 36 ++- maze.h | 14 +- resource.h | 716 ++++++++++++++++++++++++----------------------- script.doc | Bin 254464 -> 271360 bytes scrnsave.ds | 7 +- solids.cpp | 6 +- solve.cpp | 6 +- threed.cpp | 29 +- threed.h | 6 +- util.cpp | 13 +- util.h | 13 +- virtual.ds | 2 +- wdialog.cpp | 34 ++- wdriver.cpp | 32 ++- wdriver.h | 9 +- wutil.cpp | 19 +- 43 files changed, 2226 insertions(+), 804 deletions(-) create mode 100644 Daedalus.sln create mode 100644 Daedalus.vcproj create mode 100644 Daedalus.vcxproj create mode 100644 Makefile create mode 100644 daeicon5.ico create mode 100644 daeicon6.ico diff --git a/Daedalus.sln b/Daedalus.sln new file mode 100644 index 0000000..5a83c5f --- /dev/null +++ b/Daedalus.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29215.179 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Daedalus", "Daedalus.vcxproj", "{3F41CB08-9973-4856-ACC3-66ABE55D0E4D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3F41CB08-9973-4856-ACC3-66ABE55D0E4D}.Debug|Win32.ActiveCfg = Debug|Win32 + {3F41CB08-9973-4856-ACC3-66ABE55D0E4D}.Debug|Win32.Build.0 = Debug|Win32 + {3F41CB08-9973-4856-ACC3-66ABE55D0E4D}.Release|Win32.ActiveCfg = Release|Win32 + {3F41CB08-9973-4856-ACC3-66ABE55D0E4D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EA36D49B-46A9-4EAF-BE0B-377A08A90A33} + EndGlobalSection +EndGlobal diff --git a/Daedalus.vcproj b/Daedalus.vcproj new file mode 100644 index 0000000..63496f6 --- /dev/null +++ b/Daedalus.vcproj @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Daedalus.vcxproj b/Daedalus.vcxproj new file mode 100644 index 0000000..370769c --- /dev/null +++ b/Daedalus.vcxproj @@ -0,0 +1,134 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {3F41CB08-9973-4856-ACC3-66ABE55D0E4D} + Daedalus + Win32Proj + + + + Application + v142 + + + Application + v142 + + + + + + + + + + + + + <_ProjectFileVersion>16.0.29124.152 + + + ..\G\ + ..\G\ + true + + + ..\G\ + ..\G\ + true + + + + Disabled + WIN32;_DEBUG;_WINDOWS;SECURE;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + EditAndContinue + + + shlwapi.lib Winmm.lib %(AdditionalOptions) + true + Windows + MachineX86 + + + + + Neither + WIN32;NDEBUG;_WINDOWS;SECURE;%(PreprocessorDefinitions) + MultiThreaded + + Level3 + ProgramDatabase + + + shlwapi.lib Winmm.lib %(AdditionalOptions) + true + Windows + true + true + MachineX86 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f8000bd --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +# Daedalus (Version 3.4) File: Makefile +# By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm +# +# IMPORTANT NOTICE: Daedalus and all Maze generation and general +# graphics routines used in this program are Copyright (C) 1998-2023 by +# Walter D. Pullen. Permission is granted to freely use, modify, and +# distribute these routines provided these credits and notices remain +# unmodified with any altered or distributed versions of the program. +# The user does have all rights to Mazes and other graphic output +# they make in Daedalus, like a novel created in a word processor. +# +# First created 12/7/2018. +# +# This Makefile is included only for convenience. One could easily compile +# Daedalus on a Unix system by hand with the command: +# % g++ -c -O *.cpp; g++ -o daedalus *.o -lm +# Generally, all that needs to be done to compile once util.h has been +# edited, is compile each source file, and link them together with the math +# library. +# +NAME = daedalus +OBJS = color.o command.o create.o create2.o create3.o daedalus.o\ + draw.o draw2.o game.o graphics.o inside.o labyrnth.o maze.o solids.o\ + solve.o threed.o util.o + +LIBS = -lm -s +CPPFLAGS = -O -Wno-write-strings -Wno-narrowing -Wno-comment +RM = rm -f + +daedalus:: $(OBJS) + g++ -o $(NAME) $(OBJS) $(LIBS) + +clean: + $(RM) $(OBJS) $(NAME) +# \ No newline at end of file diff --git a/changes.doc b/changes.doc index 74c6d077d117c9dab5d4747d4e84322e2342d486..dbf28c5fc903a4664a65cade81a2da61a56e2059 100644 GIT binary patch delta 17754 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 Sf57 @@ -227,6 +227,8 @@ KV KvBlendR(KV kv1, KV kv2, real r) KV KvBlendN(KV kv1, KV kv2, int n1, int n2) { Assert(FBetween(n1, 0, n2)); + if (n2 == 0) + n2 = 1; return Rgb((RgbR(kv2) - RgbR(kv1)) * n1 / n2 + RgbR(kv1), (RgbG(kv2) - RgbG(kv1)) * n1 / n2 + RgbG(kv1), (RgbB(kv2) - RgbB(kv1)) * n1 / n2 + RgbB(kv1)); @@ -646,7 +648,7 @@ void CCol::BitmapSet(KV kv) if (kv == kvBlack || kv == kvWhite || kv == ~0) { // For the simplest colors, set 32 bits at a time. - l = kv == kvBlack ? 0 : ~0; + l = kv == kvBlack ? 0 : dwSet; pl = (dword *)_Pb(0); for (il = m_y * m_clRow; il > 0; il--) *pl++ = l; @@ -976,7 +978,7 @@ void CCol::ColmapExchange(KV kv1, KV kv2) for (y = 0; y < m_y; y++) for (x = 0; x < m_x; x++) { - kv = Get(x, y); + kv = _Get(x, y); if (kv == kv1) Set(x, y, kv2); else if (kv == kv2) @@ -994,7 +996,7 @@ void CCol::ColmapOrAndKv(KV kv, int nOp) for (y = 0; y < m_y; y++) for (x = 0; x < m_x; x++) { - kvT = Get(x, y); + kvT = _Get(x, y); switch (nOp) { // Boolean bit combining @@ -2120,6 +2122,42 @@ flag CCol::FColmapBlendFromBitmap(CONST CMon *b1, CONST CMon *b2, } +// Make a color bitmap an equal blending together of N other color bitmaps. +// The N other bitmaps are stacked vertically within a second bitmap. Black +// pixels are skipped, and make that subbitmap not contribute to the result. + +void CCol::ColmapBlendBitmaps(CONST CCol &c) +{ + int cc, x, y, i, nT, ccol, nR, nG, nB; + KV kv; + + BitmapOff(); + cc = c.m_y + (m_y - 1) / m_y; + for (y = 0; y < m_y; y++) + for (x = 0; x < m_x; x++) { + ccol = nR = nG = nB = 0; + for (i = 0; i < cc; i++) { + kv = c.Get(x, i * m_y + y); + if (kv == kvBlack) + continue; + ccol++; + nR += RgbR(kv); + nG += RgbG(kv); + nB += RgbB(kv); + } + if (ccol <= 0) + continue; + nT = ccol >> 1; + nR = (nR + nT) / ccol; + nG = (nG + nT) / ccol; + nB = (nB + nT) / ccol; + kv = Rgb(nR, nG, nB); + if (kv != kvBlack) + Set(x, y, kv); + } +} + + // Copy a monochrome bitmap to a color bitmap, where off and on pixels in the // monochrome bitmap are mapped to the passed in colors. All off pixels // reachable from a start point or points will be filled with a blend of @@ -2503,6 +2541,8 @@ flag CCol::FReadColmapTarga(FILE *file) for (i = 0; i < 12; i++) skipbyte(); + if (feof(file)) + return fFalse; fscanf(file, "%c%c", S1(&ch), S1(&chR)); x = (int)(chR)*256 + (int)ch; fscanf(file, "%c%c", S1(&ch), S1(&chR)); @@ -2512,6 +2552,8 @@ flag CCol::FReadColmapTarga(FILE *file) skipword(); for (y = m_y-1; y >= 0; y--) { for (x = 0; x < m_x; x++) { + if (feof(file)) + return fFalse; fscanf(file, "%c%c%c%c", S1(&chB), S1(&chG), S1(&chR), S1(&ch)); Set(x, y, Rgb(chR, chG, chB)); } diff --git a/color.h b/color.h index d1723d8..c29a109 100644 --- a/color.h +++ b/color.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: color.h +** Daedalus (Version 3.4) File: color.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** on a color bitmap, unrelated to Mazes. ** ** Old last code change: 6/29/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ /* @@ -104,9 +104,12 @@ enum _colorreplace { #define UdD(l) ((int)((dword)(l) >> 12)) #define ITextureWall(kv, d) ((int)(((kv) >> ((d) * 6)) & (cTexture-1))) #define ITextureWall2(kv, d) ((int)(((kv) >> (FOdd(d) * 12)) & 4095)) +#define ITextureWall3(kv, d) ((int)(((kv) >> (((d) > 1) * 12)) & 4095)) #define GetT(c, x, y, d) ITextureWall((c).Get(x, y), d) #define SetT(c, x, y, d, t) ((c).Get(x, y) & \ ~((KV)(cTexture-1) << ((d) * 6)) | ((KV)(t) << ((d) * 6))) +#define SetU(c, x, y, f, t) ((c).Get(x, y) & \ + ~((KV)4095 << ((f) * 12)) | ((KV)(t) << ((f) * 12))) /* @@ -214,6 +217,7 @@ class CCol : virtual public CMap // Color bitmap flag FColmapPutToBitmap(CMon &, int) CONST; void ColmapOrAndFromBitmap(CONST CMon &, KV, KV, int); flag FColmapBlendFromBitmap(CONST CMon *, CONST CMon *, CONST CMon *); + void ColmapBlendBitmaps(CONST CCol &); flag FColmapBlur(flag); void ColmapContrast(flag); diff --git a/command.cpp b/command.cpp index 8928a34..cea7dfd 100644 --- a/command.cpp +++ b/command.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: command.cpp +** Daedalus (Version 3.4) File: command.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** execute macros and script files. ** ** Created: 11/26/2001. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -184,6 +184,7 @@ CONST CMD rgcmd[ccmd] = { {cmdCreateInfinite3, "InfiniteRestart", "", MZ | M2}, {cmdCreateKruskal, "Kruskal", "al", MZ | ME | M2}, {cmdCreateLabyrinth, "Labyrinth", "C", MZ | ME | M2}, +{cmdCreateOmicron, "Omicron", "", MZ | ME | M2}, {cmdCreatePatchOverview, "MakePatch", "", HG}, {cmdCreatePerfect, "Perfect", "P", MZ | ME | M2}, {cmdCreatePlanair, "Planair", "J", MZ | M2}, @@ -445,6 +446,7 @@ CONST CMD rgcmd[ccmd] = { {cmdScript27, "Script27", "ac7", 0}, {cmdScript28, "Script28", "ac8", 0}, {cmdScript29, "Script29", "ac9", 0}, +{cmdScript30, "Script30", "ac0", 0}, {cmdScrollDown, "ScrollDown", "aPgDn",R2}, {cmdScrollEnd, "ScrollEnd", "aEnd", R2}, {cmdScrollHome, "ScrollHome", "aHome",R2}, @@ -556,6 +558,7 @@ enum _operationindex { oprOpenPaint, oprOpenWire, oprOpenPatch, + oprDlgDB, oprDlgPaint, oprEmbedXbm, oprEmbed3D, @@ -578,6 +581,7 @@ enum _operationindex { oprSaveOverview, oprSavePatch, oprSavePicture, + oprSaveVector, oprSaveSolids, oprSize, oprSizeC, @@ -659,6 +663,7 @@ enum _operationindex { oprSetCE, oprSetCA, oprSetX, + oprSetY, oprSet3, oprSet3T, oprSet3E, @@ -668,6 +673,7 @@ enum _operationindex { oprSet3CE, oprSet3CA, oprSet3X, + oprSet3Y, oprZapTexture, oprMark2, oprUnmark2, @@ -676,6 +682,7 @@ enum _operationindex { oprTextFont, oprPerimeter, oprThicken2, + oprBlendN, oprConvex, oprAllMoire, opr2ndLine2, @@ -701,12 +708,15 @@ enum _operationindex { oprSymmetricX, oprSymmetricY, oprSymmetricZ, + oprZoomPic, oprOverview2, oprAltitude, oprGetWire, oprSetWire, oprGetPatch, oprSetPatch, + oprGetStar, + oprSetStar, oprStereogram, oprSetLife, oprEvolution, @@ -735,6 +745,7 @@ CONST OPR rgopr[copr] = { {oprOpenPaint, "OpenPaint", 1, SZ | R2 | C2}, {oprOpenWire, "OpenWire", 1, SZ}, {oprOpenPatch, "OpenPatch", 1, SZ}, +{oprDlgDB, "DlgOpenDB", 0, R2}, {oprDlgPaint, "DlgOpenPaint", 0, R2 | C2}, {oprEmbedXbm, "EmbedX11", 0, R2 | B2}, {oprEmbed3D, "Embed3D", 0, R2 | B2 | M3}, @@ -757,6 +768,7 @@ CONST OPR rgopr[copr] = { {oprSaveOverview,"SaveWire", 1, SZ}, {oprSavePatch, "SavePatch", 1, SZ}, {oprSavePicture, "SavePicture", 1, SZ}, +{oprSaveVector, "SaveVector", 1, SZ}, {oprSaveSolids, "SaveSolids", 1, SZ}, {oprSize, "Size", 4, R2 | B1}, {oprSizeC, "SizeC", 4, R2 | C1}, @@ -838,6 +850,7 @@ CONST OPR rgopr[copr] = { {oprSetCE, "SetCE", 3, 0}, {oprSetCA, "SetCA", 4, R1}, {oprSetX, "SetX", 4, R1}, +{oprSetY, "SetY", 4, R1}, {oprSet3, "Set3", 4, R2}, {oprSet3T, "Set3T", 4, R1}, {oprSet3E, "Set3E", 4, R1}, @@ -847,6 +860,7 @@ CONST OPR rgopr[copr] = { {oprSet3CE, "Set3CE", 4, 0}, {oprSet3CA, "Set3CA", 5, R1}, {oprSet3X, "Set3X", 5, R1}, +{oprSet3Y, "Set3Y", 5, R1}, {oprZapTexture, "ZapTexture", 1, R1}, {oprMark2, "MarkX2", 0, R1}, {oprUnmark2, "EraseX2", 0, R1}, @@ -855,6 +869,7 @@ CONST OPR rgopr[copr] = { {oprTextFont, "TextFont", 3, SZ}, {oprPerimeter, "Perimeter", 0, 0}, {oprThicken2, "Thicken2", 1, R2 | HG | B1}, +{oprBlendN, "BlendN", 0, R2 | HG}, {oprConvex, "Convex", 0, R2 | HG | B1}, {oprAllMoire, "AllMoire", 0, R2 | HG | B2}, {opr2ndLine2, "2ndLineUntil", 1, R2 | B2}, @@ -880,12 +895,15 @@ CONST OPR rgopr[copr] = { {oprSymmetricX, "SymmetricX", 0, R2 | HG | B1 | M2}, {oprSymmetricY, "SymmetricY", 0, R2 | HG | B1 | M2}, {oprSymmetricZ, "SymmetricZ", 0, R2 | HG | B1 | M2}, +{oprZoomPic, "ZoomBiasPic", 0, R2 | HG | B1 | M2}, {oprOverview2, "Overview2", 0, R2 | HG}, {oprAltitude, "Altitude", 2, R2 | HG | NC | M2}, {oprGetWire, "GetWireframe", 2, 0}, {oprSetWire, "SetWireframe", 2, 0}, {oprGetPatch, "GetPatch", 2, 0}, {oprSetPatch, "SetPatch", 2, 0}, +{oprGetStar, "GetStar", 3, 0}, +{oprSetStar, "SetStar", 5, R2}, {oprStereogram, "Stereogram", 2, R2 | HG}, {oprSetLife, "SetLife", 1, 0}, {oprEvolution, "Evolution", 2, R2 | HG | C1}, @@ -1192,6 +1210,7 @@ enum _variableindex { varSunMoon2, varSunMoonY, varStarColor, + varStarSize, varSkyAll, varSky3D, varShowDelay, @@ -1215,6 +1234,7 @@ enum _variableindex { varTextureVar, varTextureElev, varTextureDual, + varTextureDual2, varTextureBlend, varMarkElevX1, varMarkElevY1, @@ -1235,6 +1255,7 @@ enum _variableindex { varLineSort, varLineDistance, varFaceOrigin, + varStereo3D, varWireCount, varPatchCount, varMandelbrot, @@ -1534,6 +1555,7 @@ CONST VAR rgvar[cvar] = { {varSunMoon2, "nSunMoon", R1}, {varSunMoonY, "nSunMoonY", R1}, {varStarColor, "nStarColor", 0}, +{varStarSize, "nStarSize", R1}, {varSkyAll, "fSkyAll", R1}, {varSky3D, "fSky3D", R1}, {varShowDelay, "fFrameDelay", R1}, @@ -1557,6 +1579,7 @@ CONST VAR rgvar[cvar] = { {varTextureVar, "nTextureBlock", R1}, {varTextureElev, "nTextureElev", R1}, {varTextureDual, "fTextureDual", R1}, +{varTextureDual2, "fTextureDual2", R1}, {varTextureBlend, "fTextureBlend", R1}, {varMarkElevX1, "nMarkElevX1", 0}, {varMarkElevY1, "nMarkElevY1", 0}, @@ -1577,6 +1600,7 @@ CONST VAR rgvar[cvar] = { {varLineSort, "fWireSort", R1}, {varLineDistance, "nWireDistance", R1}, {varFaceOrigin, "nDrawFaceOrigin", R1}, +{varStereo3D, "fStereo3D", R1}, {varWireCount, "nWireframeSize", 0}, {varPatchCount, "nPatchSize", 0}, {varMandelbrot, "fMandelbrotShip", 0}, @@ -1619,15 +1643,19 @@ enum _functionindex { funInv, funShftL, funShftR, + funAndL, + funOrL, funOdd, funAbs, funSgn, funMin, funMax, + funTween, funRnd, funIf, funSqr, funDist, + funLn, funSin, funCos, funTan, @@ -1746,15 +1774,19 @@ CONST FUN rgfun[cfun] = { {funInv, "Inv", 1}, {funShftL, "<<", 2}, {funShftR, ">>", 2}, +{funAndL, "&&", 2}, +{funOrL, "||", 2}, {funOdd, "Odd", 1}, {funAbs, "Abs", 1}, {funSgn, "Sgn", 1}, {funMin, "Min", 2}, {funMax, "Max", 2}, +{funTween, "Tween", 3}, {funRnd, "Rnd", 2}, {funIf, "?:", 3}, {funSqr, "Sqr", 1}, {funDist, "Dist", 4}, +{funLn, "Ln", 2}, {funSin, "Sin", 2}, {funCos, "Cos", 2}, {funTan, "Tan", 2}, @@ -2014,6 +2046,7 @@ void DoSetVariable(int ivar, CONST char *sz, int cch, long l) case varFogLength: dr.nFog = n; break; case varClipPlane: dr.nClip = n; break; case varViewSpan: dr.dInside = (real)n / 100.0; break; + case varStereo: ds.nStereo = n; break; case varTrans: dr.nTrans = n; break; case varFrameMove: dr.nFrameXY = n; break; case varFrameTurn: dr.nFrameD = n; break; @@ -2168,6 +2201,7 @@ void DoSetVariable(int ivar, CONST char *sz, int cch, long l) case varSunMoon2: dr.nSunMoon = n; break; case varSunMoonY: dr.ySunMoon = n; break; case varStarColor: ds.lStarColor = n; break; + case varStarSize: ds.nStarSize = n; break; case varSkyAll: ds.fSkyAll = f; break; case varSky3D: dr.fSky3D = f; break; case varShowDelay: dr.fDelay = f; break; @@ -2191,12 +2225,12 @@ void DoSetVariable(int ivar, CONST char *sz, int cch, long l) case varTextureVar: dr.nTextureVar = n; break; case varTextureElev: dr.nTextureElev = n; break; case varTextureDual: dr.fTextureDual = f; break; + case varTextureDual2: dr.fTextureDual2 = f; break; case varTextureBlend: dr.fTextureBlend = f; break; case varMarkElevX1: dr.nMarkElevX1 = n; break; case varMarkElevY1: dr.nMarkElevY1 = n; break; case varMarkElevX2: dr.nMarkElevX2 = n; break; case varMarkElevY2: dr.nMarkElevY2 = n; break; - case varStereo: dr.nStereo = n; break; case varMazeCellMax: ms.nCellMax = n; break; case varHuntType: ms.nHuntType = n; break; case varFractalDepth: ms.nFractalD = n; break; @@ -2212,6 +2246,7 @@ void DoSetVariable(int ivar, CONST char *sz, int cch, long l) case varLineSort: ds.fWireSort = f; break; case varLineDistance: ds.nWireDistance = n; break; case varFaceOrigin: ds.nFaceOrigin = n; break; + case varStereo3D: ds.fStereo3D = f; break; case varWireCount: if (FSetWireSize(&bm.coor, bm.ccoor, n)) bm.ccoor = n; break; case varPatchCount: @@ -2377,6 +2412,7 @@ void GetVariable(int ivar, char **psz, int *pcch, long *pl) case varFogLength: n = dr.nFog; break; case varClipPlane: n = dr.nClip; break; case varViewSpan: n = (int)(dr.dInside * 100.0); break; + case varStereo: n = ds.nStereo; break; case varTrans: n = dr.nTrans; break; case varFrameMove: n = dr.nFrameXY; break; case varFrameTurn: n = dr.nFrameD; break; @@ -2530,6 +2566,7 @@ void GetVariable(int ivar, char **psz, int *pcch, long *pl) case varSunMoon2: n = dr.nSunMoon; break; case varSunMoonY: n = dr.ySunMoon; break; case varStarColor: n = ds.lStarColor; break; + case varStarSize: n = ds.nStarSize; break; case varSkyAll: n = ds.fSkyAll; break; case varSky3D: n = dr.fSky3D; break; case varShowDelay: n = dr.fDelay; break; @@ -2553,12 +2590,12 @@ void GetVariable(int ivar, char **psz, int *pcch, long *pl) case varTextureVar: n = dr.nTextureVar; break; case varTextureElev: n = dr.nTextureElev; break; case varTextureDual: n = dr.fTextureDual; break; + case varTextureDual2: n = dr.fTextureDual2; break; case varTextureBlend: n = dr.fTextureBlend; break; case varMarkElevX1: n = dr.nMarkElevX1; break; case varMarkElevY1: n = dr.nMarkElevY1; break; case varMarkElevX2: n = dr.nMarkElevX2; break; case varMarkElevY2: n = dr.nMarkElevY2; break; - case varStereo: n = dr.nStereo; break; case varMazeCellMax: n = ms.nCellMax; break; case varHuntType: n = ms.nHuntType; break; case varFractalDepth: n = ms.nFractalD; break; @@ -2574,6 +2611,7 @@ void GetVariable(int ivar, char **psz, int *pcch, long *pl) case varLineSort: n = ds.fWireSort; break; case varLineDistance: n = ds.nWireDistance; break; case varFaceOrigin: n = ds.nFaceOrigin; break; + case varStereo3D: n = ds.fStereo3D; break; case varWireCount: n = bm.ccoor; break; case varPatchCount: n = bm.cpatch; break; case varMandelbrot: n = cs.fMandelbrot; break; @@ -2630,15 +2668,19 @@ long EvalFunction(int ifun, char *rgsz[], CONST int *rgcch, CONST long *rgl) case funInv: n = ~n1; break; case funShftL: n = n1 << n2; break; case funShftR: n = n1 >> n2; break; + case funAndL: n = n1 && n2; break; + case funOrL: n = n1 || n2; break; case funOdd: n = FOdd(n1); break; case funAbs: n = NAbs(n1); break; case funSgn: n = NSgn(n1); break; case funMin: n = Min(n1, n2); break; case funMax: n = Max(n1, n2); break; + case funTween: n = FBetween(n1, n2, n3); break; case funRnd: n = Rnd(n1, n2); break; case funIf: n = n1 ? n2 : n3; break; case funSqr: n = NSqr(NAbs(n1)); break; case funDist: n = (int)LengthN(n1, n2, n3, n4); break; + case funLn: n = (int)((real)n1 * log((real)n2)); break; case funSin: n = (int)(((real)n1 + rRound) * RSinD((real)n2)); break; case funCos: n = (int)(((real)n1 + rRound) * RCosD((real)n2)); break; case funTan: n = (int)(((real)n1 + rRound) * RTanD((real)n2)); break; @@ -2766,7 +2808,7 @@ long EvalFunction(int ifun, char *rgsz[], CONST int *rgcch, CONST long *rgl) PchGetParameter(sz, NULL, NULL, (long *)&n, 1); break; case funEvent: n = NGetVariableW(n1 ? vosEventMouse : vosEventKey); break; - case funVer: n = 3300; break; // Daedalus 3.3 + case funVer: n = 3400; break; // Daedalus 3.4 case funFileOpen: CopyRgchToSz(rgsz[0], rgcch[0], sz, cchSzMax); @@ -2966,6 +3008,7 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, { size_t cursorPrev = NULL; CMap3 *pbSrc, *pbDst, *bT; + STAR *pstar; char sz[cchSzOpr], szT[cchSzMax], sz3[cchSzDef]; char *pch, *pchT; int nRet = 0, n1, n2, n3, n4, n5, n6, n7, x, y, cch, i; @@ -3042,6 +3085,10 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, case oprOpenPatch: FFileOpen(cmdOpenPatch, sz, NULL); break; + + case oprDlgDB: + FFileOpen(cmdOpenDB, NULL, NULL); + break; case oprDlgPaint: FFileOpen(cmdOpenColmapPaint, NULL, NULL); break; @@ -3110,6 +3157,9 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, case oprSavePicture: FFileSave(cmdSavePicture, sz); break; + case oprSaveVector: + FFileSave(cmdSaveVector, sz); + break; case oprSaveSolids: CreateSolids(sz); break; @@ -3475,7 +3525,8 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, pbDst = BitmapGetMask(n2); if (iopr == oprMaskSwap && (n1 != -1 || !pbDst->FNull()) && (n2 != -1 || !pbSrc->FNull())) { - pbSrc->SwapWith(*pbDst); + if (pbSrc != pbDst) + pbSrc->SwapWith(*pbDst); break; } if (!pbSrc->FNull()) @@ -3493,7 +3544,8 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, pbSrc = ColmapGetTexture(n1); pbDst = ColmapGetTexture(n2); if (iopr == oprTextureSwap) { - pbSrc->SwapWith(*pbDst); + if (pbSrc != pbDst) + pbSrc->SwapWith(*pbDst); if (bm.k.FNull()) FShowColmap(fFalse); break; @@ -3608,7 +3660,8 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, bm.b.Turtle("_"); ws.fSpree = dr.fDot2 = dr.fSky3D = dr.fNoCompass = dr.fNoLocation = dr.fPolishMaze = dr.fFogFloor = dr.fMarkColor = dr.fMarkAll = - dr.fMarkBlock = dr.fTextureDual = dr.fTextureBlend = fFalse; + dr.fMarkBlock = dr.fTextureDual = dr.fTextureDual2 = dr.fTextureBlend = + fFalse; ms.nCellMax = ws.nTitleMessage = dr.zStep = dr.kvInWall2 = dr.kvInSky2 = dr.kvInDirt2 = dr.kvInCeil2 = dr.kvInMtn2 = dr.kvInCld2 = dr.nMarkSky = dr.nWallVar = dr.nFogLit = -1; @@ -3680,6 +3733,18 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, l = UD(n4, n4); bT->Set(n1, n2, l); break; + case oprSetY: + bT = ColmapGetTexture(dr.nTextureWall); + if (bT == NULL) + break; + if (n3 >= 0) + l = SetU(*bT, n1, n2, n3, n4); + else if (n3 == -1) + l = UD(n4, n4); + else + l = NWSE(n4, n4, n4, n4); + bT->Set(n1, n2, l); + break; case oprSet3: bm.b.Set3(n1, n2, n3, n4); break; @@ -3727,6 +3792,18 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, l = UD(n5, n5); bT->Set3(n1, n2, n3, l); break; + case oprSet3Y: + bT = ColmapGetTexture(dr.nTextureWall); + if (bT == NULL) + break; + if (n4 >= 0) + l = SetU3(*bT, n1, n2, n3, n4, n5); + else if (n4 == -1) + l = NWSE(n5, n5, n5, n5); + else + l = UD(n5, n5); + bT->Set3(n1, n2, n3, l); + break; case oprZapTexture: DotZap(cmdZapTexture, n1); break; @@ -3763,6 +3840,9 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, l = bm.b.BitmapThicken2(n1, !dr.fNoCorner); SetMacroReturn(l); break; + case oprBlendN: + bm.k.ColmapBlendBitmaps(bm.k2); + break; case oprConvex: bm.b.FBitmapConvex(xl, yl, xh, yh); break; @@ -3875,6 +3955,9 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, SetMacroReturn(l); PrintSzL("Asymmetries in Maze: %ld\n", l); break; + case oprZoomPic: + bm.b.MazeZoomWithPicture(&bm.k); + break; case oprOverview2: if (!dr.f3D) DrawOverview2(bm.b); @@ -3939,6 +4022,25 @@ int DoOperation(int iopr, char **rgsz, CONST int *rgcch, CONST long *rgl, bm.patch[n1].nTrans = (short)ws.rglVar[y+2]; } break; + case oprGetStar: + pstar = !n1 ? dr.rgstar : ds.rgstar; + if (pstar != NULL && FBetween(n2, 0, istarMax-1) && + FEnsureLVar(n3 + 2)) { + ws.rglVar[n3] = pstar[n2].x; + ws.rglVar[n3+1] = pstar[n2].y; + ws.rglVar[n3+2] = pstar[n2].kv; + } + break; + case oprSetStar: + if (dr.rgstar == NULL) + FCreateInsideStars(NULL, 0.0, 0, fFalse); + pstar = !n1 ? dr.rgstar : ds.rgstar; + if (pstar != NULL && FBetween(n2, 0, istarMax-1)) { + pstar[n2].x = n3; + pstar[n2].y = n4; + pstar[n2].kv = ParseColor(rgsz[4], fFalse); + } + break; case oprStereogram: if (!bm.fColor) bm.b.FStereogram(bm.b2, n1, n2); @@ -5480,6 +5582,10 @@ flag DoCommand(int wCmd) bm.b.CreateMazeUpsilon(); break; + case cmdCreateOmicron: + bm.b.CreateMazeOmicron(); + break; + case cmdCreateZeta: bm.b.CreateMazeZeta(); break; @@ -6305,10 +6411,10 @@ char *ReadEmbedLines(FILE *file) char szLine[cchSzOpr], ch, *sz = NULL, *szNew = NULL; int cch = 0, i, j, fSpace; - if (file == NULL) + if (file == NULL && ws.rgszStartup == NULL) return NULL; loop { - for (i = 0; i < cchSzOpr && !feof(file) && + for (i = 0; i < cchSzOpr && (file == NULL || !feof(file)) && (ch = getbyte()) >= ' '; i++) szLine[i] = ch; skiplf(); diff --git a/create.cpp b/create.cpp index eec4f0d..545962b 100644 --- a/create.cpp +++ b/create.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: create.cpp +** Daedalus (Version 3.4) File: create.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** produce standard orthogonal 2D Mazes. ** ** Created: 9/4/2000. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -1695,8 +1695,8 @@ flag CMaz::CreateMazeAldousBroder() MazeClear(!fWall); MakeEntranceExit(0); if (!fWall) { - x = RndSkip(xl + 1, xh - 1); - y = RndSkip(yl + 1, yh - 1); + x = ms.fTreeRandom ? RndSkip(xl + 1, xh - 1) : xl + 1; + y = ms.fTreeRandom ? RndSkip(yl + 1, yh - 1) : yl + 1; Set0(x, y); } else x = y = 0; @@ -1807,7 +1807,7 @@ flag CMaz::CreateMazeWilson() UpdateDisplay(); while (count > 0) { - i = Rnd(0, count-1); + i = ms.fTreeRandom ? Rnd(0, count-1) : count-1; x = x0 = wils[i].zList % xs; y = y0 = wils[i].zList / xs; // From a random uncreated location, do a random walk until run into part diff --git a/create2.cpp b/create2.cpp index f739786..aace01b 100644 --- a/create2.cpp +++ b/create2.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: create2.cpp +** Daedalus (Version 3.4) File: create2.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** produce orthogonal Mazes, however which aren't standard 2D Mazes. ** ** Created: 11/22/1996. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -2208,6 +2208,8 @@ flag CMaz::FValidPlanair(CONST char *sz) CONST } +CONST KV rgkvCube[6] = {kvGreen, kvBlue, kvMagenta, kvYellow, kvRed, kvOrange}; + // Create a new planair Maze in a bitmap, or a Maze on the surface of a set of // rectangles, whose edges can connect in arbitrary ways. Like a 3D Maze this // is technically a 3D construct stored as a sequence of levels, where the @@ -2219,6 +2221,7 @@ flag CMaz::CreateMazePlanair() int jx = Even(m_x3), jy = Even(m_y3), jz, jw = m_w3, fHunt = fFalse, pass = 0, x, y, z, xnew, ynew, znew, xInc = 2, yInc = 2, zInc = 1, d, e, i, iMax, j; + int a0, b0, c0, ax, bx, cx, ay, by, cy; long count; if (!FValidPlanair(ms.szPlanair)) @@ -2312,6 +2315,54 @@ flag CMaz::CreateMazePlanair() } } LDone: + + // Create a wireframe for this Planair Maze if it's making a cube. + if (!(ms.nOmegaDraw == 1 && FEqSz(ms.szPlanair, + "e2d3f0b1 e7a3f3c1 e4b3f6d1 e1c3f5a1 c4d0a0b4 a2d6c6b2"))) + return fTrue; + if (InitCoordinates((jx + jy) / 2 * jz) < 0) + return fFalse; + d = 25; e = d << 1; + i = (Max(jx, jy)-2)*d; + for (z = 0; z < jz; z++) { + ax = bx = cx = ay = by = cy = 0; + switch (z) { + case 0: a0=0; b0=1; c0=1; ax=1; by=-1; break; + case 1: a0=1; b0=1; c0=1; cx=-1; by=-1; break; + case 2: a0=1; b0=1; c0=0; ax=-1; by=-1; break; + case 3: a0=0; b0=1; c0=0; cx=1; by=-1; break; + case 4: a0=0; b0=1; c0=0; ax=1; cy=1; break; + case 5: a0=0; b0=0; c0=1; ax=1; cy=-1; break; + } + a0 = ((a0 << 1) - 1) * i; + b0 = ((b0 << 1) - 1) * i; + c0 = ((c0 << 1) - 1) * i; + ax *= e; ay *= e; bx *= e; by *= e; cx *= e; cy *= e; + for (y = 0; y < jy; y += 2) + for (x = 0; x < jx; x += 2) { + if (x+2 < jx && JG(x+1, y, z) && (y > 0 || PZTo(ms.szPlanair, z, 0) < + z) && (y < jy-2 || PZTo(ms.szPlanair, z, 2) < z)) + FSetCoordinates(a0 + x*ax + y*ay, b0 + x*bx + y*by, c0 + x*cx + y*cy, + a0 + (x+2)*ax + y*ay, b0 + (x+2)*bx + y*by, c0 + (x+2)*cx + y*cy, + KvBlend(rgkvCube[z], rgkvCube[y <= 0 ? PZTo(ms.szPlanair, z, 0) : + (y >= jy-2 ? PZTo(ms.szPlanair, z, 2) : z)])); + if (y+2 < jy && JG(x, y+1, z) && (x > 0 || PZTo(ms.szPlanair, z, 1) < + z) && (x < jx-2 || PZTo(ms.szPlanair, z, 3) < z)) + FSetCoordinates(a0 + x*ax + y*ay, b0 + x*bx + y*by, c0 + x*cx + y*cy, + a0 + x*ax + (y+2)*ay, b0 + x*bx + (y+2)*by, c0 + x*cx + (y+2)*cy, + KvBlend(rgkvCube[z], rgkvCube[x <= 0 ? PZTo(ms.szPlanair, z, 1) : + (x >= jx-2 ? PZTo(ms.szPlanair, z, 3) : z)])); + } + } + // Draw two arrows for the entrance and exit to the cube Maze. + for (j = -1; j <= 1; j += 2) { + zInc = j < 0 ? kvWhite : kvDkGray; + FSetCoordinates((i+d)*j, 0, 0, (i+d*10)*j, 0, 0, zInc); + e = j < 0 ? -i-d*10 : i+d; + FSetCoordinates(e, 0, 0, e+d*3, d*3, 0, zInc); + FSetCoordinates(e, 0, 0, e+d*3, -d*3, 0, zInc); + } + InitCoordinates(0); return fTrue; } diff --git a/create3.cpp b/create3.cpp index 8add7e4..1812917 100644 --- a/create3.cpp +++ b/create3.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: create3.cpp +** Daedalus (Version 3.4) File: create3.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** produce non-orthogonal Mazes. ** ** Created: 9/4/2000. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -55,6 +55,8 @@ class Generic flag FIsOnMaze(long); void CreateMazeGeneral(); void GenerateWireframe(); + virtual void WireframeLine(int, int, int, int); + virtual void WireframeOpening(); // Creates an entrance or exit, returning the cell index next to it. virtual long LMakeOpening(int, flag) = 0; @@ -241,46 +243,54 @@ void Generic::CreateMazeGeneral() void Generic::GenerateWireframe() { long area, test, hunt; - int count, d, x1, y1, x2, y2, f, cEdge = 0; + int count, d, x1, y1, x2, y2; if (ms.nOmegaDraw <= 0) return; - for (f = 0; f <= 1; f++) { - for (area = 0; !FIsOnMaze(area) || !FIsRoom(area); area = LNext(area)) - ; - hunt = area; - loop { - if (!FIsOnMaze(area) || !FIsRoom(area)) + InitCoorPatch(ms.nOmegaDraw == 2, ms.omega * ms.omega); + for (area = 0; !FIsOnMaze(area) || !FIsRoom(area); area = LNext(area)) + ; + hunt = area; + loop { + if (!FIsOnMaze(area) || !FIsRoom(area)) + continue; + count = NCount(area); + for (d = 0; d < count; d++) { + test = LEnum(area, d); + if (test < area && FIsOnMaze(test)) continue; - count = NCount(area); - for (d = 0; d < count; d++) { - test = LEnum(area, d); - if (test < area && FIsOnMaze(test)) - continue; - if (!FIsPassage(area, d)) { - if (!f) - cEdge++; - else { - MapDir(area, d, &x1, &y1, &x2, &y2); - if (ms.nOmegaDraw == 1) - FSetCoordinates(x1, y1, 0, x2, y2, 0, -1); - else - FSetPatch(x1, y1, 0, x2, y2, 10, -1); - } - } + if (!FIsPassage(area, d)) { + MapDir(area, d, &x1, &y1, &x2, &y2); + WireframeLine(x1, y1, x2, y2); } - area = LNext(area); - if (area == hunt) - break; - } - if (!f) { - if (ms.nOmegaDraw == 1) - FInitCoordinates(cEdge); - else - FInitPatch(cEdge); } + area = LNext(area); + if (area == hunt) + break; } - PrintSzN("Total number of edges generated: %d", cEdge); + WireframeOpening(); + PrintSzN("Total number of edges generated: %d", + InitCoorPatch(ms.nOmegaDraw == 2, 0)); +} + + +// Output a wireframe line given a pair of coordinates in the generic Maze. + +void Generic::WireframeLine(int x1, int y1, int x2, int y2) +{ + KV kv; + + kv = -1; + /*if (m_c != NULL && m_c->m_x == m_b.m_x && m_c->m_y == m_b.m_y) + kv = CG(*m_c, (x1+x2) >> 1, (y1+y2) >> 1);*/ + FSetCoorPatch(ms.nOmegaDraw == 2, x1, y1, 0, x2, y2, 10, kv); +} + + +// Output wireframe arrows for the start and end in the generic Maze. + +void Generic::WireframeOpening() +{ } @@ -811,7 +821,7 @@ flag Sigma::FCreateMaze(CMaz &b) return fFalse; } b.BitmapOff(); - for (y = 0; y < SYMax; y++) { + for (y = 0; y < SYMax; y++) for (x = 0; x < SXMax(y); x++) { m = SMapX(x, y); n = SMapY(y); GLine(m, n, m-ox1, n+oy1); @@ -824,7 +834,6 @@ flag Sigma::FCreateMaze(CMaz &b) if ((x >= SXMax(y)-1 && y >= ms.omega-1) || y >= SYMax-1) GLine(m+ox1, n+oy1*3, m, n+oy1*4); } - } CreateMazeGeneral(); return fTrue; } @@ -990,7 +999,7 @@ int Theta::NDirBinary(long area) XYArea(x, y, area); if (y <= ms.omega2) - return 1; + return x > 0 ? 1 : -1; return Rnd(0, 1); } @@ -1012,7 +1021,7 @@ flag Theta::FCreateMaze(CMaz &b) return fFalse; } b.BitmapOff(); - for (y = ms.omega2; y <= ms.omega; y++) { + for (y = ms.omega2; y <= ms.omega; y++) for (x = 0; x < TPoint(y); x++) { m = (x + 1) & (TPoint(y) - 1); GLine(TMapX(x, y), TMapY(x, y), TMapX(m, y), TMapY(m, y)); @@ -1021,7 +1030,6 @@ flag Theta::FCreateMaze(CMaz &b) GLine(TMapX(x, y), TMapY(x, y), TMapX(m, y+1), TMapY(m, y+1)); } } - } CreateMazeGeneral(); return fTrue; } @@ -1203,7 +1211,7 @@ flag Upsilon::FCreateMaze(CMaz &b) return fFalse; } b.BitmapOff(); - for (y = 0; y <= ms.omega; y++) { + for (y = 0; y <= ms.omega; y++) for (x = 0; x <= ms.omega; x++) { m = UMapX(x); n = UMapY(y); if (((x | y) & 1) == 0) { @@ -1222,7 +1230,6 @@ flag Upsilon::FCreateMaze(CMaz &b) if (y < ms.omega) GLine(m - ox2*(!USquare(x, y)), n, m - ox2*(!USquare(x, y)), n+oy1); } - } CreateMazeGeneral(); return fTrue; } @@ -1234,6 +1241,229 @@ flag CMaz::CreateMazeUpsilon() } +// Create an Omicron Maze, or a Maze formed of concentric circles on a sphere. + +#define OMapX(x, y) (ox0 + (x) * ox1 * (m_x / OPoint(y))) +#define OMapY(y) (oy0 + (y) * oy1) +#define OPoint(y) \ + TPoint((y) < ((ms.omega+1) >> 1) ? Max(0, y) : Max(0, ms.omega-1-(y))) + +class Omicron : Generic +{ +private: + int m_x; + + long LMakeOpening(int, flag); + flag FIsRoom(long); + int NCount(long); + long LEnum(long, int); + long LNext(long); + int NDirBinary(long); + void MapDir(long, int, int *, int *, int *, int *); + void WireframeLine(int, int, int, int); + void WireframeOpening(); + +public: + flag FCreateMaze(CMaz &); +}; + +void Omicron::MapDir(long area, int dir, int *x1, int *y1, int *x2, int *y2) +{ + int x, y, d, dd, m, m1, m2, n1, n2; + + XYArea(x, y, area); + d = y < ((ms.omega+1) >> 1) ? 1 : -1; + dd = d < 0; + n1 = y + dd; + n2 = y + 1 - dd; + m = (x + 1) & (OPoint(y) - 1); + m1 = x << (int)(OPoint(y) < OPoint(y + d)); + m2 = m << (int)(OPoint(y) < OPoint(y + d)); + switch (dir) { + case 0: + *x1 = OMapX(x, n1-dd); *y1 = OMapY(n1); + *x2 = OMapX(x+1, n1-dd); *y2 = *y1; + break; + case 1: + *x1 = OMapX(x, n1-dd); *y1 = OMapY(n1); + *x2 = *x1; *y2 = OMapY(n2); + break; + case 2: + *x1 = OMapX(m, n1-dd); *y1 = OMapY(n1); + *x2 = *x1; *y2 = OMapY(n2); + break; + case 3: + *x1 = OMapX(m1, n2-dd); *y1 = OMapY(n2); + *x2 = OMapX(m1+1, n2-dd); *y2 = *y1; + break; + case 4: + *x1 = OMapX(m1+1, n2-dd); *y1 = OMapY(n2); + *x2 = OMapX(m1+2, n2-dd); *y2 = *y1; + break; + } +} + +long Omicron::LMakeOpening(int hint, flag fExit) +{ + long area; + int x, y, dir, x1, y1, x2, y2; + + x = Rnd(0, 3); + y = fExit ? ms.omega-1 : 0; + dir = fExit && ms.omega <= 1 ? 3 : 0; + AreaXY(area, x, y); + MakePassage(area, dir); + if (!fExit) { + MapDir(area, dir, &x1, &y1, &x2, &y2); + ms.xEntrance = (x1 + x2) >> 1; ms.yEntrance = (y1 + y2) >> 1; + } + return area; +} + +flag Omicron::FIsRoom(long area) +{ + int x, y, d; + + XYArea(x, y, area); + if (y < 0 || y >= ms.omega) + return fTrue; + for (d = 0; d < NCount(area); d++) + if (FIsPassage(area, d)) + return fTrue; + return fFalse; +} + +int Omicron::NCount(long area) +{ + int x, y, d; + + // Cells in a ring have four sides, except when the number of cells in a + // ring doubles, in which case the cell in smaller ring has five sides. + XYArea(x, y, area); + d = y < ((ms.omega+1) >> 1) ? 1 : -1; + return 4 + (OPoint(y) < OPoint(y+d)); +} + +long Omicron::LEnum(long area, int dir) +{ + int x, y, d; + + XYArea(x, y, area); + d = y < ((ms.omega+1) >> 1) ? 1 : -1; + switch (dir) { + case 0: x = x >> (int)(OPoint(y) > OPoint(y-d)); y -= d; break; + case 1: x = (x - 1) & (OPoint(y) - 1); break; + case 2: x = (x + 1) & (OPoint(y) - 1); break; + case 3: x = x << (int)(OPoint(y) < OPoint(y+d)); y += d; break; + case 4: x = (x << (int)(OPoint(y) < OPoint(y+d))) + 1; y += d; break; + } + AreaXY(area, x, y); + return area; +} + +long Omicron::LNext(long area) +{ + int x, y; + + XYArea(x, y, area); + x++; + if (x >= OPoint(y)) { + x = 0; + y++; + if (y >= ms.omega) + y = 0; + } + AreaXY(area, x, y); + return area; +} + +int Omicron::NDirBinary(long area) +{ + int x, y; + + XYArea(x, y, area); + if (y <= 0 || y >= ms.omega-1) + return x > 0 ? 1 : -1; + return Rnd(0, 1); +} + +flag Omicron::FCreateMaze(CMaz &b) +{ + int x, y, z; + + m_b = &b; + z = ms.omega*2 + 1; + x = Max(b.m_x, z); y = Max(b.m_y, z); + if (!b.FBitmapSizeSet(x, y)) + return fFalse; + m_x = OPoint(ms.omega >> 1); + ox1 = (b.m_x - 1) / m_x; + ox0 = (b.m_x - ox1 * m_x) >> 1; + oy1 = (b.m_y - 1) / ms.omega; + oy0 = (b.m_y - oy1 * ms.omega) >> 1; + if (ox1 < 2 || oy1 < 2) { + PrintSzN_W("Bitmap too small to make omicron Maze of size: %d", ms.omega); + return fFalse; + } + b.BitmapOff(); + for (y = 0; y <= ms.omega; y++) + for (x = OPoint(y)-1; x >= 0; x--) { + GLine(OMapX(x, y), OMapY(y), OMapX(x+1, y), OMapY(y)); + if (y < ms.omega) + GLine(OMapX(x, y), OMapY(y), OMapX(x, y), OMapY(y+1)); + } + CreateMazeGeneral(); + return fTrue; +} + +void Omicron::WireframeLine(int x1, int y1, int x2, int y2) +{ + int z1, z2; + real m1, n1, m2, n2, r1, r2; + KV kv; + + if (ms.nOmegaDraw == 2) + FSetPatch(x1, y1, 0, x2, y2, 10, -1); + else { + r1 = (real)OPoint(ms.omega >> 1); + m1 = (real)((x1 - ox0) / ox1) * rDegMax / r1; + m2 = (real)((x2 - ox0) / ox1) * rDegMax / r1; + n1 = (real)((y1 - oy0) / oy1 + 1) * rDegHalf / (ms.omega+2) - rDegQuad; + n2 = (real)((y2 - oy0) / oy1 + 1) * rDegHalf / (ms.omega+2) - rDegQuad; + r1 = RCosD(n1); r2 = RCosD(n2); + z1 = (int)(1000.0 * RSinD(n1)); + z2 = (int)(1000.0 * RSinD(n2)); + y1 = (int)(1000.0 * RSinD(m1) * r1); + y2 = (int)(1000.0 * RSinD(m2) * r2); + x1 = (int)(1000.0 * RCosD(m1) * r1); + x2 = (int)(1000.0 * RCosD(m2) * r2); + kv = Hue((int)(((n1 + n2) / 2.0 + rDegQuad) * 2.0 * 10.0)); + FSetCoordinates(x1, y1, z1, x2, y2, z2, kv); + } +} + +void Omicron::WireframeOpening() +{ + int i, j; + KV kv; + + // Draw two arrows for the entrance and exit to the Omicron Maze. + for (i = -1; i <= 1; i += 2) { + kv = i < 0 ? kvDkGray : kvWhite; + FSetCoordinates(0, 0, (1000+25)*i, 0, 0, (1000+25*9)*i, kv); + j = i < 0 ? -1000-25 : 1000+25*9; + FSetCoordinates(0, 0, j, 25*3, 0, j-25*3, kv); + FSetCoordinates(0, 0, j, -25*3, 0, j-25*3, kv); + } +} + +flag CMaz::CreateMazeOmicron() +{ + Omicron omicron; + return omicron.FCreateMaze(*this); +} + + /* ****************************************************************************** ** Recursive Fractal Maze Routines @@ -2237,6 +2467,15 @@ long CMaz::CreateMazeCrack(flag fClear) MakeEntranceExit(1); UpdateDisplay(); } + if (ms.nOmegaDraw) { + InitCoorPatch(ms.nOmegaDraw == 2, 100); + FSetCoorPatch(ms.nOmegaDraw == 2, xl, yl, 0, xl, yh, 10, -1); + FSetCoorPatch(ms.nOmegaDraw == 2, xh, yl, 0, xh, yh, 10, -1); + FSetCoorPatch(ms.nOmegaDraw == 2, xl, yl, 0, ms.xEntrance-1, yl, 10, -1); + FSetCoorPatch(ms.nOmegaDraw == 2, ms.xEntrance+1, yl, 0, xh, yl, 10, -1); + FSetCoorPatch(ms.nOmegaDraw == 2, xl, yh, 0, ms.xExit-1, yh, 10, -1); + FSetCoorPatch(ms.nOmegaDraw == 2, ms.xExit+1, yh, 0, xh, yh, 10, -1); + } // Draw lines appending onto what's already present. while (pass < ms.nCrackPass) { @@ -2288,6 +2527,7 @@ long CMaz::CreateMazeCrack(flag fClear) d >>= 1; // Draw the line a pixel at a time. Stop before hitting any other wall. + x2 = x; y2 = y; for (z = 0; z <= zMax; z++) { x += xInc; y += yInc; d += dInc; if (d >= zMax) { @@ -2300,6 +2540,9 @@ long CMaz::CreateMazeCrack(flag fClear) k = (k << 1) + Get(x + xoff[i], y + yoff[i]); if (mpgrff[k]) { Set1(x, y); + if (ms.nOmegaDraw) + FSetCoorPatch(ms.nOmegaDraw == 2, x2, y2, 0, x, y, 10, -1); + x2 = x; y2 = y; f = fTrue; } else break; @@ -2315,6 +2558,8 @@ long CMaz::CreateMazeCrack(flag fClear) } else pass++; } + if (ms.nOmegaDraw) + InitCoorPatch(ms.nOmegaDraw == 2, 0); return count; } @@ -2333,6 +2578,8 @@ flag CMaz::ZetaGenerate(flag fClear, int x, int y) while ((y - yl & 3) != 3) y--; count = ((xh - xl) >> 2)*((yh - yl) >> 2) - 1; + if (ms.nOmegaDraw) + InitCoorPatch(ms.nOmegaDraw == 2, count+2); iMax = ms.fRiver ? DIRS2 : 1; Set0(x, y); UpdateDisplay(); @@ -2359,6 +2606,8 @@ flag CMaz::ZetaGenerate(flag fClear, int x, int y) Set0(x + xoff2[d], y + yoff2[d]); Set0(xnew - xoff[d], ynew - yoff[d]); Set0(xnew, ynew); + if (ms.nOmegaDraw) + FSetCoorPatch(ms.nOmegaDraw == 2, x, y, 0, xnew, ynew, 10, -1); x = xnew; y = ynew; pass = 0; fHunt = fFalse; @@ -2406,7 +2655,15 @@ flag CMaz::CreateMazeZeta() MazeClear(fOn); MakeEntranceExit(3); UpdateDisplay(); - return ZetaGenerate(fTrue, Rnd(xl + 3, xh), Rnd(yl + 3, yh)); + if (!ZetaGenerate(fTrue, Rnd(xl + 3, xh), Rnd(yl + 3, yh))) + return fFalse; + if (ms.nOmegaDraw) { + FSetCoorPatch(ms.nOmegaDraw == 2, ms.xEntrance, 0, 0, ms.xEntrance, 3, 10, + -1); + FSetCoorPatch(ms.nOmegaDraw == 2, ms.xExit, m_y-1, 0, ms.xExit, m_y-4, 10, + -1); + } + return fTrue; } diff --git a/daedalus.cpp b/daedalus.cpp index 3782c7b..c5254b2 100644 --- a/daedalus.cpp +++ b/daedalus.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: daedalus.cpp +** Daedalus (Version 3.4) File: daedalus.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** underlying operating system. ** ** Created: 11/18/1993. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -94,9 +94,9 @@ DR dr = { -1, -1, -1, -1, -1, -1, fFalse, 94001225, 0, 0, 50, 333, fFalse, fFalse, -1, fFalse, fFalse, fFalse, fFalse, fFalse, fFalse, fFalse, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - fFalse, fFalse, 11, 3412, 4, 427, 0, 0, + fFalse, fFalse, fFalse, 11, 3412, 4, 427, 0, // Internal settings - fFalse, 0.0, NULL, 0, NULL, NULL, NULL, NULL, 50, 40, 99999}; + fFalse, 0, 0.0, NULL, 0, NULL, NULL, NULL, NULL, 50, 40, 99999, 0}; // Constant data @@ -119,7 +119,7 @@ CONST char *rgszScript[cmdScriptLast - cmdScript01 + 1] = { "survmaz0.ds", "survmaz1.ds", "survmaz2.ds", "survmaz3.ds", "survmaz4.ds", "survmaz5.ds", "survmaz6.ds", "survmaz7.ds", "survmaz8.ds", "survmaz9.ds", "carletn1.ds", "carletn2.ds", "stocker.ds", "glacier.ds", "safari.ds", - "mousemaz.ds", "squared.ds", "mandy.ds", "pentris.ds"}; + "mousemaz.ds", "squared.ds", "mandy.ds", "pentris.ds", "gripsox.ds"}; CONST char *rgszShortcut[cmdScriptLast - cmdScript01 + 1] = { "Daedalus demos", "Word Mazes", "World's largest Maze", "4D Mazes", "5D Mazes", "Dragonslayer", @@ -130,7 +130,8 @@ CONST char *rgszShortcut[cmdScriptLast - cmdScript01 + 1] = { "Survivor Maze game #7", "Survivor Maze game #8", "Survivor Maze game #9", "Carleton Farm Maze #1", "Carleton Farm Maze #2", "Stocker Farms Maze", "Glacier Maze game", "Safari Maze", "Mouse Maze game", - "Survivor Squares game", "Mandelbrot set", "Pentris"}; + "Survivor Squares game", "Mandelbrot set", "Pentris", + "Grippy Socks"}; // Command lines to run on startup. When embedding a complex script file, in // it first delete the leading DS, then replace \ with \\, " with \", and ? @@ -188,14 +189,27 @@ byte BRead(FILE *file) // Initialize a new wireframe list in memory of the specified size. -flag FInitCoordinates(int cCoor) +int InitCoordinates(int cCoor) { + COOR *coor; + flag fExtend = cCoor < 0; + + if (cCoor == 0) + cCoor = ds.cCoorPatch; + else if (fExtend) + cCoor = NAbs(cCoor); + if (cCoor == bm.ccoor) + return bm.ccoor; + coor = (COOR *)ReallocateArray(bm.coor, bm.ccoor, sizeof(COOR), cCoor); + if (coor == NULL) + return -1; if (bm.coor != NULL) DeallocateP(bm.coor); - bm.coor = RgAllocate(cCoor, COOR); + bm.coor = coor; bm.ccoor = cCoor; - ds.cCoorPatch = 0; - return bm.coor != NULL; + if (!fExtend) + ds.cCoorPatch = 0; + return bm.ccoor; } @@ -203,6 +217,9 @@ flag FInitCoordinates(int cCoor) flag FSetCoordinates(int x1, int y1, int z1, int x2, int y2, int z2, KV kv) { + if (ds.cCoorPatch >= bm.ccoor && InitCoordinates(bm.ccoor * -2) < 0) + return fFalse; + Assert(ds.cCoorPatch < bm.ccoor); WriteCoordinates(bm.coor, x1, y1, z1, x2, y2, z2, kv < 0 ? ds.kvTrim : kv); return fTrue; } @@ -210,14 +227,27 @@ flag FSetCoordinates(int x1, int y1, int z1, int x2, int y2, int z2, KV kv) // Initialize a new patch list in memory of the specified size. -flag FInitPatch(int cPat) +int InitPatch(int cPat) { + PATCH *patch; + flag fExtend = cPat < 0; + + if (cPat == 0) + cPat = ds.cCoorPatch; + else if (fExtend) + cPat = NAbs(cPat); + if (cPat == bm.cpatch) + return bm.cpatch; + patch = (PATCH *)ReallocateArray(bm.patch, bm.cpatch, sizeof(PATCH), cPat); + if (patch == NULL) + return -1; if (bm.patch != NULL) DeallocateP(bm.patch); - bm.patch = RgAllocate(cPat, PATCH); + bm.patch = patch; bm.cpatch = cPat; - ds.cCoorPatch = 0; - return bm.patch != NULL; + if (!fExtend) + ds.cCoorPatch = 0; + return bm.cpatch; } @@ -227,15 +257,41 @@ flag FSetPatch(int x1, int y1, int z1, int x2, int y2, int z2, KV kv) { PATN pat[cPatch]; + if (ds.cCoorPatch >= bm.cpatch && InitPatch(bm.cpatch * -2) < 0) + return fFalse; pat[0].x = x1; pat[0].y = y1; pat[0].z = z1; pat[0].fLine = fTrue; pat[1].x = x1; pat[1].y = y1; pat[1].z = z2; pat[1].fLine = fTrue; pat[2].x = x2; pat[2].y = y2; pat[2].z = z2; pat[2].fLine = fTrue; pat[3].x = x2; pat[3].y = y2; pat[3].z = z1; pat[3].fLine = fTrue; + Assert(ds.cCoorPatch < bm.cpatch); WritePatch(bm.patch, pat, fFalse, kv < 0 ? ds.kvObject : kv); return fTrue; } +// Initialize either the wireframe or patch list in memory to a given size. + +int InitCoorPatch(flag fPatch, int cCoorPatch) +{ + if (!fPatch) + return InitCoordinates(cCoorPatch); + else + return InitPatch(cCoorPatch); +} + + +// Append either a line or patch to the wireframe or patch list in memory. + +flag FSetCoorPatch(flag fPatch, int x1, int y1, int z1, int x2, int y2, int z2, + KV kv) +{ + if (!fPatch) + return FSetCoordinates(x1, y1, z1, x2, y2, z1/*z2*/, kv); + else + return FSetPatch(x1, y1, z1, x2, y2, z2, kv); +} + + /* ****************************************************************************** ** Daedalus Routines @@ -295,6 +351,7 @@ flag FReadDaedalusBitmap(FILE *file) skipcrlf(); } else { ws.iszStartup++; + ws.ichStartup = 0; } if (z == 1) { if (bm.b.FReadDaedalusBitmapCore(file, x, y)) @@ -687,8 +744,7 @@ CMaz *BitmapGetMask(int ib) if (pbT == NULL) return NULL; for (iT = ws.cbMask; iT <= ib; iT++) - new(&pbT[iT]) CMaz(); - //pbT[iT].CMaz::CMaz(); + new(&pbT[iT]) CMaz(); // Effectively does: pbT[iT].CMaz::CMaz(); if (ws.rgbMask != NULL) DeallocateP(ws.rgbMask); ws.rgbMask = pbT; @@ -725,8 +781,7 @@ CMazK *ColmapGetTexture(int ic) if (pcT == NULL) return NULL; for (iT = ws.ccTexture; iT <= ic; iT++) - new(&pcT[iT]) CMazK(); - //pcT[iT].CMazK::CMazK(); + new(&pcT[iT]) CMazK(); // Effectively does: pcT[iT].CMazK::CMazK(); if (ws.rgcTexture != NULL) DeallocateP(ws.rgcTexture); ws.rgcTexture = pcT; @@ -3008,6 +3063,10 @@ void *PAllocate(long lcb) char sz[cchSzMax]; void *pv; +#ifndef PC + // For Unix systems in which longs are 8 bytes instead of 4 bytes. + lcb += 4; +#endif #ifdef DEBUG pv = malloc(lcb + sizeof(dword)*3); #else diff --git a/daedalus.def b/daedalus.def index 8a78c60..baf29b4 100644 --- a/daedalus.def +++ b/daedalus.def @@ -1,8 +1,8 @@ -; Daedalus (Version 3.3) File: daedalus.def +; Daedalus (Version 3.4) File: daedalus.def ; By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ; ; IMPORTANT NOTICE: Daedalus and all Maze generation and general -; graphics routines used in this program are Copyright (C) 1998-2018 by +; graphics routines used in this program are Copyright (C) 1998-2023 by ; Walter D. Pullen. Permission is granted to freely use, modify, and ; distribute these routines provided these credits and notices remain ; unmodified with any altered or distributed versions of the program. @@ -19,10 +19,10 @@ ; General Public License for more details, a copy of which is in the ; LICENSE.HTM included with Daedalus, and at http://www.gnu.org ; -; Last code change: 11/28/2018. +; Last code change: 8/29/2023. NAME DAEDALUS -DESCRIPTION "Daedalus 3.3 - By Walter D. Pullen" +DESCRIPTION "Daedalus 3.4 - By Walter D. Pullen" EXETYPE WINDOWS STUB 'WINSTUB.EXE' CODE PRELOAD MOVEABLE DISCARDABLE diff --git a/daedalus.doc b/daedalus.doc index f2ac3f0cb9b2112a1306b8f2949fd22649502664..1e6f691555f97c8df04afd24c107888154147c28 100644 GIT binary patch delta 85845 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

Z!*0;R@Cr#vc%#238<>C(W3!h1S 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 delta 76425 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 diff --git a/daeicon5.ico b/daeicon5.ico new file mode 100644 index 0000000000000000000000000000000000000000..09b26f6059768c161dc0b93dcc52001475efca04 GIT binary patch literal 19030 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 literal 0 HcmV?d00001 diff --git a/daeicon6.ico b/daeicon6.ico new file mode 100644 index 0000000000000000000000000000000000000000..b4f2254c0853207590a770ffef4c9c4eb839332f GIT binary patch literal 2734 zcmbW3J#O1T5QRsv5kmk0=>(C=l&;b$M@gAmm{nT4W#y~v0SNdCDpRVA070AY&Fn5I z$u5!+hi_+gewNhiEX@{nXWQ-C%?C$n#i9v?&g`PuBto!NRF^4Epgucg^nY_{-s zc!8f2zLjJx4(iRgtnUN3GqjWvsEO>C<*X6RPb%GRX?Yw5T`y(obr|9bc^R|ZLtfSC z*Knxr!*FneW$`A42ejx z2rVbk<>YILn;gcO;#$6OxHQ*$okg1s&$h^aCxFDSp~tU7;$f55fQ`+I~!Yfv228>J2R0o)n> zZ=DmU(y`TC)i}1wW-yzWDjYvvR;5`bUpP=mQ-V@r@|lOPr5E~{dEI7AOdG{LW$HAK z&iJM2FCB`$Q{~9gjZWELVt<+83L2oc9 z9;iGv2`W|n$}>bS&|KA9JVZ1Z^m=tpk)#D`dVjB_>CEl5DyRl(_Db-s-qkJ8WZ(Hj zNj#~&RnW^O3%+blz6O zGZI`yK~$hyt@Q6{FLm_7ICB%tRcCKca}{E?D)<1Nk?*c>QRIqpqF=l7Uid^0EZ7To z(I$mXn=4c|7gbbe7lFNy?p`rT=9^?+(DNeG&s|S1cWRi6+^~;%JusAW3O^zFvJMN@ zDb(|2KRD({M%Py)vC9=%fXh0`A84?h^g~IH>>8caPN2Nqz2xYEl~kO~3KP0$>to lrxi?ry6^c<6Yo{rx09L){xeYz^Cq437oM;=V=K-Zv%em*l0pCg literal 0 HcmV?d00001 diff --git a/draw.cpp b/draw.cpp index 4e111f8..baceda5 100644 --- a/draw.cpp +++ b/draw.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: draw.cpp +** Daedalus (Version 3.4) File: draw.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** Mazes. ** ** Created: 6/15/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -44,9 +44,9 @@ DS ds = { fTrue, fFalse, fFalse, fTrue, fFalse, fFalse, 1, 1, 200.0, 20.0, 20.0, 20.0, kvBlack, kvBlue, kvYellow, kvGray, kvGreen, kvRed, {100.0, 75.0, 50.0}, // Inside settings - fFalse, 500, + fFalse, 500, 0, // Macro accessible only settings - 10990099, fFalse, fFalse, 0, 0, 0, 1000, fTrue, 0, + 10990099, -1, fFalse, fFalse, 0, 0, 0, 1000, fTrue, 0, fFalse, // Internal settings fFalse, xStart, 0.0, 0, NULL}; @@ -1273,7 +1273,7 @@ void WriteWireframeMetafile(FILE *file, CONST COOR *coor, long ccoor) MetaLong(14); // Bytes in string MetaLong(LFromBB('D', 'a', 'e', 'd')); // "Daed" MetaLong(LFromBB('a', 'l', 'u', 's')); // "alus" - MetaLong(LFromBB(' ', '3', '.', '3')); // " 3.3" + MetaLong(LFromBB(' ', '3', '.', '4')); // " 3.4" MetaWord(WFromBB('0', 0)); // "0" MetaSaveDc(); MetaWindowOrg(xmin, ymin); diff --git a/draw.h b/draw.h index 4e801f5..96ea19f 100644 --- a/draw.h +++ b/draw.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: draw.h +** Daedalus (Version 3.4) File: draw.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** graphics routines, unrelated to Mazes. ** ** Created: 6/15/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ /* @@ -39,6 +39,8 @@ ((int)(((c).Get3(x, y, z) >> ((d) * 6)) & (cTexture-1))) #define SetT3(c, x, y, z, d, t) ((c).Get3(x, y, z) & \ ~((KV)(cTexture-1) << ((d) * 6)) | ((KV)(t) << ((d) * 6))) +#define SetU3(c, x, y, z, f, t) ((c).Get3(x, y, z) & \ + ~((KV)4095 << ((f) * 12)) | ((KV)(t) << ((f) * 12))) /* @@ -98,12 +100,14 @@ typedef struct _drawsettings { // Inside settings - flag fStar; - int cStar; + flag fStar; // Used by Inside view too + int cStar; // Used by Inside view too + int nStereo; // Used by Inside view too // Macro accessible only settings long lStarColor; // Used by Inside view too + int nStarSize; // Used by Inside view too flag fSkyAll; // Used by Inside view too flag fArrowFree; int nTrans; @@ -112,6 +116,7 @@ typedef struct _drawsettings { int nWireDistance; flag fWireSort; int nFaceOrigin; + flag fStereo3D; // Used by Inside view too // Internal settings @@ -210,7 +215,9 @@ extern flag CreateSolids(CONST char *); extern KV KvStarRandom(void); extern void CalculateCoordinate(int *, int *, real, real, real); +extern flag FRenderPerspectiveWireCore(CMap &, COOR *, long); extern flag FRenderPerspectiveWire(CMap &, COOR *, long); +extern flag FRenderPerspectivePatchCore(CMap &, PATCH *, long); extern flag FRenderPerspectivePatch(CMap &, PATCH *, long); extern flag FRenderAerial(CMap &, CONST COOR *, long); extern long ConvertPatchToWire(COOR **, CONST PATCH *, long); diff --git a/draw2.cpp b/draw2.cpp index 9c6d4a1..17521a7 100644 --- a/draw2.cpp +++ b/draw2.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: draw2.cpp +** Daedalus (Version 3.4) File: draw2.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** Mazes. ** ** Created: 7/17/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -119,7 +119,8 @@ flag FRenderInitialize(CMap &b, real theta, real phi) CalculateCoordinate(&x, &y, rx, ry, rz); kv = fColor ? ds.rgstar[i].kv : fOff; b.Set(x, y, kv); - if (FOdd(i)) + if (ds.nStarSize < 0 ? FOdd(i) : + RgbR(kv) + RgbG(kv) + RgbB(kv) >= ds.nStarSize) for (d = 0; d < DIRS; d++) b.Set(x+xoff[d], y+yoff[d], kv); } @@ -144,6 +145,64 @@ void RenderFinalize(CMap &b) } +// Draw a stereoscopic 3D version of a wireframe or patch list to a color or +// monochrome bitmap. This involves drawing "left eye" and "right eye" +// versions of the scene from slightly different points of view. + +flag FRenderPerspectiveStereo(CMap &b, COOR *coor, long ccoor, + PATCH *patch, long cpatch) +{ + int mSav = ds.hormin, nSav = ds.vermin, dSav = ds.theta, x, f, m, n; + flag fWire = coor != NULL, fRet = fFalse; + CMap *bs = NULL; + CCol *c, *cs; + + x = !ds.fStereo3D ? b.m_x >> 1 : b.m_x; + bs = b.Create(); + if (bs == NULL || !bs->FBitmapSizeSet(x, b.m_y)) + goto LExit; + f = FOdd(b.m_x) && !ds.fStereo3D; + m = NCosRD(ds.nStereo, ds.theta); n = NSinRD(ds.nStereo, ds.theta); + + // Draw left eye view of scene. + ds.hormin += m; ds.vermin += n; //ds.theta += 1; + if (!(fWire ? FRenderPerspectiveWireCore(*bs, coor, ccoor) : + FRenderPerspectivePatchCore(*bs, patch, cpatch))) + goto LExit; + if (ds.fStereo3D && b.FColor()) { + c = dynamic_cast(&b); + cs = dynamic_cast(bs); + cs->ColmapGrayscale(); + cs->ColmapOrAndKv(kvCyan, 0); + } + b.BlockMove(*bs, 0, 0, x-1, b.m_y-1, 0, 0); + + // Draw right eye view of scene. + ds.hormin -= m*2; ds.vermin -= n*2; //ds.theta -= 1*2; + if (!(fWire ? FRenderPerspectiveWireCore(*bs, coor, ccoor) : + FRenderPerspectivePatchCore(*bs, patch, cpatch))) + goto LExit; + if (!ds.fStereo3D) + b.BlockMove(*bs, 0, 0, x-1, b.m_y-1, x+f, 0); + else if (b.FColor()) { + cs->ColmapGrayscale(); + cs->ColmapOrAndKv(kvRed, 0); + c->ColmapOrAnd(*cs, 1); + } + + // Draw line down middle if outer bitmap is odd sized. + if (f) + b.LineY(x, 0, b.m_y-1, ds.kvTrim); + ds.hormin = mSav; ds.vermin = nSav; ds.theta = dSav; + + fRet = fTrue; +LExit: + if (bs != NULL) + bs->Destroy(); + return fRet; +} + + // Return a randomly chosen color for a star or meteor. KV KvStarRandom() @@ -342,7 +401,7 @@ void PushdownWire(COOR *coor, long p, long size) // Implements the Render Wireframe Perspective command for both monochrome and // color bitmaps. -flag FRenderPerspectiveWire(CMap &b, COOR *coor, long ccoor) +flag FRenderPerspectiveWireCore(CMap &b, COOR *coor, long ccoor) { COOR *coorT, coorSwap; long ccoor2 = 0, ccoor3 = 0, i; @@ -491,6 +550,17 @@ flag FRenderPerspectiveWire(CMap &b, COOR *coor, long ccoor) } +// Like FRenderPerspectiveWireCore but handles stereoscopic rendering of two +// images side by side if that setting is in effect. + +flag FRenderPerspectiveWire(CMap &b, COOR *coor, long ccoor) +{ + if (ds.nStereo != 0) + return FRenderPerspectiveStereo(b, coor, ccoor, NULL, 0); + return FRenderPerspectiveWireCore(b, coor, ccoor); +} + + /* ****************************************************************************** ** Render Perspective Patches @@ -521,7 +591,7 @@ void PushdownPatch(PATCH *patch, long p, long size) // patches in 3D space. Implements the Render Wireframe Perspective command // for both monochrome and color bitmaps. -flag FRenderPerspectivePatch(CMap &b, PATCH *patch, long cpatch) +flag FRenderPerspectivePatchCore(CMap &b, PATCH *patch, long cpatch) { PATCH *patchT, patT; PATR patrT; @@ -809,6 +879,17 @@ flag FRenderPerspectivePatch(CMap &b, PATCH *patch, long cpatch) } +// Like FRenderPerspectivePatchCore but handles stereoscopic rendering of two +// images side by side if that setting is in effect. + +flag FRenderPerspectivePatch(CMap &b, PATCH *patch, long cpatch) +{ + if (ds.nStereo != 0) + return FRenderPerspectiveStereo(b, NULL, 0, patch, cpatch); + return FRenderPerspectivePatchCore(b, patch, cpatch); +} + + /* ****************************************************************************** ** Other Render Routines diff --git a/game.cpp b/game.cpp index e26fc28..22276a5 100644 --- a/game.cpp +++ b/game.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: game.cpp +** Daedalus (Version 3.4) File: game.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** come with Daedalus. ** ** Created: 11/6/2018. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include diff --git a/graphics.cpp b/graphics.cpp index d151b46..029f4ae 100644 --- a/graphics.cpp +++ b/graphics.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: graphics.cpp +** Daedalus (Version 3.4) File: graphics.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** bitmap, unrelated to Mazes. ** ** Converted from Modula2: 3/8/1991. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -90,18 +90,18 @@ CONST char *szTurtleCh1[128-32] = { "BRGFEHBR3"}; // Symbols // Turtle font for 5x9 characters. -CONST char *szTurtleCh2[256-32] = { - "", "BR2D4BD2D0", "BRD2BR2U2", "BD2R4BD2L4BD2BRU6BR2D6", - "BR2D6BENL3EHL2HER3", "RDLNUBR4G4BR4DLUR", "BD2NF4UEFDG2DFRE2", "BR2DG", - "BR3G2D2F2", "BRF2D2G2", "BD2FNGRNU2ND2RNEF", "BD3R2NU2ND2R2", "BD5BR2DG", - "BD3R4", "BD6BRRULD", "BD5E4", // Symbols +CONST char *szTurtleCh2[256-32] = {"", + "BR2D4BD2D0", "BRD2BR2U2", "BD2R4BD2L4BFU4BR2D4", "BR2D6BENL3EHL2HER3", + "RDLNUBR4G4BR4DLUR", "BD2NF4UEFDG2DFRE2", "BR2DG", "BR3G2D2F2", "BRF2D2G2", + "BD2FNGRNU2ND2RNEF", "BD3R2NU2ND2R2", "BD5BR2DG", "BD3R4", "BD6BRRULD", + "BD5E4", // Special Characters "BDD4NE4FR2EU4HL2G", "BFED6NLR", "BDER2FDG4R4", "BDER2FDGNLFDGL2H", "D3R3NU3ND3R", "NR4D3R3FDGL2H", "BR3NFL2GD4FR2EUHL3", "R4DG4D", "BDDFNR2GDFR2EUHEUHL2G", "BD5FR2EU4HL2GDFR3", // Numbers "BR2BD2D0BD2D0", "BR2BD2D0BD2G", "BR3G3F3", "BD2R4BD2L4", "BRF3G3", - "BDER2FDGLDBD2D0", "BF2DFEU2HL2GD4FR2", // Symbols + "BDER2FDGLDBD2D0", "BF2DFEU2HL2GD4FR2", // Special Characters "BD6U4E2F2D2NL4D2", "D6R3EUHNL3EUHL3", "BR3NFL2GD4FR2E", "D6R2E2U2H2L2", "NR4D3NR3D3R4", "NR4D3NR3D3", "BR3NFL2GD4FR2EU2L2", "D3ND3R4NU3D3", @@ -121,22 +121,22 @@ CONST char *szTurtleCh2[256-32] = { "BD2D3FRE2NU2D2", "BD2DFDFEUEU", "BD2D3FENUFEU3", "BD2F2NG2NE2F2", "BD2D3FR2ENU3D2GL3", "BD2R4G4R4", // Lower Case Letters - "BR3GDGFDF", "BR2D2BD2D2", "BRFDFGDG", "BFEFE", "BR2GFEH", // Symbols + "BR3GDGFDF", "BR2D2BD2D2", "BRFDFGDG", "BFEFE", "", // Symbols "BR3NFLGDNRNLD2NRNLDFRE", "BR2FGHE", "BR2BD4DG", "BR4LGD2NRNLD2GL", "BD6EBFE", "BD6D0BR2D0BR2D0", "BR2DNL2NR2D4", "BR2DNL2NR2D4NL2NR2D", "BR2NGF", "RDLNUBR4G2L2BD2RDLUBR3RDLU", "BD5FR2EUHL2HUER2NFBU2GH", "BF2FG", - "BRNRGD4FRNR2U3NR2U3R2", "", "R4DG4DR4BU6BHHG", "", // 80-8F + "BRNRGD4FRNR2U3NR2U3R2", "", "R4DG4DR4BU8BLGH", "", // 80-8F "", "BR3GD", "BR2DG", "BFNDEBFNED", "BD2EUBR2DG", "BD3BRRDLU", "BD3BRR2", - "BD3R4", "BFEFE", "RND2RBRND2FNDED2", "BD6R3EHL2HENR3BU2FE", "BF2GF", - "BD4NED2FRNR2U2R2UHLNLD2", "", "BD6NR4E4L4BUBEFE", + "BD3R4", "BFEFE", "RND2RBRND2FNDED2", "BD6R3EHL2HENR3BU3FE", "BF2GF", + "BD3NED2FRNR2U2R2UHLNLD2", "", "BD6NR4E4L4BU3BRFE", "D2FRND3REU2BUBHD0BL2D0", // 90-9F - "", "BR2D0BD2D4", "BR2DND6NLRFBL4NED3FR2E", "BD6NR4EU2NLNR2U2ERF", + "", "BR2D0BD2D4", "BR2DND6NLRFBL4NED3FR2E", "BD6RNR3U3NLNR2U2ERF", "BDFEFNEFGNFGHNGHE", "F2NE2DNL2NR2D2NL2NR2D", "BR2D2BD2D2", "BD6R3EHNL2EHL2GFBU2HER3", "BRD0BR2D0", "BD2ER2FD2GL2HU2BR3LGFR", - "BF4U2NUG2LHU2ER2F", "BD3NFEBR3GF", "BD2R4D", "BD3BRR2", + "BF4U2NUG2LHU2ER2FBD5L4", "BD3NFEBR3GF", "BD2R4D", "BD3BRR2", "BD2ER2FD2GL2HU2BRND2R2DLNLF", "BRR2", // A0-AF "BR2FGHE", "BR2D2NL2NR2D2BG2R4", "BRR2DL2DR2", "BRR2DNLDL2", "BR3G", @@ -162,15 +162,15 @@ CONST char *szTurtleCh2[256-32] = { "BF4G2LHU2ER2FD3BU6BLH", "BF4G2LHU2ER2FD3BU6BL2E", "BF4G2LHU2ER2FD3BU6BLHG", "BF4G2LHU2ER2FD3BU7GHG", "BF4G2LHU2ER2FD3BU6BLD0BL2D0", "BF4G2LHU2ER2FD3BU6BL2D0", "BD2R3FDL3GDR2NR2U4", "BF4BUHL2GD2FR2EBG3RU2", - "BD4R4UHL2GD2FR3BU5BL2H", "BD4R4UHL2GD2FR3BU6BLG", "BD4R4UHL2GD2FR3BU5BLHG", - "BD4R4UHL2GD2FR3BU6BLD0BL2D0", "BRFBD2D3", "BR3GBD2D3", "BFENFBD3D3", + "BD4R4UHL2GD2FR3BU6BL2H", "BD4R4UHL2GD2FR3BU7BLG", "BD4R4UHL2GD2FR3BU6BLHG", + "BD4R4UHL2GD2FR3BU6BLD0BL2D0", "BEFBD2D4", "BR2NEBD2D4", "BRENFBD3D4", "BRD0BR2D0BLBD2D4", // E0-EF - "BR3DNLNRD4NDGLHUERF", "BD2DND3ER2FD3BU6GHG", "BD3D2FR2EU2HL2NGBEH", - "BD3D2FR2EU2HL2NGBEE", "BD3D2FR2EU2HL2NGBUEF", "BD3D2FR2EU2HL2NGBUEFE", + "BR3DNLNRD2FDGL2HUER2", "BD2DND3ER2FD3BU7GHG", "BD3D2FR2EU2HL2NGBU3F", + "BD3D2FR2EU2HL2NGBUBEE", "BD3D2FR2EU2HL2NGBU2EF", "BD3D2FR2EU2HL2NGBU2EFE", "BD3D2FR2EU2HL2NGBU2D0BR2D0", "BD3R4BH2D0BD4D0", "BD3D2FR2EU2HL2GD2BDE4", - "BD2D3FRE2ND2U2BHBLH", "BD2D3FRE2ND2U2BHBLE", "BD2D3FRE2ND2U2BHHG", - "BD2D3FRE2ND2U2BHBUD0BL2D0", "BD8R3EU2NU3GL2HU3BEBRE", "D5ND3FR2EU2HL2G", + "BD2D3FRE2ND2U2BH2H", "BD2D3FRE2ND2U2BH2E", "BD2D3FRE2ND2U2BUBHHG", + "BD2D3FRE2ND2U2BHBUD0BL2D0", "BD8R3EU2NU3GL2HU3BE2E", "D5ND3FR2EU2HL2G", "BD8R3EU2NU3GL2HU3BEBUD0BR2D0"}; // F0-FF // Turtle font for 8x13 unicursal characters. @@ -225,6 +225,98 @@ CONST char *szTurtleCh3[128-32] = { "RU2RURU2RU3LU2LULUR2DRD2RD2R2DL2D2LD2LDLDR5", "U10RURURDRDRURURD12", "R3U8LULU2RUR3DRD2LDLD8R3"}; // Symbols +// Turtle font for 8x14 characters. +CONST char *szTurtleCh4[256-32] = {"", + "BR3D5BD3D", "BR2D3BR3U3", "BD3R6BD3L6BF2U7BR2D7", + "BR3D9BH2BLFR4EU2HL4HUER4F", "RDLNUBR6G6BR6DLUR", "BD3NF6U2ERFD2G3D2FR2E3", + "BR3DG", "BR4G3D3F3", "BR2F3D3G3", "BD2F2NG2RNU3ND3RNE2F2", "BD4R3NU3ND3R3", + "BR3BD8DG", "BD4R6", "BD9BR2RULD", "BD7E6", // Special Characters + + "BD2D5NE5F2R2E2U5NLH2L2G2", "BR3NG2D9NL2R2", "BD2E2R2F2DG6R6", + "BD2E2R2F2G2NLF2DG2L2H2", "D5R4NU5ND4R2", "NR6D4R4F2DG2L2H2", + "BR4NF2L2G2D5F2R2E2UH2L2G2", "R6DG6D2", "BD2F2NR2G2DF2R2E2UH2E2H2L2G2", + "BD7F2R2E2U5H2L2G2DF2R2E2", // Numbers + + "BR2BD2DRULBD4DRUL", "BR2BD2DRULBD4RDG", "BR4G4F4", "BD3R6BD3L6", "BRF4G4", + "BD2E2R2F2DG2LD2BD2D0", "BF3RDLNUDFREU3H2L2G2D5F2R3E", // Special Characters + + "BD9U6E3F3D3NL6D3", "D9R4E2UH2NL4E2H2L4", "BR4NF2L2G2D5F2R2E2", + "D9R3E3U3H3L3", "NR6D4NR5D5R6", "NR6D5NR5D4", "BR4NF2L2G2D5F2R2E2U2L3", + "D4ND5R6NU4D5", "BRR2NR2D9NL2R2", "BD6DF2R2E2U7", "D4ND5R2NE4F4D", "D9R6", + "ND9F3ND2E3D9", "ND9F2DFDFDF2U9", "BD2D5F2R2E2U5H2L2G2", "ND9R4F2DG2L4", + "BD2D5F2R2ENFNH2EU5H2L2G2", "ND9R4F2DG2L2NL2F4", "BR4NF2L2G2F2R2F2DG2L2H2", + "R3NR3D9", "D7F2R2E2U7", "D3FDFDFNDEUEUEU3", "D9E3NU2F3U9", + "DF6D2BL6U2E6U", "D3F2RND4RE2U3", "R6DG6D2R6", // Upper Case Letters + + "BR4L3D9R3", "BDF6", "BRR3D9L3", "BD3E3F3", "BD9R6", "BR3DF", // Symbols + + "BF6G3LH2U2E2R3FD5", "D7ND2F2R2E2U2H2L2G2", "BR6BD4HL3G2D2F2R3E", + "BR6D7ND2G2L2H2U2E2R2F2", "BD6R6UH2L2G2D2F2R3E", "BD4R2NR4ND5U3ER2F", + "BD11FR3E2U5H2L2G2D2F2R2E2", "D5ND4E2R2F2D4", "BR3DBD3D5", "BR4DBD3D7GL2H", + "D6ND3REREREBD6HLHLH", "BR3D9", "BD3DND5ERFND2ERFD5", "BD3D2ND4E2R2F2D4", + "BD5D2F2R2E2U2H2L2G2", "BD3D2ND7E2R2F2D2G2L2H2", + "BR6BD12U7NU2H2L2G2D2F2R2E2", "BD3D2ND4E2R2F2", "BD8FR4EUHL4HUER4F", + "BR3D4NL3NR3D5", "BD3D4F2R2E2NU4D2", "BD3DFDFDFEUEUEU", "BD3D5FRENU2FREU5", + "BD3F3NG3NE3F3", "BD3D4F2R2E2NU4D3G2L4", "BD3R6G6R6", // Lower Case Letters + + "BR4LGD2GFD2FR", "BR3D3BD3D3", "BRRFD2FGD2GL", "BFERFRE", "", // Symbols + + "BR5NFL2G2DNR2NLD2NR2NLD2F2R2E", "BR3FGHE", "BR3BD8DG", "BR5LGD3NR2NL2D4GL", + "BD9BREBFE", "BD9BRD0BR2D0BR2D0", "BR3BDD2NL2NR2D5", + "BR3BDD2NL2NR2D3NL2NR2D2", "BR3NGF", "BRFGHNEBR6GLG2LGBD3EFGHBR4EFGH", + "BU3BR2FEBD3NF2L2G2F2R2F2DG2L2H2", "BR3BD2F2G2", "BR2NRG2D5F2RNR3U5NR2U4R3", + "", "R6DG6D2R6BU12BL2GH", "", // 80-8F + + "", "BR4GD", "BR3DG", "BFNDEBR3GD", "BRBD2EUBR3DG", "BD4BR3RDLU", "BD4BRR4", + "BD4R6", "BRBFEFE", "RND2RBR2ND2FNDED2", "BD8FR4EUHL4HUER4FBH4FE", + "BR4BD2G2F2", "BD4NED4FREU4HLBR3NGRFD2L3BD2FRE", "", "BD3R6G6R6BU9BL2GH", + "D3F2RND4RE2U3BH2D0BL2D0", // 90-9F + + "", "BR3DBD3D5", "BR3D2ND7NL2R2FBL6NED3FR4E", "BD9RNR5U4NLNR4U3E2R2F", + "DFER2FEUBD3NHD2BD3UHNEGL2HGDBU3NFU2E", "F3NE3D2NL2NR2D2NL2NR2D2", + "BR3D3BD3D3", "BD8FR4EUHNL4EUHL4GDFBU3HUER4F", "BR2D0BR2D0", + "BD3E2R2F2D2G2L2H2U2BR4LGFR", "BRBF4U2NUG2LHU2ER2FBD5L4", "BD4NF2E2BR4G2F2", + "BD4R6D2", "BD4BRR4", "BD2E2R2F2D2G2L2H2U2BR2ND2R2DLNLF", "BRR4", // A0-AF + + "BR3FGHE", "BR3D3NL3NR3D3BG3R6", "BRR3FGL2GDR4", "BRR3FGNL3FGL3", "BR4G", + "BD3D4ND5F2RE2NU4DF", "BR6ND9L3ND9LG2D2F2R", "BR3BD4D0", "BR3BD8DL", + "BRR2D4NL2R2", "BR3GD2FR2EU2HL2BLBD6R4", "BD2F2G2BR4E2H2", + "RD3NLRBR4BU2G6BR6ND2NU2L2U2", "RD3NLRBR4BU2G6BR6BD2L2U2R2U2L2", + "R2D2NL2D2L2BR6BU2G6BDBR6UNU2L2U2", "BR3D0BD2D2LG2DF2R2E2", // B0-BF + + "BD9U6E3F3D3NL6D3BU10BL2H", "BD9U6E3F3D3NL6D3BU10BL4E", + "BD9U6E3F3D3NL6D3BU10BL2HG", "BD9U6E3F3D3NL6D3BU11BLGHG", + "BD9U6E3F3D3NL6D3BU11BL2D0BL2D0", "BD9U6E3F3D3NL6D3BU11BL3D0", + "BD9U3NR3U3E3NR3D4NR3D5R3", "BR4NF2L2G2D5F2R2E2BG3DL", + "NR6D4NR5D5R6BU10BL3H", "NR6D4NR5D5R6BU10BL3E", "NR6D4NR5D5R6BU10BL2HG", + "NR6D4NR5D5R6BU11BL2D0BL2D0", "BRR2NR2D9NL2R2BU10BL2H", + "BRR2NR2D9NL2R2BU10BL2E", "BRR2NR2D9NL2R2BU10BLHG", + "BRR2NR2D9NL2R2BU11BLD0BL2D0", // C0-CF + + "BD4RNRD5R2E3U3H3L2D4", "ND9F2DFDFDF2U9BU2BLGHG", "BR2G2D5F2R2E2U5H2L2BEH", + "BR2G2D5F2R2E2U5H2L2BEE", "BR2G2D5F2R2E2U5H2L2BUEF", + "BR2G2D5F2R2E2U5H2L2BUEFE", "BR2G2D5F2R2E2U5H2L2BU2D0BR2D0", "BDF3NE3NG3F3", + "BR2G2D5F2R2E2U5H2L2BR4G2DGDGDG2", "D7F2R2E2U7BL3BUH", "D7F2R2E2U7BL3BUE", + "D7F2R2E2U7BL2BUHG", "D7F2R2E2U7BH2D0BL2D0", "D3F2RND4RE2U3BL3BUE", + "D7ND2R4E2UH2L4", "BD9U7E2R2FDG2DFRFDGL3", // D0-DF + + "BF6G3LH2U2E2R3FD5BU8BL3H", "BF6G3LH2U2E2R3FD5BU8BL3E", + "BF6G3LH2U2E2R3FD5BU8BL2HG", "BF6G3LH2U2E2R3FD5BU9BLGHG", + "BF6G3LH2U2E2R3FD5BU8BL2D0BL2D0", "BF6G3LH2U2E2R3FD5BU8BL3D0", + "BD4ERFD4GLHUER5U2HLGD4FRE", "BR6BD4HL3G2D2F2R3EBG2NUDL", + "BD6R6UH2L2G2D2F2R3EBU7BL3H", "BD6R6UH2L2G2D2F2R3EBU7BL3E", + "BD6R6UH2L2G2D2F2R3EBU7BL2HG", "BD6R6UH2L2G2D2F2R3EBU7BL2D0BL2D0", + "BR2FBD2D6", "BR4GBD2D6", "BR3NGNFBD3D6", "BR2BDD0BR2D0BLBD2D6", // E0-EF + + "BR4DNLNRD3FD2G2L2H2U2E2R2F", "BD3D2ND4E2R2F2D4BU9BLGHG", + "BD5D2F2R2E2U2H2L2G2BE4BLH", "BD5D2F2R2E2U2H2L2G2BE4BLE", + "BD5D2F2R2E2U2H2L2G2BE4HG", "BD5D2F2R2E2U2H2L2G2BE4NEHG", + "BD5D2F2R2E2U2H2L2G2BE4D0BL2D0", "BD4R6BU3BL3D0BD6D0", + "BD5D2F2R2E2U2H2L2NG2BR4G6", "BD3D4F2R2E2ND2U4BH2H", + "BD3D4F2R2E2ND2U4BH2BUG", "BD3D4F2R2E2ND2U4BH2HG", + "BD3D4F2R2E2ND2U4BH2D0BL2D0", "BD3D4F2R2E2NU4D3G2L4BU11BR3E", + "D7ND5F2R2E2U2H2L2G2", "BD3D4F2R2E2NU4D3G2L4BU11BR2D0BR2D0"}; // F0-FF + GS gs = { // Display settings fFalse, fTrue, NULL, @@ -390,7 +482,7 @@ void CMon::Block(int x1, int y1, int x2, int y2, KV o) if (x1 == 0 && x2 == m_x-1) { il1 = _Il(x1, y1); il2 = _Il(x2, y2); - l = o ? ~0 : 0; + l = o ? dwSet : 0; while (il1 <= il2) *_Pl(il1++) = l; goto LDone; @@ -403,7 +495,7 @@ void CMon::Block(int x1, int y1, int x2, int y2, KV o) l2 = ((1L << (x2 & 31 ^ 7)) - 1 ^ (255L << (x2 & 24))); for (y = y1; y <= y2; y++) { for (il = il1; il <= il2; il++) { - l = ~0; + l = dwSet; if (il == il1 && (x1 & 31) > 0) l &= l1; if (il == il2) @@ -538,7 +630,7 @@ void CMon::LineX(int x1, int x2, int y, KV o) // Quickly draw the line, setting up to 32 pixels at a time. il1 = _Il(x1, y); il2 = _Il(x2, y); for (il = il1; il <= il2; il++) { - l = ~0; + l = dwSet; if (il == il1 && (x1 & 31) > 0) l &= ~((1L << (x1-1 & 31 ^ 7)) - 1 ^ (255 << (x1-1 & 24))); if (il == il2) @@ -1289,7 +1381,7 @@ flag CMon::Turtle(CONST char *szCmd) chT = szCmd[index++]; if (chT == chNull) goto LDone; - if (FBetween(chT, '0', '2')) { + if (FBetween(chT, '0', '3')) { gs.turtlet = (chT - '0'); break; } @@ -1328,6 +1420,13 @@ flag CMon::Turtle(CONST char *szCmd) Turtle(szTurtleCh3[ch - 32]); Turtle("R2"); break; + case 3: + x = gs.turtlex; y = gs.turtley; + Turtle(szTurtleCh4[ch - 32]); + i = 9 * gs.turtles; + gs.turtlex = x + xoff[gs.turtlea ^ 3]*i; // 1, 0, -1, 0 + gs.turtley = y + yoff[gs.turtlea ^ 3]*i; // 0, 1, 0, -1 + break; } } } @@ -1538,7 +1637,7 @@ void CMon::BitmapSet(KV o) dword l; long clBitmap, il; - l = o ? ~0 : 0; + l = o ? dwSet : 0; clBitmap = CbBitmap(m_x, m_y) >> 2; // Set 32 pixels at a time. for (il = 0; il < clBitmap; il++) @@ -1557,7 +1656,7 @@ void CMon::BitmapReverse() clBitmap = CbBitmap(m_x, m_y) >> 2; // Invert 32 pixels at a time. for (il = 0; il < clBitmap; il++) - *_Pl(il) ^= ~0; + *_Pl(il) ^= dwSet; } @@ -2911,7 +3010,7 @@ void CMon::WriteXbm(FILE *file, CONST char *szName, char mode) CONST sprintf(S(sz), "%s", szName); for (pchEnd = sz; *pchEnd != chNull; pchEnd++) ; - for (pchStart = pchEnd; pchStart > szName && *pchStart != '\\'; pchStart--) + for (pchStart = pchEnd; pchStart > sz && *pchStart != '\\'; pchStart--) ; if (*pchStart == '\\') pchStart++; diff --git a/graphics.h b/graphics.h index d573cf4..0479abd 100644 --- a/graphics.h +++ b/graphics.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: graphics.h +** Daedalus (Version 3.4) File: graphics.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** on a monochrome bitmap, unrelated to Mazes. ** ** Created: 7/1/1993. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ /* @@ -160,7 +160,7 @@ class CMap // Base bitmap independent of pixel type INLINE void BitmapOff() { BitmapSet(0); } INLINE void BitmapOn() - { BitmapSet(~0); } + { BitmapSet(dwSet); } INLINE void Edge(int x1, int y1, int x2, int y2, KV kv) { Box(x1, y1, x2, y2, 1, 1, kv); } INLINE void BoxAll(int xsiz, int ysiz, KV kv) diff --git a/inside.cpp b/inside.cpp index e6cb05b..8afd204 100644 --- a/inside.cpp +++ b/inside.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: inside.cpp +** Daedalus (Version 3.4) File: inside.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** from inside a Maze's passages. ** ** Created: 6/2/2001. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -115,6 +115,8 @@ void LineYGradient(CMazK &c, int x, int y1, int y2, KV kv1, KV kv2) yClip1 = 0; if (yClip2 > c.m_y) yClip2 = c.m_y; + if (yClip1 < dr.yElevMin) + yClip1 = dr.yElevMin; if (yClip2 > dr.yElevMax) yClip2 = dr.yElevMax; if (yClip2 <= yClip1) @@ -170,6 +172,8 @@ void LineYTrans(CMazK &c, int x, int y1, int y2, KV kv, int nTrans) y1 = 0; if (y2 > c.m_y) y2 = c.m_y; + if (y1 < dr.yElevMin) + y1 = dr.yElevMin; if (y2 > dr.yElevMax) y2 = dr.yElevMax; @@ -219,6 +223,8 @@ void LineYTexture( y1 = 0; if (y2 > cDst.m_y) y2 = cDst.m_y; + if (y1 < dr.yElevMin) + y1 = dr.yElevMin; if (y2 > dr.yElevMax) y2 = dr.yElevMax; @@ -405,6 +411,8 @@ void LineYMask( y1 = 0; if (y2 > cDst.m_y) y2 = cDst.m_y; + if (y1 < dr.yElevMin) + y1 = dr.yElevMin; if (y2 > dr.yElevMax) y2 = dr.yElevMax; @@ -486,6 +494,8 @@ void LineYFloor(CMazK &c, int x, int yb, int dy1, int dy2, y1 = 0; if (y2 > c.m_y) y2 = c.m_y; + if (y1 < dr.yElevMin) + y1 = dr.yElevMin; if (y2 > dr.yElevMax) y2 = dr.yElevMax; @@ -582,6 +592,8 @@ void LineYFloorTexture(CMazK &cDst, int x, int yb, int dy1, int dy2, rdy1 = (real)dy1; if (y2 > cDst.m_y) y2 = cDst.m_y; + if (y1 < dr.yElevMin) + y1 = dr.yElevMin; if (y2 > dr.yElevMax) y2 = dr.yElevMax; rddy = (real)(dy2 - dy1); @@ -683,8 +695,9 @@ void LineYFloorTexture(CMazK &cDst, int x, int yb, int dy1, int dy2, flag FCreateInsideStars(CMazK *c, real rd, int yAdd, flag fPerspective) { - int i, x, y; + int i, x, y, d; real rx, dInside2 = dr.dInside*2.0, rT; + KV kv; // If the list of stars hasn't been generated yet, do so first. if (dr.rgstar == NULL) { @@ -718,8 +731,14 @@ flag FCreateInsideStars(CMazK *c, real rd, int yAdd, flag fPerspective) x = c->m_x-1 - (int)((real)c->m_x * rx); y = yAdd + (int)((real)(c->m_y >> (int)!ds.fSkyAll) * (real)dr.rgstar[i].y / 16384.0); + kv = dr.rgstar[i].kv; if (fPerspective || c->Get(x, y) == dr.kvInSky) - c->Set(x, y, dr.rgstar[i].kv); + c->Set(x, y, kv); + if (ds.nStarSize < 0 ? FOdd(i) : + RgbR(kv) + RgbG(kv) + RgbB(kv) >= ds.nStarSize) + for (d = 0; d < DIRS; d++) + if (fPerspective || c->Get(x+xoff[d], y+yoff[d]) == dr.kvInSky) + c->Set(x+xoff[d], y+yoff[d], kv); } } return fTrue; @@ -1521,8 +1540,10 @@ void ComputeTexture(int *piTexture, int *piMask, real *prTexture, int ic, // Determine the color and monochrome texture to apply to this wall. if (!dr.fTextureDual) iTexture = ITextureWall(kv, k); - else + else if (!dr.fTextureDual2) iTexture = ITextureWall2(kv, k); + else + iTexture = ITextureWall3(kv, k); if (iTexture > 0) { if (iTexture < ws.cbMask && !ws.rgbMask[iTexture].FNull()) iMask = iTexture; @@ -1731,6 +1752,7 @@ void DrawTransVar(CMazK &c, int x, int yb, int cTrans, TRANS *trans, yLo1 = ptrans->yLo1; yHi1 = ptrans->yHi1; yLo2 = ptrans->yLo2; yHi2 = ptrans->yHi2; dr.yElevMax = yb+IO(ptrans->yElev); + dr.yElevMin = yb+IO(ptrans->yElev2); fWall = !(dr.nTrans == nTransFast && ptrans->fTrans && i > 0 && trans[i-1].fTrans && ptrans->y == trans[i-1].y2 && yHi == trans[i-1].yHi && yLo == trans[i-1].yLo && @@ -1928,7 +1950,7 @@ flag RedrawInsidePerspective(CMazK &c) fTrans = (dr.nTrans != nTransNone && !bm.b3.FNull()), fInTrans = fFalse; int zEye = ((dr.zElev + (dr.zWall >> 1)) << iVarScale) / dr.zWall, yExtra, yExtra2, yExtraK, yExtra2K, - yElevMax, itransMac = 10, cTrans, kElev = 1, nFogT; + yElevMax, yElevMin, itransMac = 10, cTrans, kElev = 1, nFogT; flag fMarkAll = dr.fMarkAll, fColorMark = !cMark->FNull(), fColorMark2, fDoCompute = fFalse, fDoEnd = fFalse, fDoWall = fFalse, fDoSeal = fFalse, fDoTrans = fFalse, fDoWallVar = fFalse, @@ -1960,7 +1982,7 @@ flag RedrawInsidePerspective(CMazK &c) // Prepare the bitmap for drawing. rT = RTanD(dr.dInside); rd = (real)xc / rT; - if (c.m_x > dr.ccalc || rd != dr.rdCalc) { + if (c.m_x != dr.xCalc || rd != dr.rdCalc) { if (c.m_x > dr.ccalc) { if (dr.rgcalc != NULL) DeallocateP(dr.rgcalc); @@ -1974,9 +1996,10 @@ flag RedrawInsidePerspective(CMazK &c) dr.rgcalc[x].rAngleColumn = RAtnD((real)(x - xc) / rd); dr.rgcalc[x].rDistCorrect = RCosD(dr.rgcalc[x].rAngleColumn); } + dr.xCalc = c.m_x; dr.rdCalc = rd; } - dr.yElevMax = ypWallMax; + dr.yElevMax = ypWallMax; dr.yElevMin = -ypWallMax; // Initialize a bunch of variables. if (f3D) { @@ -2088,6 +2111,7 @@ flag RedrawInsidePerspective(CMazK &c) // Loop over each column in the bitmap, to draw each column separately. for (x = 0; x < c.m_x; x++) { dr.yElevMax = yElevMax = ypWallMax; + dr.yElevMin = yElevMin = -ypWallMax; // Figure out the angle of this ray, the corresponding horizontal and // vertical increments to get from cell to cell, and the characteristics @@ -2404,6 +2428,7 @@ flag RedrawInsidePerspective(CMazK &c) } yElevMax = yElev1; dr.yElevMax = yb+IO(yElevMax); + dr.yElevMin = yb+IO(yElevMin); } } fInMark = fDoExitMark = fFalse; @@ -2427,6 +2452,8 @@ flag RedrawInsidePerspective(CMazK &c) rx3, ry3, rx4, ry4, FFogDirt(xo, yo), GetP(bTextureDirt, xo, yo), fFalse, rScale); } + if (y > yElevMin) + yElevMin = -y; fInMark2 = fDoExitMark2 = fFalse; } @@ -2579,6 +2606,7 @@ flag RedrawInsidePerspective(CMazK &c) ptransCur->y = ptransCur->y2 = y; ptransCur->yk = ptransCur->yk2 = yk; ptransCur->yElev = yElevMax; + ptransCur->yElev2 = yElevMin; ptransCur->fTrans = fDoTrans; ptransCur->nFog = nFogT; ptransCur->kvOrig = kvT; @@ -2610,6 +2638,7 @@ flag RedrawInsidePerspective(CMazK &c) if (fDoEnd) { if (fDoSeal) { dr.yElevMax = yb+IO(yElevMax); + dr.yElevMin = yb+IO(yElevMin); LineI(yb+IO(y - (yk << 1)), yb+IO(y), dr.kvInEdge); fDoSeal = fFalse; } @@ -2659,6 +2688,7 @@ flag RedrawInsidePerspective(CMazK &c) // Actually draw the wall for the current column here. dr.yElevMax = yb+IO(yElevMax); + dr.yElevMin = yb+IO(yElevMin); LineYGradient(c, x, yb-IO(y), yb+IO(y), kv2, dr.kvInWall2); // Do texture mapping on top of the drawn wall at the current column. @@ -2684,32 +2714,44 @@ flag RedrawInsidePerspective(CMazK &c) flag RedrawInsidePerspectiveStereo(CMazK &c, CMazK &cs) { - int x = c.m_x >> 1, f = FOdd(c.m_x), mSav = dr.nOffsetX, nSav = dr.nOffsetY, - m, n, d; + int mSav = dr.nOffsetX, nSav = dr.nOffsetY, dSav = dr.nOffsetD, + x, f, m, n, d; + x = !ds.fStereo3D ? c.m_x >> 1 : c.m_x; if (!cs.FBitmapSizeSet(x, c.m_y)) return fFalse; + f = FOdd(c.m_x) && !ds.fStereo3D; d = 180 - (dr.dir*90 + dr.nOffsetD); if (d >= nDegMax) d -= nDegMax; - m = NCosRD(dr.nStereo, d); n = NSinRD(dr.nStereo, d); + m = NCosRD(ds.nStereo, d); n = NSinRD(ds.nStereo, d); // Draw left eye view of scene. - dr.nOffsetX += m; dr.nOffsetY += n; + dr.nOffsetX += m; dr.nOffsetY += n; //dr.nOffsetD += 1; if (!RedrawInsidePerspective(cs)) return fFalse; - c.BlockMove(cs, 0, 0, x, c.m_y-1, 0, 0); + if (ds.fStereo3D) { + cs.ColmapGrayscale(); + cs.ColmapOrAndKv(kvCyan, 0); + } + c.BlockMove(cs, 0, 0, x-1, c.m_y-1, 0, 0); // Draw right eye view of scene. - dr.nOffsetX -= m*2; dr.nOffsetY -= n*2; + dr.nOffsetX -= m*2; dr.nOffsetY -= n*2; //dr.nOffsetD -= 1*2; if (!RedrawInsidePerspective(cs)) return fFalse; - c.BlockMove(cs, 0, 0, x, c.m_y-1, x+f, 0); + if (!ds.fStereo3D) + c.BlockMove(cs, 0, 0, x-1, c.m_y-1, x+f, 0); + else { + cs.ColmapGrayscale(); + cs.ColmapOrAndKv(kvRed, 0); + c.ColmapOrAnd(cs, 1); + } // Draw line down middle if outer bitmap is odd sized. if (f) c.LineY(x, 0, c.m_y-1, dr.kvInEdge); - dr.nOffsetX = mSav; dr.nOffsetY = nSav; + dr.nOffsetX = mSav; dr.nOffsetY = nSav; dr.nOffsetD = dSav; return fTrue; } diff --git a/labyrnth.cpp b/labyrnth.cpp index 869b1a3..cb3ce4c 100644 --- a/labyrnth.cpp +++ b/labyrnth.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: labyrnth.cpp +** Daedalus (Version 3.4) File: labyrnth.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -23,7 +23,7 @@ ** This file contains unicursal Labyrinth creation algorithms. ** ** Created: 7/12/2009. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -153,6 +153,7 @@ flag CMaz::CreateMazeHilbert(flag f3D) { CMaz b2; int i, w, x, y, z; + flag fMaze = ms.fFractalI; if (!f3D) { @@ -160,10 +161,17 @@ flag CMaz::CreateMazeHilbert(flag f3D) if (!FBitmapSizeSet(5, 5)) return fFalse; BitmapOn(); - for (x = 1; x <= 3; x += 2) - for (y = 1; y <= 3; y++) - Set0(x, y); - Set0(2, 3); + if (!fMaze) { + for (x = 1; x <= 3; x += 2) + for (y = 1; y <= 3; y++) + Set0(x, y); + Set0(2, 3); + } else { + for (y = 1; y <= 3; y += 2) + for (x = 1; x <= 3; x++) + Set0(x, y); + Set0(1, 2); + } // Create each new generation from four copies of the original for (i = 1; i < ms.zFractal; i++) { @@ -172,19 +180,32 @@ flag CMaz::CreateMazeHilbert(flag f3D) if (!FBitmapSizeSet((m_x << 1) - 1, (m_y << 1) - 1)) return fFalse; BitmapOn(); - for (y = 1; y < w; y++) - for (x = 1; x < w; x++) - if (!b2.Get(x, y)) { - Set0(y, x); // 1 transpose - Set0(x, w+y); // 2 normal - Set0(w+x, w+y); // 3 normal - Set0(m_x-1-y, x); // 4 transpose flipx - } - Set0(1, w); Set0(m_x-2, w); - Set0(w, w+1); + if (!fMaze) { + for (y = 1; y < w; y++) + for (x = 1; x < w; x++) + if (!b2.Get(x, y)) { + Set0(y, x); // 1 transpose + Set0(x, w+y); // 2 normal + Set0(w+x, w+y); // 3 normal + Set0(m_x-1-y, x); // 4 transpose flipx + } + Set0(1, w); Set0(m_x-2, w); + Set0(w, w+1); + } else { + for (y = 1; y < w; y++) + for (x = 1; x < w; x++) + if (!b2.Get(x, y)) { + Set0(w-x, w-y); // 1 flipx flipy + Set0(y, m_y-1-x); // 2 transpose flipy + Set0(w+x, w+y); // 3 normal + Set0(m_x-1-y, x); // 4 transpose flipx + } + Set0(w, w-1); Set0(w, w+1); + Set0(1, w); + } UpdateDisplay(); } - Set0(1, 0); Set0(m_x-2, 0); + Set0(1, 0); Set0(m_x-2, !fMaze ? 0 : m_y-1); } else { // Create base case generation 1 @@ -335,6 +356,7 @@ void CMaz::LabyrinthHilbertPartial(int zFactor, int m1, int n1) { int rgd[iStackMax], id = 0, zs, m2, n2, x1, y1, x2, y2, x12, y12, d; RC rgrc[iStackMax], rc; + flag fMaze = ms.fFractalI; zs = 1 << zFactor; m2 = m1 + (m_x >> 1); n2 = n1 + (m_y >> 1); @@ -348,7 +370,7 @@ void CMaz::LabyrinthHilbertPartial(int zFactor, int m1, int n1) if (FBetween(0, m1, m2)) LineY(VX2(0), VY2(0), VY2(zs), fOn); if (FBetween(zs, n1, n2)) LineX(VX2(0), VX2(zs), VY2(zs), fOn); if (FBetween(zs, m1, m2)) LineY(VX2(zs), VY2(0), VY2(zs), fOn); - Set0(1-m1*2, -n1*2); Set0((zs-m1)*2-1, -n1*2); + Set0(1-m1*2, -n1*2); Set0((zs-m1)*2-1, !fMaze ? -n1*2 : (zs-n1)*2); // Continue while there's at least one square on the stack. while (id >= 0) { @@ -367,29 +389,56 @@ void CMaz::LabyrinthHilbertPartial(int zFactor, int m1, int n1) x1 = rc.x1; y1 = rc.y1; x2 = rc.x2; y2 = rc.y2; d = rgd[id]; x12 = (x1 + x2) >> 1; y12 = (y1 + y2) >> 1; - if (!FOdd(d)) { - LineX(VX2(x1 + 1), VX2(x2 - 1), VY2(y12), fOn); - LineY(VX2(x12), d < 1 ? VY2(y1) + 1 : VY2(y2) - 1, VY2(y12), fOn); - if (y2 - y1 > 2) - LineY(VX2(x12), VY2(y12 + (d < 1 ? 1 : -1)), d < 1 ? VY2(y2) : VY2(y1), - fOn); + if (!fMaze) { + if (!FOdd(d)) { + LineX(VX2(x1 + 1), VX2(x2 - 1), VY2(y12), fOn); + LineY(VX2(x12), d < 1 ? VY2(y1) + 1 : VY2(y2) - 1, VY2(y12), fOn); + if (y2 - y1 > 2) + LineY(VX2(x12), VY2(y12 + (d < 1 ? 1 : -1)), + d < 1 ? VY2(y2) : VY2(y1), fOn); + } else { + LineY(VX2(x12), VY2(y1 + 1), VY2(y2 - 1), fOn); + LineX(d < 2 ? VX2(x1) + 1 : VX2(x2) - 1, VX2(x12), VY2(y12), fOn); + if (x2 - x1 > 2) + LineX(VX2(x12 + (d < 2 ? 1 : -1)), d < 2 ? VX2(x2) : VX2(x1), + VY2(y12), fOn); + } } else { - LineY(VX2(x12), VY2(y1 + 1), VY2(y2 - 1), fOn); - LineX(d < 2 ? VX2(x1) + 1 : VX2(x2) - 1, VX2(x12), VY2(y12), fOn); - if (x2 - x1 > 2) - LineX(VX2(x12 + (d < 2 ? 1 : -1)), d < 2 ? VX2(x2) : VX2(x1), VY2(y12), - fOn); + if (!FOdd(d)) { + LineX(VX2(x1 + 1) - (d > 1), VX2(x2 - 1) + (d < 1), VY2(y12), fOn); + if (y2 - y1 > 2) { + LineY(VX2(x12), VY2(y1) + 1, VY2(y12 - 1), fOn); + LineY(VX2(x12), VY2(y2) - 1, VY2(y12 + 1), fOn); + } + } else { + LineY(VX2(x12), VY2(y1 + 1) - (d < 2), VY2(y2 - 1) + (d > 2), fOn); + if (x2 - x1 > 2) { + LineX(VX2(x1) + 1, VX2(x12 - 1), VY2(y12), fOn); + LineX(VX2(x2) - 1, VX2(x12 + 1), VY2(y12), fOn); + } + } } // Divide current square's coordinates and push four subsquares on stack. - SetRC2(x1, y1, x12, y12); - rgd[id++] = d + (d <= 0) - (d == 1) & DIRS1; - SetRC2(x12, y1, x2, y12); - rgd[id++] = d + (d >= 3) - (d <= 0) & DIRS1; - SetRC2(x1, y12, x12, y2); - rgd[id++] = d + (d == 1) - (d == 2) & DIRS1; - SetRC2(x12, y12, x2, y2); - rgd[id] = d + (d == 2) - (d >= 3) & DIRS1; + if (!fMaze) { + SetRC2(x1, y1, x12, y12); + rgd[id++] = d + (d == 0) - (d == 1) & DIRS1; + SetRC2(x1, y12, x12, y2); + rgd[id++] = d + (d == 1) - (d == 2) & DIRS1; + SetRC2(x12, y12, x2, y2); + rgd[id++] = d + (d == 2) - (d == 3) & DIRS1; + SetRC2(x12, y1, x2, y12); + rgd[id] = d + (d == 3) - (d == 0) & DIRS1; + } else { + SetRC2(x1, y1, x12, y12); + rgd[id++] = d + (d == 3) - (d == 1) + (d == 0)*2 & DIRS1; + SetRC2(x1, y12, x12, y2); + rgd[id++] = d + (d == 0) - (d == 2) + (d == 1)*2 & DIRS1; + SetRC2(x12, y12, x2, y2); + rgd[id++] = d + (d == 1) - (d == 3) + (d == 2)*2 & DIRS1; + SetRC2(x12, y1, x2, y12); + rgd[id] = d + (d == 2) - (d == 0) + (d == 3)*2 & DIRS1; + } } } diff --git a/maze.cpp b/maze.cpp index 6901cd0..c63922a 100644 --- a/maze.cpp +++ b/maze.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: maze.cpp +** Daedalus (Version 3.4) File: maze.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** actual creation and solving. ** ** Created: 4/11/1991. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -1757,6 +1757,34 @@ long CMaz::DoMakeSymmetric(int nOp, flag fBraid) } +// Zoom an orthogonal Maze so passages and walls become 1 or 2 pixels wide, +// based on the brightness of corresponding pixels in a color bitmap. + +flag CMaz::MazeZoomWithPicture(CONST CCol *c1) +{ + int x, y, n; + flag f1, f2; + + if (!FBitmapBias(1, 2, 1, 2)) + return fFalse; + for (y = 0; y < m_y; y += 3) + for (x = 0; x < m_x; x += 3) { + n = c1->Get(x/3, y/3); + n = (RgbR(n) + RgbG(n) + RgbB(n)) / 192; + f1 = Get(x, y+1); f2 = Get(x+1, y); + if (n > 0) { + Set1(x+1, y+1-(!f1 && !f2)); + if (n > 1) { + Set1(x+f1, y+1+f1); + if (n > 2) + Set1(x+1+f2, y+f2); + } + } + } + return fTrue; +} + + // Render a section of Maze on a bitmap. Walls are always one pixel thick and // it's assumed no cells are solid blocks, however passages can be of greater // sizes and displayed in different orientations. Used in the rendering of @@ -2131,7 +2159,7 @@ ulong MazeCountPossible(int x, int y) t = RSin(((real)j*rPi) / (2.0*ry)); r *= (4.0 * (s*s + t*t)); if (r > rMax) - return (ulong)~0L; + return dwSet; } } return (ulong)(r / (rx*ry) + rRound); diff --git a/maze.h b/maze.h index 20aa24a..30bd3cd 100644 --- a/maze.h +++ b/maze.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: maze.h +** Daedalus (Version 3.4) File: maze.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** algorithms, and other Maze utilities. ** ** Created: 11/22/1996. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ @@ -319,6 +319,7 @@ class CMaz : public CMon3 // Monochrome bitmap Maze long DoCrackIsland(int, int, flag); long DoCrackIslands(flag); long DoMakeSymmetric(int nOp, flag fBraid); + flag MazeZoomWithPicture(CONST CCol *); void BlockMoveMaze(CONST CMaz &, int, int, int, int, int, int, int, int, int, int); void BlockMoveMaze3(CONST CMaz &, int, int, int, int, int, int, @@ -411,6 +412,7 @@ class CMaz : public CMon3 // Monochrome bitmap Maze flag CreateMazeSigma(); flag CreateMazeTheta(); flag CreateMazeUpsilon(); + flag CreateMazeOmicron(); void FractalSet(CMazK *c, KV kv, int x, int y); flag FFractalLine(CMaz *, CMazK *, KV, int, int, int, int); int CreateMazeFractal2(CMazK *); @@ -498,10 +500,12 @@ extern int RndDir(void); extern ulong MazeCountPossible(int, int); // Function hooks implemented elsewhere -extern flag FInitCoordinates(int); +extern int InitCoordinates(int); extern flag FSetCoordinates(int, int, int, int, int, int, KV); -extern flag FInitPatch(int); +extern int InitPatch(int); extern flag FSetPatch(int, int, int, int, int, int, KV); +extern int InitCoorPatch(flag, int); +extern flag FSetCoorPatch(flag, int, int, int, int, int, int, KV); /* diff --git a/resource.h b/resource.h index 8341fed..248c518 100644 --- a/resource.h +++ b/resource.h @@ -6,6 +6,8 @@ #define icon2 102 #define icon3 103 #define icon4 104 +#define icon5 105 +#define icon6 106 #define menu 111 #define accelerator 121 #define dlgAbort 201 @@ -145,361 +147,363 @@ #define cmdCreateInfinite3 1110 #define cmdCreateKruskal 1111 #define cmdCreateLabyrinth 1112 -#define cmdCreatePatchOverview 1113 -#define cmdCreatePerfect 1114 -#define cmdCreatePlanair 1115 -#define cmdCreatePrim 1116 -#define cmdCreatePrim2 1117 -#define cmdCreateRandom 1118 -#define cmdCreateRecursive 1119 -#define cmdCreateSegment 1120 -#define cmdCreateSidewinder 1121 -#define cmdCreateSigma 1122 -#define cmdCreateSpiral 1123 -#define cmdCreateTheta 1124 -#define cmdCreateTilt 1125 -#define cmdCreateTree 1126 -#define cmdCreateUnicursal 1127 -#define cmdCreateUpsilon 1128 -#define cmdCreateWeave 1129 -#define cmdCreateWilson 1130 -#define cmdCreateWireOverview 1131 -#define cmdCreateZeta 1132 -#define cmdCubemapFlip 1133 -#define cmdDeletePole 1134 -#define cmdDelX 1135 -#define cmdDelX2 1136 -#define cmdDelY 1137 -#define cmdDelY2 1138 -#define cmdDlgColor 1139 -#define cmdDlgCreate 1140 -#define cmdDlgDisplay 1141 -#define cmdDlgDot 1142 -#define cmdDlgDraw 1143 -#define cmdDlgDraw2 1144 -#define cmdDlgEvent 1145 -#define cmdDlgFile 1146 -#define cmdDlgInside 1147 -#define cmdDlgLabyrinth 1148 -#define cmdDlgMaze 1149 -#define cmdDlgRandom 1150 -#define cmdDlgSize 1151 -#define cmdDlgSizeMaze 1152 -#define cmdDlgZoom 1153 -#define cmdDotBig 1154 -#define cmdDotBoth 1155 -#define cmdDotDrag 1156 -#define cmdDotOn 1157 -#define cmdDotSet 1158 -#define cmdDotShow 1159 -#define cmdDotTwo 1160 -#define cmdDotWall 1161 -#define cmdDotZap 1162 -#define cmdDotZapTrans 1163 -#define cmdDotZapUntrans 1164 -#define cmdDrawDel 1165 -#define cmdDrawGet 1166 -#define cmdDrawPut 1167 -#define cmdDrawSwap 1168 -#define cmdEraseCorner 1169 -#define cmdExit 1170 -#define cmdExpandSet 1171 -#define cmdFlipX 1172 -#define cmdFlipY 1173 -#define cmdFlipZ 1174 -#define cmdFloodDot 1175 -#define cmdFloodDot2 1176 -#define cmdFloodPassage 1177 -#define cmdFloodWallL 1178 -#define cmdFloodWallR 1179 -#define cmdGo2nd 1180 -#define cmdGoCorner1 1181 -#define cmdGoCorner3 1182 -#define cmdGoCorner7 1183 -#define cmdGoCorner9 1184 -#define cmdGoIn 1185 -#define cmdGoInY 1186 -#define cmdGoMiddle 1187 -#define cmdGoOut 1188 -#define cmdGoOutY 1189 -#define cmdGoRandom 1190 -#define cmdGroundVariable 1191 -#define cmdInsideMap 1192 -#define cmdInsideView 1193 -#define cmdJump1 1194 -#define cmdJump2 1195 -#define cmdJump3 1196 -#define cmdJump4 1197 -#define cmdJump6 1198 -#define cmdJump7 1199 -#define cmdJump8 1200 -#define cmdJump9 1201 -#define cmdLabyrinthChartres 1202 -#define cmdLabyrinthChartresF 1203 -#define cmdLabyrinthChartresR 1204 -#define cmdLabyrinthClassical 1205 -#define cmdLabyrinthClassicalF 1206 -#define cmdLabyrinthCretan 1207 -#define cmdLabyrinthCustom 1208 -#define cmdLabyrinthMan 1209 -#define cmdLife 1210 -#define cmdMacro01 1211 -#define cmdMacro02 1212 -#define cmdMacro03 1213 -#define cmdMacro04 1214 -#define cmdMacro05 1215 -#define cmdMacro06 1216 -#define cmdMacro07 1217 -#define cmdMacro08 1218 -#define cmdMacro09 1219 -#define cmdMacro10 1220 -#define cmdMacro11 1221 -#define cmdMacro12 1222 -#define cmdMacro13 1223 -#define cmdMacro14 1224 -#define cmdMacro15 1225 -#define cmdMacro16 1226 -#define cmdMacro17 1227 -#define cmdMacro18 1228 -#define cmdMacro19 1229 -#define cmdMacro20 1230 -#define cmdMacro21 1231 -#define cmdMacro22 1232 -#define cmdMacro23 1233 -#define cmdMacro24 1234 -#define cmdMacro25 1235 -#define cmdMacro26 1236 -#define cmdMacro27 1237 -#define cmdMacro28 1238 -#define cmdMacro29 1239 -#define cmdMacro30 1240 -#define cmdMacro31 1241 -#define cmdMacro32 1242 -#define cmdMacro33 1243 -#define cmdMacro34 1244 -#define cmdMacro35 1245 -#define cmdMacro36 1246 -#define cmdMacro37 1247 -#define cmdMacro38 1248 -#define cmdMacro39 1249 -#define cmdMacro40 1250 -#define cmdMacro41 1251 -#define cmdMacro42 1252 -#define cmdMacro43 1253 -#define cmdMacro44 1254 -#define cmdMacro45 1255 -#define cmdMacro46 1256 -#define cmdMacro47 1257 -#define cmdMacro48 1258 -#define cmdMark 1259 -#define cmdMarkBlindAlley 1260 -#define cmdMarkBlock 1261 -#define cmdMarkBlock2 1262 -#define cmdMarkCollision 1263 -#define cmdMarkCuldsac 1264 -#define cmdMessage 1265 -#define cmdMove1 1266 -#define cmdMove2 1267 -#define cmdMove3 1268 -#define cmdMove4 1269 -#define cmdMove6 1270 -#define cmdMove7 1271 -#define cmdMove8 1272 -#define cmdMove9 1273 -#define cmdMoveAround 1274 -#define cmdMoveBack 1275 -#define cmdMoveD 1276 -#define cmdMoveEast 1277 -#define cmdMoveForward 1278 -#define cmdMoveLeft 1279 -#define cmdMoveNorth 1280 -#define cmdMoveRandom 1281 -#define cmdMoveRight 1282 -#define cmdMoveSouth 1283 -#define cmdMoveU 1284 -#define cmdMoveWest 1285 -#define cmdNormalize 1286 -#define cmdNormalize2 1287 -#define cmdOpen 1288 -#define cmdOpen3D 1289 -#define cmdOpenBitmap 1290 -#define cmdOpenColmapTarga 1291 -#define cmdOpenPatch 1292 -#define cmdOpenScript 1293 -#define cmdOpenText 1294 -#define cmdOpenWire 1295 -#define cmdOpenXbm 1296 -#define cmdPartBraid 1297 -#define cmdPartCavern 1298 -#define cmdPartCrack 1299 -#define cmdPartKruskal 1300 -#define cmdPartPerfect 1301 -#define cmdPartPrim 1302 -#define cmdPartRecursive 1303 -#define cmdPartTree 1304 -#define cmdPartUnicursal 1305 -#define cmdPartWeave 1306 -#define cmdPartZeta 1307 -#define cmdPaste 1308 -#define cmdPatchToWire 1309 -#define cmdPolishMaze 1310 -#define cmdPrint 1311 -#define cmdPrintSetup 1312 -#define cmdRandomize 1313 -#define cmdRedrawNow 1314 -#define cmdRenderAerial 1315 -#define cmdRenderOverview 1316 -#define cmdRenderPatchPerspective 1317 -#define cmdRenderPyramid 1318 -#define cmdRenderWirePerspective 1319 -#define cmdRepaintNow 1320 -#define cmdRepeat 1321 -#define cmdRoomThin 1322 -#define cmdRotateA 1323 -#define cmdRotateL 1324 -#define cmdRotateR 1325 -#define cmdSave3DN 1326 -#define cmdSave3DS 1327 -#define cmdSaveBitmap 1328 -#define cmdSaveColmapTarga 1329 -#define cmdSaveDOS 1330 -#define cmdSaveDOS2 1331 -#define cmdSaveDOS3 1332 -#define cmdSavePatch 1333 -#define cmdSavePicture 1334 -#define cmdSaveText 1335 -#define cmdSaveVector 1336 -#define cmdSaveWallCenter 1337 -#define cmdSaveWallFill 1338 -#define cmdSaveWallFit 1339 -#define cmdSaveWallStretch 1340 -#define cmdSaveWallTile 1341 -#define cmdSaveWire 1342 -#define cmdSaveXbmC 1343 -#define cmdSaveXbmN 1344 -#define cmdSaveXbmS 1345 -#define cmdScript01 1346 -#define cmdScript02 1347 -#define cmdScript03 1348 -#define cmdScript04 1349 -#define cmdScript05 1350 -#define cmdScript06 1351 -#define cmdScript07 1352 -#define cmdScript08 1353 -#define cmdScript09 1354 -#define cmdScript10 1355 -#define cmdScript11 1356 -#define cmdScript12 1357 -#define cmdScript13 1358 -#define cmdScript14 1359 -#define cmdScript15 1360 -#define cmdScript16 1361 -#define cmdScript17 1362 -#define cmdScript18 1363 -#define cmdScript19 1364 -#define cmdScript21 1365 -#define cmdScript22 1366 -#define cmdScript23 1367 -#define cmdScript24 1368 -#define cmdScript25 1369 -#define cmdScript26 1370 -#define cmdScript27 1371 -#define cmdScript28 1372 -#define cmdScript29 1373 -#define cmdScrollDown 1374 -#define cmdScrollEnd 1375 -#define cmdScrollHome 1376 -#define cmdScrollUp 1377 -#define cmdSetupAll 1378 -#define cmdSetupDesktop 1379 -#define cmdSetupExtension 1380 -#define cmdSetupUser 1381 -#define cmdShellChange 1382 -#define cmdShellHelp 1383 -#define cmdShellLicense 1384 -#define cmdShellScript 1385 -#define cmdShellWeb 1386 -#define cmdShellWeb2 1387 -#define cmdShowBottleneck 1388 -#define cmdSize01 1389 -#define cmdSize02 1390 -#define cmdSize03 1391 -#define cmdSize04 1392 -#define cmdSize05 1393 -#define cmdSize06 1394 -#define cmdSize07 1395 -#define cmdSize08 1396 -#define cmdSize09 1397 -#define cmdSize10 1398 -#define cmdSize11 1399 -#define cmdSize12 1400 -#define cmdSize13 1401 -#define cmdSize14 1402 -#define cmdSize15 1403 -#define cmdSize16 1404 -#define cmdSize17 1405 -#define cmdSize18 1406 -#define cmdSize19 1407 -#define cmdSizeWindow 1408 -#define cmdSlide 1409 -#define cmdSmooth 1410 -#define cmdSolve4D 1411 -#define cmdSolveBlindAlley 1412 -#define cmdSolveBlock 1413 -#define cmdSolveChain 1414 -#define cmdSolveCollision 1415 -#define cmdSolveCuldsac 1416 -#define cmdSolveFollowL 1417 -#define cmdSolveFollowR 1418 -#define cmdSolveFractal2 1419 -#define cmdSolveHyper 1420 -#define cmdSolvePledgeL 1421 -#define cmdSolvePledgeR 1422 -#define cmdSolveRecursive 1423 -#define cmdSolveShortest 1424 -#define cmdSolveShortest2 1425 -#define cmdSolveTremaux 1426 -#define cmdSolveWeave 1427 -#define cmdSpree 1428 -#define cmdSymmetric 1429 -#define cmdTempAdd 1430 -#define cmdTempAlpha 1431 -#define cmdTempAnd 1432 -#define cmdTempBlend 1433 -#define cmdTempDel 1434 -#define cmdTempGet 1435 -#define cmdTempOr 1436 -#define cmdTempPut 1437 -#define cmdTempSub 1438 -#define cmdTempSwap 1439 -#define cmdTempTessellate 1440 -#define cmdTempXor 1441 -#define cmdTextureBackground 1442 -#define cmdTextureBlock1 1443 -#define cmdTextureBlock2 1444 -#define cmdTextureBlock3 1445 -#define cmdTextureCeiling 1446 -#define cmdTextureDel 1447 -#define cmdTextureGround1 1448 -#define cmdTextureGround2 1449 -#define cmdTextureGround3 1450 -#define cmdTextureWall1 1451 -#define cmdTextureWall2 1452 -#define cmdTextureWall3 1453 -#define cmdThicken 1454 -#define cmdThinner 1455 -#define cmdTimeGet 1456 -#define cmdTimePause 1457 -#define cmdTimeReset 1458 -#define cmdTweakEndpoint 1459 -#define cmdTweakPassage 1460 -#define cmdUnmark 1461 -#define cmdUnsetup 1462 -#define cmdWallVariable 1463 -#define cmdWeave3D 1464 -#define cmdWeaveInside 1465 -#define cmdWindowBitmap 1466 -#define cmdWindowFull 1467 +#define cmdCreateOmicron 1113 +#define cmdCreatePatchOverview 1114 +#define cmdCreatePerfect 1115 +#define cmdCreatePlanair 1116 +#define cmdCreatePrim 1117 +#define cmdCreatePrim2 1118 +#define cmdCreateRandom 1119 +#define cmdCreateRecursive 1120 +#define cmdCreateSegment 1121 +#define cmdCreateSidewinder 1122 +#define cmdCreateSigma 1123 +#define cmdCreateSpiral 1124 +#define cmdCreateTheta 1125 +#define cmdCreateTilt 1126 +#define cmdCreateTree 1127 +#define cmdCreateUnicursal 1128 +#define cmdCreateUpsilon 1129 +#define cmdCreateWeave 1130 +#define cmdCreateWilson 1131 +#define cmdCreateWireOverview 1132 +#define cmdCreateZeta 1133 +#define cmdCubemapFlip 1134 +#define cmdDeletePole 1135 +#define cmdDelX 1136 +#define cmdDelX2 1137 +#define cmdDelY 1138 +#define cmdDelY2 1139 +#define cmdDlgColor 1140 +#define cmdDlgCreate 1141 +#define cmdDlgDisplay 1142 +#define cmdDlgDot 1143 +#define cmdDlgDraw 1144 +#define cmdDlgDraw2 1145 +#define cmdDlgEvent 1146 +#define cmdDlgFile 1147 +#define cmdDlgInside 1148 +#define cmdDlgLabyrinth 1149 +#define cmdDlgMaze 1150 +#define cmdDlgRandom 1151 +#define cmdDlgSize 1152 +#define cmdDlgSizeMaze 1153 +#define cmdDlgZoom 1154 +#define cmdDotBig 1155 +#define cmdDotBoth 1156 +#define cmdDotDrag 1157 +#define cmdDotOn 1158 +#define cmdDotSet 1159 +#define cmdDotShow 1160 +#define cmdDotTwo 1161 +#define cmdDotWall 1162 +#define cmdDotZap 1163 +#define cmdDotZapTrans 1164 +#define cmdDotZapUntrans 1165 +#define cmdDrawDel 1166 +#define cmdDrawGet 1167 +#define cmdDrawPut 1168 +#define cmdDrawSwap 1169 +#define cmdEraseCorner 1170 +#define cmdExit 1171 +#define cmdExpandSet 1172 +#define cmdFlipX 1173 +#define cmdFlipY 1174 +#define cmdFlipZ 1175 +#define cmdFloodDot 1176 +#define cmdFloodDot2 1177 +#define cmdFloodPassage 1178 +#define cmdFloodWallL 1179 +#define cmdFloodWallR 1180 +#define cmdGo2nd 1181 +#define cmdGoCorner1 1182 +#define cmdGoCorner3 1183 +#define cmdGoCorner7 1184 +#define cmdGoCorner9 1185 +#define cmdGoIn 1186 +#define cmdGoInY 1187 +#define cmdGoMiddle 1188 +#define cmdGoOut 1189 +#define cmdGoOutY 1190 +#define cmdGoRandom 1191 +#define cmdGroundVariable 1192 +#define cmdInsideMap 1193 +#define cmdInsideView 1194 +#define cmdJump1 1195 +#define cmdJump2 1196 +#define cmdJump3 1197 +#define cmdJump4 1198 +#define cmdJump6 1199 +#define cmdJump7 1200 +#define cmdJump8 1201 +#define cmdJump9 1202 +#define cmdLabyrinthChartres 1203 +#define cmdLabyrinthChartresF 1204 +#define cmdLabyrinthChartresR 1205 +#define cmdLabyrinthClassical 1206 +#define cmdLabyrinthClassicalF 1207 +#define cmdLabyrinthCretan 1208 +#define cmdLabyrinthCustom 1209 +#define cmdLabyrinthMan 1210 +#define cmdLife 1211 +#define cmdMacro01 1212 +#define cmdMacro02 1213 +#define cmdMacro03 1214 +#define cmdMacro04 1215 +#define cmdMacro05 1216 +#define cmdMacro06 1217 +#define cmdMacro07 1218 +#define cmdMacro08 1219 +#define cmdMacro09 1220 +#define cmdMacro10 1221 +#define cmdMacro11 1222 +#define cmdMacro12 1223 +#define cmdMacro13 1224 +#define cmdMacro14 1225 +#define cmdMacro15 1226 +#define cmdMacro16 1227 +#define cmdMacro17 1228 +#define cmdMacro18 1229 +#define cmdMacro19 1230 +#define cmdMacro20 1231 +#define cmdMacro21 1232 +#define cmdMacro22 1233 +#define cmdMacro23 1234 +#define cmdMacro24 1235 +#define cmdMacro25 1236 +#define cmdMacro26 1237 +#define cmdMacro27 1238 +#define cmdMacro28 1239 +#define cmdMacro29 1240 +#define cmdMacro30 1241 +#define cmdMacro31 1242 +#define cmdMacro32 1243 +#define cmdMacro33 1244 +#define cmdMacro34 1245 +#define cmdMacro35 1246 +#define cmdMacro36 1247 +#define cmdMacro37 1248 +#define cmdMacro38 1249 +#define cmdMacro39 1250 +#define cmdMacro40 1251 +#define cmdMacro41 1252 +#define cmdMacro42 1253 +#define cmdMacro43 1254 +#define cmdMacro44 1255 +#define cmdMacro45 1256 +#define cmdMacro46 1257 +#define cmdMacro47 1258 +#define cmdMacro48 1259 +#define cmdMark 1260 +#define cmdMarkBlindAlley 1261 +#define cmdMarkBlock 1262 +#define cmdMarkBlock2 1263 +#define cmdMarkCollision 1264 +#define cmdMarkCuldsac 1265 +#define cmdMessage 1266 +#define cmdMove1 1267 +#define cmdMove2 1268 +#define cmdMove3 1269 +#define cmdMove4 1270 +#define cmdMove6 1271 +#define cmdMove7 1272 +#define cmdMove8 1273 +#define cmdMove9 1274 +#define cmdMoveAround 1275 +#define cmdMoveBack 1276 +#define cmdMoveD 1277 +#define cmdMoveEast 1278 +#define cmdMoveForward 1279 +#define cmdMoveLeft 1280 +#define cmdMoveNorth 1281 +#define cmdMoveRandom 1282 +#define cmdMoveRight 1283 +#define cmdMoveSouth 1284 +#define cmdMoveU 1285 +#define cmdMoveWest 1286 +#define cmdNormalize 1287 +#define cmdNormalize2 1288 +#define cmdOpen 1289 +#define cmdOpen3D 1290 +#define cmdOpenBitmap 1291 +#define cmdOpenColmapTarga 1292 +#define cmdOpenPatch 1293 +#define cmdOpenScript 1294 +#define cmdOpenText 1295 +#define cmdOpenWire 1296 +#define cmdOpenXbm 1297 +#define cmdPartBraid 1298 +#define cmdPartCavern 1299 +#define cmdPartCrack 1300 +#define cmdPartKruskal 1301 +#define cmdPartPerfect 1302 +#define cmdPartPrim 1303 +#define cmdPartRecursive 1304 +#define cmdPartTree 1305 +#define cmdPartUnicursal 1306 +#define cmdPartWeave 1307 +#define cmdPartZeta 1308 +#define cmdPaste 1309 +#define cmdPatchToWire 1310 +#define cmdPolishMaze 1311 +#define cmdPrint 1312 +#define cmdPrintSetup 1313 +#define cmdRandomize 1314 +#define cmdRedrawNow 1315 +#define cmdRenderAerial 1316 +#define cmdRenderOverview 1317 +#define cmdRenderPatchPerspective 1318 +#define cmdRenderPyramid 1319 +#define cmdRenderWirePerspective 1320 +#define cmdRepaintNow 1321 +#define cmdRepeat 1322 +#define cmdRoomThin 1323 +#define cmdRotateA 1324 +#define cmdRotateL 1325 +#define cmdRotateR 1326 +#define cmdSave3DN 1327 +#define cmdSave3DS 1328 +#define cmdSaveBitmap 1329 +#define cmdSaveColmapTarga 1330 +#define cmdSaveDOS 1331 +#define cmdSaveDOS2 1332 +#define cmdSaveDOS3 1333 +#define cmdSavePatch 1334 +#define cmdSavePicture 1335 +#define cmdSaveText 1336 +#define cmdSaveVector 1337 +#define cmdSaveWallCenter 1338 +#define cmdSaveWallFill 1339 +#define cmdSaveWallFit 1340 +#define cmdSaveWallStretch 1341 +#define cmdSaveWallTile 1342 +#define cmdSaveWire 1343 +#define cmdSaveXbmC 1344 +#define cmdSaveXbmN 1345 +#define cmdSaveXbmS 1346 +#define cmdScript01 1347 +#define cmdScript02 1348 +#define cmdScript03 1349 +#define cmdScript04 1350 +#define cmdScript05 1351 +#define cmdScript06 1352 +#define cmdScript07 1353 +#define cmdScript08 1354 +#define cmdScript09 1355 +#define cmdScript10 1356 +#define cmdScript11 1357 +#define cmdScript12 1358 +#define cmdScript13 1359 +#define cmdScript14 1360 +#define cmdScript15 1361 +#define cmdScript16 1362 +#define cmdScript17 1363 +#define cmdScript18 1364 +#define cmdScript19 1365 +#define cmdScript21 1366 +#define cmdScript22 1367 +#define cmdScript23 1368 +#define cmdScript24 1369 +#define cmdScript25 1370 +#define cmdScript26 1371 +#define cmdScript27 1372 +#define cmdScript28 1373 +#define cmdScript29 1374 +#define cmdScript30 1375 +#define cmdScrollDown 1376 +#define cmdScrollEnd 1377 +#define cmdScrollHome 1378 +#define cmdScrollUp 1379 +#define cmdSetupAll 1380 +#define cmdSetupDesktop 1381 +#define cmdSetupExtension 1382 +#define cmdSetupUser 1383 +#define cmdShellChange 1384 +#define cmdShellHelp 1385 +#define cmdShellLicense 1386 +#define cmdShellScript 1387 +#define cmdShellWeb 1388 +#define cmdShellWeb2 1389 +#define cmdShowBottleneck 1390 +#define cmdSize01 1391 +#define cmdSize02 1392 +#define cmdSize03 1393 +#define cmdSize04 1394 +#define cmdSize05 1395 +#define cmdSize06 1396 +#define cmdSize07 1397 +#define cmdSize08 1398 +#define cmdSize09 1399 +#define cmdSize10 1400 +#define cmdSize11 1401 +#define cmdSize12 1402 +#define cmdSize13 1403 +#define cmdSize14 1404 +#define cmdSize15 1405 +#define cmdSize16 1406 +#define cmdSize17 1407 +#define cmdSize18 1408 +#define cmdSize19 1409 +#define cmdSizeWindow 1410 +#define cmdSlide 1411 +#define cmdSmooth 1412 +#define cmdSolve4D 1413 +#define cmdSolveBlindAlley 1414 +#define cmdSolveBlock 1415 +#define cmdSolveChain 1416 +#define cmdSolveCollision 1417 +#define cmdSolveCuldsac 1418 +#define cmdSolveFollowL 1419 +#define cmdSolveFollowR 1420 +#define cmdSolveFractal2 1421 +#define cmdSolveHyper 1422 +#define cmdSolvePledgeL 1423 +#define cmdSolvePledgeR 1424 +#define cmdSolveRecursive 1425 +#define cmdSolveShortest 1426 +#define cmdSolveShortest2 1427 +#define cmdSolveTremaux 1428 +#define cmdSolveWeave 1429 +#define cmdSpree 1430 +#define cmdSymmetric 1431 +#define cmdTempAdd 1432 +#define cmdTempAlpha 1433 +#define cmdTempAnd 1434 +#define cmdTempBlend 1435 +#define cmdTempDel 1436 +#define cmdTempGet 1437 +#define cmdTempOr 1438 +#define cmdTempPut 1439 +#define cmdTempSub 1440 +#define cmdTempSwap 1441 +#define cmdTempTessellate 1442 +#define cmdTempXor 1443 +#define cmdTextureBackground 1444 +#define cmdTextureBlock1 1445 +#define cmdTextureBlock2 1446 +#define cmdTextureBlock3 1447 +#define cmdTextureCeiling 1448 +#define cmdTextureDel 1449 +#define cmdTextureGround1 1450 +#define cmdTextureGround2 1451 +#define cmdTextureGround3 1452 +#define cmdTextureWall1 1453 +#define cmdTextureWall2 1454 +#define cmdTextureWall3 1455 +#define cmdThicken 1456 +#define cmdThinner 1457 +#define cmdTimeGet 1458 +#define cmdTimePause 1459 +#define cmdTimeReset 1460 +#define cmdTweakEndpoint 1461 +#define cmdTweakPassage 1462 +#define cmdUnmark 1463 +#define cmdUnsetup 1464 +#define cmdWallVariable 1465 +#define cmdWeave3D 1466 +#define cmdWeaveInside 1467 +#define cmdWindowBitmap 1468 +#define cmdWindowFull 1469 #define dbCl_g 10001 #define dbCl_p 10002 #define dcDo_gch 10003 @@ -784,7 +788,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 301 -#define _APS_NEXT_COMMAND_VALUE 1468 +#define _APS_NEXT_COMMAND_VALUE 1470 #define _APS_NEXT_CONTROL_VALUE 10280 #define _APS_NEXT_SYMED_VALUE 301 #endif diff --git a/script.doc b/script.doc index d3a9617d9135af717b4dc9a8738f0a5e93ee0f98..5d6febcb266fad34d21c01e0b7080065200cbe34 100644 GIT binary patch delta 48883 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±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�WiIo1lROH(`Pk3*96MV_{gS$b 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 YgPX$MNeANhYz}=6Cui*69OlgaU$=pPSO5S3 delta 35215 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 diff --git a/solve.cpp b/solve.cpp index 81031fb..748c42b 100644 --- a/solve.cpp +++ b/solve.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: solve.cpp +** Daedalus (Version 3.4) File: solve.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -23,7 +23,7 @@ ** This file contains Maze solving algorithms. ** ** Created: 9/4/2000. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include diff --git a/threed.cpp b/threed.cpp index 8b4190d..f331d8a 100644 --- a/threed.cpp +++ b/threed.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: threed.cpp +** Daedalus (Version 3.4) File: threed.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** or color bitmap being treated as a 3D or 4D bitmap, unrelated to Mazes. ** ** Created: 3/12/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -320,20 +320,23 @@ flag CMap3::FCubeFlip2(int nAxis, int nOp) { CONST char *pch; - Assert(FBetween(nAxis, 0, 2) && FBetween(nOp, 0, 3)); - switch (nAxis*4 + nOp) { + Assert(FBetween(nAxis, 0, 2) && FBetween(nOp, 0, 4)); + switch (nAxis*5 + nOp) { case 0: pch = "Xyz"; break; // X Flip case 1: pch = "xzY"; break; // X Rotate right case 2: pch = "xZy"; break; // X Rotate left case 3: pch = "xYZ"; break; // X Rotate across - case 4: pch = "xYz"; break; // Y Flip - case 5: pch = "zyX"; break; // Y Rotate right - case 6: pch = "Zyx"; break; // Y Rotate left - case 7: pch = "XyZ"; break; // Y Rotate across - case 8: pch = "xyZ"; break; // Z Flip - case 9: pch = "Yxz"; break; // Z Rotate right - case 10: pch = "yXz"; break; // Z Rotate left - case 11: pch = "XYz"; break; // Z Rotate across + case 4: pch = "xzy"; break; // X Transpose + case 5: pch = "xYz"; break; // Y Flip + case 6: pch = "zyX"; break; // Y Rotate right + case 7: pch = "Zyx"; break; // Y Rotate left + case 8: pch = "XyZ"; break; // Y Rotate across + case 9: pch = "zyx"; break; // Y Transpose + case 10: pch = "xyZ"; break; // Z Flip + case 11: pch = "Yxz"; break; // Z Rotate right + case 12: pch = "yXz"; break; // Z Rotate left + case 13: pch = "XYz"; break; // Z Rotate across + case 14: pch = "yxz"; break; // Z Transpose default: Assert(fFalse); return fFalse; } return FCubeFlip(pch); diff --git a/threed.h b/threed.h index 8bd3103..facdedd 100644 --- a/threed.h +++ b/threed.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: threed.h +** Daedalus (Version 3.4) File: threed.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** on a monochrome bitmap being treated as a 3D/4D bitmap, unrelated to Mazes. ** ** Created: 3/12/1990. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ /* diff --git a/util.cpp b/util.cpp index 7a356ee..b07ae6c 100644 --- a/util.cpp +++ b/util.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: util.cpp +** Daedalus (Version 3.4) File: util.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** or any other part of Daedalus. ** ** Created: 6/4/1993. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -58,7 +58,6 @@ void operator delete(void *pv) DeallocateP(pv); } -#ifndef PC void *operator new(size_t cb, void *pv) { return pv; @@ -67,7 +66,6 @@ void *operator new(size_t cb, void *pv) void operator delete(void *pv, void *pv2) { } -#endif // Change the size of a memory allocation, containing a list of cElem items of @@ -82,7 +80,7 @@ void *ReallocateArray(void *rgElem, int cElem, int cbElem, int cElemNew) return NULL; ClearPb(rgElemNew, cElemNew * cbElem); if (rgElem != NULL) - CopyPb(rgElem, rgElemNew, cElem * cbElem); + CopyPb(rgElem, rgElemNew, Min(cElem, cElemNew) * cbElem); return rgElemNew; } @@ -609,7 +607,7 @@ real CVector::Angle(CONST CVector &v2) CONST return rPiHalf; else if (angle <= -1.0) return rPi; - angle = RAtn(RSqr(1.0 - angle*angle)/angle); + angle = RAtn(RSqr(1.0 - Sq(angle)) / angle); if (angle >= 0.0) return angle; else @@ -1052,6 +1050,7 @@ int Rnd(int n1, int n2) int d, r, n, nT; if (n1 > n2) { + // Special parameters allow returning any 32 bit number. if (n1 == lHighest && n2 == (int)0x80000000) return LRnd(); SwapN(n1, n2); diff --git a/util.h b/util.h index 184be9d..caeaaba 100644 --- a/util.h +++ b/util.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: util.h +** Daedalus (Version 3.4) File: util.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** related to graphics or any other part of Daedalus. ** ** Created: 6/4/1993. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ // Compile options @@ -34,6 +34,10 @@ #define PC #define ASSERT +// WIN: Comment out to produce command line version with no Windows interface. +// PC: Comment out if not using a Microsoft Visual Studio compiler. +// ASSERT: Comment out to avoid useful debugging checks and error messages. + #ifdef PC #define SECURECRT #define OVERRIDE override @@ -101,6 +105,7 @@ #define chNull '\0' #define chTab '\t' #define chMost '\377' +#define dwSet 0xFFFFFFFF #define dwCanary 0x12345678 #define cchSzDef 80 @@ -155,9 +160,9 @@ enum _printmode { #define RSinD(r) RSin(RFromD(r)) #define RCosD(r) RCos(RFromD(r)) #define RTanD(r) RTan(RFromD(r)) -#define RAtnD(r) DFromR(RAtn(r)) #define RAsinD(r) DFromR(RAsin(r)) #define RAcosD(r) DFromR(RAcos(r)) +#define RAtnD(r) DFromR(RAtn(r)) #define NSinRD(r, d) ((int)((r)*RSinD(d) + rRound)) #define NCosRD(r, d) ((int)((r)*RCosD(d) + rRound)) #define RFromD(r) ((r)/rDegRad) diff --git a/virtual.ds b/virtual.ds index 8ac0385..38fa8e7 100644 --- a/virtual.ds +++ b/virtual.ds @@ -1,5 +1,5 @@ DS -// Daedalus Virtual Mazes - A script file for Daedalus 3.3 +// Daedalus Virtual Mazes - A script file for Daedalus 3.4 // By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm // Variable usage: diff --git a/wdialog.cpp b/wdialog.cpp index 65f7dff..1d3f8f0 100644 --- a/wdialog.cpp +++ b/wdialog.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: wdialog.cpp +** Daedalus (Version 3.4) File: wdialog.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** dialog utilities. ** ** Created: 2/11/2001. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -54,18 +54,21 @@ enum _extension { iextDS = 8, iextDW = 9, iextDP = 10, - iextAll = 11, - iextMax = 12, + iextDB = 11, + iextAll = 12, + iextMax = 13, }; CONST char *rgszOpen[iextMax] = {"Open Bitmap", "Open Text", "Open X11 Bitmap", "Open Targa Bitmap", "Open Paint Bitmap", "" /* Open Picture */, "" /* Open Vector */, "Open 3D Bitmap", - "Open Script", "Open Wireframe", "Open Patches", "Open File"}; + "Open Script", "Open Wireframe", "Open Patches", + "Open Daedalus Bitmap", "Open File"}; CONST char *rgszSave[iextMax] = {"Save Bitmap", "Save Text", "Save X11 Bitmap", "Save Targa Bitmap", "" /* Save Paint Bitmap */, "Save Picture", "Save Vector", "Save 3D Bitmap", - "" /* Save Script */, "Save Wireframe", "Save Patches", "" /* Save File */}; + "" /* Save Script */, "Save Wireframe", "Save Patches", + "Save Daedalus Bitmap", "" /* Save File */}; CONST char *rgszFilter[iextMax] = { "Windows Bitmaps (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0", "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0", @@ -78,10 +81,11 @@ CONST char *rgszFilter[iextMax] = { "Daedalus Scripts (*.ds)\0*.ds\0All Files (*.*)\0*.*\0", "Wireframe Files (*.dw)\0*.dw\0All Files (*.*)\0*.*\0", "Patch Files (*.dp)\0*.dp\0All Files (*.*)\0*.*\0", + "Daedalus Bitmaps (*.db)\0*.db\0All Files (*.*)\0*.*\0", "All Daedalus Files\0*.bmp;*.txt;*.d?;*.pcx\0All Files (*.*)\0*.*\0"}; CONST char *rgszExt[iextMax] = { - "bmp", "txt", "xbm", "tga", "pcx", "wmf", "svg", "d3", "ds", "dw", "dp", - ""}; + "bmp", "txt", "xbm", "tga", "pcx", "wmf", "svg", + "d3", "ds", "dw", "dp", "db", ""}; /* @@ -248,7 +252,6 @@ flag FFileOpen(int wCmd, CONST char *szFile, FILE *fileIn) switch (wCmd) { case cmdOpen: - case cmdOpenDB: isz = iextAll; break; case cmdOpenBitmap: @@ -278,6 +281,9 @@ flag FFileOpen(int wCmd, CONST char *szFile, FILE *fileIn) case cmdOpenPatch: isz = iextDP; break; + case cmdOpenDB: + isz = iextDB; + break; default: Assert(fFalse); } @@ -1402,7 +1408,7 @@ flag API DlgInside(HWND hdlg, uint msg, WORD wParam, LONG lParam) SetEditN(deIn_fd, dr.nFog); SetEditN(deIn_cp, dr.nClip); SetEditR(deIn_vs, dr.dInside); - SetEditN(deIn_sw, dr.nStereo); + SetEditN(deIn_sw, ds.nStereo); SetRadio(dr7 + dr.nTrans, dr7, dra); SetEditN(deIn_fm, dr.nFrameXY); SetEditN(deIn_fr, dr.nFrameD); @@ -1483,7 +1489,7 @@ flag API DlgInside(HWND hdlg, uint msg, WORD wParam, LONG lParam) dr.nFog = nfd; dr.nClip = ncp; dr.dInside = rvs; - dr.nStereo = nsw; + ds.nStereo = nsw; dr.nTrans = GetRadio(dr7, dra); dr.nFrameXY = nfm; dr.nFrameD = nfr; @@ -1633,14 +1639,14 @@ flag API DlgCubeFlip(HWND hdlg, uint msg, WORD wParam, LONG lParam) switch (msg) { case WM_INITDIALOG: SetRadio(dr1, dr1, dr3); - SetRadio(dr4, dr4, dr7); + SetRadio(dr4, dr4, dr8); SetFocus(GetDlgItem(hdlg, dr1)); return fFalse; case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { if (wParam == IDOK) { i = GetRadio(dr1, dr3); - j = GetRadio(dr4, dr7); + j = GetRadio(dr4, dr8); PbFocus()->FCubeFlip2(i, j); DirtyView(); } diff --git a/wdriver.cpp b/wdriver.cpp index 7b93a0b..934c20c 100644 --- a/wdriver.cpp +++ b/wdriver.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: wdriver.cpp +** Daedalus (Version 3.4) File: wdriver.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -24,7 +24,7 @@ ** code to execute menu commands and Windows events. ** ** Created: 4/8/2013. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -472,6 +472,7 @@ int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, FBootExternal("daedalus.ds", fTrue); ws.fQuitting = fTrue; } else if (!FBootExternal("daedalus.ds", fTrue)) { + dr.nFrameXY = dr.nFrameD = dr.nFrameZ = 90; DoCommand(cmdInsideView); DoCommand(cmdGoMiddle); DoCommand(cmdMoveRandom); @@ -634,7 +635,8 @@ flag DoCommandW(int wCmd) case cmdSetupAll: case cmdSetupUser: if (!FCreateProgramGroup(wCmd == cmdSetupAll)) - PrintSz_E("Failed to create program group."); + PrintSz_E("Failed to create program group.\nDaedalus " + "can still be run from other icons or directly from its folder."); break; case cmdSetupDesktop: @@ -1248,7 +1250,13 @@ LRESULT WINAPI WndProc(HWND hwnd, uint wMsg, WPARAM wParam, LPARAM lParam) case WM_HSCROLL: if (ws.fSaverRun) goto LClose; - switch (wParam) { + switch (LOWORD(wParam)) { + case SB_LEFT: + ws.xScroll = 0; + break; + case SB_RIGHT: + ws.xScroll = nScrollDiv; + break; case SB_LINEUP: ws.xScroll = max(0, ws.xScroll - 1); break; @@ -1262,7 +1270,7 @@ LRESULT WINAPI WndProc(HWND hwnd, uint wMsg, WPARAM wParam, LPARAM lParam) ws.xScroll = min(nScrollDiv, ws.xScroll + nScrollPage); break; case SB_THUMBPOSITION: - ws.xScroll = LOWORD(lParam); + ws.xScroll = HIWORD(wParam); break; default: return fFalse; @@ -1276,7 +1284,13 @@ LRESULT WINAPI WndProc(HWND hwnd, uint wMsg, WPARAM wParam, LPARAM lParam) case WM_VSCROLL: if (ws.fSaverRun) goto LClose; - switch(wParam) { + switch (LOWORD(wParam)) { + case SB_TOP: + ws.yScroll = 0; + break; + case SB_BOTTOM: + ws.yScroll = nScrollDiv; + break; case SB_LINEUP: ws.yScroll = max(0, ws.yScroll - 1); break; @@ -1290,7 +1304,7 @@ LRESULT WINAPI WndProc(HWND hwnd, uint wMsg, WPARAM wParam, LPARAM lParam) ws.yScroll = min(nScrollDiv, ws.yScroll + nScrollPage); break; case SB_THUMBPOSITION: - ws.yScroll = LOWORD(lParam); + ws.yScroll = HIWORD(wParam); break; default: return fFalse; @@ -1381,7 +1395,7 @@ void Redraw(HWND hwnd) goto LDone; if (dr.nInside != nInsideSimple) { - if (dr.nStereo == 0) + if (ds.nStereo == 0) RedrawInsidePerspective(bm.kI); else RedrawInsidePerspectiveStereo(bm.kI, bm.kS); diff --git a/wdriver.h b/wdriver.h index 04290b5..a260e4c 100644 --- a/wdriver.h +++ b/wdriver.h @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: wdriver.h +** Daedalus (Version 3.4) File: wdriver.h ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -23,7 +23,7 @@ ** This file contains Windows specific definitions for Daedalus as a whole. ** ** Created: 4/8/2013. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ @@ -58,9 +58,6 @@ // Dialog Macros -#define HourglassOn \ - if (ws.fHourglass) hcurPrev = SetCursor(LoadCursor(NULL, IDC_WAIT)) -#define HourglassOff if (hcurPrev != NULL) SetCursor(hcurPrev) #define CheckMenu(cmd, f) \ CheckMenuItem(wi.hmenu, cmd, f ? MF_CHECKED : MF_UNCHECKED); #define SetCheck(id, f) CheckDlgButton(hdlg, id, f) diff --git a/wutil.cpp b/wutil.cpp index 29f6349..2f98287 100644 --- a/wutil.cpp +++ b/wutil.cpp @@ -1,9 +1,9 @@ /* -** Daedalus (Version 3.3) File: wutil.cpp +** Daedalus (Version 3.4) File: wutil.cpp ** By Walter D. Pullen, Astara@msn.com, http://www.astrolog.org/labyrnth.htm ** ** IMPORTANT NOTICE: Daedalus and all Maze generation and general -** graphics routines used in this program are Copyright (C) 1998-2018 by +** graphics routines used in this program are Copyright (C) 1998-2023 by ** Walter D. Pullen. Permission is granted to freely use, modify, and ** distribute these routines provided these credits and notices remain ** unmodified with any altered or distributed versions of the program. @@ -23,7 +23,7 @@ ** This file contains Windows specific utilities and operations for Daedalus. ** ** Created: 11/16/2002. -** Last code change: 11/29/2018. +** Last code change: 8/29/2023. */ #include @@ -355,7 +355,7 @@ void DrawTextLine(HDC hdc, CONST char *sz, int cch, int y) if (dr.kvOff == dr.kvOn) nSav = SetBkMode(hdc, TRANSPARENT); yp = size.cy*y + (y < 0)*ws.ypClient; - if (dr.nStereo == 0) { + if (ds.nStereo == 0 || ds.fStereo3D) { TextOut(hdc, (ws.xpClient >> 1) - (size.cx >> 1), yp, sz, cch); } else { TextOut(hdc, (ws.xpClient >> 2) - (size.cx >> 1), yp, sz, cch); @@ -520,6 +520,7 @@ flag FCreateDesktopIcon() DeleteShortcut(szDir, "Daedalus 3.0"); DeleteShortcut(szDir, "Daedalus 3.1"); DeleteShortcut(szDir, "Daedalus 3.2"); + DeleteShortcut(szDir, "Daedalus 3.3"); // Check whether hunger subdirectory exists with texture in it. GetModuleFileName(wi.hinst, szExe, cchSzMax); @@ -567,7 +568,9 @@ flag FCreateProgramGroup(flag fAll) DeleteShortcut(szDir, "Daedalus 3.0"); DeleteShortcut(szDir, "Daedalus 3.1"); DeleteShortcut(szDir, "Daedalus 3.2"); - DeleteShortcut(szDir, "Daedalus homepage"); + DeleteShortcut(szDir, "Daedalus 3.3"); + DeleteShortcut(szDir, "Daedalus homepage"); // Now Daedalus website + DeleteShortcut(szDir, "Carleton Farm Maze"); // Now Carleton Farm Maze #1 // Add main shortcuts in folder. sprintf(S(szName), "%s %s", szDaedalus, szVersion); @@ -593,15 +596,13 @@ flag FCreateProgramGroup(flag fAll) return fFalse; } - // Delete old previous version script shortcuts from subfolder. - DeleteShortcut(szDir, "Carleton Farm Maze"); // Now Carleton Farm Maze #1 - // Add script shortcuts in subfolder for (iScript = 0; iScript <= cmdScriptLast - cmdScript01; iScript++) { if (!FCreateShortcut(szDir, rgszShortcut[iScript], rgszScript[iScript], NULL, iScript != 5/*Dragonslayer*/ && iScript != 8/*Hunger*/ && iScript != 25/*Squares*/ && iScript != 26/*Mandelbrot*/ && - iScript != 27/*Pentris*/ ? 1 : 2)) + iScript != 27/*Pentris*/ && iScript != 28/*Grippy*/ ? 1 : + (iScript != 28/*Grippy*/ ? 2 : 5))) return fFalse; } return fTrue;