├── .editorconfig
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ └── feature_request.yml
└── workflows
│ └── build-and-publish.yml
├── .gitignore
├── .vscode
├── launch.json
└── tasks.json
├── Celeste64.HookGen
├── Celeste64.HookGen.csproj
├── IncrementalHookGenerator.cs
└── Properties
│ └── launchSettings.json
├── Celeste64.Launcher
├── BuildProperties.cs
├── Celeste64.Launcher.csproj
├── ConsoleHelper.cs
├── Program.cs
└── Properties
│ └── PublishProfiles
│ ├── LinuxProfile.pubxml
│ ├── MacOSProfile.pubxml
│ └── WindowsProfile.pubxml
├── Celeste64.sln
├── Content
├── Audio
│ ├── Master.bank
│ ├── Master.strings.bank
│ ├── ReadMe.md
│ ├── music.bank
│ └── sfx.bank
├── Celeste64.fgd
├── Faces
│ ├── baddy
│ │ ├── AngryIdle00.png
│ │ ├── AngryIdle01.png
│ │ ├── AngryTalk00.png
│ │ ├── AngryTalk01.png
│ │ ├── DefaultIdle00.png
│ │ ├── DefaultIdle01.png
│ │ ├── DefaultTalk00.png
│ │ ├── DefaultTalk01.png
│ │ ├── ResolvedIdle00.png
│ │ ├── ResolvedIdle01.png
│ │ ├── ResolvedTalk00.png
│ │ ├── ResolvedTalk01.png
│ │ ├── UncertainAIdle00.png
│ │ ├── UncertainAIdle01.png
│ │ ├── UncertainATalk00.png
│ │ ├── UncertainATalk01.png
│ │ ├── UncertainBIdle00.png
│ │ ├── UncertainBIdle01.png
│ │ ├── UncertainBTalk00.png
│ │ └── UncertainBTalk01.png
│ ├── granny
│ │ ├── DefaultIdle00.png
│ │ ├── DefaultIdle01.png
│ │ ├── DefaultTalk00.png
│ │ ├── DefaultTalk01.png
│ │ ├── Laugh00.png
│ │ └── Laugh01.png
│ ├── madeline
│ │ ├── AngryIdle00.png
│ │ ├── AngryIdle01.png
│ │ ├── AngryTalk00.png
│ │ ├── AngryTalk01.png
│ │ ├── DefaultIdle00.png
│ │ ├── DefaultIdle01.png
│ │ ├── DefaultTalk00.png
│ │ ├── DefaultTalk01.png
│ │ ├── HappyIdle00.png
│ │ ├── HappyTalk00.png
│ │ ├── HappyTalk01.png
│ │ ├── UpsetIdle00.png
│ │ ├── UpsetIdle01.png
│ │ ├── UpsetTalk00.png
│ │ └── UpsetTalk01.png
│ ├── signpost00.png
│ └── theo
│ │ ├── AnnoyedITalk00.png
│ │ ├── AnnoyedITalk01.png
│ │ ├── AnnoyedIdle00.png
│ │ ├── AnnoyedIdle01.png
│ │ ├── DefaultIdle00.png
│ │ ├── DefaultIdle01.png
│ │ ├── DefaultTalk00.png
│ │ ├── DefaultTalk01.png
│ │ ├── ProudIdle00.png
│ │ ├── ProudTalk00.png
│ │ ├── ProudTalk01.png
│ │ ├── SmugIdle00.png
│ │ ├── SmugIdle01.png
│ │ ├── SmugTalk00.png
│ │ ├── SmugTalk01.png
│ │ ├── TiredIdle00.png
│ │ ├── TiredTalk00.png
│ │ ├── TiredTalk01.png
│ │ ├── UpsetIdle00.png
│ │ ├── UpsetIdle01.png
│ │ ├── UpsetTalk00.png
│ │ └── UpsetTalk01.png
├── Fonts
│ ├── Renogare.otf
│ └── RenogareTrue.ttf
├── GameConfig.cfg
├── Levels.json
├── Levels.md
├── Maps
│ ├── 1-1.map
│ ├── 1-10.map
│ ├── 1-2.map
│ ├── 1-3.map
│ ├── 1-4.map
│ ├── 1-5.map
│ ├── 1-6.map
│ ├── 1-7.map
│ ├── 1-8.map
│ ├── 1-9.map
│ ├── 1.map
│ └── Palette.map
├── Models
│ ├── Sources
│ │ ├── antenna.blend
│ │ ├── antenna.blend1
│ │ ├── antenna.png
│ │ ├── badeline.png
│ │ ├── car.blend
│ │ ├── car.blend1
│ │ ├── car.png
│ │ ├── cassete.aseprite
│ │ ├── cassete.png
│ │ ├── coin.blend
│ │ ├── coin.blend1
│ │ ├── feather.blend
│ │ ├── feather.blend1
│ │ ├── feather.png
│ │ ├── flag.blend
│ │ ├── flag.blend1
│ │ ├── flag.png
│ │ ├── granny.blend
│ │ ├── granny.blend1
│ │ ├── logo.blend
│ │ ├── logo.blend1
│ │ ├── logo1.blend
│ │ ├── logo1.blend1
│ │ ├── logo1.png
│ │ ├── player.blend
│ │ ├── player.blend1
│ │ ├── player.png
│ │ ├── refill.png
│ │ ├── refill_gem.blend
│ │ ├── refill_gem.blend1
│ │ ├── refill_uv.png
│ │ ├── sign.blend
│ │ ├── sign.blend1
│ │ ├── sign_1.png
│ │ ├── sign_props.blend
│ │ ├── sign_props.blend1
│ │ ├── spike.blend
│ │ ├── spike.blend1
│ │ ├── spike.png
│ │ ├── spring_board.blend
│ │ ├── spring_board.blend1
│ │ ├── spring_platform.png
│ │ ├── strawb.aseprite
│ │ ├── strawb.png
│ │ ├── strawb_uv.png
│ │ ├── strawberry.blend
│ │ ├── strawberry.blend1
│ │ ├── tapes.blend
│ │ ├── tapes.blend1
│ │ ├── theo.blend
│ │ ├── theo.blend1
│ │ ├── tree.blend
│ │ ├── tree.blend1
│ │ └── tree.png
│ ├── antenna.glb
│ ├── badeline.glb
│ ├── bucket.glb
│ ├── bush1.glb
│ ├── car_collider.glb
│ ├── car_mirrors.glb
│ ├── car_top.glb
│ ├── car_wheels.glb
│ ├── coin.glb
│ ├── feather.glb
│ ├── flag_off.glb
│ ├── flag_on.glb
│ ├── granny.glb
│ ├── grass1.glb
│ ├── hydrant.glb
│ ├── logo.glb
│ ├── player.glb
│ ├── refill_gem.glb
│ ├── refill_gem_double.glb
│ ├── sign.glb
│ ├── sign1.glb
│ ├── sign2.glb
│ ├── sign3.glb
│ ├── sign4.glb
│ ├── spike.glb
│ ├── spike_ball.glb
│ ├── spring_board.glb
│ ├── strawberry.glb
│ ├── tape_1.glb
│ ├── tape_2.glb
│ ├── theo.glb
│ ├── trafic1.glb
│ └── tree1.glb
├── Shaders
│ ├── Default.glsl
│ ├── Edge.glsl
│ ├── Partials
│ │ └── Methods.gl
│ └── Sprite.glsl
├── Sprites
│ ├── Controls
│ │ ├── Nintendo Switch
│ │ │ ├── Back.png
│ │ │ ├── ButtonDown.png
│ │ │ ├── ButtonLeft.png
│ │ │ ├── ButtonRight.png
│ │ │ ├── ButtonUp.png
│ │ │ ├── East.png
│ │ │ ├── LeftShoulder.png
│ │ │ ├── LeftStick.png
│ │ │ ├── LeftTriggerPositive.png
│ │ │ ├── LeftX.png
│ │ │ ├── LeftXNegative.png
│ │ │ ├── LeftXPositive.png
│ │ │ ├── LeftY.png
│ │ │ ├── LeftYNegative.png
│ │ │ ├── LeftYPositive.png
│ │ │ ├── North.png
│ │ │ ├── RightShoulder.png
│ │ │ ├── RightStick.png
│ │ │ ├── RightTriggerPositive.png
│ │ │ ├── RightX.png
│ │ │ ├── RightXNegative.png
│ │ │ ├── RightXPositive.png
│ │ │ ├── RightY.png
│ │ │ ├── RightYNegative.png
│ │ │ ├── RightYPositive.png
│ │ │ ├── Select.png
│ │ │ ├── South.png
│ │ │ ├── Start.png
│ │ │ └── West.png
│ │ ├── PC
│ │ │ ├── A.png
│ │ │ ├── Apostrophe.png
│ │ │ ├── B.png
│ │ │ ├── Backslash.png
│ │ │ ├── Backspace.png
│ │ │ ├── C.png
│ │ │ ├── Capslock.png
│ │ │ ├── Comma.png
│ │ │ ├── Command.png
│ │ │ ├── D.png
│ │ │ ├── D0.png
│ │ │ ├── D1.png
│ │ │ ├── D2.png
│ │ │ ├── D3.png
│ │ │ ├── D4.png
│ │ │ ├── D5.png
│ │ │ ├── D6.png
│ │ │ ├── D7.png
│ │ │ ├── D8.png
│ │ │ ├── D9.png
│ │ │ ├── Delete.png
│ │ │ ├── Down.png
│ │ │ ├── E.png
│ │ │ ├── End.png
│ │ │ ├── Enter.png
│ │ │ ├── Equals.png
│ │ │ ├── Escape.png
│ │ │ ├── Exclamation.png
│ │ │ ├── F.png
│ │ │ ├── F1.png
│ │ │ ├── F10.png
│ │ │ ├── F11.png
│ │ │ ├── F12.png
│ │ │ ├── F2.png
│ │ │ ├── F3.png
│ │ │ ├── F4.png
│ │ │ ├── F5.png
│ │ │ ├── F6.png
│ │ │ ├── F7.png
│ │ │ ├── F8.png
│ │ │ ├── F9.png
│ │ │ ├── Function.png
│ │ │ ├── G.png
│ │ │ ├── H.png
│ │ │ ├── Home.png
│ │ │ ├── I.png
│ │ │ ├── Insert.png
│ │ │ ├── J.png
│ │ │ ├── K.png
│ │ │ ├── Keypad0.png
│ │ │ ├── Keypad1.png
│ │ │ ├── Keypad2.png
│ │ │ ├── Keypad3.png
│ │ │ ├── Keypad4.png
│ │ │ ├── Keypad5.png
│ │ │ ├── Keypad6.png
│ │ │ ├── Keypad7.png
│ │ │ ├── Keypad8.png
│ │ │ ├── Keypad9.png
│ │ │ ├── KeypadColon.png
│ │ │ ├── KeypadDivide.png
│ │ │ ├── KeypadEnter.png
│ │ │ ├── KeypadGreater.png
│ │ │ ├── KeypadLess.png
│ │ │ ├── KeypadMinus.png
│ │ │ ├── KeypadMultiply.png
│ │ │ ├── KeypadPlus.png
│ │ │ ├── KeypadPower.png
│ │ │ ├── L.png
│ │ │ ├── Left.png
│ │ │ ├── LeftAlt.png
│ │ │ ├── LeftBracket.png
│ │ │ ├── LeftControl.png
│ │ │ ├── LeftOS.png
│ │ │ ├── LeftShift.png
│ │ │ ├── M.png
│ │ │ ├── Minus.png
│ │ │ ├── Mouse.png
│ │ │ ├── MouseLeft.png
│ │ │ ├── MouseMiddle.png
│ │ │ ├── MouseMove.png
│ │ │ ├── MouseRight.png
│ │ │ ├── MouseScroll.png
│ │ │ ├── MouseX.png
│ │ │ ├── MouseY.png
│ │ │ ├── N.png
│ │ │ ├── Numlock.png
│ │ │ ├── O.png
│ │ │ ├── Option.png
│ │ │ ├── P.png
│ │ │ ├── PageDown.png
│ │ │ ├── PageUp.png
│ │ │ ├── Period.png
│ │ │ ├── PrintScreen.png
│ │ │ ├── Question.png
│ │ │ ├── Quote.png
│ │ │ ├── Return.png
│ │ │ ├── Right.png
│ │ │ ├── RightAlt.png
│ │ │ ├── RightBracket.png
│ │ │ ├── RightControl.png
│ │ │ ├── RightShift.png
│ │ │ ├── Semicolon.png
│ │ │ ├── Slash.png
│ │ │ ├── Space.png
│ │ │ ├── Tab.png
│ │ │ ├── Tilde.png
│ │ │ ├── Up.png
│ │ │ ├── q.png
│ │ │ ├── r.png
│ │ │ ├── s.png
│ │ │ ├── t.png
│ │ │ ├── u.png
│ │ │ ├── v.png
│ │ │ ├── w.png
│ │ │ ├── x.png
│ │ │ ├── y.png
│ │ │ └── z.png
│ │ ├── PlayStation
│ │ │ ├── Back.png
│ │ │ ├── ButtonDown.png
│ │ │ ├── ButtonLeft.png
│ │ │ ├── ButtonRight.png
│ │ │ ├── ButtonUp.png
│ │ │ ├── East.png
│ │ │ ├── LeftShoulder.png
│ │ │ ├── LeftStick.png
│ │ │ ├── LeftTriggerPositive.png
│ │ │ ├── LeftX.png
│ │ │ ├── LeftXNegative.png
│ │ │ ├── LeftXPositive.png
│ │ │ ├── LeftY.png
│ │ │ ├── LeftYNegative.png
│ │ │ ├── LeftYPositive.png
│ │ │ ├── North.png
│ │ │ ├── PS3_Select.png
│ │ │ ├── PS3_Start.png
│ │ │ ├── PS4_Select.png
│ │ │ ├── PS4_Start.png
│ │ │ ├── RIghtTriggerPositive.png
│ │ │ ├── RIghtX.png
│ │ │ ├── RightShoulder.png
│ │ │ ├── RightStick.png
│ │ │ ├── RightXNegative.png
│ │ │ ├── RightXPositive.png
│ │ │ ├── RightY.png
│ │ │ ├── RightYNegative.png
│ │ │ ├── RightYPositive.png
│ │ │ ├── Select.png
│ │ │ ├── South.png
│ │ │ ├── Start.png
│ │ │ └── West.png
│ │ ├── ReadMe.md
│ │ └── Xbox Series
│ │ │ ├── Back.png
│ │ │ ├── ButtonDown.png
│ │ │ ├── ButtonLeft.png
│ │ │ ├── ButtonRight.png
│ │ │ ├── ButtonUp.png
│ │ │ ├── East.png
│ │ │ ├── LeftShoulder.png
│ │ │ ├── LeftStick.png
│ │ │ ├── LeftTriggerPositive.png
│ │ │ ├── LeftX.png
│ │ │ ├── LeftXNegative.png
│ │ │ ├── LeftXPositive.png
│ │ │ ├── LeftY.png
│ │ │ ├── LeftYNegative.png
│ │ │ ├── LeftYPositive.png
│ │ │ ├── North.png
│ │ │ ├── RightShoulder.png
│ │ │ ├── RightStick.png
│ │ │ ├── RightTriggerPositive.png
│ │ │ ├── RightX.png
│ │ │ ├── RightXNegative.png
│ │ │ ├── RightXPositive.png
│ │ │ ├── RightY.png
│ │ │ ├── RightYNegative.png
│ │ │ ├── RightYPositive.png
│ │ │ ├── Select.png
│ │ │ ├── South.png
│ │ │ ├── Start.png
│ │ │ └── West.png
│ ├── bubble.png
│ ├── circle.png
│ ├── dust_0.png
│ ├── dust_1.png
│ ├── dust_2.png
│ ├── dust_3.png
│ ├── dust_4.png
│ ├── gradient.png
│ ├── icon_skull.png
│ ├── icon_stopwatch.png
│ ├── icon_strawberry.png
│ ├── interact.png
│ ├── particle-star.png
│ ├── ring.png
│ ├── shard_0.png
│ ├── shard_1.png
│ ├── shard_2.png
│ ├── splash.png
│ ├── stamp.png
│ ├── wood_shard_0.png
│ ├── wood_shard_1.png
│ └── wood_shard_2.png
├── Text
│ └── English.json
└── Textures
│ ├── Overworld
│ ├── overlay.png
│ ├── splashscreen.png
│ ├── strawberry.png
│ └── vignette.png
│ ├── Postcards
│ ├── ForsakenCity.png
│ ├── back-empty.png
│ └── back.png
│ ├── Skyboxes
│ ├── bsides.aseprite
│ ├── bsides_0.png
│ ├── bsides_1.png
│ ├── bsides_2.png
│ ├── city.aseprite
│ └── city.png
│ ├── TB_empty.png
│ ├── big_decals_1.png
│ ├── casset_block_1.png
│ ├── casset_block_2.png
│ ├── clouds.png
│ ├── concrete_decals.png
│ ├── concrete_decals_2.png
│ ├── concrete_door_trim.png
│ ├── concrete_wall.png
│ ├── floor_burnt_concrete.png
│ ├── floor_dirty_concrete.png
│ ├── girder.png
│ ├── girder_16.png
│ ├── girder_v.png
│ ├── girder_v_16.png
│ ├── girder_wood.png
│ ├── glass_1.png
│ ├── invisible.png
│ ├── metal_floor_1.png
│ ├── road1.png
│ ├── rock_1.png
│ ├── rock_2.png
│ ├── rock_3.png
│ ├── rock_4.png
│ ├── rock_5.png
│ ├── snow_1.png
│ ├── special_floor.aseprite
│ ├── special_floor_1.png
│ ├── wall.png
│ ├── wall_ruined_1.png
│ ├── wall_ruined_2.png
│ ├── wall_ruined_3.png
│ ├── wall_ruined_4.png
│ ├── wall_ruined_5.png
│ ├── wall_ruined_6.png
│ ├── wall_ruined_7.png
│ ├── white.png
│ ├── wood_1.png
│ ├── wood_2.png
│ ├── wood_3.png
│ ├── wood_4.png
│ └── wood_fragile.png
├── Mods
└── DefaultSkins
│ ├── Fuji.json
│ └── Skins
│ ├── badeline.json
│ ├── granny.json
│ ├── player-short-hair.json
│ └── theo.json
├── README.md
├── SETUP.md
├── Source
├── Actors
│ ├── Actor.cs
│ ├── Attacher.cs
│ ├── Badeline.cs
│ ├── BreakBlock.cs
│ ├── Cassette.cs
│ ├── CassetteBlock.cs
│ ├── Checkpoint.cs
│ ├── Coin.cs
│ ├── Cutscene.cs
│ ├── DeathBlock.cs
│ ├── Debris.cs
│ ├── Decoration.cs
│ ├── DoubleDashPuzzleBlock.cs
│ ├── Dust.cs
│ ├── EndingArea.cs
│ ├── FallingBlock.cs
│ ├── Feather.cs
│ ├── FixedCamera.cs
│ ├── FloatingDecoration.cs
│ ├── FloatyBlock.cs
│ ├── FogRing.cs
│ ├── GateBlock.cs
│ ├── Granny.cs
│ ├── IntroCar.cs
│ ├── LoadingZone.cs
│ ├── MovingBlock.cs
│ ├── NPC.cs
│ ├── NonClimbableBlock.cs
│ ├── Player.cs
│ ├── Refill.cs
│ ├── Signpost.cs
│ ├── Snow.cs
│ ├── Solid.cs
│ ├── SolidMesh.cs
│ ├── Sound.cs
│ ├── SpikeBlock.cs
│ ├── Spring.cs
│ ├── StaticProp.cs
│ ├── Strawberry.cs
│ ├── Theo.cs
│ └── TrafficBlock.cs
├── Audio
│ ├── Audio.cs
│ ├── AudioHandle.cs
│ ├── Events.cs
│ ├── FMOD
│ │ ├── .editorconfig
│ │ ├── ReadMe.md
│ │ ├── fmod.cs
│ │ ├── fmod_dsp.cs
│ │ ├── fmod_errors.cs
│ │ ├── fmod_studio.cs
│ │ └── libs
│ │ │ ├── lib64
│ │ │ ├── libfmod.so
│ │ │ ├── libfmod.so.13
│ │ │ ├── libfmod.so.13.18
│ │ │ ├── libfmodstudio.so
│ │ │ ├── libfmodstudio.so.13
│ │ │ └── libfmodstudio.so.13.18
│ │ │ ├── libarm
│ │ │ ├── libfmod.so
│ │ │ ├── libfmod.so.13
│ │ │ ├── libfmod.so.13.18
│ │ │ ├── libfmodstudio.so
│ │ │ ├── libfmodstudio.so.13
│ │ │ └── libfmodstudio.so.13.18
│ │ │ ├── libarm64
│ │ │ ├── libfmod.so
│ │ │ ├── libfmod.so.13
│ │ │ ├── libfmod.so.13.18
│ │ │ ├── libfmodstudio.so
│ │ │ ├── libfmodstudio.so.13
│ │ │ └── libfmodstudio.so.13.18
│ │ │ ├── osx
│ │ │ ├── libfmod.dylib
│ │ │ └── libfmodstudio.dylib
│ │ │ └── x64
│ │ │ ├── fmod.dll
│ │ │ ├── fmodstudio.dll
│ │ │ └── fsbank.dll
│ └── SoundHandle.cs
├── Celeste64.csproj
├── Data
│ ├── Assets.cs
│ ├── Controls.cs
│ ├── Language.cs
│ ├── LevelInfo.cs
│ ├── Map.cs
│ ├── ModSettings.cs
│ ├── PersistedData
│ │ ├── ControlsConfigBinding.cs
│ │ ├── ControlsConfigStick.cs
│ │ ├── ControlsConfig_V01.cs
│ │ ├── LevelRecord_V01.cs
│ │ ├── ModRecord_V01.cs
│ │ ├── ModRecord_V02.cs
│ │ ├── ModSettingsRecord_V01.cs
│ │ ├── ModSettings_V01.cs
│ │ ├── PersistedData.cs
│ │ ├── SaveDataReadMe.md
│ │ ├── Save_V01.cs
│ │ ├── Save_V02.cs
│ │ ├── Settings_V01.cs
│ │ └── VersionedPersistedData.cs
│ ├── Save.cs
│ └── Settings.cs
├── Game.cs
├── Graphics
│ ├── Camera.cs
│ ├── Hair.cs
│ ├── Materials.cs
│ ├── Model.cs
│ ├── ModelFlags.cs
│ ├── ParticleSystem.cs
│ ├── RenderState.cs
│ ├── SimpleModel.cs
│ ├── SkinnedModel.cs
│ ├── SkinnedTemplate.cs
│ ├── Skybox.cs
│ ├── Sprite.cs
│ ├── SpriteRenderer.cs
│ └── Vertex.cs
├── Helpers
│ ├── Globals.cs
│ ├── GridPartition.cs
│ ├── LogHelper.cs
│ ├── Menu.cs
│ ├── RayHit.cs
│ ├── Routine.cs
│ ├── SpringPhysics.cs
│ ├── StateMachine.cs
│ ├── UI.cs
│ └── Utils.cs
├── Interfaces.cs
├── License.txt
├── Mod
│ ├── Core
│ │ ├── DummyGameMod.cs
│ │ ├── GameMod.cs
│ │ ├── GameModSettings.cs
│ │ ├── ModAssemblyLoadContext.cs
│ │ ├── ModInfo.cs
│ │ ├── ModLoader.cs
│ │ ├── ModManager.cs
│ │ └── VanillaGameMod.cs
│ ├── Data
│ │ └── SaveManager.cs
│ ├── Filesystem
│ │ ├── FolderModFilesystem.cs
│ │ ├── IModFilesystem.cs
│ │ ├── LayeredFilesystem.cs
│ │ └── ZipModFilesystem.cs
│ ├── Helpers
│ │ ├── CustomPlayerState.cs
│ │ ├── CustomPlayerStateRegistry.cs
│ │ ├── ModAssetDictionary.cs
│ │ ├── SkinInfo.cs
│ │ ├── StreamExtensions.cs
│ │ └── StringExtensions.cs
│ ├── Hook
│ │ ├── DisallowHooksAttribute.cs
│ │ ├── HookManager.cs
│ │ └── InternalHookGenTargetAttribute.cs
│ ├── ImGui
│ │ ├── DebugActorMenu.cs
│ │ ├── FujiDebugMenu.cs
│ │ ├── ImGuiHandler.cs
│ │ ├── ImGuiManager.cs
│ │ └── ImGuiRenderer.cs
│ ├── Menu
│ │ ├── BindControlMenu.cs
│ │ ├── ControlsMenu.cs
│ │ ├── GameOptionsMenu.cs
│ │ ├── ModControlsMenu.cs
│ │ ├── ModInfoMenu.cs
│ │ ├── ModOptionsMenu.cs
│ │ ├── ModSelectionMenu.cs
│ │ └── SaveSelectionMenu.cs
│ ├── Patches
│ │ ├── Hooks.cs
│ │ ├── Keyboard.cs
│ │ ├── Patches.cs
│ │ └── SledgeHooks.cs
│ └── StatusEffects
│ │ └── StatusEffect.cs
├── Program.cs
├── Scenes
│ ├── GameErrorMessage.cs
│ ├── Overworld.cs
│ ├── Scene.cs
│ ├── Startup.cs
│ ├── Titlescreen.cs
│ └── World.cs
├── Screenwipes
│ ├── AngledWipe.cs
│ ├── ScreenWipe.cs
│ ├── SlideWipe.cs
│ └── SpotlightWipe.cs
└── Spatial
│ ├── BoundingBox.cs
│ ├── BoundingFrustum.cs
│ └── PlaneIntersectionType.cs
├── fuji.ico
├── fuji.png
└── fuji.svg
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: Submit a bug report
2 | description: Submit a bug report for the Fuji mod loader
3 | labels: ["bug"]
4 | body:
5 | - type: checkboxes
6 | id: confirmation
7 | attributes:
8 | label: Please confirm the following
9 | options:
10 | - label: I am using the latest stable/beta version of Fuji
11 | required: true
12 | - label: I have confirmed that this issue is not caused by a faulty mod
13 | required: true
14 | - label: I have searched and confirmed that this issue is not a duplicate
15 | required: true
16 | - type: textarea
17 | id: repro
18 | attributes:
19 | label: What were you doing?
20 | description: What were you trying to accomplish when this issue happened? How can we reproduce this issue?
21 | placeholder: Add context
22 | validations:
23 | required: true
24 | - type: textarea
25 | id: logs
26 | attributes:
27 | label: Your logs
28 | description: Please paste your logs so we can diagnose this issue in more detail.
29 | placeholder: Paste here
30 | render: shell
31 | validations:
32 | required: true
33 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.yml:
--------------------------------------------------------------------------------
1 | name: Submit a feature request
2 | description: Submit a request for a new Fuji mod loader feature
3 | labels: ["enhancement", "fr-pending-review"]
4 | assignees:
5 | - axiand
6 | body:
7 | - type: checkboxes
8 | id: confirmation
9 | attributes:
10 | label: Please confirm the following
11 | options:
12 | - label: I have searched to ensure that my feature request is not a duplicate
13 | required: true
14 | - label: My feature request will benefit the general community (i.e. it is not better off as a standalone mod)
15 | required: true
16 | - type: textarea
17 | id: impl
18 | attributes:
19 | label: Describe your feature
20 | description: Requests that are too vague may be rejected.
21 | placeholder: Please describe the implementation of your feature. Add as much detail as you think is necessary.
22 | validations:
23 | required: true
24 | - type: textarea
25 | id: argue_in_favour
26 | attributes:
27 | label: Why should we implement this?
28 | placeholder: Present a strong but concise argument for adding your feature, this will make it more likely to be considered.
29 | validations:
30 | required: true
31 | - type: checkboxes
32 | id: teamwork
33 | attributes:
34 | label: Optional
35 | options:
36 | - label: I will open (or have already opened) a pull request that implements this feature.
37 | required: false
38 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # build artifacts
2 | bin
3 | obj
4 | build
5 |
6 | # editors
7 | .vs
8 | .idea
9 |
10 | # ignore mods, except for the built in included ones
11 | Mods
12 | -Mods/DefaultSkins
13 | -Mods/TestLevel
14 |
15 | # trash that we dont want
16 | Celeste64.Launcher/imgui.ini
17 | Content/Map_Test/autosave
18 | Content/Maps/autosave
19 | Content/FMOD/celeste64/.cache
20 | Content/FMOD/celeste64/.user
21 | Content/FMOD/celeste64/.unsaved
22 | Celeste64-Fuji
23 | *.user
24 | Log.txt
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | // running this uses a debugger. press "ctrl+f5" by default to just run with no debugger
9 | "name": "Build and Run Game",
10 | "type": "coreclr",
11 | "request": "launch",
12 | "preLaunchTask": "build",
13 | "program": "${workspaceFolder}/Celeste64.Launcher/bin/Debug/net8.0/Celeste64-Fuji.exe",
14 | "args": [],
15 | "cwd": "${workspaceFolder}/Celeste64.Launcher",
16 | "console": "internalConsole",
17 | "stopAtEntry": false
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "label": "build",
6 | "command": "dotnet",
7 | "type": "process",
8 | "args": [
9 | "build",
10 | "${workspaceFolder}/Celeste64.sln",
11 | "/property:GenerateFullPaths=true",
12 | "/consoleloggerparameters:NoSummary;ForceNoAlign"
13 | ],
14 | "problemMatcher": "$msCompile"
15 | },
16 | {
17 | "label": "publish",
18 | "command": "dotnet",
19 | "type": "process",
20 | "args": [
21 | "publish",
22 | "${workspaceFolder}/Celeste64.sln",
23 | "/property:GenerateFullPaths=true",
24 | "/consoleloggerparameters:NoSummary;ForceNoAlign"
25 | ],
26 | "problemMatcher": "$msCompile"
27 | },
28 | {
29 | "label": "watch",
30 | "command": "dotnet",
31 | "type": "process",
32 | "args": [
33 | "watch",
34 | "run",
35 | "--project",
36 | "${workspaceFolder}/Celeste64.sln"
37 | ],
38 | "problemMatcher": "$msCompile"
39 | }
40 | ]
41 | }
--------------------------------------------------------------------------------
/Celeste64.HookGen/Celeste64.HookGen.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | netstandard2.0
4 | false
5 | enable
6 | latest
7 |
8 | true
9 | true
10 |
11 | Celeste64.HookGen
12 | Celeste64.HookGen
13 |
14 |
15 |
16 |
17 | all
18 | runtime; build; native; contentfiles; analyzers; buildtransitive
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Celeste64.HookGen/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json.schemastore.org/launchsettings.json",
3 | "profiles": {
4 | "Generators": {
5 | "commandName": "DebugRoslynComponent",
6 | "targetProject": "../Celeste64/Celeste64.csproj"
7 | }
8 | }
9 | }
--------------------------------------------------------------------------------
/Celeste64.Launcher/BuildProperties.cs:
--------------------------------------------------------------------------------
1 | using EmbeddedBuildProperty;
2 |
3 | namespace Celeste64.Launcher;
4 |
5 | public partial class BuildProperties
6 | {
7 | [BuildProperty]
8 | public static partial string BuildVersion();
9 | }
10 |
--------------------------------------------------------------------------------
/Celeste64.Launcher/ConsoleHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.InteropServices;
2 |
3 | namespace Celeste64.Launcher;
4 |
5 | public static class ConsoleHelper
6 | {
7 | // P/Invoke required:
8 | [DllImport("kernel32.dll", SetLastError = true)]
9 | public static extern IntPtr GetStdHandle(int nStdHandle);
10 |
11 | [DllImport("kernel32.dll", SetLastError = true)]
12 | public static extern bool SetStdHandle(int nStdHandle, IntPtr hHandle);
13 | [DllImport("kernel32")]
14 | static extern bool AllocConsole();
15 |
16 | public const int STD_OUTPUT_HANDLE = -11;
17 |
18 | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
19 | public static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPTStr)] string filename,
20 | [MarshalAs(UnmanagedType.U4)] uint access,
21 | [MarshalAs(UnmanagedType.U4)] FileShare share,
22 | IntPtr securityAttributes,
23 | [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
24 | [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
25 | IntPtr templateFile);
26 |
27 | public const uint GENERIC_WRITE = 0x40000000;
28 | public const uint GENERIC_READ = 0x80000000;
29 |
30 | public static void CreateConsole()
31 | {
32 | AllocConsole();
33 | var hOut = GetStdHandle(STD_OUTPUT_HANDLE);
34 | var hRealOut = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, FileShare.Write, IntPtr.Zero, FileMode.OpenOrCreate, 0, IntPtr.Zero);
35 | if (hRealOut != hOut)
36 | {
37 | SetStdHandle(STD_OUTPUT_HANDLE, hRealOut);
38 | Console.SetOut(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true });
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Celeste64.Launcher/Properties/PublishProfiles/LinuxProfile.pubxml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | Release
8 | Any CPU
9 | build
10 | FileSystem
11 | <_TargetId>Folder
12 | net8.0
13 | linux-x64
14 | false
15 | true
16 |
17 |
18 |
19 | PreserveNewest
20 | true
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Celeste64.Launcher/Properties/PublishProfiles/MacOSProfile.pubxml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | Release
8 | Any CPU
9 | build
10 | FileSystem
11 | <_TargetId>Folder
12 | net8.0
13 | osx-x64
14 | false
15 | true
16 |
17 |
18 |
19 | PreserveNewest
20 | true
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Celeste64.Launcher/Properties/PublishProfiles/WindowsProfile.pubxml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | Release
8 | Any CPU
9 | build
10 | FileSystem
11 | <_TargetId>Folder
12 | net8.0
13 | win-x64
14 | false
15 | false
16 | true
17 |
18 |
19 |
20 | PreserveNewest
21 | true
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Content/Audio/Master.bank:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Audio/Master.bank
--------------------------------------------------------------------------------
/Content/Audio/Master.strings.bank:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Audio/Master.strings.bank
--------------------------------------------------------------------------------
/Content/Audio/ReadMe.md:
--------------------------------------------------------------------------------
1 | These banks were built with FMOD Studio.
2 |
3 | The project file that built these ones will be made public in the near future, but are not part of this repository.
--------------------------------------------------------------------------------
/Content/Audio/music.bank:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Audio/music.bank
--------------------------------------------------------------------------------
/Content/Audio/sfx.bank:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Audio/sfx.bank
--------------------------------------------------------------------------------
/Content/Faces/baddy/AngryIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/AngryIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/AngryIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/AngryIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/AngryTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/AngryTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/AngryTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/AngryTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/DefaultIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/DefaultIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/DefaultIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/DefaultIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/DefaultTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/DefaultTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/DefaultTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/DefaultTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/ResolvedIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/ResolvedIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/ResolvedIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/ResolvedIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/ResolvedTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/ResolvedTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/ResolvedTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/ResolvedTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainAIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainAIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainAIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainAIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainATalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainATalk00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainATalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainATalk01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainBIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainBIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainBIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainBIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainBTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainBTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/baddy/UncertainBTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/baddy/UncertainBTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/granny/DefaultIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/DefaultIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/granny/DefaultIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/DefaultIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/granny/DefaultTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/DefaultTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/granny/DefaultTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/DefaultTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/granny/Laugh00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/Laugh00.png
--------------------------------------------------------------------------------
/Content/Faces/granny/Laugh01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/granny/Laugh01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/AngryIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/AngryIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/AngryIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/AngryIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/AngryTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/AngryTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/AngryTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/AngryTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/DefaultIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/DefaultIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/DefaultIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/DefaultIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/DefaultTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/DefaultTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/DefaultTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/DefaultTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/HappyIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/HappyIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/HappyTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/HappyTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/HappyTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/HappyTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/UpsetIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/UpsetIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/UpsetIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/UpsetIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/UpsetTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/UpsetTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/madeline/UpsetTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/madeline/UpsetTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/signpost00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/signpost00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/AnnoyedITalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/AnnoyedITalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/AnnoyedITalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/AnnoyedITalk01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/AnnoyedIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/AnnoyedIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/AnnoyedIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/AnnoyedIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/DefaultIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/DefaultIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/DefaultIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/DefaultIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/DefaultTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/DefaultTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/DefaultTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/DefaultTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/ProudIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/ProudIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/ProudTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/ProudTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/ProudTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/ProudTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/SmugIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/SmugIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/SmugIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/SmugIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/SmugTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/SmugTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/SmugTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/SmugTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/TiredIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/TiredIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/TiredTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/TiredTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/TiredTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/TiredTalk01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/UpsetIdle00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/UpsetIdle00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/UpsetIdle01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/UpsetIdle01.png
--------------------------------------------------------------------------------
/Content/Faces/theo/UpsetTalk00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/UpsetTalk00.png
--------------------------------------------------------------------------------
/Content/Faces/theo/UpsetTalk01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Faces/theo/UpsetTalk01.png
--------------------------------------------------------------------------------
/Content/Fonts/Renogare.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Fonts/Renogare.otf
--------------------------------------------------------------------------------
/Content/Fonts/RenogareTrue.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Fonts/RenogareTrue.ttf
--------------------------------------------------------------------------------
/Content/GameConfig.cfg:
--------------------------------------------------------------------------------
1 | {
2 | version: 3,
3 | name: "Celeste64",
4 | icon: "icon.png",
5 | "fileformats": [
6 | { "format": "Valve", "initialmap": "initial_valve.map" },
7 | { "format": "Standard", "initialmap": "initial_standard.map" },
8 | { "format": "Quake2", "initialmap": "initial_quake2.map" },
9 | { "format": "Quake3" }
10 | ],
11 | "filesystem": {
12 | "searchpath": ".",
13 | "packageformat": { "extension": "pak", "format": "idpak" }
14 | },
15 | "Textures": {
16 | "package": { "type": "directory", "root": "Textures" },
17 | "format": { "extensions": ["bmp", "exr", "hdr", "jpeg", "jpg", "png", "tga", "webp"], "format": "image" },
18 | "exclude": [ "*_ao", "*_emission", "*_heightmap", "*_metallic", "*_normal", "*_orm", "*_roughness", "*_sss" ],
19 | "attribute": "_tb_textures"
20 | },
21 | "entities": {
22 | "definitions": [ "Celeste64.fgd" ],
23 | "defaultcolor": "0.6 0.6 0.6 1.0",
24 | "modelformats": [ "mdl", "md2", "md3", "bsp", "dkm" ],
25 | "scale": 1
26 | },
27 | "tags": {
28 | "brush": [
29 | {
30 | "name": "Detail",
31 | "attribs": [ ],
32 | "match": "classname",
33 | "pattern": "detail*"
34 | },{
35 | "name": "Trigger",
36 | "attribs": [ "transparent" ],
37 | "match": "classname",
38 | "pattern": "trigger*",
39 | "texture": "trigger"
40 | }
41 | ],
42 | "brushface": [
43 | {
44 | "name": "Clip",
45 | "attribs": [ "transparent" ],
46 | "match": "texture",
47 | "pattern": "clip"
48 | },{
49 | "name": "Skip",
50 | "attribs": [ "transparent" ],
51 | "match": "texture",
52 | "pattern": "skip"
53 | }
54 | ]
55 | },
56 | "faceattribs": {
57 | "defaults": {
58 | "scale": [1, 1]
59 | },
60 | "surfaceflags": [
61 |
62 | ],
63 | "contentflags": [
64 |
65 | ]
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/Content/Levels.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "ID": "0_FORSAKEN_CITY",
4 | "Name": "Forsaken City",
5 | "Label": "Created for the 6th anniversary\nby the Celeste Team",
6 | "Strawberries": 30,
7 | "Preview": "Postcards/ForsakenCity",
8 | "Map": "1"
9 | }
10 | ]
--------------------------------------------------------------------------------
/Content/Levels.md:
--------------------------------------------------------------------------------
1 | ### Setting up Trenchbroom for Level Editing:
2 | - Use a "Generic" from the game type selection, under `View -> Preferences`
3 | - Set the `Content` folder as the `Game Path`, so that it can find Textures.
4 | - Selected `File -> Reload Texture Collections`, to view all the surfaces.
5 | - Select `Celeste64.fgd` as the Entity Definitions, under the `Entity` tab.
6 |
7 | ### Loading Levels / Maps
8 | - Add new Levels to the `Levels.json` by copying an existing entry and modifying it.
9 | - `"ID"` should be entirely unique for your level - it's what is used to track save data.
10 | - Place your Trenchbroom `.map` files in the `Maps` folder, and then select your entry Map by modying `"Map"` in `Levels.json`.
11 | - Restart the game, and it will appear on the Overworld Level select.
12 | - Press `Ctrl + R` at any time during Gameplay to reload your map (and all other assets) to test while playing.
--------------------------------------------------------------------------------
/Content/Models/Sources/antenna.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/antenna.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/antenna.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/antenna.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/antenna.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/antenna.png
--------------------------------------------------------------------------------
/Content/Models/Sources/badeline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/badeline.png
--------------------------------------------------------------------------------
/Content/Models/Sources/car.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/car.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/car.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/car.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/car.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/car.png
--------------------------------------------------------------------------------
/Content/Models/Sources/cassete.aseprite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/cassete.aseprite
--------------------------------------------------------------------------------
/Content/Models/Sources/cassete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/cassete.png
--------------------------------------------------------------------------------
/Content/Models/Sources/coin.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/coin.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/coin.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/coin.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/feather.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/feather.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/feather.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/feather.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/feather.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/feather.png
--------------------------------------------------------------------------------
/Content/Models/Sources/flag.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/flag.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/flag.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/flag.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/flag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/flag.png
--------------------------------------------------------------------------------
/Content/Models/Sources/granny.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/granny.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/granny.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/granny.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/logo.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/logo.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/logo.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/logo.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/logo1.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/logo1.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/logo1.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/logo1.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/logo1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/logo1.png
--------------------------------------------------------------------------------
/Content/Models/Sources/player.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/player.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/player.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/player.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/player.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/player.png
--------------------------------------------------------------------------------
/Content/Models/Sources/refill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/refill.png
--------------------------------------------------------------------------------
/Content/Models/Sources/refill_gem.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/refill_gem.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/refill_gem.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/refill_gem.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/refill_uv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/refill_uv.png
--------------------------------------------------------------------------------
/Content/Models/Sources/sign.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/sign.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/sign.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/sign.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/sign_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/sign_1.png
--------------------------------------------------------------------------------
/Content/Models/Sources/sign_props.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/sign_props.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/sign_props.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/sign_props.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/spike.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spike.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/spike.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spike.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/spike.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spike.png
--------------------------------------------------------------------------------
/Content/Models/Sources/spring_board.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spring_board.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/spring_board.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spring_board.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/spring_platform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/spring_platform.png
--------------------------------------------------------------------------------
/Content/Models/Sources/strawb.aseprite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/strawb.aseprite
--------------------------------------------------------------------------------
/Content/Models/Sources/strawb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/strawb.png
--------------------------------------------------------------------------------
/Content/Models/Sources/strawb_uv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/strawb_uv.png
--------------------------------------------------------------------------------
/Content/Models/Sources/strawberry.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/strawberry.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/strawberry.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/strawberry.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/tapes.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/tapes.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/tapes.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/tapes.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/theo.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/theo.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/theo.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/theo.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/tree.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/tree.blend
--------------------------------------------------------------------------------
/Content/Models/Sources/tree.blend1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/tree.blend1
--------------------------------------------------------------------------------
/Content/Models/Sources/tree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/Sources/tree.png
--------------------------------------------------------------------------------
/Content/Models/antenna.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/antenna.glb
--------------------------------------------------------------------------------
/Content/Models/badeline.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/badeline.glb
--------------------------------------------------------------------------------
/Content/Models/bucket.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/bucket.glb
--------------------------------------------------------------------------------
/Content/Models/bush1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/bush1.glb
--------------------------------------------------------------------------------
/Content/Models/car_collider.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/car_collider.glb
--------------------------------------------------------------------------------
/Content/Models/car_mirrors.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/car_mirrors.glb
--------------------------------------------------------------------------------
/Content/Models/car_top.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/car_top.glb
--------------------------------------------------------------------------------
/Content/Models/car_wheels.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/car_wheels.glb
--------------------------------------------------------------------------------
/Content/Models/coin.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/coin.glb
--------------------------------------------------------------------------------
/Content/Models/feather.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/feather.glb
--------------------------------------------------------------------------------
/Content/Models/flag_off.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/flag_off.glb
--------------------------------------------------------------------------------
/Content/Models/flag_on.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/flag_on.glb
--------------------------------------------------------------------------------
/Content/Models/granny.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/granny.glb
--------------------------------------------------------------------------------
/Content/Models/grass1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/grass1.glb
--------------------------------------------------------------------------------
/Content/Models/hydrant.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/hydrant.glb
--------------------------------------------------------------------------------
/Content/Models/logo.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/logo.glb
--------------------------------------------------------------------------------
/Content/Models/player.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/player.glb
--------------------------------------------------------------------------------
/Content/Models/refill_gem.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/refill_gem.glb
--------------------------------------------------------------------------------
/Content/Models/refill_gem_double.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/refill_gem_double.glb
--------------------------------------------------------------------------------
/Content/Models/sign.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/sign.glb
--------------------------------------------------------------------------------
/Content/Models/sign1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/sign1.glb
--------------------------------------------------------------------------------
/Content/Models/sign2.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/sign2.glb
--------------------------------------------------------------------------------
/Content/Models/sign3.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/sign3.glb
--------------------------------------------------------------------------------
/Content/Models/sign4.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/sign4.glb
--------------------------------------------------------------------------------
/Content/Models/spike.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/spike.glb
--------------------------------------------------------------------------------
/Content/Models/spike_ball.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/spike_ball.glb
--------------------------------------------------------------------------------
/Content/Models/spring_board.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/spring_board.glb
--------------------------------------------------------------------------------
/Content/Models/strawberry.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/strawberry.glb
--------------------------------------------------------------------------------
/Content/Models/tape_1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/tape_1.glb
--------------------------------------------------------------------------------
/Content/Models/tape_2.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/tape_2.glb
--------------------------------------------------------------------------------
/Content/Models/theo.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/theo.glb
--------------------------------------------------------------------------------
/Content/Models/trafic1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/trafic1.glb
--------------------------------------------------------------------------------
/Content/Models/tree1.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Models/tree1.glb
--------------------------------------------------------------------------------
/Content/Shaders/Edge.glsl:
--------------------------------------------------------------------------------
1 | VERTEX:
2 | #version 330
3 |
4 | uniform mat4 u_matrix;
5 | layout(location=0) in vec2 a_position;
6 | layout(location=1) in vec2 a_tex;
7 | layout(location=2) in vec4 a_color;
8 | layout(location=3) in vec4 a_type;
9 | out vec2 v_tex;
10 | out vec4 v_col;
11 | out vec4 v_type;
12 | void main(void)
13 | {
14 | gl_Position = u_matrix * vec4(a_position.xy, 0, 1);
15 | v_tex = a_tex;
16 | v_col = a_color;
17 | v_type = a_type;
18 | }
19 |
20 | FRAGMENT:
21 | #version 330
22 | #include Partials/Methods.gl
23 |
24 | uniform sampler2D u_texture;
25 | uniform sampler2D u_depth;
26 | uniform vec2 u_pixel;
27 | uniform vec4 u_edge;
28 | in vec2 v_tex;
29 | in vec4 v_col;
30 | in vec4 v_type;
31 | out vec4 o_color;
32 |
33 | float depth(vec2 uv)
34 | {
35 | return texture(u_depth, uv).r;
36 | }
37 |
38 | void main(void)
39 | {
40 | // get depth and adjacent depth values
41 | float it = depth(v_tex);
42 | float other =
43 | depth(v_tex + vec2(u_pixel.x, 0)) * 0.25 +
44 | depth(v_tex + vec2(-u_pixel.x, 0)) * 0.25 +
45 | depth(v_tex + vec2(0, u_pixel.y)) * 0.25 +
46 | depth(v_tex + vec2(0, -u_pixel.y)) * 0.25;
47 |
48 | // more edge the closer to the screen
49 | float edge = step(0.001, other - it);
50 |
51 | // calculate edge color mixed with default color
52 | vec4 col = texture(u_texture, v_tex);
53 | vec3 res = mix(col.rgb, u_edge.rgb, edge * 0.70);
54 | o_color = vec4(res, col.a);
55 | }
56 |
--------------------------------------------------------------------------------
/Content/Shaders/Partials/Methods.gl:
--------------------------------------------------------------------------------
1 | float LinearizeDepth(float depth, float near, float far)
2 | {
3 | float z = depth * 2.0 - 1.0; // back to NDC
4 | return ((2.0 * near * far) / (far + near - z * (far - near))) / far;
5 | }
6 |
7 | float Map(float value, float min1, float max1, float min2, float max2)
8 | {
9 | float perc = clamp((value - min1) / (max1 - min1), 0.0, 1.0);
10 | return perc * (max2 - min2) + min2;
11 | }
12 |
13 | vec3 TransformNormal(vec3 normal, mat4 transform)
14 | {
15 | return normalize(transpose(inverse(mat3(transform))) * normal);
16 | }
--------------------------------------------------------------------------------
/Content/Shaders/Sprite.glsl:
--------------------------------------------------------------------------------
1 | VERTEX:
2 | #version 330
3 |
4 | uniform mat4 u_matrix;
5 |
6 | layout(location=0) in vec3 a_position;
7 | layout(location=1) in vec2 a_tex;
8 | layout(location=2) in vec4 a_color;
9 |
10 | out vec2 v_tex;
11 | out vec4 v_color;
12 |
13 | void main(void)
14 | {
15 | gl_Position = u_matrix * vec4(a_position, 1.0);
16 | v_tex = a_tex;
17 | v_color = a_color;
18 | }
19 |
20 | FRAGMENT:
21 | #version 330
22 | #include Partials/Methods.gl
23 |
24 | uniform sampler2D u_texture;
25 | uniform float u_near;
26 | uniform float u_far;
27 |
28 | in vec2 v_tex;
29 | in vec4 v_color;
30 |
31 | out vec4 o_color;
32 |
33 | void main(void)
34 | {
35 | // apply color value
36 | o_color = texture(u_texture, v_tex) * v_color;
37 |
38 | // apply depth values
39 | gl_FragDepth = LinearizeDepth(gl_FragCoord.z, u_near, u_far);
40 | }
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/Back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/Back.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/ButtonDown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/ButtonDown.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/ButtonLeft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/ButtonLeft.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/ButtonRight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/ButtonRight.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/ButtonUp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/ButtonUp.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/East.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/East.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/LeftYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/LeftYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/North.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/North.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/RightYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/RightYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/Select.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/South.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/South.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/Start.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Nintendo Switch/West.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Nintendo Switch/West.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/A.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/A.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Apostrophe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Apostrophe.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/B.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/B.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Backslash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Backslash.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Backspace.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Backspace.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/C.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/C.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Capslock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Capslock.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Comma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Comma.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Command.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Command.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D0.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D1.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D2.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D3.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D4.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D5.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D6.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D7.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D8.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/D9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/D9.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Delete.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Down.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/E.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/E.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/End.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/End.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Enter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Enter.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Equals.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Equals.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Escape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Escape.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Exclamation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Exclamation.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F1.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F10.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F11.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F12.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F2.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F3.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F4.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F5.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F6.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F7.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F8.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/F9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/F9.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Function.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/G.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/G.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/H.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/H.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Home.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/I.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/I.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Insert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Insert.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/J.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/J.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/K.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/K.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad0.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad1.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad2.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad3.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad4.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad5.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad6.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad7.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad8.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Keypad9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Keypad9.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadColon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadColon.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadDivide.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadDivide.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadEnter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadEnter.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadGreater.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadGreater.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadLess.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadLess.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadMinus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadMinus.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadMultiply.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadMultiply.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadPlus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadPlus.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/KeypadPower.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/KeypadPower.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/L.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Left.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/LeftAlt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/LeftAlt.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/LeftBracket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/LeftBracket.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/LeftControl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/LeftControl.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/LeftOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/LeftOS.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/LeftShift.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/LeftShift.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/M.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Minus.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Mouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Mouse.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseLeft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseLeft.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseMiddle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseMiddle.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseMove.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseMove.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseRight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseRight.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseScroll.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseScroll.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/MouseY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/MouseY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/N.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Numlock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Numlock.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/O.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/O.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Option.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Option.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/P.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/P.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/PageDown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/PageDown.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/PageUp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/PageUp.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Period.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Period.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/PrintScreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/PrintScreen.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Question.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Question.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Quote.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Quote.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Return.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Return.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Right.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/RightAlt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/RightAlt.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/RightBracket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/RightBracket.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/RightControl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/RightControl.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/RightShift.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/RightShift.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Semicolon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Semicolon.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Slash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Slash.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Space.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Space.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Tab.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Tilde.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Tilde.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/Up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/Up.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/q.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/q.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/r.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/s.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/t.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/t.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/u.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/u.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/v.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/v.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/w.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/x.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/y.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/y.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PC/z.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PC/z.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/Back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/Back.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/ButtonDown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/ButtonDown.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/ButtonLeft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/ButtonLeft.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/ButtonRight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/ButtonRight.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/ButtonUp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/ButtonUp.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/East.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/East.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/LeftYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/LeftYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/North.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/North.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/PS3_Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/PS3_Select.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/PS3_Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/PS3_Start.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/PS4_Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/PS4_Select.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/PS4_Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/PS4_Start.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RIghtTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RIghtTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RIghtX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RIghtX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/RightYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/RightYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/Select.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/South.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/South.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/Start.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/PlayStation/West.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/PlayStation/West.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/ReadMe.md:
--------------------------------------------------------------------------------
1 | These inputs are from [Kenney's Input Prompts](https://kenney.nl/assets/input-prompts) and released under Creative Commons CC0.
2 |
3 | Due to time constraints, I'm only including the default button prompts for each controller. In an ideal world, with proper controller bindings, it would include all prompts and map to them gracefully.
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/Back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/Back.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/ButtonDown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/ButtonDown.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/ButtonLeft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/ButtonLeft.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/ButtonRight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/ButtonRight.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/ButtonUp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/ButtonUp.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/East.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/East.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/LeftYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/LeftYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/North.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/North.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightShoulder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightShoulder.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightStick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightStick.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightTriggerPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightTriggerPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightX.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightXNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightXNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightXPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightXPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightY.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightYNegative.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightYNegative.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/RightYPositive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/RightYPositive.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/Select.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/South.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/South.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/Start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/Start.png
--------------------------------------------------------------------------------
/Content/Sprites/Controls/Xbox Series/West.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/Controls/Xbox Series/West.png
--------------------------------------------------------------------------------
/Content/Sprites/bubble.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/bubble.png
--------------------------------------------------------------------------------
/Content/Sprites/circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/circle.png
--------------------------------------------------------------------------------
/Content/Sprites/dust_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/dust_0.png
--------------------------------------------------------------------------------
/Content/Sprites/dust_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/dust_1.png
--------------------------------------------------------------------------------
/Content/Sprites/dust_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/dust_2.png
--------------------------------------------------------------------------------
/Content/Sprites/dust_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/dust_3.png
--------------------------------------------------------------------------------
/Content/Sprites/dust_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/dust_4.png
--------------------------------------------------------------------------------
/Content/Sprites/gradient.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/gradient.png
--------------------------------------------------------------------------------
/Content/Sprites/icon_skull.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/icon_skull.png
--------------------------------------------------------------------------------
/Content/Sprites/icon_stopwatch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/icon_stopwatch.png
--------------------------------------------------------------------------------
/Content/Sprites/icon_strawberry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/icon_strawberry.png
--------------------------------------------------------------------------------
/Content/Sprites/interact.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/interact.png
--------------------------------------------------------------------------------
/Content/Sprites/particle-star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/particle-star.png
--------------------------------------------------------------------------------
/Content/Sprites/ring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/ring.png
--------------------------------------------------------------------------------
/Content/Sprites/shard_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/shard_0.png
--------------------------------------------------------------------------------
/Content/Sprites/shard_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/shard_1.png
--------------------------------------------------------------------------------
/Content/Sprites/shard_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/shard_2.png
--------------------------------------------------------------------------------
/Content/Sprites/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/splash.png
--------------------------------------------------------------------------------
/Content/Sprites/stamp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/stamp.png
--------------------------------------------------------------------------------
/Content/Sprites/wood_shard_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/wood_shard_0.png
--------------------------------------------------------------------------------
/Content/Sprites/wood_shard_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/wood_shard_1.png
--------------------------------------------------------------------------------
/Content/Sprites/wood_shard_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Sprites/wood_shard_2.png
--------------------------------------------------------------------------------
/Content/Textures/Overworld/overlay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Overworld/overlay.png
--------------------------------------------------------------------------------
/Content/Textures/Overworld/splashscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Overworld/splashscreen.png
--------------------------------------------------------------------------------
/Content/Textures/Overworld/strawberry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Overworld/strawberry.png
--------------------------------------------------------------------------------
/Content/Textures/Overworld/vignette.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Overworld/vignette.png
--------------------------------------------------------------------------------
/Content/Textures/Postcards/ForsakenCity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Postcards/ForsakenCity.png
--------------------------------------------------------------------------------
/Content/Textures/Postcards/back-empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Postcards/back-empty.png
--------------------------------------------------------------------------------
/Content/Textures/Postcards/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Postcards/back.png
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/bsides.aseprite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/bsides.aseprite
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/bsides_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/bsides_0.png
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/bsides_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/bsides_1.png
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/bsides_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/bsides_2.png
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/city.aseprite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/city.aseprite
--------------------------------------------------------------------------------
/Content/Textures/Skyboxes/city.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/Skyboxes/city.png
--------------------------------------------------------------------------------
/Content/Textures/TB_empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/TB_empty.png
--------------------------------------------------------------------------------
/Content/Textures/big_decals_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/big_decals_1.png
--------------------------------------------------------------------------------
/Content/Textures/casset_block_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/casset_block_1.png
--------------------------------------------------------------------------------
/Content/Textures/casset_block_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/casset_block_2.png
--------------------------------------------------------------------------------
/Content/Textures/clouds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/clouds.png
--------------------------------------------------------------------------------
/Content/Textures/concrete_decals.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/concrete_decals.png
--------------------------------------------------------------------------------
/Content/Textures/concrete_decals_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/concrete_decals_2.png
--------------------------------------------------------------------------------
/Content/Textures/concrete_door_trim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/concrete_door_trim.png
--------------------------------------------------------------------------------
/Content/Textures/concrete_wall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/concrete_wall.png
--------------------------------------------------------------------------------
/Content/Textures/floor_burnt_concrete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/floor_burnt_concrete.png
--------------------------------------------------------------------------------
/Content/Textures/floor_dirty_concrete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/floor_dirty_concrete.png
--------------------------------------------------------------------------------
/Content/Textures/girder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/girder.png
--------------------------------------------------------------------------------
/Content/Textures/girder_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/girder_16.png
--------------------------------------------------------------------------------
/Content/Textures/girder_v.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/girder_v.png
--------------------------------------------------------------------------------
/Content/Textures/girder_v_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/girder_v_16.png
--------------------------------------------------------------------------------
/Content/Textures/girder_wood.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/girder_wood.png
--------------------------------------------------------------------------------
/Content/Textures/glass_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/glass_1.png
--------------------------------------------------------------------------------
/Content/Textures/invisible.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/invisible.png
--------------------------------------------------------------------------------
/Content/Textures/metal_floor_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/metal_floor_1.png
--------------------------------------------------------------------------------
/Content/Textures/road1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/road1.png
--------------------------------------------------------------------------------
/Content/Textures/rock_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/rock_1.png
--------------------------------------------------------------------------------
/Content/Textures/rock_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/rock_2.png
--------------------------------------------------------------------------------
/Content/Textures/rock_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/rock_3.png
--------------------------------------------------------------------------------
/Content/Textures/rock_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/rock_4.png
--------------------------------------------------------------------------------
/Content/Textures/rock_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/rock_5.png
--------------------------------------------------------------------------------
/Content/Textures/snow_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/snow_1.png
--------------------------------------------------------------------------------
/Content/Textures/special_floor.aseprite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/special_floor.aseprite
--------------------------------------------------------------------------------
/Content/Textures/special_floor_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/special_floor_1.png
--------------------------------------------------------------------------------
/Content/Textures/wall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_1.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_2.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_3.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_4.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_5.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_6.png
--------------------------------------------------------------------------------
/Content/Textures/wall_ruined_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wall_ruined_7.png
--------------------------------------------------------------------------------
/Content/Textures/white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/white.png
--------------------------------------------------------------------------------
/Content/Textures/wood_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wood_1.png
--------------------------------------------------------------------------------
/Content/Textures/wood_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wood_2.png
--------------------------------------------------------------------------------
/Content/Textures/wood_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wood_3.png
--------------------------------------------------------------------------------
/Content/Textures/wood_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wood_4.png
--------------------------------------------------------------------------------
/Content/Textures/wood_fragile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Content/Textures/wood_fragile.png
--------------------------------------------------------------------------------
/Mods/DefaultSkins/Fuji.json:
--------------------------------------------------------------------------------
1 | {
2 | "Id": "JazzrabbitDefaultSkins",
3 | "Name": "Default Skin Pack",
4 | "ModAuthor": "Jazzrabbit",
5 | "Description": "This mod is a built in Fuji mod that adds several new default skins to select in the game including Badeline, Theo, Granny, and a short hair version of Madeline.",
6 | "Version": "1.0.0"
7 | }
--------------------------------------------------------------------------------
/Mods/DefaultSkins/Skins/badeline.json:
--------------------------------------------------------------------------------
1 | {
2 | "Model": "badeline",
3 | "HideHair": false,
4 | "Name": "Badeline",
5 | "HairNormal" : "9B3FB5",
6 | "HairNoDash" : "6EC0FF",
7 | "HairTwoDash" : "FA91FF",
8 | "HairRefillFlash" : "FFFFFF",
9 | "HairFeather" : "F2D450"
10 | }
--------------------------------------------------------------------------------
/Mods/DefaultSkins/Skins/granny.json:
--------------------------------------------------------------------------------
1 | {
2 | "Model": "granny",
3 | "HideHair": true,
4 | "Name": "Granny",
5 | "HairNormal" : "FFFFFF",
6 | "HairNoDash" : "6EC0FF",
7 | "HairTwoDash" : "FA91FF",
8 | "HairRefillFlash" : "FFFFFF",
9 | "HairFeather" : "F2D450"
10 | }
--------------------------------------------------------------------------------
/Mods/DefaultSkins/Skins/player-short-hair.json:
--------------------------------------------------------------------------------
1 | {
2 | "Model": "player",
3 | "HideHair": true,
4 | "Name": "Short Hair"
5 | }
--------------------------------------------------------------------------------
/Mods/DefaultSkins/Skins/theo.json:
--------------------------------------------------------------------------------
1 | {
2 | "Model": "theo",
3 | "HideHair": true,
4 | "Name": "Theo",
5 | "HairNormal" : "452318"
6 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Fuji: A Celeste 64 Mod Loader
2 |
3 |
4 |
5 |
6 | Fuji is a basic Mod Loader for Celeste 64: Fragments of the Mountain, a game made by the original Celeste developers in under 2 weeks for Celeste's 6th Anniversary. It is forked from the source code of that game.
7 |
8 | ### [More info about Fuji can be found here](https://fujiapi.github.io/)
9 | ### [We're also on Discord, join us!](https://discord.gg/9NJcbSyuae)
10 |
11 | ### [The original game can be found here](https://maddymakesgamesinc.itch.io/celeste64)
12 |
13 | Fuji is still very early in development, but is currently able to load custom levels alongside the main game, as well as loading additional assets such as custom models, custom dialog, custom textures, etc...
14 | It also implements some new functionality like custom skins, and the ability to load code mods from DLLs.
15 |
16 | # Installation
17 | ### [See the installation instructions here](https://github.com/FujiAPI/Fuji/wiki/Installing-Fuji)
18 |
19 | # Contributing
20 | See the [Contributor's Guide](https://github.com/FujiAPI/Fuji/wiki/Contributing-Guide) for a quick start.
21 |
22 | # Building
23 | See [SETUP.md](SETUP.md) for build instructions.
24 |
25 | # License
26 | - The Celeste IP and everything in the `Content` folder are owned by [Maddy Makes Games, Inc](https://www.maddymakesgames.com/).
27 | - The `Source` folder, with exceptions where noted, is [licensed under MIT](Source/License.txt).
28 | - The `Source/Audio/FMOD` folder contains bindings and binaries from FMOD.
29 | - This mod loader is adapted from Celeste 64's Source code, but it is not made or endorsed by the game's creators.
30 |
--------------------------------------------------------------------------------
/Source/Actors/Attacher.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public abstract class Attacher : Actor, IRidePlatforms
4 | {
5 | public virtual Vec3 AttachNormal => -Vec3.UnitZ;
6 | public virtual Vec3 AttachOrigin => Position;
7 |
8 | public Actor? AttachedTo;
9 |
10 | public override void Added()
11 | {
12 | base.Added();
13 |
14 | if (World.SolidRayCast(AttachOrigin - AttachNormal, AttachNormal, 5f, out var hit)
15 | && hit.Actor is Solid solid)
16 | {
17 | AttachedTo = hit.Actor;
18 | solid.Attachers.Add(this);
19 | }
20 | }
21 |
22 | public virtual bool RidingPlatformCheck(Actor platform) => AttachedTo == platform;
23 |
24 | public virtual void RidingPlatformSetVelocity(in Vec3 value) { }
25 |
26 | public virtual void RidingPlatformMoved(in Vec3 delta) { Position += delta; }
27 | }
28 |
--------------------------------------------------------------------------------
/Source/Actors/BreakBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class BreakBlock : Solid, IDashTrigger
4 | {
5 | public static readonly string[] GlassShards = ["shard_0", "shard_1", "shard_2"];
6 | public static readonly string[] WoodShards = ["wood_shard_0", "wood_shard_1", "wood_shard_2"];
7 |
8 | public readonly bool Secret;
9 |
10 | public virtual bool BouncesPlayer { get; set; }
11 |
12 | public BreakBlock(bool bouncesPlayer_, bool transparent, bool secret)
13 | {
14 | BouncesPlayer = bouncesPlayer_;
15 | Transparent = transparent;
16 | Secret = secret;
17 |
18 | if (Transparent)
19 | Model.Flags = ModelFlags.Transparent;
20 | }
21 |
22 | public virtual void HandleDash(Vec3 velocity)
23 | {
24 | var size = LocalBounds.Size;
25 | var amount = (size.X * size.Y * size.Z) / 200;
26 | var options = (Transparent ? GlassShards : WoodShards);
27 |
28 | if (Secret)
29 | Audio.Play(Sfx.sfx_secret, Position);
30 |
31 | if (Transparent)
32 | Audio.Play(Sfx.sfx_glassbreak, Position);
33 | else
34 | Audio.Play(Sfx.sfx_breakable_wall_wood, Position);
35 |
36 | for (int i = 0; i < amount; i++)
37 | {
38 | var offset = new Vec3(World.Rng.Float(size.X), World.Rng.Float(size.Y), World.Rng.Float(size.Z));
39 | var at = Vec3.Transform(offset - size / 2, Matrix);
40 | velocity = velocity.Normalized() * World.Rng.Float(100, 400);
41 | World.Request().Init(at, velocity, options[World.Rng.Int(options.Length)]);
42 | }
43 |
44 | World.Destroy(this);
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Source/Actors/CassetteBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class CassetteBlock : Solid, IListenToAudioCallback
4 | {
5 | public CassetteBlock(bool startOn)
6 | {
7 | Model.MakeMaterialsUnique();
8 | Transparent = true;
9 | SetOn(startOn);
10 | }
11 |
12 | public virtual void SetOn(bool enabled)
13 | {
14 | Collidable = enabled;
15 | Model.Flags = enabled ? ModelFlags.Terrain : ModelFlags.Transparent;
16 |
17 | foreach (var mat in Model.Materials)
18 | mat.Color = enabled ? Color.White : Color.White * 0.30f;
19 | }
20 |
21 | public virtual void AudioCallbackEvent(int index)
22 | {
23 | if (index % 2 == 0)
24 | SetOn(!Collidable);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Source/Actors/DeathBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class DeathBlock : Actor { }
4 |
--------------------------------------------------------------------------------
/Source/Actors/Debris.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Debris : Actor, IRecycle, IHaveSprites
4 | {
5 | public Vec3 Velocity;
6 | public Subtexture Image;
7 | public float Timer;
8 |
9 | public virtual void Init(Vec3 position, Vec3 velocity, string image)
10 | {
11 | Position = position;
12 | Velocity = velocity;
13 | Image = Assets.Subtextures[image];
14 | Timer = 0.0f;
15 | UpdateOffScreen = true;
16 | }
17 |
18 | public override void Update()
19 | {
20 | Position += Velocity * Time.Delta;
21 | Velocity.Z -= 200 * Time.Delta;
22 |
23 | var vxy = Velocity.XY();
24 | vxy = Calc.Approach(vxy, Vec2.Zero, 400 * Time.Delta);
25 | Velocity = Velocity.WithXY(vxy);
26 |
27 | Timer += Time.Delta;
28 | if (Timer > 2.0f)
29 | World.Destroy(this);
30 | }
31 |
32 | public virtual void CollectSprites(List populate)
33 | {
34 | populate.Add(Sprite.CreateBillboard(World, Position, Image, 2, Color.White));
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Source/Actors/Decoration.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Decoration : Actor, IHaveModels
4 | {
5 | public readonly SimpleModel Model = new() { Flags = ModelFlags.Terrain };
6 |
7 | public void CollectModels(List<(Actor Actor, Model Model)> populate)
8 | {
9 | populate.Add((this, Model));
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Source/Actors/DoubleDashPuzzleBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class DoubleDashPuzzleBlock : Solid, IUnlockStrawberry, IHaveSprites
4 | {
5 | public bool Satisfied { get; protected set; }
6 |
7 | public bool Ready = false;
8 | public float Pulse = 0;
9 | public Color PulseColor;
10 |
11 | public virtual void CollectSprites(List populate)
12 | {
13 | if (Ready && !Satisfied && Pulse > 0)
14 | {
15 | var haloPos = Position + Vec3.UnitZ * 2 + Vec3.Transform(Vec3.Zero, Model.Transform);
16 | populate.Add(Sprite.CreateBillboard(World, haloPos, "gradient", 50 * Pulse, PulseColor * 0.50f) with { Post = true });
17 | populate.Add(Sprite.CreateBillboard(World, Position, "ring", Pulse * Pulse * 40, PulseColor * .4f) with { Post = true });
18 | populate.Add(Sprite.CreateBillboard(World, Position, "ring", Pulse * 50, PulseColor * .4f) with { Post = true });
19 | }
20 | }
21 |
22 | public override void Update()
23 | {
24 | base.Update();
25 |
26 | if (!Satisfied && !Ready && GetPlayerRider() is { Dashes: >= 2 } player)
27 | {
28 | PulseColor = player.Hair.Color;
29 | Ready = true;
30 | Pulse = 1;
31 | TShake = 1.0f;
32 | Audio.Play(Sfx.sfx_secret, Position);
33 | }
34 |
35 | if (Ready && Pulse > 0)
36 | {
37 | Pulse -= Time.Delta;
38 | if (Pulse <= 0)
39 | Satisfied = true;
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Source/Actors/Dust.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Dust : Actor, IHaveSprites, IRecycle
4 | {
5 | public static readonly string[] Images = ["dust_0", "dust_1", "dust_2", "dust_3", "dust_4"];
6 |
7 | public Vec3 Velocity;
8 | public Subtexture Image;
9 | public Color Color;
10 | public float Percent;
11 | public float Duration;
12 |
13 | public virtual void Init(Vec3 position, Vec3 velocity, Color? color = null)
14 | {
15 | Position = position;
16 | Velocity = velocity;
17 | Percent = 0.0f;
18 | Color = color ?? new Color(0.7f, 0.75f, 0.8f, 1.0f);
19 | Image = Assets.Subtextures[Images[World.Rng.Int(Images.Length)]];
20 | Duration = World.Rng.Float(0.5f, 1.0f);
21 | UpdateOffScreen = true;
22 | }
23 |
24 | public override void Update()
25 | {
26 | Position += Velocity * Time.Delta;
27 | Velocity.Z += 10 * Time.Delta;
28 |
29 | var vxy = Velocity.XY();
30 | vxy = Calc.Approach(vxy, Vec2.Zero, 200 * Time.Delta);
31 | Velocity = Velocity.WithXY(vxy);
32 |
33 | Percent += Time.Delta / Duration;
34 | if (Percent >= 1.0f)
35 | World.Destroy(this);
36 | }
37 |
38 | public virtual void CollectSprites(List populate)
39 | {
40 | populate.Add(Sprite.CreateBillboard(World, Position, Image, 4 * (1.0f - Percent), Color));
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Source/Actors/EndingArea.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class EndingArea : Actor { }
4 |
--------------------------------------------------------------------------------
/Source/Actors/FixedCamera.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class FixedCamera(Vec3 point) : Actor
4 | {
5 | public Vec3 Point = point;
6 | }
7 |
--------------------------------------------------------------------------------
/Source/Actors/FloatingDecoration.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class FloatingDecoration : Actor, IHaveModels
4 | {
5 | public readonly SimpleModel Model = new() { Flags = ModelFlags.Terrain };
6 | public float Rate;
7 | public float Offset;
8 |
9 | public override void Added()
10 | {
11 | Rate = World.Rng.Float(1, 3);
12 | Offset = World.Rng.Float(MathF.Tau);
13 | UpdateOffScreen = true;
14 | }
15 |
16 | public virtual void CollectModels(List<(Actor Actor, Model Model)> populate)
17 | {
18 | var time = World.GeneralTimer * Rate * 0.25f + Offset;
19 | Model.Transform = Matrix.CreateTranslation(0, 0, MathF.Sin(time) * 12);
20 | populate.Add((this, Model));
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Source/Actors/FloatyBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public sealed class FloatyBlock : Solid
4 | {
5 | public Vec3 Origin;
6 | public Vec3 Offset;
7 | public float Friction = 300;
8 | public float FrictionThreshold = 50;
9 | public float Frequency = 1.2f;
10 | public float Halflife = 3.0f;
11 | public Player? PlayerRiderLocal;
12 |
13 | public override void Added()
14 | {
15 | base.Added();
16 | Origin = Position;
17 | Offset = Vec3.Zero;
18 | }
19 |
20 | public override void Update()
21 | {
22 | base.Update();
23 |
24 | if (PlayerRiderLocal is null && HasPlayerRider())
25 | {
26 | PlayerRiderLocal = GetPlayerRider();
27 | Velocity += GetPlayerRider()!.PreviousVelocity * .8f;
28 | }
29 | else if (PlayerRiderLocal is not null && !HasPlayerRider())
30 | {
31 | if (PlayerRiderLocal is { } player)
32 | Velocity -= player.Velocity * .8f;
33 | PlayerRiderLocal = null;
34 | }
35 |
36 | // friction
37 | Friction = 200;
38 | FrictionThreshold = 1;
39 | if (Friction > 0 && Velocity.LengthSquared() > FrictionThreshold.Squared())
40 | Velocity = Utils.Approach(Velocity, Velocity.Normalized() * FrictionThreshold, Friction * Time.Delta);
41 |
42 | // spring!
43 | var diff = Position - (Origin + Offset);
44 | var normal = diff.Normalized();
45 | float vel = Vec3.Dot(Velocity, normal);
46 | float old_vel = vel;
47 | vel = SpringPhysics.Calculate(diff.Length(), vel, 0, 0, Frequency, Halflife);
48 | Velocity += normal * (vel - old_vel);
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Source/Actors/GateBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class GateBlock(Vec3 end) : Solid
4 | {
5 | public virtual float Acceleration => 400;
6 | public virtual float MaxSpeed => 200;
7 |
8 | public Vec3 Start;
9 | public Vec3 End = end;
10 | public bool Opened;
11 | public Sound? Sfx;
12 |
13 | public readonly Routine Routine = new();
14 |
15 | public override void Added()
16 | {
17 | Sfx = World.Add(new Sound(this, Celeste64.Sfx.sfx_touch_switch_gate_open_move));
18 | UpdateOffScreen = true;
19 | Start = Position;
20 | }
21 |
22 | public override void Update()
23 | {
24 | base.Update();
25 |
26 | if (!Opened && !Coin.AnyRemaining(World))
27 | {
28 | Opened = true;
29 | Routine.Run(Sequence());
30 | }
31 | else if (Routine.IsRunning)
32 | {
33 | Routine.Update();
34 | }
35 | }
36 |
37 | public virtual CoEnumerator Sequence()
38 | {
39 | TShake = .2f;
40 | Sfx?.Resume();
41 | yield return .2f;
42 |
43 | var normal = (End - Position).Normalized();
44 | while (Position != End && Vec3.Dot((End - Position).Normalized(), normal) >= 0)
45 | {
46 | Velocity = Utils.Approach(Velocity, MaxSpeed * normal, Acceleration * Time.Delta);
47 | yield return Co.SingleFrame;
48 | }
49 |
50 | Audio.Play(Celeste64.Sfx.sfx_touch_switch_gate_finish, Position);
51 | Sfx?.Stop();
52 | Sfx = null;
53 | Velocity = Vec3.Zero;
54 | MoveTo(End);
55 | TShake = .2f;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Source/Actors/Granny.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Granny : NPC
4 | {
5 | public virtual string TALK_FLAG => "GRANNY";
6 | public Player? TalkingTo;
7 |
8 | public Granny() : base(Assets.Models["granny"])
9 | {
10 | Model.Transform = Matrix.CreateScale(3) * Matrix.CreateTranslation(0, 0, -1.5f);
11 | InteractHoverOffset = new Vec3(0, -2, 16);
12 | InteractRadius = 32;
13 | CheckForDialog();
14 | }
15 |
16 | public override void Interact(Player player)
17 | {
18 | TalkingTo = player;
19 | World.Add(new Cutscene(Conversation));
20 | }
21 |
22 | public virtual CoEnumerator Conversation(Cutscene cs)
23 | {
24 | yield return Co.Run(cs.MoveToDistance(TalkingTo, Position.XY(), 16));
25 | yield return Co.Run(cs.FaceEachOther(TalkingTo, this));
26 |
27 | int index = Save.CurrentRecord.GetFlag(TALK_FLAG) + 1;
28 | yield return Co.Run(cs.Say(Loc.Lines($"Granny{index}")));
29 | Save.CurrentRecord.IncFlag(TALK_FLAG);
30 | CheckForDialog();
31 | }
32 |
33 | public virtual void CheckForDialog()
34 | {
35 | InteractEnabled = Loc.HasLines($"Granny{Save.CurrentRecord.GetFlag(TALK_FLAG) + 1}");
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Source/Actors/LoadingZone.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class LoadingZone(string map, string checkpointName, bool isSubmap) : Actor
4 | {
5 | public readonly string Map = map;
6 | public readonly string CheckpointName = checkpointName;
7 | public readonly bool IsSubmap = isSubmap;
8 | }
9 |
--------------------------------------------------------------------------------
/Source/Actors/MovingBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class MovingBlock : Solid
4 | {
5 | public Vec3 Start;
6 | public Vec3 End;
7 |
8 | public float Lerp;
9 | public float Target = 1;
10 | public bool GoSlow;
11 |
12 | public MovingBlock(bool goSlow, Vec3 end)
13 | {
14 | this.GoSlow = goSlow;
15 | UpdateOffScreen = true;
16 | End = end;
17 | }
18 |
19 | public override void Added()
20 | {
21 | Start = Position;
22 | base.Added();
23 | }
24 |
25 | public override void Update()
26 | {
27 | base.Update();
28 |
29 | Calc.Approach(ref Lerp, Target, Time.Delta / (GoSlow ? 2 : 1));
30 | if (Lerp == Target)
31 | Target = 1 + -(int)Target;
32 |
33 | MoveTo(Vec3.Lerp(Start, End, Utils.SineInOut(Lerp)));
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Source/Actors/NPC.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public abstract class NPC : Actor, IHaveModels, IHaveSprites, IHavePushout, ICastPointShadow
4 | {
5 | public SkinnedModel Model;
6 |
7 | public bool InteractEnabled = true;
8 | public float InteractRadius = 16;
9 | public Vec3 InteractHoverOffset;
10 | public bool IsPlayerOver;
11 |
12 | public bool ShowHover = false;
13 | public float ShowTimer = 0;
14 |
15 | public virtual float PushoutHeight { get; set; } = 12;
16 | public virtual float PushoutRadius { get; set; } = 8;
17 | public virtual float PointShadowAlpha { get; set; }
18 |
19 | public NPC(SkinnedTemplate model)
20 | {
21 | Model = new SkinnedModel(model);
22 | Model.Play("idle");
23 |
24 | foreach (var mat in Model.Materials)
25 | mat.Effects = 0.70f;
26 |
27 | LocalBounds = new BoundingBox(Vec3.Zero + Vec3.UnitZ * 4, 8);
28 | PointShadowAlpha = 1;
29 | }
30 |
31 | public abstract void Interact(Player player);
32 |
33 | public override void Update()
34 | {
35 | if (World.Camera.Frustum.Contains(WorldBounds))
36 | Model.Update();
37 | ShowTimer += Time.Delta;
38 | }
39 |
40 | public override void LateUpdate()
41 | {
42 | if (!ShowHover && IsPlayerOver)
43 | Audio.Play(Sfx.ui_npc_popup);
44 | ShowHover = IsPlayerOver;
45 | IsPlayerOver = false;
46 | }
47 |
48 | public virtual void CollectModels(List<(Actor Actor, Model Model)> populate)
49 | {
50 | populate.Add((this, Model));
51 | }
52 |
53 | public virtual void CollectSprites(List populate)
54 | {
55 | if (ShowHover)
56 | {
57 | var at = Vec3.Transform(InteractHoverOffset, Matrix);
58 | at += Vec3.UnitZ * MathF.Sin(ShowTimer * 8);
59 | populate.Add(Sprite.CreateBillboard(World, at, "interact", 2, Color.White) with { Post = true });
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Source/Actors/NonClimbableBlock.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class NonClimbableBlock : Solid
4 | {
5 | public override bool IsClimbable => false;
6 | }
7 |
--------------------------------------------------------------------------------
/Source/Actors/Signpost.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Signpost : NPC, IHaveModels
4 | {
5 | public readonly string Conversation;
6 | public Player? TalkingTo;
7 |
8 | public Signpost(string conversation) : base(Assets.Models["sign"])
9 | {
10 | Conversation = conversation;
11 | Model.Transform =
12 | Matrix.CreateScale(4) *
13 | Matrix.CreateTranslation(0, 0, -1.5f);
14 | InteractHoverOffset = new Vec3(0, 0, 16);
15 | InteractRadius = 16;
16 | PushoutRadius = 6;
17 | }
18 |
19 | public override void Interact(Player player)
20 | {
21 | TalkingTo = player;
22 | World.Add(new Cutscene(Talk));
23 | }
24 |
25 | public virtual CoEnumerator Talk(Cutscene cs)
26 | {
27 | yield return Co.Run(cs.Face(TalkingTo, Position));
28 | yield return Co.Run(cs.Say(Loc.Lines(Conversation)));
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Source/Actors/Sound.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Sound(Actor following, string sound) : Actor
4 | {
5 | public AudioHandle Handle;
6 | public Actor? Following = following;
7 |
8 | public readonly string SoundEvent = sound;
9 |
10 | public void Resume()
11 | {
12 | if (!Handle)
13 | {
14 | Handle.Stop();
15 | Handle = Audio.Play(SoundEvent, Following?.Position);
16 | UpdateOffScreen = true;
17 | }
18 | }
19 |
20 | public void Stop()
21 | {
22 | Handle.Stop();
23 | UpdateOffScreen = false;
24 | }
25 |
26 | public override void LateUpdate()
27 | {
28 | if (Following != null)
29 | {
30 | Handle.Position = Following.Position;
31 |
32 | if (Following is Solid solid)
33 | Handle.Set("Velocity", solid.Velocity.Length());
34 | }
35 | else if (!Destroying)
36 | {
37 | World.Destroy(this);
38 | }
39 | }
40 |
41 | public override void Destroyed()
42 | {
43 | Stop();
44 | Following = null;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Source/Actors/Spring.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Spring : Attacher, IHaveModels, IPickup
4 | {
5 | public SkinnedModel Model;
6 |
7 | public virtual float PickupRadius => 16;
8 |
9 | public float TCooldown = 0;
10 |
11 | public Spring()
12 | {
13 | Model = new SkinnedModel(Assets.Models["spring_board"]) { Transform = Matrix.CreateScale(8.0f) };
14 | Model.SetLooping("Spring", false);
15 | Model.Play("Idle");
16 |
17 | LocalBounds = new(Position + Vec3.UnitZ * 4, 16);
18 | }
19 |
20 | public override void Update()
21 | {
22 | Model.Update();
23 |
24 | if (TCooldown > 0)
25 | {
26 | TCooldown -= Time.Delta;
27 | if (TCooldown <= 0)
28 | UpdateOffScreen = false;
29 | }
30 | }
31 |
32 | public virtual void CollectModels(List<(Actor Actor, Model Model)> populate)
33 | {
34 | populate.Add((this, Model));
35 | }
36 |
37 | public virtual void Pickup(Player player)
38 | {
39 | if (TCooldown <= 0)
40 | {
41 | UpdateOffScreen = true;
42 | Audio.Play(Sfx.sfx_springboard, Position);
43 | TCooldown = 1.0f;
44 | Model.Play("Spring", true);
45 | player.Spring(this);
46 |
47 | if (AttachedTo is FallingBlock fallingBlock)
48 | fallingBlock.Trigger();
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Source/Actors/StaticProp.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class StaticProp : Actor, IHaveModels, IHavePushout, IListenToAudioCallback
4 | {
5 | public readonly SkinnedModel Model;
6 |
7 | public float PushoutHeight { get; set; } = 10;
8 | public float PushoutRadius { get; set; } = 6;
9 |
10 | public float Scale = 1.0f;
11 | public float Rotation = 0;
12 |
13 | public StaticProp(SkinnedTemplate model, float radius, float height)
14 | {
15 | Model = new(model)
16 | {
17 | Flags = ModelFlags.Terrain,
18 | Transform = Matrix.CreateScale(0.2f),
19 | };
20 | LocalBounds = new BoundingBox(new Vec3(-10, -10, 0), new Vec3(10, 10, 80));
21 | PushoutHeight = height;
22 | PushoutRadius = radius;
23 | }
24 |
25 | public override void Update()
26 | {
27 | Calc.Approach(ref Scale, 1.0f, Time.Delta);
28 | }
29 |
30 | public virtual void CollectModels(List<(Actor Actor, Model Model)> populate)
31 | {
32 | Model.Transform =
33 | Matrix.CreateRotationY(Rotation) *
34 | Matrix.CreateScale(0.2f * Scale);
35 | populate.Add((this, Model));
36 | }
37 |
38 | public virtual void AudioCallbackEvent(int index)
39 | {
40 | if (World.Entry.Submap)
41 | {
42 | Scale = 1.05f;
43 | Rotation = 0.05f * ((index % 2) == 0 ? -1 : 1);
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Source/Actors/Theo.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class Theo : NPC
4 | {
5 | public virtual string TALK_FLAG => "THEO";
6 | public Player? TalkingTo;
7 |
8 | public Theo() : base(Assets.Models["theo"])
9 | {
10 | Model.Transform = Matrix.CreateScale(3) * Matrix.CreateTranslation(0, 0, -1.5f);
11 | InteractHoverOffset = new Vec3(0, -2, 16);
12 | InteractRadius = 32;
13 | CheckForDialog();
14 | }
15 |
16 | public override void Interact(Player player)
17 | {
18 | World.Add(new Cutscene(Conversation));
19 | }
20 |
21 | public virtual CoEnumerator Conversation(Cutscene cs)
22 | {
23 | yield return Co.Run(cs.MoveToDistance(TalkingTo, Position.XY(), 16));
24 | yield return Co.Run(cs.FaceEachOther(TalkingTo, this));
25 |
26 | int index = Save.CurrentRecord.GetFlag(TALK_FLAG) + 1;
27 | yield return Co.Run(cs.Say(Loc.Lines($"Theo{index}")));
28 | Save.CurrentRecord.IncFlag(TALK_FLAG);
29 | CheckForDialog();
30 | }
31 |
32 | public virtual void CheckForDialog()
33 | {
34 | InteractEnabled = Loc.HasLines($"Theo{Save.CurrentRecord.GetFlag(TALK_FLAG) + 1}");
35 | }
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/Source/Audio/FMOD/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = unset
5 | end_of_line = unset
6 | insert_final_newline = unset
7 | trim_trailing_whitespace = unset
8 | indent_style = unset
9 | indent_size = unset
10 | generated_code = true
--------------------------------------------------------------------------------
/Source/Audio/FMOD/ReadMe.md:
--------------------------------------------------------------------------------
1 | The files here are from the [FMOD Library](https://fmod.com/) and not under the MIT license like the rest of the code in the `Source` folder.
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmod.so:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmod.so.13:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmod.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/lib64/libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmodstudio.so:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmodstudio.so.13:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/lib64/libfmodstudio.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/lib64/libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmod.so:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmod.so.13:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmod.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/libarm/libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmodstudio.so:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmodstudio.so.13:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm/libfmodstudio.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/libarm/libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmod.so:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmod.so.13:
--------------------------------------------------------------------------------
1 | libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmod.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/libarm64/libfmod.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmodstudio.so:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmodstudio.so.13:
--------------------------------------------------------------------------------
1 | libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/libarm64/libfmodstudio.so.13.18:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/libarm64/libfmodstudio.so.13.18
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/osx/libfmod.dylib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/osx/libfmod.dylib
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/osx/libfmodstudio.dylib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/osx/libfmodstudio.dylib
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/x64/fmod.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/x64/fmod.dll
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/x64/fmodstudio.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/x64/fmodstudio.dll
--------------------------------------------------------------------------------
/Source/Audio/FMOD/libs/x64/fsbank.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/Source/Audio/FMOD/libs/x64/fsbank.dll
--------------------------------------------------------------------------------
/Source/Data/LevelInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 |
3 | namespace Celeste64;
4 |
5 | ///
6 | /// Stores Meta-Info about a specific Level
7 | ///
8 | public class LevelInfo
9 | {
10 | public string ID { get; set; } = string.Empty;
11 | public string Name { get; set; } = string.Empty;
12 | public string Label { get; set; } = string.Empty;
13 | public int Strawberries { get; set; } = 0;
14 | public string Preview { get; set; } = string.Empty;
15 | public string Map { get; set; } = string.Empty;
16 | public string ModId { get; set; } = string.Empty;
17 |
18 | public void Enter(ScreenWipe? toBlack = null, float holdTime = 0)
19 | {
20 | Save.Instance.LevelID = ID;
21 | Game.Instance.Goto(new Transition()
22 | {
23 | Mode = Transition.Modes.Replace,
24 | Scene = () => new World(new(Map, Save.CurrentRecord.Checkpoint, false, World.EntryReasons.Entered)),
25 | ToBlack = toBlack ?? new SpotlightWipe(),
26 | FromBlack = new SpotlightWipe(),
27 | StopMusic = true,
28 | HoldOnBlackFor = holdTime
29 | });
30 | }
31 | }
32 |
33 | [JsonSourceGenerationOptions(WriteIndented = true, AllowTrailingCommas = true)]
34 | [JsonSerializable(typeof(List))]
35 | internal partial class LevelInfoListContext : JsonSerializerContext { }
36 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/ControlsConfigStick.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 |
3 | namespace Celeste64;
4 |
5 | public sealed class ControlsConfigStick
6 | {
7 | public float Deadzone { get; set; } = 0;
8 | public List Up { get; set; } = [];
9 | public List Down { get; set; } = [];
10 | public List Left { get; set; } = [];
11 | public List Right { get; set; } = [];
12 |
13 | public void BindTo(VirtualStick stick)
14 | {
15 | stick.CircularDeadzone = Deadzone;
16 | stick.Horizontal.OverlapBehaviour = VirtualAxis.Overlaps.TakeNewer;
17 | stick.Vertical.OverlapBehaviour = VirtualAxis.Overlaps.TakeNewer;
18 | foreach (var it in Up)
19 | it.BindTo(stick.Vertical.Negative);
20 | foreach (var it in Down)
21 | it.BindTo(stick.Vertical.Positive);
22 | foreach (var it in Left)
23 | it.BindTo(stick.Horizontal.Negative);
24 | foreach (var it in Right)
25 | it.BindTo(stick.Horizontal.Positive);
26 | }
27 | }
28 |
29 | [JsonSourceGenerationOptions(
30 | WriteIndented = true,
31 | UseStringEnumConverter = true,
32 | DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
33 | Converters = [typeof(ControlsConfigBinding_Converter)],
34 | AllowTrailingCommas = true
35 | )]
36 | [JsonSerializable(typeof(ControlsConfigStick))]
37 | internal partial class ControlsConfigStickContext : JsonSerializerContext { }
38 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/ControlsConfig_V01.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 | using System.Text.Json.Serialization.Metadata;
3 |
4 | namespace Celeste64;
5 |
6 | public class ControlsConfig_V01 : PersistedData
7 | {
8 | public override int Version => 1;
9 |
10 | public Dictionary> Actions { get; set; } = [];
11 | public Dictionary Sticks { get; set; } = [];
12 |
13 | public override JsonTypeInfo GetTypeInfo()
14 | {
15 | return ControlsConfig_V01Context.Default.ControlsConfig_V01;
16 | }
17 | }
18 |
19 | [JsonSourceGenerationOptions(
20 | WriteIndented = true,
21 | UseStringEnumConverter = true,
22 | DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
23 | AllowTrailingCommas = true,
24 | Converters = [typeof(ControlsConfigBinding_Converter)]
25 | )]
26 | [JsonSerializable(typeof(ControlsConfig_V01))]
27 | internal partial class ControlsConfig_V01Context : JsonSerializerContext { }
28 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/LevelRecord_V01.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json;
2 | using System.Text.Json.Serialization;
3 | using System.Text.Json.Serialization.Metadata;
4 |
5 | namespace Celeste64;
6 |
7 | ///
8 | /// Stored data associated with a single level
9 | ///
10 | public sealed class LevelRecord_V01 : PersistedData
11 | {
12 | public override int Version => 1;
13 |
14 | public string ID { get; set; } = string.Empty;
15 | public string Checkpoint { get; set; } = string.Empty;
16 | public HashSet Strawberries { get; set; } = [];
17 | public HashSet CompletedSubMaps { get; set; } = [];
18 | public Dictionary Flags { get; set; } = [];
19 | public int Deaths { get; set; } = 0;
20 | public TimeSpan Time { get; set; } = new();
21 |
22 | public int GetFlag(string name, int defaultValue = 0)
23 | => Flags.TryGetValue(name, out int value) ? value : defaultValue;
24 |
25 | public int SetFlag(string name, int value = 1)
26 | => Flags[name] = value;
27 |
28 | public int IncFlag(string name)
29 | => Flags[name] = GetFlag(name) + 1;
30 |
31 | public override JsonTypeInfo GetTypeInfo()
32 | {
33 | return LevelRecord_V01Context.Default.LevelRecord_V01;
34 | }
35 | }
36 |
37 | internal class LevelRecord_V01Converter : JsonConverter
38 | {
39 | public override LevelRecord_V01? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
40 | {
41 | using (var jsonDoc = JsonDocument.ParseValue(ref reader))
42 | {
43 | return new LevelRecord_V01().Deserialize(jsonDoc.RootElement.GetRawText());
44 | }
45 | }
46 |
47 | public override void Write(Utf8JsonWriter writer, LevelRecord_V01 value, JsonSerializerOptions options)
48 | {
49 | value.Serialize(writer, value);
50 | }
51 | }
52 |
53 | [JsonSourceGenerationOptions(WriteIndented = true, AllowTrailingCommas = true, UseStringEnumConverter = true)]
54 | [JsonSerializable(typeof(LevelRecord_V01))]
55 | internal partial class LevelRecord_V01Context : JsonSerializerContext { }
56 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/ModRecord_V01.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json;
2 | using System.Text.Json.Serialization;
3 | using System.Text.Json.Serialization.Metadata;
4 |
5 | namespace Celeste64;
6 |
7 | ///
8 | /// Stored data associated with a mod
9 | ///
10 | public sealed class ModRecord_V01 : PersistedData
11 | {
12 | public override int Version => 1;
13 |
14 | public string ID { get; set; } = string.Empty;
15 | public bool Enabled { get; set; } = true;
16 | public Dictionary StringData { get; set; } = [];
17 | public Dictionary IntData { get; set; } = [];
18 | public Dictionary FloatData { get; set; } = [];
19 | public Dictionary BoolData { get; set; } = [];
20 | public Dictionary SettingsStringData { get; set; } = [];
21 | public Dictionary SettingsIntData { get; set; } = [];
22 | public Dictionary SettingsFloatData { get; set; } = [];
23 | public Dictionary SettingsBoolData { get; set; } = [];
24 |
25 | public override JsonTypeInfo GetTypeInfo()
26 | {
27 | return ModRecord_V01Context.Default.ModRecord_V01;
28 | }
29 | }
30 |
31 | internal class ModRecord_V01Converter : JsonConverter
32 | {
33 | public override ModRecord_V01? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
34 | {
35 | using (var jsonDoc = JsonDocument.ParseValue(ref reader))
36 | {
37 | return new ModRecord_V01().Deserialize(jsonDoc.RootElement.GetRawText());
38 | }
39 | }
40 |
41 | public override void Write(Utf8JsonWriter writer, ModRecord_V01 value, JsonSerializerOptions options)
42 | {
43 | value.Serialize(writer, value);
44 | }
45 | }
46 |
47 | [JsonSourceGenerationOptions(WriteIndented = true, AllowTrailingCommas = true, UseStringEnumConverter = true)]
48 | [JsonSerializable(typeof(ModRecord_V01))]
49 | internal partial class ModRecord_V01Context : JsonSerializerContext { }
50 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/ModSettings_V01.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 | using System.Text.Json.Serialization.Metadata;
3 |
4 | namespace Celeste64;
5 |
6 | public sealed class ModSettings_V01 : PersistedData
7 | {
8 | public override int Version => 1;
9 |
10 | public static ModSettings_V01 Instance = new();
11 |
12 | public List ModSettingsRecords { get; set; } = [];
13 |
14 | public override JsonTypeInfo GetTypeInfo()
15 | {
16 | return ModSettings_V01Context.Default.ModSettings_V01;
17 | }
18 | }
19 |
20 | [JsonSourceGenerationOptions(
21 | WriteIndented = true,
22 | AllowTrailingCommas = true,
23 | UseStringEnumConverter = true,
24 | Converters = [typeof(ModSettingsRecord_V01Converter)]
25 | )]
26 | [JsonSerializable(typeof(ModSettings_V01))]
27 | internal partial class ModSettings_V01Context : JsonSerializerContext { }
28 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/PersistedData.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json;
2 | using System.Text.Json.Serialization.Metadata;
3 |
4 | namespace Celeste64;
5 | public abstract class PersistedData
6 | {
7 | public abstract int Version { get; }
8 |
9 | public virtual void Serialize(Stream stream, object instance)
10 | {
11 | JsonSerializer.Serialize(stream, instance, GetTypeInfo());
12 | }
13 |
14 | public virtual void Serialize(Utf8JsonWriter writer, object instance)
15 | {
16 | JsonSerializer.Serialize(writer, instance, GetTypeInfo());
17 | }
18 |
19 | public virtual T? Deserialize(string data) where T : PersistedData
20 | {
21 | try
22 | {
23 | return JsonSerializer.Deserialize(data, GetTypeInfo()) as T;
24 | }
25 | catch (Exception e)
26 | {
27 | LogHelper.Error("Failed to load persisted data", e);
28 | return null;
29 | }
30 | }
31 |
32 | public abstract JsonTypeInfo GetTypeInfo();
33 | }
34 |
--------------------------------------------------------------------------------
/Source/Data/PersistedData/VersionedPersistedData.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json;
2 |
3 | namespace Celeste64;
4 | public abstract class VersionedPersistedData : PersistedData where V : PersistedData, new()
5 | {
6 | public override T? Deserialize(string data) where T : class
7 | {
8 | try
9 | {
10 | var doc = JsonDocument.Parse(data);
11 | int version = doc.RootElement.TryGetProperty("Version", out JsonElement prop) ? (prop.TryGetInt32(out int result) ? result : 1) : 1;
12 |
13 | if (version != Version)
14 | {
15 | // TODO: possibly revisit this and see if we can find a way to not need this extra new here.
16 | // I tried to do it like that originally, but System.Text.Json doesn't seem to have a way to deserialize in place,
17 | // and it can't be static because it needs to use the overridden version and type info.
18 | return UpgradeFrom(new V().Deserialize(data)) as T;
19 | }
20 | else
21 | {
22 | return base.Deserialize(data);
23 | }
24 | }
25 | catch (Exception e)
26 | {
27 | LogHelper.Error("Failed to load versioned persisted data", e);
28 | return null;
29 | }
30 | }
31 |
32 | public abstract PersistedData? UpgradeFrom(V? data);
33 | }
34 |
--------------------------------------------------------------------------------
/Source/Graphics/Model.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public abstract class Model
4 | {
5 | public Matrix Transform = Matrix.Identity;
6 | public ModelFlags Flags;
7 | public readonly List Materials = [];
8 | public bool HasUniqueMaterials { get; private set; } = false;
9 |
10 | ///
11 | /// Makes our Materials unique, if they're not already
12 | ///
13 | public void MakeMaterialsUnique()
14 | {
15 | if (!HasUniqueMaterials)
16 | {
17 | HasUniqueMaterials = true;
18 | for (int i = 0; i < Materials.Count; i++)
19 | Materials[i] = Materials[i].Clone();
20 | }
21 | }
22 |
23 | public virtual void Prepare() { }
24 | public abstract void Render(ref RenderState state);
25 | }
26 |
--------------------------------------------------------------------------------
/Source/Graphics/ModelFlags.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | [Flags]
4 | public enum ModelFlags
5 | {
6 | None = 0,
7 | Default = 1 << 0,
8 | Terrain = 1 << 1,
9 | Silhouette = 1 << 2,
10 | Transparent = 1 << 3,
11 | Cutout = 1 << 4,
12 | StrawberryGetEffect = 1 << 5,
13 | }
14 |
--------------------------------------------------------------------------------
/Source/Graphics/RenderState.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public struct RenderState
4 | {
5 | public Camera Camera;
6 | public Matrix ModelMatrix;
7 | public bool Silhouette;
8 | public Vec3 SunDirection;
9 | public Color VerticalFogColor;
10 | public DepthCompare DepthCompare;
11 | public bool DepthMask;
12 | public bool CutoutMode;
13 | public int Calls;
14 | public int Triangles;
15 |
16 | public void ApplyToMaterial(DefaultMaterial mat, in Matrix localTransformation)
17 | {
18 | if (mat.Shader == null)
19 | return;
20 |
21 | mat.Model = localTransformation * ModelMatrix;
22 | mat.MVP = mat.Model * Camera.ViewProjection;
23 | mat.NearPlane = Camera.NearPlane;
24 | mat.FarPlane = Camera.FarPlane;
25 | mat.Silhouette = Silhouette;
26 | mat.Time = (float)Time.Duration.TotalSeconds;
27 | mat.SunDirection = SunDirection;
28 | mat.VerticalFogColor = VerticalFogColor;
29 | mat.Cutout = CutoutMode;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Source/Graphics/Vertex.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace Celeste64;
5 |
6 | [StructLayout(LayoutKind.Sequential, Pack = 1)]
7 | public readonly struct SpriteVertex(Vec3 position, Vec2 texcoord, Color color) : IVertex
8 | {
9 | public readonly Vec3 Pos = position;
10 | public readonly Vec2 Tex = texcoord;
11 | public readonly Color Color = color;
12 | public readonly VertexFormat Format => VertexFormat;
13 |
14 | private static readonly VertexFormat VertexFormat = VertexFormat.Create(
15 | [
16 | new(0, VertexType.Float3, normalized: false),
17 | new(1, VertexType.Float2, normalized: false),
18 | new(2, VertexType.UByte4, normalized: true)
19 | ]);
20 | }
21 |
22 | [StructLayout(LayoutKind.Sequential, Pack = 1)]
23 | public readonly struct Vertex(Vec3 position, Vec2 texcoord, Vec3 color, Vec3 normal, Vec4 joint, Vec4 weight) : IVertex
24 | {
25 | public readonly Vec3 Pos = position;
26 | public readonly Vec2 Tex = texcoord;
27 | public readonly Vec3 Col = color;
28 | public readonly Vec3 Normal = normal;
29 | public readonly Vec4 Joint = joint;
30 | public readonly Vec4 Weight = weight;
31 | public readonly VertexFormat Format => VertexFormat;
32 |
33 | public Vertex(Vec3 position, Vec2 texcoord, Vec3 color, Vec3 normal)
34 | : this(position, texcoord, color, normal, Vec4.Zero, Vec4.One) { }
35 |
36 | [MethodImpl(MethodImplOptions.AggressiveInlining)]
37 | public Vertex Transform(in Matrix mat)
38 | {
39 | return new Vertex(
40 | Vec3.Transform(Pos, mat),
41 | Tex,
42 | Col,
43 | Vec3.TransformNormal(Normal, mat),
44 | Joint,
45 | Weight
46 | );
47 | }
48 |
49 | private static readonly VertexFormat VertexFormat = VertexFormat.Create(
50 | [
51 | new(0, VertexType.Float3, normalized: false),
52 | new(1, VertexType.Float2, normalized: false),
53 | new(2, VertexType.Float3, normalized: true),
54 | new(3, VertexType.Float3, normalized: false),
55 | new(4, VertexType.Float4, normalized: false),
56 | new(5, VertexType.Float4, normalized: false),
57 | ]);
58 | }
59 |
--------------------------------------------------------------------------------
/Source/Helpers/Globals.cs:
--------------------------------------------------------------------------------
1 | global using Foster.Framework;
2 | global using System.Numerics;
3 | global using Matrix = System.Numerics.Matrix4x4;
4 | global using Vec2 = System.Numerics.Vector2;
5 | global using Vec3 = System.Numerics.Vector3;
6 | global using Vec4 = System.Numerics.Vector4;
7 |
--------------------------------------------------------------------------------
/Source/Helpers/RayHit.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public struct RayHit
4 | {
5 | public Vec3 Point;
6 | public Vec3 Normal;
7 | public float Distance;
8 | public Actor? Actor;
9 | public int Intersections;
10 | }
11 |
12 | public struct WallHit
13 | {
14 | public Vec3 Pushout;
15 | public Vec3 Normal;
16 | public Vec3 Point;
17 | public Actor? Actor;
18 | }
19 |
--------------------------------------------------------------------------------
/Source/License.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Maddy Makes Games, Inc.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/Source/Mod/Core/DummyGameMod.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | ///
4 | /// A dummy GameMod, used for mods which do not ship their own DLL file.
5 | ///
6 | internal sealed class DummyGameMod : GameMod;
7 |
--------------------------------------------------------------------------------
/Source/Mod/Core/VanillaGameMod.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | ///
4 | /// A dummy GameMod, used for registering vanilla assets
5 | ///
6 | internal sealed class VanillaGameMod : GameMod;
7 |
--------------------------------------------------------------------------------
/Source/Mod/Helpers/CustomPlayerState.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | ///
4 | /// Defines a custom player state. Treated as a singleton.
5 | ///
6 | public abstract class CustomPlayerState
7 | {
8 | ///
9 | /// Whether this state can control hair color.
10 | /// If this returns false, regular colors will be used based on dash count.
11 | ///
12 | public virtual bool ControlHairColor => false;
13 |
14 | ///
15 | /// Whether the player can pick up s.
16 | /// Defaults to true.
17 | ///
18 | public virtual bool IsAbleToPickup => true;
19 |
20 | ///
21 | /// Whether its possible to pause the game in this state.
22 | /// Defaults to true.
23 | ///
24 | public virtual bool IsAbleToPause => true;
25 |
26 | ///
27 | /// Called each frame when the player is in this state.
28 | ///
29 | public abstract void Update(Player player);
30 |
31 | ///
32 | /// Called the frame the player enters this state.
33 | ///
34 | public abstract void OnBegin(Player player);
35 |
36 | ///
37 | /// Called the frame the player leaves this state
38 | ///
39 | ///
40 | public abstract void OnEnd(Player player);
41 |
42 | ///
43 | /// A routine that begins when the player enters this state.
44 | ///
45 | public abstract CoEnumerator Routine(Player player);
46 | }
47 |
--------------------------------------------------------------------------------
/Source/Mod/Helpers/StreamExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public static class StreamExtensions
4 | {
5 | ///
6 | /// Reads all bytes of the given stream into a byte array.
7 | ///
8 | public static byte[] ReadAllToByteArray(this Stream stream)
9 | {
10 | // Just in case a memory stream gets passed in, no need to make another copy.
11 | if (stream is MemoryStream streamAsMemStream)
12 | {
13 | return streamAsMemStream.ToArray();
14 | }
15 |
16 | using var memStream = new MemoryStream();
17 | stream.CopyTo(memStream);
18 | memStream.Seek(0, SeekOrigin.Begin);
19 |
20 | return memStream.ToArray();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Source/Mod/Helpers/StringExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | public static class StringExtensions
4 | {
5 | ///
6 | /// Replaces backslashes with slashes in the given string
7 | ///
8 | public static string Unbackslash(this string from)
9 | => from.Replace('\\', '/');
10 |
11 | ///
12 | /// Corrects the slashes in the given path to be correct for the given OS.
13 | ///
14 | public static string CorrectSlashes(this string path)
15 | => path switch
16 | {
17 | null => "",
18 | _ => path.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar),
19 | };
20 |
21 | ///
22 | /// Calls on this string
23 | ///
24 | public static string? Directory(this string? path)
25 | {
26 | return Path.GetDirectoryName(path);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Source/Mod/Hook/DisallowHooksAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | ///
4 | /// Prevents hook-gen to automatically generate hooks for the specific type / method.
5 | /// This should used on almost every method inside the 'Celeste64' namespace for methods added by Fuji.
6 | ///
7 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
8 | internal class DisallowHooksAttribute : Attribute;
9 |
--------------------------------------------------------------------------------
/Source/Mod/Hook/InternalHookGenTargetAttribute.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 |
3 | namespace Celeste64.Mod;
4 |
5 | // Used within Celeste64.HookGen to store the target method.
6 | // Should not be used by anything else.
7 |
8 | [AttributeUsage(AttributeTargets.Method)]
9 | public class InternalOnHookGenTargetAttribute : Attribute
10 | {
11 | internal MethodBase Target = null!;
12 | }
13 |
14 | [AttributeUsage(AttributeTargets.Method)]
15 | public class InternalILHookGenTargetAttribute : Attribute
16 | {
17 | internal MethodBase Target = null!;
18 | }
19 |
--------------------------------------------------------------------------------
/Source/Mod/ImGui/ImGuiHandler.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | ///
4 | /// Base class for everything which want to draw something using Dear ImGui.
5 | /// Instances need to be added to / removed from to register them.
6 | ///
7 | public abstract class ImGuiHandler
8 | {
9 | ///
10 | /// Whether this handler will be updated.
11 | ///
12 | public virtual bool Active { get; set; } = true;
13 |
14 | ///
15 | /// Whether this handler will be drawn.
16 | ///
17 | public virtual bool Visible { get; set; } = true;
18 |
19 | ///
20 | /// Called once per frame and should be used to update state.
21 | ///
22 | public virtual void Update() { }
23 |
24 | ///
25 | /// Called an undefined amount per frame and should only be used to draw the current state.
26 | /// This should not update any state.
27 | ///
28 | public virtual void Render() { }
29 | }
30 |
--------------------------------------------------------------------------------
/Source/Mod/ImGui/ImGuiManager.cs:
--------------------------------------------------------------------------------
1 | using ImGuiNET;
2 |
3 | namespace Celeste64.Mod;
4 |
5 | public class ImGuiManager
6 | {
7 | ///
8 | /// Whether the keyboard input was consumed by Dear ImGui.
9 | ///
10 | public static bool WantCaptureKeyboard { get; private set; }
11 |
12 | ///
13 | /// Whether the mouse input was consumed by Dear ImGui.
14 | ///
15 | public static bool WantCaptureMouse { get; private set; }
16 |
17 | private readonly ImGuiRenderer renderer;
18 | private static FujiDebugMenu debugMenu = new FujiDebugMenu();
19 | private static IEnumerable Handlers => ModManager.Instance.EnabledMods.SelectMany(mod => mod.ImGuiHandlers);
20 |
21 | internal ImGuiManager()
22 | {
23 | renderer = new ImGuiRenderer();
24 | renderer.RebuildFontAtlas();
25 | }
26 |
27 | internal void UpdateHandlers()
28 | {
29 | renderer.Update();
30 |
31 | if (debugMenu.Active)
32 | debugMenu.Update();
33 |
34 | foreach (var handler in Handlers)
35 | {
36 | if (handler.Active) handler.Update();
37 | }
38 | }
39 |
40 | internal void RenderHandlers()
41 | {
42 | renderer.BeforeRender();
43 | if (debugMenu.Visible)
44 | debugMenu.Render();
45 |
46 | foreach (var handler in Handlers)
47 | {
48 | if (handler.Visible) handler.Render();
49 | }
50 | renderer.AfterRender();
51 |
52 | var io = ImGui.GetIO();
53 | WantCaptureKeyboard = io.WantCaptureKeyboard;
54 | WantCaptureMouse = io.WantCaptureMouse;
55 | }
56 |
57 | internal void RenderTexture(Batcher batch)
58 | {
59 | if (renderer.target == null) return;
60 | batch.Image(renderer.target, Vec2.Zero, Color.White);
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Source/Mod/Menu/ModOptionsMenu.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | public class ModOptionsMenu : Menu
4 | {
5 | internal GameMod? Mod;
6 |
7 | internal ModOptionsMenu(Menu? rootMenu)
8 | {
9 | RootMenu = rootMenu;
10 | }
11 |
12 | public override void Closed()
13 | {
14 | base.Closed();
15 | if (Mod != null)
16 | {
17 | Mod.SaveSettings();
18 | Save.SaveToFile();
19 | }
20 | }
21 |
22 | //Items list always includes the Back item, so check if it's more than 1 to know if we should display it.
23 | internal bool ShouldDisplay => items.Count > 1;
24 |
25 | internal void SetMod(GameMod mod)
26 | {
27 | Mod = mod;
28 | items.Clear();
29 | Title = mod.ModInfo.Name + "\nOptions";
30 |
31 | mod.AddModSettings(this);
32 |
33 | if (RootMenu != null)
34 | {
35 | Add(new Option("Back", () =>
36 | {
37 | PopRootSubMenu();
38 | }));
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Source/Mod/Patches/Patches.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod.Patches;
2 |
3 | internal static class Patches
4 | {
5 | public static void Load()
6 | {
7 | Keyboard.Load();
8 | Hooks.Load();
9 | SledgeHooks.Load();
10 |
11 | // Needs to be done last, to prevent our patches from being rejected
12 | Hooks.AfterLoad();
13 | }
14 |
15 | public static void Unload()
16 | {
17 | Keyboard.Unload();
18 | Hooks.Unload();
19 | SledgeHooks.Unload();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Source/Mod/Patches/SledgeHooks.cs:
--------------------------------------------------------------------------------
1 | using MonoMod.RuntimeDetour;
2 | using System.Reflection;
3 |
4 | namespace Celeste64.Mod.Patches;
5 |
6 | ///
7 | /// Hook into sledge to change how map data is loaded.
8 | ///
9 | internal static class SledgeHooks
10 | {
11 | private static Hook? solidComputeVerticesHook;
12 |
13 | public static void Load()
14 | {
15 | solidComputeVerticesHook = new Hook(typeof(Sledge.Formats.Map.Objects.Solid).GetMethod(nameof(Sledge.Formats.Map.Objects.Solid.ComputeVertices), BindingFlags.Public | BindingFlags.Instance) ?? throw new InvalidOperationException(), On_Solid_ComputeVertices);
16 | }
17 |
18 | public static void Unload()
19 | {
20 | solidComputeVerticesHook?.Dispose();
21 | }
22 |
23 | public delegate void orig_Solid_ComputeVertices(Sledge.Formats.Map.Objects.Solid self);
24 | public static void On_Solid_ComputeVertices(orig_Solid_ComputeVertices orig, Sledge.Formats.Map.Objects.Solid self)
25 | {
26 | const float planeMatchEpsilon = 0.0075f; // Magic number that seems to match VHE
27 |
28 | if (self.Faces.Count < 4) return;
29 |
30 | var poly = new Sledge.Formats.Geometric.Precision.Polyhedrond(self.Faces.Select(x => x.Plane));
31 |
32 | foreach (var face in self.Faces)
33 | {
34 | face.Vertices.Clear();
35 | //In Sledge's original implementation, they only compared the planes normal. This caused issues if two planes had similar normal.
36 | //We are changing it to compare the distance as well for more accuracy.
37 | var pg = poly.Polygons.FirstOrDefault(x => x.Plane.Normal.EquivalentTo(face.Plane.Normal, planeMatchEpsilon)
38 | && Math.Abs(x.Plane.D - face.Plane.D) < 0.001f);
39 | if (pg != null)
40 | {
41 | face.Vertices.AddRange(pg.Vertices.Select(x => x.ToVector3()));
42 | }
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Source/Mod/StatusEffects/StatusEffect.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64.Mod;
2 |
3 | public abstract class StatusEffect
4 | {
5 | public virtual Player? Player { get; set; }
6 | public virtual World? World { get; set; }
7 | public virtual bool RemoveOnReapply => true;
8 |
9 | public virtual float Duration { get; set; } = 10;
10 | public bool RemoveAfterDuration = false;
11 |
12 | public StatusEffect() { }
13 |
14 | public virtual void OnStatusEffectAdded() { }
15 | public virtual void OnStatusEffectRemoved() { }
16 |
17 | public virtual void Update(float deltaTime) { }
18 |
19 | public virtual void OnPlayerKilled() { }
20 |
21 | public void UpdateDuration(float deltaTime)
22 | {
23 | if (RemoveAfterDuration)
24 | {
25 | Duration -= deltaTime;
26 | if (Duration <= 0 && Player != null)
27 | {
28 | Player.RemoveStatusEffect(this);
29 | }
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Source/Program.cs:
--------------------------------------------------------------------------------
1 | using System.Text.RegularExpressions;
2 |
3 | namespace Celeste64;
4 |
5 | class Program
6 | {
7 | // Moved to Celeste64.Launcher project
8 | }
9 |
10 | public class CommandParser
11 | {
12 | /*
13 | Simple (perhaps to a fault) command arg matcher
14 | Each match represents an arg
15 | Group #2 is the arg name
16 | Group #4 is the arg value (if it exists)
17 | */
18 | public readonly string Pattern = """-{1,2}([a-z0-9-]+)(="?([^"-]+)"?)?\b""";
19 | public readonly Regex Exp;
20 | public readonly List Flags = [];
21 | public readonly Dictionary Args = new();
22 |
23 |
24 | public CommandParser(string[] args)
25 | {
26 | Exp = new(Pattern);
27 |
28 | string argsStr = String.Join(" ", args);
29 |
30 | foreach (Match match in Exp.Matches(argsStr))
31 | {
32 | if (match.Groups[2].Value == string.Empty)
33 | {
34 | Flags.Add(match.Groups[1].Value);
35 | }
36 | else
37 | {
38 | Args.Add(match.Groups[1].Value, match.Groups[3].Value);
39 | }
40 | }
41 | }
42 |
43 | ///
44 | /// Check if the command line args contain the specified arg name
45 | ///
46 | /// The name to search for
47 | /// Whether the element exists
48 | public bool Has(string name)
49 | {
50 | if (Flags.Contains(name)) return true;
51 | if (Args.ContainsKey(name)) return true;
52 |
53 | return false;
54 | }
55 |
56 | ///
57 | /// Get the value of a command line arg
58 | /// Args with values take priority over flags without values (flags).
59 | ///
60 | /// The arg name to search for
61 | ///
62 | /// An empty string if a flag was found with the name
63 | /// The value of the arg if one was found
64 | /// Null if neither a flag nor a value could be found
65 | ///
66 | public string? Get(string name)
67 | {
68 | if (Args.ContainsKey(name)) return Args[name];
69 | if (Flags.Contains(name)) return String.Empty;
70 |
71 | return null;
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Source/Scenes/GameErrorMessage.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class GameErrorMessage : Scene
4 | {
5 | private Menu menu = new();
6 |
7 | public GameErrorMessage(Exception e)
8 | {
9 | Audio.StopSounds();
10 |
11 | menu.Title = "Uh-oh! You've caught a super rare error!\nCheck your log file for more details.\nIf this error was caused by a mod, you might want to report the issue to the mod author.";
12 |
13 | menu.Add(new Menu.Option("FujiOpenLogFile", () =>
14 | {
15 | LogHelper.OpenLog();
16 | }));
17 |
18 | menu.Add(new Menu.Option("QuitToMainMenu", () =>
19 | {
20 | Assets.Load();
21 |
22 | Overworld ovw = new(false);
23 | Game.Instance.UnsafelySetScene(ovw);
24 | }));
25 |
26 | menu.Add(new Menu.Option("Exit", () => throw e)); // This exits the game and forwards the error to the fatal crash handler.
27 | }
28 |
29 | public override void Update()
30 | {
31 | menu.Update();
32 | }
33 |
34 | public override void Render(Target target)
35 | {
36 | target.Clear(Color.Black);
37 |
38 | Batcher batcher = new();
39 | Rect bounds = new(0, 0, target.Width, target.Height);
40 |
41 | menu.Render(batcher, bounds.Center);
42 |
43 | batcher.Render(target);
44 | batcher.Clear();
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Source/Scenes/Scene.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public abstract class Scene
4 | {
5 | public string Music = string.Empty;
6 | public string Ambience = string.Empty;
7 |
8 | public string MusicWav = string.Empty;
9 | public string AmbienceWav = string.Empty;
10 |
11 | public virtual void Entered() { }
12 | public virtual void Exited() { }
13 | public virtual void Disposed() { }
14 | public abstract void Update();
15 | public abstract void Render(Target target);
16 | }
17 |
--------------------------------------------------------------------------------
/Source/Screenwipes/ScreenWipe.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public abstract class ScreenWipe(float duration)
4 | {
5 | public bool IsFromBlack;
6 | public bool IsFinished { get; private set; } = false;
7 | public float Percent => percent;
8 |
9 | private float percent = 0;
10 |
11 | public void Restart(bool isFromBlack)
12 | {
13 | percent = 0;
14 | IsFromBlack = isFromBlack;
15 | IsFinished = false;
16 | Start();
17 | }
18 |
19 | public void Update()
20 | {
21 | if (percent < 1)
22 | {
23 | percent = Calc.Approach(percent, 1.0f, Time.Delta / duration);
24 | Step(percent);
25 | if (percent >= 1.0f)
26 | IsFinished = true;
27 | }
28 | }
29 |
30 | public abstract void Start();
31 | public abstract void Step(float percent);
32 | public abstract void Render(Batcher batch, Rect bounds);
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/Source/Screenwipes/SlideWipe.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public class SlideWipe() : ScreenWipe(Duration)
4 | {
5 | private const int Rows = 12;
6 | private const float AngleSize = 64;
7 | private const float Duration = 0.20f;
8 |
9 | public override void Start() { }
10 |
11 | public override void Step(float percent) { }
12 |
13 | public override void Render(Batcher batch, Rect bounds)
14 | {
15 | if ((Percent <= 0 && IsFromBlack) || (Percent >= 1 && !IsFromBlack))
16 | {
17 | batch.Rect(bounds, Color.Black);
18 | return;
19 | }
20 |
21 | var shift = 64;
22 | var rect = bounds.Inflate(shift, 0);
23 |
24 | if (IsFromBlack)
25 | rect.X = Calc.Lerp(-shift, bounds.Right, Percent);
26 | else
27 | rect.X = Calc.Lerp(-bounds.Width, -shift, Percent);
28 |
29 | batch.Quad(
30 | rect.TopLeft + new Vec2(shift, 0),
31 | rect.TopRight,
32 | rect.BottomRight + new Vec2(-shift, 0),
33 | rect.BottomLeft,
34 | Color.Black);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Source/Spatial/PlaneIntersectionType.cs:
--------------------------------------------------------------------------------
1 | namespace Celeste64;
2 |
3 | public enum PlaneIntersectionType
4 | {
5 | Front,
6 | Back,
7 | Intersecting
8 | }
9 |
--------------------------------------------------------------------------------
/fuji.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/fuji.ico
--------------------------------------------------------------------------------
/fuji.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujiAPI/Fuji/c5f3d41b9696f91a2586e705b965e75df4a61b19/fuji.png
--------------------------------------------------------------------------------