Git Product home page Git Product logo

hephaistos's Introduction

Hephaistos

GitHub Actions status GitHub release (latest SemVer) GitHub downloads GitHub stars GitHub license

Hades.patched.with.Hephaistos.for.3840x1600.mp4

CLI tool for patching any resolution in Supergiant Games' Hades, primarily targeting ultrawide monitors (21:9, 32:9), multi-monitor (48:9), and Steam Deck (16:10).

By default, on Hades:

  • Resolutions wider than 16:9 (e.g. 21:9) are pillarboxed with artwork / black bars on left / right.
  • Resolutions taller than 16:9 (e.g. 16:10) are letterboxed with black bars on top / bottom.

Hephaistos can bypass both, and also allows using custom resolutions (useful for custom window sizes and multi-monitor without Eyefinity / Surround).

Hephaistos is stable: many users have been using it for a long time, some even from their very first time on Hades, and nothing major has had to be fixed for a while. Still, there might be rare quirks on specific setups that haven't been detected yet: you are most welcome to report anything by opening a new issue (ideally with screenshots / videos / a save file) and I will definitely have a look and fix itΒ πŸ‘Œ

(Click on items to show details. For example, click on Install for installation instructions.)

Issues / FAQ

(Click on items to show details)

Black / empty bars on the main menu and other menus in game (e.g. Mirror of Night)

Short answer: Hephaistos cannot resize static assets such as animations / FMVs (e.g. main menu) and most on-screen artwork (e.g. in-game menus, dialogues): they will stay at 16:9 in the center of the screen.

Longer answer: These static assets were designed by Supergiant Games with the assumption of a 1920x1080 viewport. If Hephaistos were to resize them to fit the screen, they would either have to be distorted (which would be very ugly) or cut (which loses information and would not work for menus anyway, because there are often buttons on the edges that would be cut). Instead, Hephaistos simply centers them, which is why black bars or empty bars are displayed: Hephaistos cannot "invent" something to display instead πŸ˜‰

There is one exception to the rule: fullscreen overlays (e.g. red flash when getting hit, dialogue dimming) are resized to fit the whole screen instead of being kept in the center. This is done because fullscreen overlays can be stretched without visual artifacts.

Also of note: there are a few assets that actually extend beyond 1920x1080, so these extra bits will now be displayed since the artwork is centered (e.g. Chaos dialogue, Pact of Punishment menu). This was impossible to tell from the original game (since it was cut at 1920x1080), so you are in fact getting a bit more of Hades artwork when using Hephaistos 😁

Windows protected your PC popup when trying to run Hephaistos

Windows SmartScreen is being extra paranoid because Hephaistos is not an EV-signed executable (this costs money). To run Hephaistos, click on More info in the center of the screen and then Run anyway.

Note: if you are a power user, you may want to disable Windows SmartScreen altogether (Reputation-based protection settings > turn Potentially unwanted app blocking off).

Antivirus software says Hephaistos is a virus

This is a false positive due to Hephaistos containing hex editing code (required for patching Hades' executables) and using PyInstaller for packaging. It is common for hex-editing PyInstaller-based programs to get falsely detected by AV software and there is nothing I can do about it (see here).

All I can do is tell you that if you downloaded Hephaistos from this GitHub repository, you are safe to run it (the Windows build is automatically bundled with PyInstaller and directly uploaded to GitHub by GitHub runners themselves, there is very little chance it was tampered with in any way). If you don't want to trust hephaistos.exe, I would recommend reading the source code and using the Python version yourself.

Another solution I would suggest is to remove your antivirus software and stick with the default Windows Defender antivirus. Unlike in ancient times, Windows does a good job at protecting users nowadays, and it also seems not to falsely detect hephaistos.exe as a virus (well, at least in most cases). This will also boost your PC performance because third party AV software is very bad for performance (and there is nothing you can do about it).

I thought Supergiant Games said ultrawide was not possible. Why did they lie?

This is what Supergiant Games said (source):

Hades is a 2D game and many aspects of it are built around the 16:9 aspect ratio. We cannot just extend the game viewport to ultrawide resolution without introducing a wide variety of problems.

Short answer: Personally, I don't think SGG was lying. I've seen the "wide variety of problems" they are talking about, and I believe they said this because of technical debt in their tool chain that'd be impossible for them address properly in a timely manner (it would cost too much).

Longer answer: There were definitely a lot of things of fix, this mod was more involved than the typical ultrawide fix mod. The vast majority of ultrawide fixes are for 3D games where one only needs to remove intentional limitations on viewport / aspect ratio with a hex patch (example: Horizon Zero Dawn), hence why generic solutions such as SUWSF are very useful. In Hades' case, the UI is very, very elaborate (many different menus, each with their own on-screen artworks and interactions), hence an ad-hoc solution dynamically re-adjusting UI elements was required, resulting in a tremendous amount of additional custom work so that individual UI elements are properly positioned after resizing the viewport.

I can see why SGG would not want to invest in supporting this in an official capacity. As a modder if something's not working perfectly well in the modded resolution I can just say "eh, whatever", whereas a less-than-perfect implementation from SGG might be considered botched by users (and rightfully so: if you state you are supporting a resolution, then of course users will expect it to be supported).

After reverse engineering the thing, it seems to me their UI / UX tool stack (e.g. whatever the artists / designers use to create the HUD) would need a huge refactoring to allow for proper support of arbitrary aspect ratios. Deriving from the fixes I had to do, I'm 99% sure the 16:9 limitation actually exists solely due to how their custom in-house tools happened to evolve over the years (they have been reusing stuff since Bastion), and the fact all their games are limited in a similar way is just a byproduct of this (it's basically technical debt). Assuming they did address it, then on top of that they'd have to have people that actually do test arbitrary aspect ratios, and think about how to handle every edge case, etc.

From a business perspective, it's a trade off between the investment required for such a small user base vs. the need / want to gain respect from this small user base, and I'm not blaming SGG for not doing it considering their resources: it's not a huge AAA, this type of complex technical debt is not free to address (it's actually very costly), and at some point business decisions need to be made.

Also, remember that they stopped active development work on Hades a long while ago. We can always hope that at some point they'll be able to address this technical debt and have their next games support ultrawide officially...! 🀞

Can I get banned for using Hephaistos?

No. Hades is an offline game and is not tamper-protected on any platform (e.g. no VAC on Steam): you will not get banned.

Do achievements still work when using Hephaistos?

Short answer: Yes. Hades uses client-side achievements (i.e. achievements are managed by the game, not by Steam / Epic Games / Microsoft Store) and Hephaistos does not touch anything achievements-related: achievements still work exactly like in the original game.

Longer answer: No matter the platform (Steam, Epic Games, Microsoft Store), achievements can be of 2 types: client (offline checks) or server (online checks).

Client achievements are most common. In this mode, achievements are handled client-side (i.e. by the game), offline. There is no check or anything done by the platform: the client sends a message saying "unlock X achievement on Y game" and platform says "sure". This is why you can use Steam Achievement Manager to unlock (and even relock) any client achievement of your choice without any consequences. Client achievements are basically "we don't care if anyone cheats, this is only for fun" achievements.

Server achievements are less common. In this mode, achievements are handled server-side (i.e. by the game server or the platform), online. This makes it harder to cheat achievements because the client does not have direct control over achievement checks. If the client (i.e. the game) is also tamper-protected (e.g. Steam's VAC system), then cheating is extremely hard / impossible. Server achievements are basically "serious" achievements.

Any game (no matter if offline or online) can use any type of achievements (client or server). There can even be a mix of both client and server achievements on the same game. With that said:

  • Offline games will almost always use client achievements. It is very rare for offline games to use server achievements.
  • Online games will typically either:
    • Use only client achievements (and rarely a few server achievements, usually newer achievements added after release).
    • Use only server achievements (and rarely a few client achievements, usually older legacy achievements added before release).

In any case, the takeaway is that there is no reason any mod would disable achievements on any game without tamper-protection:

  • Client achievements should not be disabled by the mod (unless you specifically use a mod that says it does that).
  • Server achievements cannot be disabled by the mod, period.

However, if the game does use tamper-protection, then you don't want to use any mod at all (even if the mod actually does nothing) because you'd get flagged just because your game has been modified.

In Hades' case, the game is offline, only uses client achievements, and is not tamper-protected. Hephaistos does not touch anything achievements-related: achievements still work exactly like in the original game, so you may do whatever you want with the achievements including using Steam Achievement Manager to unlock / relock all of them if you please.

How can I support Hephaistos? Do you have a Patreon or anything?

Thank you very much, you're not the first one to ask but I don't want to accept donations. I would instead suggest you spend the money to gift Hades to someone, or to buy another indie game (may I recommend Hotline Miami? 🀩).

Why is it spelled Hephaistos and not Hephaestus / Hephaestos?

Ἥφαιστος in Ancient Greek can be transliterated closest to HαΈ—phaistos. Apparently this is also the "chiefly academic" term. Anyway it was mostly a little fun for myself :)

Preview / Showcase

Before / after comparisons

(Click on items to show details)

21:9

21-9_vanilla 21-9_hephaistos

32:9

32-9_vanilla 32-9_hephaistos

48:9 / triple screen (with HUD centered)

48-9_vanilla 48-9_hephaistos

16:10 / Steam Deck

SteamDeck

Additional screenshots

(Click on items to show details)

21:9

32:9

48:9 / triple screen (with HUD centered)

16:10 / Steam Deck

ℹ️ More images can be found over at Nexus Mods and WSGF.

Install

Hephaistos can be downloaded as an executable for Windows, macOS, and Linux, or as a Python archive, and must be placed in the Hades directory. (Click on items to show details)

Windows
  • Download hephaistos-windows.zip.
  • Extract the archive. You should get an hephaistos.exe executable.
  • Move hephaistos.exe to the Hades directory. It must be placed right next to the default Hades files:
    • Steam / Epic Games / Heroic
      Hades/
      β”œβ”€β”€ Content/
      β”œβ”€β”€ x64/
      β”œβ”€β”€ x64Vk/
      β”œβ”€β”€ x86/
      └── hephaistos.exe
      

      ⚠️ If you don't know where Hades is, Hephaistos can try to give you a tip by auto-detecting from Steam / Epic Games / Heroic configuration files: double-click hephaistos.exe. Note that you still have to move hephaistos.exe to the Hades directory manually before continuing.

    • Microsoft Store
      Hades/
      β”œβ”€β”€ Content/
      β”‚   β”œβ”€β”€ Content/
      β”‚   β”œβ”€β”€ ja/
      β”‚   β”œβ”€β”€ Hades.exe
      β”‚   └── ...
      β”œβ”€β”€ [hidden file] E0A69B86-F3DD-416D-BCA8-3782255B0B74
      β”œβ”€β”€ [hidden file] ...
      └── hephaistos.exe
      

      ⚠️ If you don't know where Hades is, reinstall Hades from the Microsoft Store: you can then choose where Hades will be located. Note that you still have to move hephaistos.exe to the Hades directory manually before continuing.

macOS
  • Download hephaistos-macos.zip.
  • Extract the archive. You should get an hephaistos executable.
  • Move hephaistos to the Hades directory. It must be placed right next to the default Hades files:
    Hades/
    β”œβ”€β”€ Game.macOS.app/
    └── hephaistos
    

    ⚠️ If you don't know where Hades is, Hephaistos can try to give you a tip by auto-detecting from Steam / Epic Games configuration files: drag the hephaistos file onto the Terminal application icon and run it. Note that you still have to move hephaistos to the Hades directory manually before continuing.

Linux / Steam Deck
  • Download hephaistos-linux.zip.
  • Extract the archive. You should get an hephaistos executable.
  • Move hephaistos to the Hades directory. It must be placed right next to the default Hades files:
    Hades/
    β”œβ”€β”€ Content/
    β”œβ”€β”€ x64/
    β”œβ”€β”€ x64Vk/
    β”œβ”€β”€ x86/
    └── hephaistos
    

    ⚠️ If you don't know where Hades is, Hephaistos can try to give you a tip by auto-detecting from Steam / Heroic configuration files: run ./hephaistos in terminal (on Steam Deck: right-click > Run in Konsole). Note that you still have to move hephaistos to the Hades directory manually before continuing.

[Advanced] Python
  • Download hephaistos-python.zip.
  • Extract the archive. You should get hephaistos, hephaistos-data and sjson directories.
  • Move all directories to the Hades directory. They must be placed right next to the default Hades files (see Windows / macOS / Linux entries above for more details).

Once Hephaistos is placed in the Hades directory, you are ready to use it:

  • [Easy] Use Hephaistos' interactive instructions: see Interactive mode.
  • [Advanced] Use Hephaistos subcommands from the command line: see CLI usage.

Interactive mode

  • Windows: double-click on hephaistos.exe
  • macOS: drag the Hades directory onto the Terminal application icon > run ./hephaistos
  • Linux / Steam Deck: run ./hephaistos in terminal (on Steam Deck: right-click > Run in Konsole)
  • Python: run python -m hephaistos

When running Hephaistos in interactive mode, Hephaistos will guide you through the steps:

Hi! This interactive wizard will help you to set up Hephaistos.
Note: while Hephaistos can be used in interactive mode for basic usage, you will need to switch to non-interactive mode for any advanced usage. See the README for more details.

Current version: v1.x.y
Latest version: v1.x.y

Pick an option:
1. Patch Hades using Hephaistos
2. Restore Hades to its pre-Hephaistos state
3. Check current Hades / Hephaistos status
4. Exit
Choice:

Type 1 to pick the patch option. Hephaistos will again prompt you for your resolution and preferences, and then patch Hades:

INFO:hephaistos:Using resolution: (3840, 1600)
INFO:hephaistos:Using '--scaling=hor+': computed patch viewport (2592, 1080)
INFO:hephaistos:Using '--hud=expand': HUD will be expanded horizontally / vertically
INFO:hephaistos:Patched 'x64\EngineWin64s.dll'
INFO:hephaistos:Reading SJSON data (this operation can take time, please be patient)
...
INFO:hephaistos:Installed Lua mod to 'Content\Mods\Hephaistos'
INFO:hephaistos:Patched 'Content\Scripts\RoomManager.lua' with hook 'Import "../Mods/Hephaistos/Hephaistos.lua"'

Press any key to continue...

⚠️ Reading SJSON data can take time depending on your CPU and hard drive, please be patient ⏳

Hades binaries are now patched to work with the chosen resolution. Start the game and try it out for a bit.

Once done, use Hephaistos again, but this time type 2 to pick the restore option:

INFO:hephaistos:Restored backups from 'hephaistos-data\backups' to '.'
INFO:hephaistos:Discarded hashes at 'hephaistos-data\hashes'
INFO:hephaistos:Discarded SJSON data at 'hephaistos-data\sjson-data'
INFO:hephaistos:Uninstalled Lua mod from 'Content\Mods\Hephaistos'

Hades binaries are now restored to their pre-Hephaistos state.

Do note that every time it receives an update, Hades will automatically revert to its default resolution, and Hephaistos must be reapplied. If in doubt, type 3 to pick the status option and check the current Hades / Hephaistos status.

This concludes the tutorial. I hope you'll enjoy HephaistosΒ πŸ₯³

CLI usage

  • Executable: hephaistos -h
  • Python: python -m hephaistos -h

Hephaistos is mostly self-documented via the CLI help. Use hephaistos -h to find the available subcommands (patch, restore, etc.) which themselves are documented (e.g. hephaistos patch -h).

Add the -v flag to print information about what Hephaistos is doing under the hood. The flag may be repeated twice (-vv) to display debug output.

patch-specific information

You can safely patch and re-patch multiple times in a row as Hephaistos always patches based on backups of the original files. There is no need to use restore in-between patch calls: restore should only be used to rollback to original.

Every time it receives an update, Hades will automatically revert to its original resolution, and Hephaistos must be reapplied. Trying to re-patch after a game update will be blocked as Hephaistos detects something happened outside of its control:

> hephaistos patch 3440 1440
ERROR:hephaistos:Hash file mismatch: 'XXX' was modified.
ERROR:hephaistos:Was the game updated? Re-run with '--force' to discard previous backups and re-patch Hades from its current state.

And status will confirm this:

> hephaistos status
Hades was patched with Hephaistos, but Hades files were modified. Was the game updated?

Since the game was updated, the previous backups can be safely discarded. Use --force to repatch and create new backups:

hephaistos patch 3440 1440 --force

--scaling

patch supports the following scaling algorithms: (Click on items to show details)

hor+ (Hor+ scaling, default for wider aspect ratios)

Expand aspect ratio and field of view horizontally, keep vertical height / field of view. This is the default scaling used by Hephaistos for aspect ratios wider than 16:9 (e.g. 21:9), and recommended for general usage as it strives to keep the experience as close to the original as possible.

scaling_21-9_vanilla scaling_21-9_hor+

vert+ (Vert+ scaling, default for taller aspect ratios)

Expand aspect ratio and field of view vertically, keep horizontal height / field of view. This is the default scaling used by Hephaistos for aspect ratios taller than 16:9 (e.g. 16:10), and recommended for general usage as it strives to keep the experience as close to the original as possible.

pixel (pixel-based scaling)

Expand field of view in all directions without applying any scaling, disregarding aspect ratios. This scaling is not recommended for general usage as it effectively "zooms out" the camera and thus does not keep the experience close to the original, but it's fun if you have a big screen and want to see more of the screen at once.

scaling_21-9_vanilla scaling_21-9_pixel

--hud

patch supports the following HUD resizing modes: (Click on items to show details)

expand (default for most aspect ratios)

Expand the HUD horizontally and vertically. Static HUD elements will be repositioned to their intended location for the new screen size, e.g. health indicator will be in the bottom left, resource indicator will be in the bottom right. This is the default HUD resizing mode used by Hephaistos for 16:10, 21:9, and 32:9, but note that you may want to try out --hud=center for 32:9 to see what you prefer.

hud_21-9-vanilla hud_21-9_expand

center (default for 48:9 and wider)

Keep HUD in the center of the screen with the same size as the original 16:9 HUD. Screen size will change but HUD will not move, static HUD elements will remain at their default 16:9 position. This is the default HUD resizing mode used by Hephaistos for 48:9 and wider.

hud_21-9-vanilla hud_21-9_center

--no-custom-resolution

By default, patch patches a custom resolution in the ProfileX.sjson configuration file by updating its WindowWidth/WindowHeight and X/Y values.

This has two advantages:

  • Ensure the game runs at the preferred resolution.
    • Useful when inadvertently switching to a wrong resolution from the game settings.
    • Useful when playing Hades on a secondary monitor.
  • Allow running the game in windowed mode at a specific size.
    • Useful for choosing your own window size in windowed mode.
    • Useful for spanning the game window over multi-monitor without Eyefinity / Surround.

Neither of these are possible in the vanilla game: only the resolutions from the main display are offered from the game settings and the game window cannot be freely resized.

While not recommended, you may use --no-custom-resolution if you wish not to force custom resolution through ProfileX.sjson. This is mostly useful for development purposes.

Miscellaneous options

--hades-dir

By default, Hephaistos assumes that it has been placed in the Hades directory. If it fails to detect Hades files, it will try to auto-detect Hades location from Steam / Epic Games / Heroic configuration files and ask to be relocated.

You may use --hades-dir to manually specify where Hades is located, e.g. if you want to store Hephaistos and its files in a different location than the Hades directory.

--no-modimporter

Hephaistos is compatible with Mod Importer1 (>= 1.3.0). If Hephaistos detects it is available, it will run modimporter to register / unregister itself during patch and restore operations, instead of manually editing Content\Scripts\RoomManager.lua.

While not recommended, this can be bypassed with --no-modimporter, in which case Hephaistos will not run modimporter even if detected. This is mostly useful for development purposes.

Under the hood

Hades uses an internal 1920x1080 viewport with static scaling (i.e. it can only played at 16:9, no matter the display resolution).

To bypass this limitation, Hephaistos patches the game's files with an ad-hoc viewport computed depending on chosen resolution and scaling algorithm:

> hephaistos patch 3440 1440 -v
INFO:hephaistos:Using resolution: (3440, 1440)
INFO:hephaistos:Using '--scaling=hor+': computed patch viewport (2580, 1080)
INFO:hephaistos:Using '--hud=expand': HUD will be expanded horizontally / vertically
INFO:hephaistos:Patched 'x64\EngineWin64s.dll'
...
INFO:hephaistos:Installed Lua mod 'hephaistos/lua' to 'Content/Mods/Hephaistos'
INFO:hephaistos:Patched 'Content/Scripts/RoomManager.lua' with hook 'Import "../Mods/Hephaistos/Hephaistos.lua"'

> hephaistos patch 1280 800 -v
INFO:hephaistos:Using resolution: (1280, 800)
INFO:hephaistos:Using '--scaling=vert+': computed patch viewport (1920, 1200)
...
  • Backends' engine DLLs are hex patched to expand the resolution and camera viewports.
  • Resource SJSON files are patched to resize / move around GUI elements.
  • Gameplay Lua scripts are extended with a Lua mod recalculating sizes / positions of GUI elements.

ℹ️ Hephaistos is compatible with Mod Utility2 (>= 2.2.0). If available, it will leverage ModUtil hook functions rather than its own custom hooks. This makes Hephaistos more compatible with other ModUtil-based mods if they also are hooking onto the same functions as Hephaistos (though it still won't magically fix conflicts or new GUI elements from other mods that Hephaistos wasn't tailored to).

While patching, Hephaistos stores:

  • A backup of the original files.
    • Allows restoring Hades to its pre-patch state if need be.
  • File hashes of the patched files.
    • Allows detecting any outside modifications made to the files -- mostly for detecting game updates.
    • Allows detecting if we are repatching a previously patched installation, in which case the original files are used as basis for in-place repatching without an intermediate restore operation.
  • (If patching an SJSON) A JSON-serialized dict of the deserialized original SJSON data.
    • Speeds up in-place repatching as we avoid the need to deserialize the original SJSON data again (which is very slow, while deserializing the JSON is instantaneous).

Everything is stored under the hephaistos-data directory.

Why did you make this, and how did you know what to patch?

I love Hades and am an ultrawide player myself. I decided to try my hand at modding ultrawide support by decompiling Hades and reverse-engineering the viewport logic just to see if I could, and here we areΒ πŸ˜„

See this blog post for more details about Hephaistos' genesis.

Footnotes

  1. Mod Importer (GitHub / Nexus Mods) is a tool helping to manage mods and register / unregister them with Hades. ↩

  2. Mod Utility (GitHub / Nexus Mods) is a mod-library helping mods integrate not only with Hades but also with other mods. ↩

hephaistos's People

Contributors

github-actions[bot] avatar nbusseneau 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

hephaistos's Issues

Toggling Hephaistos on and off (Steam Deck game mode use case)

Would there be any interest in integrating a simple GUI I wrote for your awesome mod? Or maybe just linking to it in the README.md for users who want an easy way to swap screen resolutions while in Steam's Game Mode?

https://github.com/apolopena/hephaistos-gui

Integration of the GUI in it's current implementation could be in the form of a sub command such as:
./hephaistos gui screenres

@nbusseneau I could open a PR if you are interested integrating it or just linking to it
Thanks again for your awesome mod!

Console error

For some reason is not patching the game:

Command: hephaistos patch 5120 1440 --force

Output:

ERROR:hephaistos.patchers:Expected 2 matches, found 0 for width and 2 for height
Traceback (most recent call last):
  File "hephaistos\__main__.py", line 17, in <module>
  File "hephaistos\cli.py", line 88, in __init__
  File "hephaistos\cli.py", line 123, in handler
  File "hephaistos\patchers.py", line 60, in patch_engines
  File "hephaistos\patchers.py", line 37, in __safe_patch_file
  File "hephaistos\patchers.py", line 77, in __patch_engine
LookupError: Expected 2 matches, found 0 for width and 2 for height
[12980] Failed to execute script __main__

Same after restoration, with no "--force" etc. Can't patch the game.

Linux savegame path assumes default steam library path

Hi and thanks for this amazing tool.

I just noticed an issue and thought I'd report it.

On Linux helphaistos looks here for the savegames to patch them:

Platform.LINUX: [ # Proton wrapper save file path
os.path.expanduser(r'~/.steam/steam/steamapps/compatdata/1145360/pfx/drive_c/users/steamuser/Documents/Saved Games/Hades'),
],

The issue is, that when using Proton steam stores the "Windows Data" (so the compatdata folder) not in the default steam library, but in the one of the game.
So for me this path is /media/path/to/my/SteamLibrary/steamapps/compatdata/1145360/pfx/drive_c/users/steamuser/Documents/Saved Games/Hades. Maybe a argument similar to --hades-dir could be used to specify the path (or alternatively use the path relative to the current path as we are already in /media/path/to/my/SteamLibrary/steamapps/common/Hades.

Also I am not entirely sure if --hades-dir works correctly or I am just doing something wrong, but I solved the issue of having to be inside the hades dir and the repostory dir (for python -m to work) by creating symlinks to all hephaistos subdirectories in the hades directory.

Apart from this the patch seems to be working perfectly.

[macOS] Getting the error "Unable to Read Data" after patching

Hi Nicolas,
After patching using the interactive mode, I'm getting the error below:

image

Creating a new save file is also not possible (pops up when starting a new run)
image

Everything works fine after restoring to pre-Hephaistos state
image

System
Chip: Apple M1 Pro
OS: Ventura (13.0)
Target Resolution: 3440 x 1440

GUI support

We need to be able to automatically tweak the GUI according to the computed viewport.
All GUI components are managed from *.lua and *.sjson files in the Content directory.

EDIT: I've released v0.2.0 with initial support for GUI patching (SJSON + Lua). This first version of GUI patching patches both SJSON and Lua files:

  • Automatic patching of SJSON X, Y, etc. properties based on their original values and the new viewport.
  • Registering a custom Lua mod for recalculating various hardcoded values and repositioning dynamic calls.

It works fine enough, though there are still some rough edges to tackle -- I did not get all the vignette/overlays right yet, e.g. when transitioning between scenes.

In a future version I'd also move away from automatic SJSON patching to have a bit more control about how it detects what to patch, but for now the automatic patcher will do.

EDIT: Been working on progressively fixing stuff, most overlays/vignettes are good, I'm now working my way through all screens/shops. v0.6.0 is out if you'd like to have a try. Not everything's fixed yet but it's looking way better already :)

EDIT: I think I've fixed almost everything in v0.8.0 πŸ˜„
There are a bunch of small effects left to fix but we're already in a excellent state, with all screens done and all major effects :)

EDIT: I'm pretty sure I've fixed almost everything in latest version v0.11.0 πŸŽ‰
Finally got rid of the automatic SJSON patcher to move towards fully controlled patching.

EDIT: Released v0.12.0 and v0.13.0 with fixes for last nits (victory screen, end credits, etc.). I think we should be good for a v1.0.0 release, and also publishing on Nexus Mods. Closing issue.

Left to do (updated: v0.13.0):

  • Texts overflowing out of GUI components
  • Locked keepsake icons not properly positioned
  • Top left icon in boon choice menu not properly positioned
  • Boon re-roll vignette not scaling
  • Poison animation not scaling
  • Lava animation not scaling
  • [Redacted] boiling blood animation not scaling
  • Gun ammo UI + reload UI offset to the right
  • Companion summon overlay fixed on the left / not centred
  • Mid-run trait UI (B button) bottom graphics not centred
  • Epilogue sigils not properly positioned

To determine if something is needed / possible:

  • Victory screen fixed on the left / not centred
  • #4
  • Fullscreen displacement FX for various occasions (calls, Chaos interact, Hades speaking, etc.)
  • End credits
  • Epilogue

Heroic Games install on steam deck does not work

Hello,

I installed Hades on my steam deck via the Heroic store, a 3rd party epic games launcher, since that is where I own the game.
Unfortunately, this causes an issue with patching, as hephaistos does not know where my save folder is. (Mine is /home/deck/Games/Heroic/Prefixes/Hades/pfx/drive_c/users/steamuser/Documents/Saved Games/Hades/)

I read #13 where it was suggested being able to define your own save file path in the CLI tool.

Do you think this would be possible to implement?

32:9 with 21:9 black borders

The patch correctly patched the viewport for 5120x1440 (32:9), but the vignette effect image was left in 21:9 format

DH0AfR5 1

"Did not find any 'ProfileX.sjson' in save directories"

Steam Deck, SteamOS stable, Hades installed on micro SD, Hephaistos saved into same folder. I have tried verifying file integrity within the Steam Client, uninstalling/reinstalling the entire game, and downloading a fresh Hephaistos file.

I can run Hephaistos to restore without getting any errors, but run into this issue when trying to patch for the Steam Deck. Manually running ./hephaistos patch 1280 800 has the same problem, but here is my console output from running the interactive installer:

Hi! This interactive wizard will help you to set up Hephaistos.
Note: while Hephaistos can be used in interactive mode for basic usage, you will need to switch to non-interactive mode for any advanced usage. See the README for more details.

Current version: v1.7.9
Latest version: could not check latest version -- perhaps no Internet connection is available?

Pick an option:
1. Patch Hades using Hephaistos
2. Restore Hades to its pre-Hephaistos state
3. Check current Hades / Hephaistos status
4. Exit
Choice: 1

Pick an option:
1. Select from common 16:10 resolutions
2. Select from common 21:9 resolutions
3. Select from common 32:9 resolutions
4. Select from common 48:9 resolutions
5. Input resolution manually
6. Cancel
Choice: 1

Select resolution:
1. 1280 x 800
2. 1440 x 900
3. 1680 x 1050
4. 1920 x 1200
5. 2560 x 1600
6. 3840 x 2400
7. Cancel
Choice: 1

Select scaling algorithm (see README for more details):
1. [RECOMMENDED] Vert+: keeps experience close to vanilla game.
2. Pixel-based: effectively "zooms out" the camera.
3. Cancel
Choice (press ENTER to use [RECOMMENDED]):

Select HUD resizing mode (see README for more details):
1. [RECOMMENDED] Expand the HUD horizontally and vertically.
2. Keep HUD in the center of the screen with the same size as the original 16:9 HUD.
3. Cancel
Choice (press ENTER to use [RECOMMENDED]):

INFO:hephaistos:Using resolution: (1280, 800)
INFO:hephaistos:Using '--scaling=vert+': computed patch viewport (1920, 1200)
INFO:hephaistos:Using '--hud=expand': HUD will be expanded horizontally / vertically
INFO:hephaistos:Patched 'x64/EngineWin64s.dll'
INFO:hephaistos:Patched 'x64Vk/EngineWin64sv.dll'
INFO:hephaistos:Patched 'x86/EngineWin32s.dll'
INFO:hephaistos:Reading SJSON data (this operation can take time, please be patient)
INFO:hephaistos:Patched 'Content/Game/Animations/Fx.sjson'
INFO:hephaistos:Patched 'Content/Game/Animations/GUIAnimations.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/AboutScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/AnnouncementScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/CloudSaveUploadDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/CloudSettingsScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/CloudSyncDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/DebugDrawGroupScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/DebugKeyScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/DownloadScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/ExitConfirmDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/InGameUI.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/KeyMappingScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LanguageScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LaunchScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LoadMapScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LoadReplayScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LoadSaveScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/LoadScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/MainMenuScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/MenuScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/MessageDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/MessageDialogLarge.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/MiscSettingsScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/PatchNotesScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/PauseScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/ProfileScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/RemoteProfileScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/ResolutionScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/SettingsMenuScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/StartNewGameScreen.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/SVNLockDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/GUI/ThreeWayDialog.sjson'
INFO:hephaistos:Patched 'Content/Game/Obstacles/GUI.sjson'
WARNING:hephaistos:Did not find any 'ProfileX.sjson' in save directories:
  - ../../compatdata/1145360/pfx/drive_c/users/steamuser/Documents/Saved Games/Hades
WARNING:hephaistos:Cannot patch custom resolution to 'ProfileX.sjson' (no save files found).
This is not an issue in most cases (e.g. first time you play, so no save files yet).
One exception: if you were trying to patch in a custom resolution, it will NOT work (game will appear stretched).
In this case, you should start a game to create a new save file first, and then re-run the patcher.
INFO:hephaistos:Installed Lua mod to 'Content/Mods/Hephaistos'
INFO:hephaistos:Patched 'Content/Scripts/RoomManager.lua' with hook 'Import "../Mods/Hephaistos/Hephaistos.lua"'

Press any key to continue...

I get the warning about it not finding any profile files, but not only do I definitely have saves that I can open in the game just fine, but as far as I can tell, I can see the exact file(s) that is says cannot be found:

(deck@steamdeck Hades)$ echo $PWD
/home/deck/.local/share/Steam/steamapps/compatdata/1145360/pfx/drive_c/users/steamuser/Documents/Saved Games/Hades
(deck@steamdeck Hades)$ ls
 activeProfile      'Data Records'   Profile1.sjson       Profile1_Temp.sav.bak   Profile2.sav         Profile2_Temp.sav       Profile2.v.sav.bak    Temp
 activeProfile.bak   Hades.log       Profile1.sjson.bak   Profile1.v.sav          Profile2.sjson       Profile2_Temp.sav.bak   Screenshots
'Data Dumps'         Profile1.sav    Profile1_Temp.sav    Profile1.v.sav.bak      Profile2.sjson.bak   Profile2.v.sav          steam_autocloud.vdf

Hephaistos is not working for me

I attempt to patch Hades with Hephaistos (3440x1440, expand HUD horizontally), but this mod is not working for me (with the latest Steam version). I get an error message :

'custom_resolution_init_window' patching: expected 1 matches in 'x64\EngineWin64s.dll', found 0

Passing through door Styx -> [Redacted] white transition clipping

LoadBackgroundColor.mp4

The initial load screen (white) scales correctly but is then clipped for a second (I've switched it from white to red for the video, so that we can see it easily) before returning to a proper state (white again).

  1. [Lua] ExitToHadesPresentation runs FadeOut({ Color = Color.White, Duration = 2 })
    • Triggered due to ObstacleData.TravelDoor01.ExitFunctionName = "ExitToHadesPresentation"
  2. [Engine] mLoadBackgroundColor displayed
    • RoomSetData.Styx.D_Boss01.LoadBackgroundColor = Color.White is loaded to world->mLoadBackgroundColor via LoadMap
  3. [Lua] RoomEntranceHades takes over with FadeOut({ Color = Color.White, Duration = 0 })
    • Triggered due to RoomSetData.Styx.D_Boss01.EntranceFunctionName = "RoomEntranceHades"

Funnily enough, the Styx -> [Redacted] transition is the only room that specifies a LoadBackgroundColor (all others default to the engine-side black default value for world->mLoadBackgroundColor), so I'm actually pondering if it's even worth investing time to look into it considering the difficulty for such a small issue.

More details

RoomManager.lua line 5102:

LoadMap({ Name = nextRoom.Name, ResetBinks = previousRoom.ResetBinksOnExit or currentRun.CurrentRoom.ResetBinksOnEnter, LoadBackgroundColor = currentRun.CurrentRoom.LoadBackgroundColor })

LoadBackgroundColor is then retrieved from ScriptAction::LoadMap:

unknown

And later passed to world:

unknown

Afterwards World::RequestBegin is called:

unknown

Color is retrieved later in World::Begin:

unknown

And passed to World::LoadNextMap:

unknown

It is passed to a struct of type GameScreen as its mFullscreenSpriteEffect field, and that's where I can't seem to progress further:

unknown

I suspect GameScreen::DrawFaded to be involved, as it re-uses mFullscreenSpriteEffect, but my testing so far is inconclusive:

unknown

I find it really strange that this specific overlay/texture does not scale to the whole viewport. It is as if it used some kind of custom calculations, e.g "get current height then multiply by 16:9 to get width", instead of getting both height/width.

(PSA/Info) If it stopped working for you, you must verify files/reinstall.

Hi, huge fan of the project, love what you're doing, thank you! I hope this helps someone.

At some point in an earlier version, Hephaistos seemed to corrupt some of my Hades files. As a result, I could not reinstall Hephaistos with really any version. Additionally, Hades could not read the save files.

I'm not sure if this is just a problem with me, but what I had to do was verify integrity files. Hephaistos was then effectively fully uninstalled (which, the program could not do by itself). Then, once I reinstalled Hephaistos, it worked, and everything is good now.

Sorry if this is either a "me only" issue, or not the right place to put this. Thought it was important.

  • Don

Mac OS: resolution not applying

On my macbook pro 16" (3456x2234p) I try to set the game to 1728x1117 (exactly half of full res) with your tool.
but when the game starts, it's at 1920x1200 (lowest res available in the list ingame)

I tried to repatch with the game in fullscreen and borderless, no changes

[macOS] Error with custom resolution

Hi! Thank you for this really cool and well documented mod :)

I'm trying to run Hades on my 14' MacBook Pro, it has a bit of a weird resolution (3024x1964px) with the whole notch situation. I tried to set it up with Hephaistos but it gives me this error after the HUD step:

error: argument --scaling: invalid choice: <Scaling.AUTODETECT: 'autodetect'> (choose from 'hor+', 'vert+', 'pixel')

I tried to set up the more traditional 16/10 aspect ratio and it worked as intended. Any idea what's going on? Thank you for your help!

Here's the full log:

Pick an option:
1. Patch Hades using Hephaistos
2. Restore Hades to its pre-Hephaistos state
3. Check current Hades / Hephaistos status
4. Exit
Choice: 1

Pick an option:
1. Select from common 16:10 resolutions
2. Select from common 21:9 resolutions
3. Select from common 32:9 resolutions
4. Select from common 48:9 resolutions
5. Input resolution manually
6. Cancel
Choice: 5

Width: 3024
Height: 1964

Select scaling algorithm (see README for more details):
1. [RECOMMENDED] Hor+ / Vert+ (based on input resolution): keeps experience close to vanilla game.
2. Pixel-based: effectively "zooms out" the camera.
3. Cancel
Choice (press ENTER to use [RECOMMENDED]): 1

Select HUD resizing mode (see README for more details):
1. Expand the HUD horizontally and vertically.
2. Keep HUD in the center of the screen with the same size as the original 16:9 HUD.
3. Cancel
Choice: 1

error: argument --scaling: invalid choice: <Scaling.AUTODETECT: 'autodetect'> (choose from 'hor+', 'vert+', 'pixel')

usage: hephaistos patch [-h] [--scaling {hor+,vert+,pixel}] [--hud {expand,center}] [--no-custom-resolution] [-f] [-v]
                        [--hades-dir HADES_DIR] [--no-modimporter]
                        width height

patch Hades using Hephaistos

positional arguments:
  width                 display resolution width
  height                display resolution height

options:
  -h, --help            show this help message and exit
  --scaling {hor+,vert+,pixel}
                        scaling algorithm (default: 'hor+' for wider aspect ratios / 'vert+' for taller aspect ratios)
  --hud {expand,center}
                        HUD mode (default: 'expand' for most aspect ratios / 'center' for 48:9 and wider)
  --no-custom-resolution
                        do not patch custom resolution in 'ProfileX.sjson' configuration file (default: patch custom resolution)
  -f, --force           force patching, bypassing hash check and removing previous backups (to be used after a game update)
  -v, --verbose         verbosity level (none: errors only, '-v': info, '-vv': debug)
  --hades-dir HADES_DIR
                        path to Hades directory (default: '.', i.e. current directory)
  --no-modimporter      do not use modimporter for registering / unregistering Hephaistos (default: use modimporter if available)

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]


MacOS: Failed to apply 'viewport' patch

Similar to #14 I am receiving the Failed to apply 'viewport' patch error when attempting to patch the game

Hades: v1.38291
Hephaistos: v1.7.3

Hi! This interactive wizard will help you to set up Hephaistos.
Note: while Hephaistos can be used in interactive mode for basic usage, you will need to switch to non-interactive mode for any advanced usage. See the README for more details.

Current version: v1.7.3
Latest version: could not check latest version -- perhaps no Internet connection is available?

Pick an option:
1. Patch Hades using Hephaistos
2. Restore Hades to its pre-Hephaistos state
3. Check current Hades / Hephaistos status
4. Exit
Choice: 1

Pick an option:
1. Select from common 16:10 resolutions
2. Select from common 21:9 resolutions
3. Select from common 32:9 resolutions
4. Select from common 48:9 / triple screen resolutions
5. Input resolution manually
6. Cancel
Choice: 3

Select resolution:
1. 3840 x 1080
2. 5120 x 1440
3. Cancel
Choice: 2

Select HUD preference (for 32:9, try out both options and see what you prefer!):
1. Expand HUD horizontally / vertically (recommended for 21:9 and 16:10)
2. Keep HUD in the center (recommended for 48:9 / triple screen)
3. Cancel
Choice: 2

INFO:hephaistos:Using resolution: (5120, 1440)
INFO:hephaistos:Using '--scaling=hor+': computed patch viewport (3840, 1080)
INFO:hephaistos:Using '--hud=center': HUD will be kept in the center of the screen
ERROR:hephaistos:Failed to apply 'viewport' patch in 'Game.macOS.app/Contents/MacOS/Game.macOS' (no occurrences found)

`hephaistos.exe` falsely flagged by AV software

MacOS: Failed to apply 'viewport' patch

Unfortunately, hephaistos fails to apply the patch on my Macbook.

I moved hephaistos to /Users/marcel/Library/Application Support/Steam/steamapps/common/Hades:

~/Library/Application Support/Steam/steamapps/common/Hades
❯ ll
total 6.9M
drwxr-xr-x 3 marcel staff   96 Apr  7 21:18 Game.macOS.app
drwxr-xr-x 4 marcel staff  128 Apr  8 18:55 hephaistos-data
-rwxr-xr-x 1 marcel staff 6.9M Feb 28 16:29 hephaistos

I executed the patching process in this directory using ./hephaistos.

The log I get from the Terminal:

Hi! This interactive wizard will help you to set up Hephaistos.
Note: while Hephaistos can be used in interactive mode for basic usage, you will need to switch to non-interactive mode for any advanced usage. See the README for more details.

Current version: v1.6.3
Latest version: could not check latest version -- perhaps no Internet connection is available?

Pick an option:
1. Patch Hades using Hephaistos
2. Restore Hades to its pre-Hephaistos state
3. Check current Hades / Hephaistos status
4. Exit
Choice: 1

Pick an option:
1. Select from common 21:9 resolutions
2. Select from common 32:9 resolutions
3. Select from common 48:9 / triple screen resolutions
4. Input resolution manually
5. Cancel
Choice: 2

Select resolution:
1. 3840 x 1080
2. 5120 x 1440
3. Cancel
Choice: 2

Select HUD preference (for 32:9, try out both options and see what you prefer!):
1. Expand HUD horizontally (recommended for 21:9)
2. Keep HUD in the center (recommended for 48:9 / triple screen)
3. Cancel
Choice: 2

INFO:hephaistos:Using resolution: (5120, 1440)
INFO:hephaistos:Using '--scaling=hor+': computed patch viewport (3840, 1080)
INFO:hephaistos:Using '--hud=center': HUD will be kept in the center of the screen
ERROR:hephaistos:Failed to apply 'viewport' patch in 'Game.macOS.app/Contents/MacOS/Game.macOS' (no occurrences found)

I checked the printed directory Game.macOS.app/Contents/MacOS/Game.macOS and the Game.macOS file is present.

Compatibility with OlympusExtra

Hello!
I've just started playing Hades again, and decided to look into mods.
Having changed monitor since I've played Hades first, I now needed Hepahistos to bring the right resolution to the game. Thanks a lot for building this.

I've also installed OlympusExtra which adds a bunch of boons, dialogues, and... keepsakes.

I've found the keepsake page to be a bit broken after installing both mods. I did not try without and it might be another issue, but this is the result I'm seeing when looking at the keepsake page in my home.

image

I am assuming the addition of the keepsakes (and the added invocation and arrows to switch pages for invocation) are not compatible with the mods.
Might be something to do with the order I installed the mod as well? iirc i installed modimporter, modutility, OlympusExtra and then hephaistos.

Would you be able to help?

Edit: where are my manners, a merry christmas to all of you of course :)

Thanks,
Mickael

Moving from creation to view, getting logged out & nothing ever loads

Recently started playing Starfinder. My group is using Hephaistos to create our characters and do level-ups.

When I log in and access my account via the Creation Manager... logging in and accessing the editable portion of my character sheet, everything is working. In the upper right-hand corner, it shows me logged in.

If I click on view my (character) sheet, it starts processing the click... I lose my logged-in status and I get the loading page stripe across the screen and it never loads. I have got up and walked away.. it never loads.

Repeated tries garner nothing different.

I eventually will clear the cache, restart the computer and I finally can get the information up. IF I am not playing this is doable (just irritating), but in the middle of a game, I don't want to have to be restarting my computer to view my character's sheet.

Any thoughts?

Black bars appear on particular menus

Black bars are still visible in some menus after applyingΒ Hephaistos on Steam Deck (the appropriate settings are used: 16:10, 1280x800).

  1. In Main Menu, both top, and bottom bars.
  2. In Mirror of Night, top bar.

There are no black bars during gameplay or other menus, and everything else functions as it should. No issues were encountered during installation.

Main Menu
Mirror of Night

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.