Commit graph

1447 commits

Author SHA1 Message Date
pewpew
4a50a9ff56
MxNotificationManager and MxParam initial work. (#78)
* MxNotificationManager initial work.

* Add .swp files to .gitignore.

* Checkpoint before anything too crazy with param

* Cleanup and add MxParam.

* Checkpoint for everything except MxNotificationManager::Register.

* Add int return type to MxCore::GetId instead of relying on implicit function nonsense.

* Add stlcompat.h so this can still be built on modern compilers, fix affected type size asserts.

* Switch to Mx types

* Add BUILD_COMPAT option to CMake so the project can still be built with modern compilers.

* Change vtable14 and vtable18 to Register and Unregister in MxTickleManager.

* Remove last unsigned int reference to id type.

* Remove MxList, use one inherited class per type. Improves accuracy again.

* Address compiler compatibility code review.

* Match MxNotificationManager::Register.

* Re-enable MxNotificationManager DECOMP_SIZE_ASSERT.
2023-07-15 23:43:08 -07:00
MattKC
2ffe227d82
Add SmartHeap (#83)
* add smartheap

* cmake: bump even further

* this seemed to be necessary but now it isn't? ok

* cmake: force include smrtheap.hpp

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* cmake: force include smrtheap.hpp 2

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* remove compiler defs - unnecessary if force-including anyway

* cmake: use interface for cleaner code

---------

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
2023-07-15 23:18:21 -07:00
Mark Langen
f247e10b7e
reccmp.py improvements (#82)
* Rather than using <OFFSET> as a replacement for all offsets in a
  function, label the offsets as <OFFSET1>, <OFFSET2>, etc. Doing this
  will avoid false-positive 100% matches resulting from the same
  function being called in two times where a different on should have
  been called or vice versa. And the same for globals. I already
  encountered one case of this in the wild.

* When a 100% match initially fails, try to make the functions match by
  swapping register allocations. This makes it possible to get a 100%
  match where the generated machine code differs only in register
  allocation.

* Only apply the above when it is possible to reach a 100% match in that
  way. Otherwise show the developer the unadultrated diff to avoid
  complicating decompilation.

* In the result listing, show the functions which are "effective
  matches" in this way as "100%*" instead of "100%".
2023-07-15 23:13:34 -07:00
Joshua Peisach
f8b1995a83
LEGO1: MxPalette (#56)
* MxPalette - add missing member variables, Detach function

* mb

* MxPalette: give bob the builder his constructor

* push progress, gn

* avoid hexadecimal

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* fix MxPalette::GetDefaultPalette

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* aaaaaaaaaaaaaa

* Revert "fix MxPalette::GetDefaultPalette"

This reverts commit 63f2215737.

* Implement MxPalette::Clone (doesn't match)

* fix MxPalette structure and match ctor/dtor

* Matching progress for MxPalette::GetDefaultPalette

* Implement ApplySystemEntriesToPalette except the memcpy calls

* implement SetSkyColor (doesn't match)

* Use MxTypes instead of generics

* prefer decimal values than hex for m_entries

* Update mxpalette.cpp

* Push MxPalette progress - read comments in code.

* improved MxPalette::operator==, will be 100% when MSVC feels like making it so

* improved MxPalette::SetSkyColor, will be 100% when MSVC feels like making it so

* improved MxPalette::Clone, will be 100% when MSVC feels like making it so

* Fixes

- reordered the functions in order of where they are in the hex because recmp.py sometimes kept saying it couldn't find the symbol (??)
- clone returns a pointer, not a ref
- worked a bit on setpalette/applysysentriestopalette

* Match GetDefaultPalette a bit more

* fix: MxPalette::GetDefaultPalette is now 100% matching

* fix: MxPalette::ApplySystemEntriesToPalette is now 100% matching

* tidy: rename `DC` var in GetDefaultPalette to `hdc`

* fix: MxPalette::SetPalette is now functionally matching

Not assembly matching yet because of MSVC weirdness.
At some point it will probably start matching, because
the structure seems to be accurate.

* fix: MxPalette rgbquad ctor functionally matches

Not quite ASM matching yet because of weird
register allocation mismatches.

* fix: I forgot to commit mxpalette.h...

* tidy: use Mx* primitives instead of builtins

* refactor: remove MxPalette::FromBitmapPalette

* fix: call ApplySystemEntriesToPalette from MxPalette(const RGBQUAD *)

* rename MxPalette::SetPalette to MxPalette::SetEntries

* fix: I once again forgot to commit mxpalette.h...

* feat: add/match MxPalette::Reset [0x100BF490]

* fix: add MVideoManager() to mxomni header

* refactor: change unk50 in MxVideoManager to LPDIRECTDRAW

* feat: add/match MxPalette::CreateNativePalette [0x100BF000]

* fix: MxPalette::SetSkyColor is 100% matching

* Annotate MxPalette members' offsets

* Annotate the global default aplette

* use hex size

* remove unnecessary variable offset listing

* Update LEGO1/mxpalette.cpp

---------

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
Co-authored-by: Christian Semmler <mail@csemmler.com>
Co-authored-by: ktkaufman03 <ktkaufman@wpi.edu>
Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com>
2023-07-15 22:51:24 -07:00
itsmattkc
f707af34db move override macro to compat.h 2023-07-12 14:12:03 -07:00
itsmattkc
67115e32d3 cmake: bump minimum version 2023-07-07 12:22:42 -07:00
Mark Langen
889fd886f0
MxSemphore + MxThread + MxThread implementions (#80)
* Add MxSemphore + MxThread and the two implementations I could find
  of MxThread (consumers extend it and override the Run method).

* Implement a function in MxDiskStreamProvider which uses thread and
  semaphore to confirm correct layout / size of those classes.

* All 100% match except two functions with a pair of registers swapped.
2023-07-07 11:00:48 -07:00
MattKC
f8fe635248
ci: don't show context lines when diffing progress, only show changed lines 2023-07-07 10:44:53 -07:00
Mark Langen
391ca9908f
LegoStream and implementations 100% match (#77)
* MxFile and implementations 100% match

* Add MxFile and it's implementations, MxSystemFile and MxMemoryFile.
  The names are chosen by me, we don't know their original naming.

* These expose a Read/Write/Seek/Tell interface for reading and writing
  data, either from a file on disk or memory buffer.

* 100% match all functions.

* Change name to LegoStream

* Use p_ convention

* Assert size
2023-07-07 09:20:51 -07:00
MishaProductions
fb56735fbd
[lego] Implement LegoGameState::SetSavepath (#76)
* SetSavePath 100% match

* fix naming convention
2023-07-03 10:25:37 -07:00
Christian Semmler
e0e338ee44
lego: add MxDSType enum, add it to all ctors, refactor MxDSObject (#73)
* lego: add MxDSType enum, add to all ctors

* refactor header

* re-type members

* add size assert for MxDSObject

* fix Parse param

* fix types
2023-07-03 10:24:51 -07:00
Christian Semmler
d64a04705c
lego: fix/match SetColorString (#72)
* lego: fix/match SetColorString

* explicitly cast to float to avoid warning

* style fixes

* remove superfluous includes

* Update legobackgroundcolor.cpp
2023-07-02 10:17:15 -07:00
itsmattkc
9415bd18bb
fill out the rest of our primitives in mxtypes 2023-07-02 10:07:55 -07:00
itsmattkc
8fa45bbe0f replace shorts with MxS16/MxU16/undefined2 2023-07-02 02:07:11 -07:00
MattKC
5d099115fe
Update CONTRIBUTING.md [skip ci] 2023-07-02 01:11:49 -07:00
MattKC
e16249b672
Define MxLong/MxULong (#71)
* define MxLong/MxULong

The "long" type has different sizes on different platforms, and this may cause issues.

* use DWORD to match RegQueryValueExA arg
2023-07-02 01:05:49 -07:00
Kai Kaufman
0555e05756
fix: ConvertHSVToRGB is effectively 100% matching (#70) 2023-07-02 01:02:05 -07:00
Kai Kaufman
b91c7d436b
fix: MxDSFile::Open is now matching 100% (#69) 2023-07-02 00:51:57 -07:00
Anonymous Maarten
646b39e876
Implement MxObjectFactory::{MxObjectFactory,Create} + match sizes of Mx.*Presenter objects created by it (#59)
* Get Isle building on MinGW32 (#63)

* Add MxUnknown100dc6b0::~MxUnknown100dc6b0 stub

* Declare destructor of MxOmni and MxTransitionManager in class

* inline attribute must go first

* Stub LegoState::Vtable0x14 for Act3State

* MxStreamer::VTable0x14 is not an override

* Stub MxEntity::Destroy for LegoState::Destroy

* Stub MxUnknown100dc6e0 for MxSoundManager

* ::ClassName and ::IsA are const methods

* methods in the class body don't need a namespace

* MxSoundManager subclasses MxUnknown100dc6e0

* LegoInputManager subclasses MxPresenter

* NotificationId is an enum, and does not need __declspec(dllexport)

* Fix final #endif of legoomni.h and mxobjectfactory.h

* Add const alternative for LegoOmni::Create and MxVideoParam, only available for MinGW

* Alternative approach to MinGW compatibility

* MinGW on Linux is case sensitve

* Don't delete a member variable. C++ automatically destructs member variables

---------

Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com>

* MxatomId: implement inline operator==

* Add decomp.h header, containing macro's only used when matching the original binaries

* Add in-line constructor of MxPresenter

* MxMediaPresenter: add members to match size

* MxVideoPresenter: add members to match size

* MxCompositePresenter: add members to match size

* MxFlcPresenter: add members to match size

* MxSmkPresenter: add members to match size

* MxStillPresenter: add members to match size

* MxAudioPresenter: add members to match size

* MxWavePresenter: add members to match size

* MxMIDIPresenter: add members to match size

* MxEventPresenter: add members to match size

* MxLoopingFlcPresenter: add members to match size

* MxLoopingSmkPresenter: add members to match size

* MxLoopingMIDIPresenter: add check for size

* Implement MxObjectFactory::{MxObjectFactory,Create}

Matching of MxObjectFactory::Create is not good, because none of the other objects have been implemented.

* Implement a few MxPresenter methods

* Fix size of LegoInputManager

* Fix name of first padding member of legoinputmanager.h

* add DECOMP_SIZE_ASSERT macro

* Use DECOMP_SIZE_ASSERT macro + convert to hexadecimal

* fixed minor typos

---------

Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com>
Co-authored-by: itsmattkc <itsmattkc@gmail.com>
2023-07-02 00:00:28 -07:00
Anonymous Maarten
302b3f66f0
Get Isle building on MinGW32 (#63)
* Add MxUnknown100dc6b0::~MxUnknown100dc6b0 stub

* Declare destructor of MxOmni and MxTransitionManager in class

* inline attribute must go first

* Stub LegoState::Vtable0x14 for Act3State

* MxStreamer::VTable0x14 is not an override

* Stub MxEntity::Destroy for LegoState::Destroy

* Stub MxUnknown100dc6e0 for MxSoundManager

* ::ClassName and ::IsA are const methods

* methods in the class body don't need a namespace

* MxSoundManager subclasses MxUnknown100dc6e0

* LegoInputManager subclasses MxPresenter

* NotificationId is an enum, and does not need __declspec(dllexport)

* Fix final #endif of legoomni.h and mxobjectfactory.h

* Add const alternative for LegoOmni::Create and MxVideoParam, only available for MinGW

* Alternative approach to MinGW compatibility

* MinGW on Linux is case sensitve

* Don't delete a member variable. C++ automatically destructs member variables

---------

Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com>
2023-07-01 23:53:54 -07:00
Anonymous Maarten
40dd0a93d4
Faster reccmp.py on linux (#62)
* reccmp: avoid repeated execution of winepath

Executing winepath many times is slow,
so try we like to avoid it as much as possible.

When the path start with a known prefix, replace it with
a cached prefix and do some string manipulation.

This change reduces execution time of reccmp.py from 90s to 2s.

Which is nice.

m

* reccmp: continue looking when source cannot be found

Most often, the reasons is mismatched sources.

* reccmp: add basic logging + optional debug

* Read the addresses in the exe headers as little endian
2023-07-01 23:52:47 -07:00
stonedDiscord
904640e028
CI steps (#65)
* break build up into steps

* download artifacts

* clone uploadtool

* need env on windows

* just use ubuntu for inkscape

* report went missing

* add inkscape to path

* use ubuntu for compare

* Revert "use ubuntu for compare"

This reverts commit a4ce103d09.

* reinstall after cache

* try different apt cache

* use im

* use rsvg

* change size to avoid downscaling

* remove png

* do not install librsvg anymore
2023-07-01 21:51:26 -07:00
Christian Semmler
8aad15d18b
lego1: match MxBitmap::Read and vtable (#67)
* lego1: match MxBitmap::Read and vtable

* fix param name
2023-07-01 21:49:42 -07:00
itsmattkc
a66dbb8136 Squashed commit of the following:
commit a41a442f5a
Author: MishaProductions <106913236+MishaProductions@users.noreply.github.com>
Date:   Fri Jun 30 08:10:54 2023 +0300

    Update .editorconfig

    Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

commit 5768cf4a0c
Author: Misha <mishakeys20@gmail.com>
Date:   Fri Jun 30 08:04:37 2023 +0300

    add legoutil

commit 7d6b00c831
Author: Misha <mishakeys20@gmail.com>
Date:   Fri Jun 30 08:02:17 2023 +0300

    Update CMakeLists.txt

commit d9b49087f8
Author: Misha <mishakeys20@gmail.com>
Date:   Fri Jun 30 08:01:06 2023 +0300

    Update CMakeLists.txt

commit d5a2891965
Author: Misha <mishakeys20@gmail.com>
Date:   Fri Jun 30 07:59:03 2023 +0300

    Update CMakeLists.txt

commit 519253bff4
Merge: 6cefa2e 13df3f9
Author: Misha <mishakeys20@gmail.com>
Date:   Fri Jun 30 07:57:15 2023 +0300

    Merge remote-tracking branch 'upstream/master' into legobackgroundcolor

commit 6cefa2e9e2
Author: Misha <mishakeys20@gmail.com>
Date:   Thu Jun 29 16:51:53 2023 +0300

    add back stuff to mak file after merge

commit c2b16eb8ff
Merge: 3c8add2 07912eb
Author: Misha <mishakeys20@gmail.com>
Date:   Thu Jun 29 16:49:51 2023 +0300

    Merge remote-tracking branch 'upstream/master' into legobackgroundcolor

commit 3c8add2f19
Author: Misha <mishakeys20@gmail.com>
Date:   Thu Jun 29 13:34:15 2023 +0300

    Update legobackgroundcolor.cpp

commit 6879f30e79
Author: Misha <mishakeys20@gmail.com>
Date:   Wed Jun 28 18:22:35 2023 +0300

    add fixme + rename MxStringVariable functions

commit a883f37b9d
Author: Misha <mishakeys20@gmail.com>
Date:   Wed Jun 28 18:15:42 2023 +0300

    address review

commit a919eeb7f4
Author: Misha <mishakeys20@gmail.com>
Date:   Wed Jun 28 08:19:45 2023 +0300

    Update mxbackgroundcolor.cpp

commit 710c1dd5ea
Author: Misha <mishakeys20@gmail.com>
Date:   Wed Jun 28 08:11:13 2023 +0300

    add back mak file

commit 25e9bbbfb0
Merge: 78b0e8d 2d9af63
Author: Misha <mishakeys20@gmail.com>
Date:   Wed Jun 28 08:09:03 2023 +0300

    Merge remote-tracking branch 'upstream/master' into legobackgroundcolor

commit 78b0e8dd62
Author: Misha <mishakeys20@gmail.com>
Date:   Tue Jun 27 18:35:58 2023 +0300

    improve accuracy

commit 4c2e1ca95c
Author: Misha <mishakeys20@gmail.com>
Date:   Mon Jun 26 13:50:40 2023 +0300

    improve accuracy

commit 7dd3469ca3
Author: Misha <mishakeys20@gmail.com>
Date:   Mon Jun 26 13:24:11 2023 +0300

    ConvertColor wip

commit b0288803a8
Merge: 3d16867 0b47f3f
Author: MishaProductions <106913236+MishaProductions@users.noreply.github.com>
Date:   Mon Jun 26 09:42:08 2023 +0300

    Merge branch 'isledecomp:master' into legobackgroundcolor

commit 3d16867a90
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 17:03:14 2023 +0300

    90% match

commit 2208573eb2
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 12:23:47 2023 +0300

    improve accuracy + add editorconfig

commit 288f861428
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 07:57:14 2023 +0300

    fix makefile

commit 3590e59a3a
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 07:51:35 2023 +0300

    Update isle.mak

commit fb52ad5781
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 07:47:06 2023 +0300

    fix build

commit 791cf1301a
Merge: b9ecd15 64d2b9e
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 07:42:09 2023 +0300

    Merge remote-tracking branch 'upstream/master' into legobackgroundcolor

commit b9ecd15ca6
Author: Misha <mishakeys20@gmail.com>
Date:   Sun Jun 25 07:40:22 2023 +0300

    undo change

commit 6327a797bc
Author: Misha <mishakeys20@gmail.com>
Date:   Sat Jun 24 21:48:08 2023 +0300

    delete accidently committed files

commit 7ae1c05df9
Author: Misha <mishakeys20@gmail.com>
Date:   Sat Jun 24 21:47:05 2023 +0300

    implement SetColorString

commit 323a2ee0e7
Author: Misha <mishakeys20@gmail.com>
Date:   Sat Jun 24 20:47:03 2023 +0300

    constructor and some methods are matching

commit 0ce6fab3d0
Author: Misha <mishakeys20@gmail.com>
Date:   Sat Jun 24 20:38:10 2023 +0300

    constructor is almost matching
2023-06-30 16:33:59 -07:00
Christian Semmler
d7b8d6463b
lego: Implement/match CalculateNewVel (#66)
* lego: Implement/match CalculateNewVel

* remove braces

* consistency
2023-06-30 16:24:46 -07:00
Joshua Peisach
428b5ae8db
Initial implementation of MxBitmap (#34)
Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
2023-06-30 16:24:00 -07:00
itsmattkc
e929d76f3c reccmp: use "monospace" in svg font
For some reason Inkscape made this "mono", but it seems like "monospace" is the right attribute here
2023-06-30 16:12:22 -07:00
MattKC
c4d0ea8746
readme: use SVGs [skip ci]
Had to use an external site for this because GitHub doesn't seem to have a good way to do this right now. But this works...
2023-06-30 16:06:30 -07:00
MattKC
4adad9af49
ci: upload SVGs to external sites
Can't embed SVGs from GitHub Releases (made an issue that will probably get ignored here https://github.com/orgs/community/discussions/59781). Uploading to external site instead for the time being.
2023-06-30 16:00:27 -07:00
itsmattkc
4c9e138cbf implement all DLL exports (as TODOs)
Now we can use our own compiled LEGO1.LIB rather than one generated from the original. Also implements a script that tests them to help ensure future commits don't break them.
2023-06-30 11:34:39 -07:00
MattKC
13df3f906d
Update README.md [skip ci] 2023-06-29 21:45:29 -07:00
MattKC
8476bf06b2
Yet another CMake implementation (#61)
* initial cmake implementation

* ci: i guess older cmake doesn't support this

* cmake: add max version to suppress warning

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

---------

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
2023-06-29 16:39:02 -07:00
itsmattkc
aa3dfe1808 ci: skip continuous release on pull requests [skip ci] 2023-06-29 10:24:58 -07:00
MishaProductions
88c18c76ed
lego1: match LegoOmni::GetInstance and deconstructor and add a few methods (#58)
* add GetInstance fix

* Implement a few methods

* Move get* helpers to their correct locations

* rename m_instance

* add TransitionManager
2023-06-29 10:02:47 -07:00
Christian Semmler
6558a78848
lego1: implement MxDSObject (#55)
* Implement MxDSObject

* use discovered names

* Update LEGO1/mxdsobject.cpp

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* Update mxdsobject.cpp

* Update mxdsobject.h

---------

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
2023-06-29 09:08:06 -07:00
Christian Semmler
6761345c8c
lego1: fix/match some ClassName functions (#60) 2023-06-29 09:05:45 -07:00
itsmattkc
566e107290 reccmp: only show recompiled address on request
Improves comparisons between diffs because the addresses shifting around leads to false positives
2023-06-29 09:02:52 -07:00
Christian Semmler
3e58002ba5
MxStreamController: fix structure (#57) 2023-06-29 08:48:42 -07:00
Cydra
07912eb05a
Class layout for LEGO1 classes (#43)
* Stubbed a bunch of classes and annotated them for later use. Heavily wip and more of pseudocode right now.

* Converted pseudocode into real code!

* Created a bunch more classes and added more information to exisiting ones
Did not error check, this was pushed just for reference

* More classes and implementation details. Still not checked for any errors

* Fixed code and decided on a way to handle virtual table stubs

* Some additional fixes

* More smaller fixes

* Added classes to project and made it compile

* Fixed function adresses that caused the python script to fail

* More classes and virtual function resolves. Builds and compares fine.

* Again more classes and virtual function resolves. Builds and compares fine.

* No clue, I guess forced update for line endings

* Finished up some work, compiles fine. All functions are STUB annotated to not pollute reccmp.py output.

* line ending change

* rename GetClassName/IsClass

Mirroring recent changes from master

* further conform to current master

* update project

* cleanup

* project only updates when you close msdev

---------

Co-authored-by: Cydra <cydra95@gmail.com>
Co-authored-by: itsmattkc <34096995+itsmattkc@users.noreply.github.com>
2023-06-29 01:10:08 -07:00
MattKC
4d200bb193
Update CONTRIBUTING.md 2023-06-29 00:49:57 -07:00
MS
2d9af630ba
lego1: Two more operators for MxString (#53)
Followed the hint from @madebr in #31 that the next function in MxString was operator+. The one after that is operator+= and both are at 100%.

Squashed commits:
* Removed unnecessary consts
* Replaced malloc/free with new/delete, which solved swapped regs in operator=
* Use delete[] when freeing char* m_data
2023-06-27 19:57:30 -07:00
itsmattkc
8da62cc596 ci: convert to 512px png
These might scale down better, the ones in the readme seem really blurry
2023-06-27 19:55:17 -07:00
itsmattkc
8e6e2a3962 reccmp: fix SVGs on light backgrounds 2023-06-27 19:46:04 -07:00
itsmattkc
aaf61ba48e ci: ignore return code of diff
diff returns a 1 error code if diffs are found which halts the script, but we don't consider this an error, we're just interested in the information
2023-06-27 19:08:43 -07:00
itsmattkc
706be168af msvc: force update dependencies 2023-06-27 19:06:04 -07:00
itsmattkc
e7b5ea53df rename GetClassName/IsClass, declare mxtypes
Was intended as a simple code improvement, however it also seems to make WinMain, MxString::operator=, MxDSFile::Open 100% (all of which just needed registers to be switched around)
2023-06-27 19:04:07 -07:00
itsmattkc
c7cf9ee8fd ci: compare accuracy as separate step 2023-06-27 19:02:26 -07:00
itsmattkc
ad2d84ce58 ci: compare accuracy to current master 2023-06-27 19:01:04 -07:00
itsmattkc
008fd80a6f ci: create text progress reports too for auto-comparison 2023-06-27 18:58:15 -07:00
itsmattkc
f7c84d719b reccmp: use bold font for easier readability 2023-06-27 18:25:38 -07:00