Giter Club home page Giter Club logo

everest's People

Contributors

0x0ade avatar bigkahuna443 avatar brokemia avatar caeyo avatar catapillie avatar coloursofnoise avatar danesky-jp avatar dashingcat avatar demojameson avatar euniversecat avatar greymario avatar jakobrs avatar jatheplayer avatar kalobi avatar l-luna avatar ldmdiamondl avatar leo60228 avatar lollyde avatar maddie480 avatar microlith57 avatar nhruo123 avatar penguinowl avatar popax21 avatar redflames avatar rhelmot avatar snipundercover avatar swoolcock avatar viv-0 avatar wartori54 avatar wegfan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

everest's Issues

Enhancements to mod toggling

  • Make the mod toggler aware of dependencies, and toggle them along with the mod that requires them
  • Have the dependency downloader unblacklist mods automatically when they are required
  • Show more clearly which mods are currently loaded somewhere. Maybe a submenu or a section in the mod toggler?

Unnecessary dependencies on mono build

OS: Debian 10 buster
Mono version: 5.8.0.108

I am running a deb-based mono install with minimal nuget packages. From ab9caf3 onward, my build environment no longer functions properly; I need to install nuget packages which mono has already accounted for, in /usr/lib/mono/. This is a nuisance because nuget wants to install all the dependencies too, which I don't have installed because mono has that taken care of, too.

Is there any workaround possible for my workflow? If all else fails, I could just revert this commit on my local repo.

Crash with CelesteTAS on Linux / itch.io version

Someone reported crashes on Linux with the itch.io version and only CelesteTAS installed: to replicate, have both installed, go anywhere and try to dash.

  • if Disable Achievements is enabled, the following crash happens:
System.NullReferenceException: Object reference not set to an instance of an object
  at IL.Monocle.Commands.add_Render (MonoMod.Cil.ILContext+Manipulator ) <0x40c41170 + 0x00002> in <58802592a1084eefacf85810fc582ba3>:0 
  at (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition.DMD<DMD<Hook<Celeste.Stats::Increment>?-1002508516>?807530993::Hook<Celeste.Stats::Increment>?-1002508516>(Celeste.Stat,int)

Seeing the source code, there is no reason for execution to jump from the hook to Commands.add_Render though.

  • if Disable Achievements is disabled, the game core dumps:
=================================================================
Got a SIGILL while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

I cannot replicate this myself with my Steam version of the game.

Non-16:9 resolution support

This is a non-critical enhancement. It'd be nice if we could fit this into 1.0, but it's not a requirement.


Batby#8536 on Discord keeps asking for 21:9 support. It will never be officially supported as peeking into other rooms (or even the void) is undesired. Luckily, game modifications can get away with weird / negative side effects more easily than "official" features.

The menu code has been written with a "virtual" fixed resolution of 1920x1080 in mind - we'll probably just shrink the menu so that it fits on the screen.

I don't know how much of the in-game rendering code assumes a 16:9 context.

This task is currently open for anyone as I'm working on the ghost mod right now.

Hook does not work after caller method is hooked.

Here are the recreated steps and examples.
EverestHookBugExample.zip

  1. If I just Hook DoScreenWipe, it works fine. When retry in game will output two logs.
    (04/15/2020 22:15:00) [Everest] [Verbose] [Hook2] On.Celeste.Level.DoScreenWipe	wipeIn=False, onComplete=System.Action, hiresSnow=False
    (04/15/2020 22:15:00) [Everest] [Verbose] [Hook2] On.Celeste.Level.DoScreenWipe	wipeIn=True, onComplete=, hiresSnow=False
        public override void Load() {
            On.Celeste.Level.DoScreenWipe += JustLogDoScreenWipe;
        }

        private static void JustLogDoScreenWipe(On.Celeste.Level.orig_DoScreenWipe orig, Level self, bool wipeIn, Action onComplete, bool hiresSnow) {
            Logger.Log("Hook2", $"On.Celeste.Level.DoScreenWipe\twipeIn={wipeIn}, onComplete={onComplete}, hiresSnow={hiresSnow}");
            orig(self, wipeIn, onComplete, hiresSnow);
        }
  1. Then I hooked End, when retry in game the JustLogDoScreenWipe will only output one log.
(04/15/2020 22:25:46) [Everest] [Verbose] [Hook2] On.Celeste.PlayerDeadBody.End
(04/15/2020 22:25:47) [Everest] [Verbose] [Hook2] On.Celeste.Level.DoScreenWipe	wipeIn=True, onComplete=, hiresSnow=False
        public override void Load() {
            On.Celeste.PlayerDeadBody.End += JustLogEnd;
            On.Celeste.Level.DoScreenWipe += JustLogDoScreenWipe;
        }

        public override void Unload() {
            On.Celeste.PlayerDeadBody.End -= JustLogEnd;
            On.Celeste.Level.DoScreenWipe -= JustLogDoScreenWipe;
        }

        private void JustLogEnd(On.Celeste.PlayerDeadBody.orig_End orig, PlayerDeadBody self) {
            Logger.Log("Hook2", "On.Celeste.PlayerDeadBody.End");
            orig(self);
        }

        private static void JustLogDoScreenWipe(On.Celeste.Level.orig_DoScreenWipe orig, Level self, bool wipeIn, Action onComplete, bool hiresSnow) {
            Logger.Log("Hook2", $"On.Celeste.Level.DoScreenWipe\twipeIn={wipeIn}, onComplete={onComplete}, hiresSnow={hiresSnow}");
            orig(self, wipeIn, onComplete, hiresSnow);
        }

It seems that after Hook End method, the DoScreenWipe method called by End method cannot be Hooked.

		private void End()
		{
			if (!finished)
			{
				finished = true;
				Level level = SceneAs<Level>();
				if (DeathAction == null)
				{
					DeathAction = level.Reload;
				}
				level.DoScreenWipe(wipeIn: false, DeathAction);
			}
		}

Things that still need acknowledged in StrawberryRegistry

uh-oh. I wasn't done.

But I'd like to take a little break and come back in a bit. I don't think anything I list here will be an API-breaking change.

  • Non-tracked registered berries need to be tallied up too, so that save files can be gold-sleeved for levelsets that have all berries, tracked and secret, collected.

    • A quick skim says we'll need to butcher OuiFileSelectSlot.cs pretty aggressively to do this...
      This is probably very low priority.
    • Actually, Dadbod just suggested a save file indicator (a stamp, specifically) for "all collectibles".
      So maybe a golden ticket sleeve for every single berry in the levelset is a bit higher priority.
    • The completion_stamps branch aims to tackle this.
  • Do we need to do something to include registered modberries in LevelData.excludeNames? This looks a little suspicious and I should have looked into it earlier.

    • Before I forget, it looks like I can just make one check for registered berries here. It's about making sure that IDs set for strawberries and certain checked objects never change.
    • This is fixed now.
  • Need to account for vanilla moonberries. (Ugh.)

    • Turns out that was, like, a one-line fix. 馃惉馃挦
  • We may want a custom berry seed object that can accept an arbitrary Entity and double-checks that what is passed is a registered strawberry. Then we can read seed sprite data from custom berry definitions and do all the other things we need to with reflection.

    • We have the GenericStrawberrySeed and its associated Cutscene that can accept GenericStrawberrySeeds.
    • I need to make a readability pass on both later, and an extensibility pass for at least the former. This means we'll be able to set certain variables externally, such as the sprite for the seed and how long the player has before the seed set is lost.
    • Actually, this means we could even let modders set custom rules for losing berry seeds!
  • Non-vanilla berries aren't appearing in the Debug map. This is low priority, but we'll fix it anyway.

    • We have debugging features! 馃惉

Of course, feel free to tack on anything worth mentioning, or tackle something on here yourself.

Installer window cropped/scaled oddly

When opening the installer, it seems to be cropped/scaled weirdly, so the full window cannot be viewed. As such, I am unable to install Everest.
ey7w5YhTsV
My display is 1920x1080 with 125% scaling in Windows' Settings. I'm assuming it's something to do with that but I'm not sure. Any way to fix this? I've already tried changing the compatibility settings, but to no avail.

Some issues I encountered with hooks

First of all, sorry if this is not the right place to report those.

I'm reporting here the issues I encountered with hooks while developing Extended Variants:

1/ Hooking Player.ExplodeLaunch makes the game explode (fixed)

For some reason, hooking Player.ExplodeLaunch (even with a hook that does nothing) crashes the game (with System.AccessViolationException in the system's event logs on the XNA branch). This happens with both On.Celeste hooks and IL.Celeste ones.

Here is an example mod doing just that: ExplodeLaunch.zip. To replicate, go to room 09 in chapter 6 and hit a bumper.

I didn't encounter this issue with any other method I hooked... and I hooked a lot of them. 馃 Might just be something special with this method or something I'm doing wrong.

2/ Unhooking IL hooks does not always work (fixed)

More specifically, it seems that if two IL hooks are present on a method, unhooking one of them does not work (as in, the hook is still effective). But if there is only one hook, unhooking it works fine.

Here is a mod to replicate: ILHook.zip. This hooks Level.Render to enable debug pathfinder rendering and has an option to change the color grade of the level to Core (hot).

  • Go to Forsaken City
  • Turn on "Level Render Hook Enabled": level turns red
  • Turn it off: the level is still red
  • Toggling "Nothing Hook Enabled" at this point makes the colors go back to normal. This is the workaround I used in Extended Variants.

3/ Cannot IL-hook Player.orig_Update() (fixed)

Trying to IL-hook Player.orig_Update() gives the following error (full error log):

System.ArgumentException: The type or method has 1 generic parameter(s), but 2 generic argument(s) were provided. A generic argument must be provided for each generic parameter.

I didn't look into this in very deep detail, but from what I can see, the call to Entity.CollideCheck<Solid, NegaBlock>(Vector2) is the one causing trouble. Entity.CollideCheck<T>(Vector2) also exists, so maybe this one gets picked by accident?

Some methods in ILCursor cannot be used by code mods

I have been developing a code mod using IL.Celeste recently, and I ran into some issues when trying to use ILCursor. I cannot use some of the methods without the game blowing up with various errors, for example:

  • TryGotoNext(MoveType moveType, params Func<Instruction, bool>[] predicates): "The JIT compiler encountered an internal limitation"
Ver 1.2.6.1 [Everest: 859-azure-98148]
07/17/2019 13:00:35
System.InvalidProgramException: Le compilateur JIT a rencontr茅 une limitation interne.
  • GotoNext(MoveType moveType, params Func<Instruction, bool>[] predicates):
Ver 1.2.6.1 [Everest: 859-azure-98148]
07/17/2019 13:01:51
System.NullReferenceException: Object reference not set to an instance of an object.
   at Celeste.Mod.Helpers.MonoModUpdateShim._ILCursor.GotoNext(ILCursor c, Func`2[] predicates) in d:\a\1\s\Celeste.Mod.mm\Mod\Helpers\MonoModUpdateShim.cs:line 31
  • TryGotoNext(params Func<Instruction, bool>[] predicates): works fine

I am opening this issue because from what I understand, these crashes are coming from ILCursor getting relinked to MonoModUpdateShim. If I remove that shim my code mod runs fine (but I guess it breaks older code mods).

I would love to help solving that issue, but I am afraid of breaking backward compatibility. Which mods should I test my changes with if I try to solve this?

Sort out which achievements can be unlocked on mod maps

Currently, strawberry count related achievements and the moon berry one can be unlocked when playing a mod campaign, but the "all C-sides" achievement can only be unlocked for the vanilla campaign.

So, it would make sense to restrict the "strawberry count" and the "moon berry" achievements to vanilla maps as well.

Minor map screen inconsistencies

The map screen is not as consistent with modded campaigns as it is the vanilla campaign. I have noticed two inconsistencies.

  • The "scarf" under the chapter icon does not have any sort of "go up" movement for modded maps. This applies to both selecting an area or scrolling through campaigns.
  • The icons of the vanilla campaign move one after another, while modded campaigns move all at once.

These minor issues do not change much, just minor nitpicks.

Installation fails with old versions of mono

Running MonoMod to patch Celeste 1.3.1.2 (as part of miniinstaller) errors out in a variety of ways depending on what mono version I have.

6.4.0.198 (latest)

$ mono MonoMod.exe Celeste.exe
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v4.0.30319
MonoMod 19.9.1.6
[MonoMod] Reading input file into module.
[MonoMod] [Main] Scanning for mods in directory.
[MonoMod] [ReadMod] Loading mod dir: /home/audrey/games/celeste
[MonoMod] [ReadMod] Loading mod: /home/audrey/games/celeste/Celeste.Mod.mm.dll
[MonoMod] [Main] mm.AutoPatch();
[MonoMod] [AutoPatch] Parsing rules in loaded mods
[MonoMod] [RulesModder] [Write] Writing modded module into output stream.
[MonoMod] [AutoPatch] PrePatch pass
[MonoMod] [AutoPatch] Patch pass
[MonoMod] [AutoPatch] PatchRefs pass
[MonoMod] [PostProcessor] PostProcessor pass #1
[MonoMod] [PostProcessor] PostProcessor pass #2
[MonoMod] [Write] Writing modded module into output file.
Mono.CompilerServices.SymbolWriter.MonoSymbolFileException: Exception of type 'Mono.CompilerServices.SymbolWriter.MonoSymbolFileException' was thrown.
  at Mono.CompilerServices.SymbolWriter.MethodEntry.CheckLineNumberTable (Mono.CompilerServices.SymbolWriter.LineNumberEntry[] line_numbers) [0x00031] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.CompilerServices.SymbolWriter.MethodEntry..ctor (Mono.CompilerServices.SymbolWriter.MonoSymbolFile file, Mono.CompilerServices.SymbolWriter.CompileUnitEntry comp_unit, System.Int32 token, Mono.CompilerServices.SymbolWriter.ScopeVariable[] scope_vars, Mono.CompilerServices.SymbolWriter.LocalVariableEntry[] locals, Mono.CompilerServices.SymbolWriter.LineNumberEntry[] lines, Mono.CompilerServices.SymbolWriter.CodeBlockEntry[] code_blocks, System.String real_name, Mono.CompilerServices.SymbolWriter.MethodEntry+Flags flags, System.Int32 namespace_id) [0x0005e] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.CompilerServices.SymbolWriter.SourceMethodBuilder.DefineMethod (Mono.CompilerServices.SymbolWriter.MonoSymbolFile file, System.Int32 token) [0x000e1] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.CompilerServices.SymbolWriter.SourceMethodBuilder.DefineMethod (Mono.CompilerServices.SymbolWriter.MonoSymbolFile file) [0x0000d] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.CompilerServices.SymbolWriter.MonoSymbolWriter.WriteSymbolFile (System.Guid guid) [0x00015] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.Cecil.Mdb.MdbWriter.Dispose () [0x00000] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.Cecil.ModuleWriter.Write (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x00152] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleWriter.WriteModule (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x00002] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleDefinition.Write (System.String fileName, Mono.Cecil.WriterParameters parameters) [0x00017] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at MonoMod.MonoModder.Write (System.IO.Stream output, System.String outputPath) [0x0005f] in <71b3fea653634393ac8b3aaec0affcdc>:0
  at MonoMod.Program.Main (System.String[] args) [0x00262] in <71b3fea653634393ac8b3aaec0affcdc>:0

mono 4.6.2 (packaged with ubuntu 18.04):

root@8d4d221713d4:/mnt# mono MonoMod.exe Celeste.exe
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v4.0.30319
MonoMod 19.9.1.6
[MonoMod] Reading input file into module.
[MonoMod] [Main] Scanning for mods in directory.
[MonoMod] [ReadMod] Loading mod dir: /mnt
[MonoMod] [ReadMod] Loading mod: /mnt/Celeste.Mod.mm.dll
[MonoMod] [Main] mm.AutoPatch();
[MonoMod] [AutoPatch] Parsing rules in loaded mods
[MonoMod] [RulesModder] [Write] Writing modded module into output stream.
[MonoMod] [AutoPatch] PrePatch pass
[MonoMod] [AutoPatch] Patch pass
[MonoMod] [AutoPatch] PatchRefs pass
[MonoMod] [PostProcessor] PostProcessor pass #1
[MonoMod] [PostProcessor] PostProcessor pass #2
[MonoMod] [Write] Writing modded module into output file.
System.MissingMethodException: Method 'System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences' not found.
  at Mono.CompilerServices.SymbolWriter.MonoSymbolWriter.CloseMethod () [0x00000] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.Cecil.Mdb.MdbWriter.Write (Mono.Cecil.Cil.MethodDebugInformation info) [0x000be] in <40e1bef3e5f040168367d50ea20aeffc>:0
  at Mono.Cecil.Cil.CodeWriter.WriteResolvedMethodBody (Mono.Cecil.MethodDefinition method) [0x000f1] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.Cil.CodeWriter.WriteMethodBody (Mono.Cecil.MethodDefinition method) [0x0002b] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.AddMethod (Mono.Cecil.MethodDefinition method) [0x00013] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.AddMethods (Mono.Cecil.TypeDefinition type) [0x00013] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.AddType (Mono.Cecil.TypeDefinition type) [0x0009a] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.AddTypes () [0x00018] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.BuildTypes () [0x00014] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.BuildModule () [0x0009f] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.MetadataBuilder.BuildMetadata () [0x00000] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleWriter+<>c.<BuildMetadata>b__2_0 (Mono.Cecil.MetadataBuilder builder, Mono.Cecil.MetadataReader _) [0x00000] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleDefinition.Read[TItem,TRet] (TItem item, System.Func`3[T1,T2,TResult] read) [0x00029] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleWriter.BuildMetadata (Mono.Cecil.ModuleDefinition module, Mono.Cecil.MetadataBuilder metadata) [0x0000f] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleWriter.Write (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x0010a] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleWriter.WriteModule (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x00002] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at Mono.Cecil.ModuleDefinition.Write (System.String fileName, Mono.Cecil.WriterParameters parameters) [0x00017] in <8d9dd476eed0422b8775a719e22dbc54>:0
  at MonoMod.MonoModder.Write (System.IO.Stream output, System.String outputPath) [0x0005f] in <71b3fea653634393ac8b3aaec0affcdc>:0
  at MonoMod.Program.Main (System.String[] args) [0x00262] in <71b3fea653634393ac8b3aaec0affcdc>:0

mono 4.2.1 (bundled with ubuntu 16.04):

$ mono MonoMod.exe Celeste.exe
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v4.0.30319
MonoMod 19.9.1.6
[MonoMod] Reading input file into module.
[MonoMod] [Main] Scanning for mods in directory.
[MonoMod] [ReadMod] Loading mod dir: /mnt
[MonoMod] [ReadMod] Loading mod: /mnt/Celeste.Mod.mm.dll
[MonoMod] [Main] mm.AutoPatch();
[MonoMod] [AutoPatch] Parsing rules in loaded mods
MonoMod.Utils.RelinkFailedException: MonoMod failed relinking System.Object (context: MonoMod.MonoModRules) ---> System.MissingMethodException: Method 'Array.Empty' not found.
  at MonoMod.MonoModder.FindType (System.String name, Boolean runtimeName) <0x414ded20 + 0x0004f> in <filename unknown>:0
  at MonoMod.MonoModder.FindTypeDeep (System.String name) <0x414de8a0 + 0x00057> in <filename unknown>:0
  at MonoMod.MonoModder.MainRelinker (IMetadataTokenProvider mtp, IGenericParameterProvider context) <0x414de1c0 + 0x00127> in <filename unknown>:0
  at MonoMod.MonoModder.Relinker (IMetadataTokenProvider mtp, IGenericParameterProvider context) <0x414de080 + 0x00036> in <filename unknown>:0
  --- End of inner exception stack trace ---
  at MonoMod.MonoModder.Relinker (IMetadataTokenProvider mtp, IGenericParameterProvider context) <0x414de080 + 0x00113> in <filename unknown>:0
  at MonoMod.InlineRT.MonoModRulesModder.Relinker (IMetadataTokenProvider mtp, IGenericParameterProvider context) <0x414bea50 + 0x000fb> in <filename unknown>:0
  at MonoMod.Utils.MonoModExt.Relink (Mono.Cecil.TypeReference type, MonoMod.Utils.Relinker relinker, IGenericParameterProvider context) <0x414bdf50 + 0x00936> in <filename unknown>:0
  at MonoMod.MonoModder.PatchRefsInType (Mono.Cecil.TypeDefinition type) <0x414dd230 + 0x00137> in <filename unknown>:0
  at MonoMod.MonoModder.PatchRefs () <0x414dc970 + 0x00616> in <filename unknown>:0
  at MonoMod.InlineRT.MonoModRulesManager.ExecuteRules (MonoMod.MonoModder self, Mono.Cecil.TypeDefinition orig) <0x414b2f70 + 0x00777> in <filename unknown>:0
  at MonoMod.MonoModder.ParseRules (Mono.Cecil.ModuleDefinition mod) <0x414b2e30 + 0x00063> in <filename unknown>:0
  at MonoMod.MonoModder.AutoPatch () <0x414b2a90 + 0x000b2> in <filename unknown>:0
  at MonoMod.Program.Main (System.String[] args) <0x4143dd50 + 0x00726> in <filename unknown>:0

This is not actually where miniinstaller errors out - something a few steps later corrupts Celeste.exe and replaces it with an empty file somehow. Here's the log for that: miniinstaller-log.txt

Realistically this is probably a MonoMod bug or an error with my environment, but I would appreciate any relevant advice on getting everest installed on linux... thanks!

Better map documentation

This is more of a problem for @Vexatos and Cruor, but as most people will be using Everest for custom maps, this is definitely a spot that needs work. Despite the fact that this is more of a problem for Maple and whoever is working on the one or more GUIs, this should happen before 1.0 is out if we want it to actually be useful.

Fake heart colors are random

Fake hearts have randomized colors which change when editing a map, but seem consistent under no edits.

I suppose it would be worth adding an option that sets a specific heart color for individual fake hearts.

Personal to-do tweaks for Star Jump blocks

  • Option to disable the railing per block
  • Not visually connect adjacent sinking/stationary blocks
  • Maybe connect adjacent sinking blocks like vanilla does with floaty space?
  • Inside corner tiles.

Fail to install everst mod loader

I have a free copie of celeste, Im trying to install everest mod loader but it fails in the last screen every time, the game itself runs fine, here is the miniistaller log

Loading Mono.Cecil
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\Mono.Cecil.dll
Loading Mono.Cecil.Mdb
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\Mono.Cecil.Mdb.dll
Loading Mono.Cecil.Pdb
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\Mono.Cecil.Pdb.dll
Loading MonoMod.Utils.dll
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\MonoMod.Utils.dll
Loading MonoMod
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\MonoMod.exe
Loading MonoMod.RuntimeDetour.dll
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\MonoMod.RuntimeDetour.dll
Loading MonoMod.RuntimeDetour.HookGen
Lazily loading C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\MonoMod.RuntimeDetour.HookGen.exe
Running MonoMod for C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\orig\Celeste.exe
MonoMod 20.5.2.5
[MonoMod] Reading input file into module.
[MonoMod] [ReadMod] Loading mod dir: C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅
[MonoMod] [ReadMod] Loading mod: C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\Celeste.Mod.mm.dll
[MonoMod] [Main] Scanning for mods in directory.
[MonoMod] [ReadMod] Loading mod dir: C:\Games\Celeste v1.3.0.0-鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅\orig
[MonoMod] [Main] mm.AutoPatch();
[MonoMod] [AutoPatch] Parsing rules in loaded mods
[MonoMod] [RulesModder] [Write] Writing modded module into output stream.
System.TypeInitializationException: Se produjo una excepci贸n en el inicializador de tipo de 'MonoMod.MonoModRules'. ---> System.Exception: Unsupported version of Celeste: 1.3.0.0
en MonoMod.MonoModRules..cctor()
--- Fin del seguimiento de la pila de la excepci贸n interna ---
en System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type)
en MonoMod.InlineRT.MonoModRulesManager.ExecuteRules(MonoModder self, TypeDefinition orig)
en MonoMod.MonoModder.ParseRules(ModuleDefinition mod)
en MonoMod.MonoModder.AutoPatch()
en MonoMod.Program.Main(String[] args)

System.Exception: MonoMod failed creating a patched assembly!
en MiniInstaller.Program.RunMonoMod(String asmFrom, String asmTo)
en MiniInstaller.Program.Main(String[] args)

Installing Everest failed.
Please create a new issue on GitHub @ https://github.com/EverestAPI/Everest
or join the #modding_help channel on Discord (invite in the repo).
Make sure to upload your miniinstaller-log.txt

Missing libMonoPosixHelper.dylib on Mac

Ver 1.2.6.1 [Everest: 797-azure-5f3fa]
02/03/2019 20:32:31
System.DllNotFoundException: libMonoPosixHelper.dylib
  at (wrapper managed-to-native) System.IO.Compression.DeflateStreamNative.CreateZStream(System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStreamNative/UnmanagedReadOrWrite,intptr)
  at System.IO.Compression.DeflateStreamNative.Create (System.IO.Stream compressedStream, System.IO.Compression.CompressionMode mode, System.Boolean gzip) [0x0004a] in <4deb318bb3254cab91ca66698a056198>:0 
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, System.IO.Compression.CompressionMode mode, System.Boolean leaveOpen, System.Boolean gzip) [0x0002d] in <4deb318bb3254cab91ca66698a056198>:0 
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream stream, System.IO.Compression.CompressionLevel compressionLevel, System.Boolean leaveOpen, System.Boolean gzip) [0x00000] in <4deb318bb3254cab91ca66698a056198>:0 
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream stream, System.IO.Compression.CompressionLevel compressionLevel, System.Boolean leaveOpen) [0x00000] in <4deb318bb3254cab91ca66698a056198>:0 
  at (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream..ctor(System.IO.Stream,System.IO.Compression.CompressionLevel,bool)
  at Jdenticon.IO.ZlibStream..ctor (System.IO.Stream stream) [0x00047] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at (wrapper remoting-invoke-with-check) Jdenticon.IO.ZlibStream..ctor(System.IO.Stream)
  at Jdenticon.Drawing.Png.PngEncoder.WriteImageData () [0x00011] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Jdenticon.Drawing.Png.PngEncoder.Save (System.IO.Stream output) [0x00047] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Jdenticon.Drawing.Bitmap.SaveAsPng (System.IO.Stream stream) [0x0002b] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Jdenticon.Rendering.PngRenderer.SavePng (System.IO.Stream stream) [0x00000] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Jdenticon.PngExtensions.GeneratePng (Jdenticon.Identicon icon) [0x00027] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Jdenticon.PngExtensions.SaveAsPng (Jdenticon.Identicon icon) [0x00000] in <ab564dc515b94c289a2d06cfad69bf6e>:0 
  at Celeste.AreaComplete.Begin () [0x0004a] in <e6396995e64e4637a8dd70ee94d7253d>:0 
  at (wrapper dynamic-method) Monocle.Engine.DMD<Monocle.Engine::Update>(Monocle.Engine,Microsoft.Xna.Framework.GameTime)
  at TAS.EverestInterop.CelesteTASModule.Engine_Update (On.Monocle.Engine+orig_Update orig, Monocle.Engine self, Microsoft.Xna.Framework.GameTime gameTime) [0x00064] in <1d07fbc9f1a947228cc8ba943be88cd1>:0 
  at (wrapper dynamic-method) Monocle.Engine.Hook<Monocle.Engine::Update>?-1737187478(Monocle.Engine,Microsoft.Xna.Framework.GameTime)
  at Celeste.Celeste.Update (Microsoft.Xna.Framework.GameTime gameTime) [0x00030] in <e6396995e64e4637a8dd70ee94d7253d>:0 
  at Microsoft.Xna.Framework.Game.Tick () [0x000ef] in <d8a8e8a23bae436f88420b87ce0d373a>:0 
  at Microsoft.Xna.Framework.SDL2_FNAPlatform.RunLoop (Microsoft.Xna.Framework.Game game) [0x005ed] in <d8a8e8a23bae436f88420b87ce0d373a>:0 
  at Microsoft.Xna.Framework.Game.Run () [0x0002c] in <d8a8e8a23bae436f88420b87ce0d373a>:0 
  at Monocle.Engine.RunWithLogging () [0x00000] in <e6396995e64e4637a8dd70ee94d7253d>:0 

This happens when you finish a level, seems to be crashing in the process of adding the version number to the completion screen. I fixed it for myself by copying libMonoPosixHelper.dylib from another Mono installation.

Everest website

A well-designed user-friendly website is basically a requirement for a successful 1.0 release.

  • Move relevant information from README.md to DocFX
  • Move DocFX project out of this repo, add this repo as submodule
  • List Everest features / "benefits" with screenshots (or gifs) on website Nexus Mods
  • Automatically list all available Everest builds on the website, similar to how it's done on the Mod the Gungeon website with the installer versions.
    • Nexus Mods has got a version history and "big huge download button."
  • Add SEO / embed data to <head>
  • Theme the website appropriately

Example SEO / embed data:

        <meta property="og:title" content="Everest - Celeste Mod Loader" />
        <meta name="author" content="Everest Team" />
        <meta property="og:locale" content="en_US" />
        <meta name="description" content="Unofficial mod loader for the retro-style 2D platformer Celeste." />
        <meta property="og:description" content="Unofficial mod loader for the retro-style 2D platformer Celeste." />
        <link rel="canonical" href="https://everestapi.github.io/" />
        <meta property="og:url" content="https://everestapi.github.io/" />
        <meta property="og:site_name" content="Everest - Celeste Mod Loader" />
        <meta property="og:image" content="https:/everestapi.github.io/thumbnail.png" itemprop="thumbnailUrl" />
        <meta name="twitter:card" content="summary_large_image" />
        <meta name="twitter:site" content="@everestapi" />
        <meta name="twitter:creator" content="@everestapi" />
        <meta name="twitter:image" content="https:/everestapi.github.io/preview.png" />

Suggest native support for decal placements on arbitrary layers

So that we don't have to argue with what's in front of or behind something based on ID, we ought to have the ability to decide which layer a decal is on with some level of granularity. Placing a bg decal or fg decal without the depth definition would simply default their position to their current depths.

re: Strawberry Registry: investigate Leader.Store/RestoreStrawberries

It looks like this should probably be patched, particularly if anyone uses this code.

MMMMAAAAYYBEEEE we should patch it for all Followers? Currently, it won't take keys through when the transition happens.

Gonna need to investigate thoroughly, maybe discuss the implications...

Everest build 1339: Levelset with 0 strawberries causes ArgumentOutOfRange in get_MaxStrawberries

Celeste Error Log
==========================================

Ver 1.3.1.2 [Everest: 1339-azure-0f7ea]
01/12/2020 21:57:44
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   at Celeste.LevelSetStats.get_MaxStrawberries() in d:\a\1\s\Celeste.Mod.mm\Patches\SaveData.cs:line 494
   at Celeste.OuiFileSelectSlot..ctor(Int32 index, OuiFileSelect fileSelect, SaveData data) in d:\a\1\s\Celeste.Mod.mm\Patches\OuiFileSelectSlot.cs:line 38
   at Celeste.OuiFileSelect.LoadThread()
   at Celeste.RunThread.RunThreadWithLogging(Action method)

Note to self: map is in Celeste\Mods\Name\Maps\Problem.bin and is the only map in the levelset

Combining Oshiro bonk, Feather, and a ceiling softlocks Madeline

Observed in D-Sides, this video demonstrates that Madeline gets shoved into the ceiling during an Oshiro bonk out of a feather... from a surprising distance.

This feels like a vanilla-engine bug, which we might be able to fix on our end, as tricky as it might be.

We'll need to run this frame by frame in the tas tools and watch Madeline's active state and her hitboxes...

Runtime audio modding

  • Can and should we modify the FMOD banks? Or should we hook the deepest layer of Celeste / Monocle touching FMOD instead?
  • Should mods contain FMOD-prepared content (i.e. banks)? Or should they contain audio + .meta.y(a)ml files? Which audio formats can we support?
  • How critical is hooking events, filters and anything else controllable via FMOD Studio? Can we even do that without FMOD Studio?
  • Do we risk reinventing the wheel by bypassing FMOD Studio? To what extent does the FMOD EULA cover modding?

Assigning "Summit" and "Farewell"-stamped maps in mod campaigns

This is low priority to work on, but it lets us have a chance to really use those stamps on mod campaigns, which would otherwise be unable to receive the Farewell stamp with the new changes to the ticket sleeves.

Perhaps we can set metadata somewhere to indicate "this map sets Summit stamp" or "this map sets Farewell stamp", particularly if a campaign has an appropriate map but then continues past that point chronologically.

It's really just a beauty support for longer campaigns, if and when we start getting those.

Add dev-facing documentation

Currently, most of the codebase has XML comments (this is a good thing!). However, most of it is only relevant to people working on Everest, and not people working on mods. Based on past experience, I'd recommend DocFX, but you could go with whatever you want. (BTW, I thought I saw that DocFX requires VS2017, but I can't find that anymore)

User-friendly Installer

mod.sh/mod.bat is confusing. Ideas:

  • Linux-first script: Write a fully-featured bash script, and either embed MinGW's bash or find some other way of running it on Windows
    • Benefits: bash is featureful, and lends well to this sort of thing
    • Cons: It's Linux-first, and both developers and users will generally be running Windows
  • Windows-first script: Write a fully-featured Powershell script, and require Linux users to install Powershell 6/Core (is there a difference?)
    • Benefits: Powershell is similar to C#, and can interface directly with C# code via Add-Type
    • Cons: It's Windows-first, and requires installing a somewhat heavy program on Linux just to run it, even though this shouldn't be necessary
  • .msi Installer: Write an .msi script to install Everest
    • Benefits: ...it can be installed easily in an enterprise environment?
    • Cons: This is a horrible idea.
  • scriptcs script: This might be the best idea; write "native" C# and wrap it in a .bat/.sh for ease of running. The script would automatically find Celeste, run MonoMod on it, in a nice, user-friendly package. It could even offer to install some "sample" mods.
    • Benefits: Code is normal C#, and we can do everything normal C# can.
    • Cons: Depends on scriptcs.
  • Normal C# program: The same as scriptcs, but a normal, MSBuild-based program
    • Benefits: Same as scriptcs, plus the fact that it's a normal program from the user's perspective
    • Cons: Requires a full build chain, and doesn't get nice scripting built-ins

Add support for HookedMethod

  • Finish HookedMethod (I keep putting this off)
  • Think of a good name for HookedMethod (optional) (...)
  • Add native support for HookedMethod to Everest
  • Write documentation for HookedMethod (this is already partially done here)
  • Rewrite RainbowMod and MadelineEnergySelector to use HookedMethod instead of RuntimeDetour

Mod repository/installer

Right now, the source for mods is to go on the Discord and ask for WIPs. Almost anything would be better than this for users.

Game crashes out of nowhere

Whenever I try playing GhostNet with my friend, the game just crashes. However, on steam, it says that the game is still running. This is the log:

Ver 1.2.5.3 [Everest: 772-azure-0fa40]
01/10/2019 17:45:17
System.InvalidOperationException: A previous Draw call threw an unhandled exception. See InnerException for details. ---> System.OutOfMemoryException: Mem贸ria insuficiente para continuar a execu莽茫o do programa.
at Microsoft.Xna.Framework.Graphics.GraphicsDevice.Present(tagRECT* pSource, tagRECT* pDest, HWND__* hOverride)
at Microsoft.Xna.Framework.GraphicsDeviceManager.Microsoft.Xna.Framework.IGraphicsDeviceManager.EndDraw()
at Microsoft.Xna.Framework.Game.EndDraw()
at Microsoft.Xna.Framework.Game.DrawFrame()
at Microsoft.Xna.Framework.Game.Paint(Object sender, EventArgs e)
at Microsoft.Xna.Framework.GameWindow.OnPaint()
at Microsoft.Xna.Framework.WindowsGameWindow.mainForm_Paint(Object sender, PaintEventArgs e)
--- End of inner exception stack trace ---
at Microsoft.Xna.Framework.WindowsGameHost.RunOneFrame()
at Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(Object sender, EventArgs e)
at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(Int32 grfidlef)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Microsoft.Xna.Framework.WindowsGameHost.Run()
at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun)
at Monocle.Engine.RunWithLogging() in D:\a\1\s\Celeste.Mod.mm\Patches\Monocle\Engine.cs:line 29

Crash reports always say out of memory error and it's really not helpful

Steps to reproduce: Be on the latest version (and possibly other newish versions but eh).
Download the mario bros 1-1 level map.
Complete it.
The error message is supposed to be this : https://gist.github.com/Hugman76/c03083743268ebaaf4450c9628fd599a
(a null reference error)
but instead it's an out of memory error

this bug report brought to you by "okay, something failed to download properly and is crashing everest on startup, but installer_log.txt isn't helping and the crash text is lies"

using Debug map in ANY save, causing losing B/C sides MapMetaModeProperties

as discussed before in the channel...
I discovered it when playtesting my maps which have a special Starting Room setting.
I used the debug map, teleported to a room, and finished the A side from set room...
Entered B/C sides from the beginning, the spawn point was wrong, and was set to the room which was closest to 0,0 and not my Starting Room meta value.
FYI

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    馃枛 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 馃搳馃搱馃帀

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google 鉂わ笍 Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.