├── .gitignore ├── AnimatedSprite.cs ├── AssemblyInfo.cs ├── CharacterProperties.cs ├── Characters ├── Alphys.cs ├── Asgore.cs ├── Axis.cs ├── Ceroba.cs ├── Character.cs ├── CharacterCreationContext.cs ├── CharacterType.cs ├── Chujin.cs ├── Clover.cs ├── CloverVengeance.cs ├── Dalv.cs ├── ExternalCharacter.cs ├── ExternalCharacterDefinition.cs ├── ExternalCharacterFactory.cs ├── Flowey.cs ├── Frisk.cs ├── Kanako.cs ├── Lancer.cs ├── Martlet.cs ├── Moray.cs ├── Queen.cs ├── Soul.cs ├── Spamton.cs ├── StandardCharacter.cs ├── Starlo.cs └── Undyne.cs ├── Content ├── Content.mgcb ├── Custom │ └── PUT YOUR CUSTOM CHARACTERS HERE └── Included │ ├── Ace │ ├── Spr_Ace_Walk_Down.png │ ├── Spr_Ace_Walk_Left.png │ └── Spr_Ace_Walk_Up.png │ ├── Alphys │ ├── Spr_Alphys_Walk_Down.png │ ├── Spr_Alphys_Walk_Left.png │ └── Spr_Alphys_Walk_Up.png │ ├── Asgore │ ├── Spr_Asgore_Walk_Down.png │ ├── Spr_Asgore_Walk_Left.png │ └── Spr_Asgore_Walk_Up.png │ ├── Asriel │ ├── Spr_Asriel_Walk_Down.png │ ├── Spr_Asriel_Walk_Left.png │ └── Spr_Asriel_Walk_Up.png │ ├── Axis │ ├── Spr_Axis_Idle_Down.png │ ├── Spr_Axis_Idle_Left.png │ └── Spr_Axis_Idle_Up.png │ ├── Berdly │ ├── Spr_Berdly_Walk_Down.png │ ├── Spr_Berdly_Walk_Left.png │ ├── Spr_Berdly_Walk_Right.png │ └── Spr_Berdly_Walk_Up.png │ ├── BerdlyDW │ ├── Spr_BerdlyDW_Walk_Down.png │ ├── Spr_BerdlyDW_Walk_Left.png │ ├── Spr_BerdlyDW_Walk_Right.png │ └── Spr_BerdlyDW_Walk_Up.png │ ├── Ceroba │ ├── Spr_Ceroba_Idle_Down.png │ ├── Spr_Ceroba_Idle_Left.png │ ├── Spr_Ceroba_Idle_Up.png │ ├── Spr_Ceroba_Run_Down.png │ ├── Spr_Ceroba_Run_Left.png │ ├── Spr_Ceroba_Run_Up.png │ ├── Spr_Ceroba_Walk_Down.png │ ├── Spr_Ceroba_Walk_Left.png │ └── Spr_Ceroba_Walk_Up.png │ ├── Chara │ ├── Spr_Chara_Walk_Down.png │ ├── Spr_Chara_Walk_Left.png │ └── Spr_Chara_Walk_Up.png │ ├── Chujin │ ├── Spr_Chujin_Idle_Down.png │ ├── Spr_Chujin_Idle_Left.png │ ├── Spr_Chujin_Idle_Right.png │ ├── Spr_Chujin_Idle_Up.png │ ├── Spr_Chujin_Walk_Down.png │ ├── Spr_Chujin_Walk_Left.png │ ├── Spr_Chujin_Walk_Right.png │ └── Spr_Chujin_Walk_Up.png │ ├── Clover │ ├── Spr_Clover_Dance.png │ ├── Spr_Clover_Idle_Down.png │ ├── Spr_Clover_Idle_Left.png │ ├── Spr_Clover_Idle_Up.png │ ├── Spr_Clover_Run_Down.png │ ├── Spr_Clover_Run_Left.png │ ├── Spr_Clover_Run_Up.png │ ├── Spr_Clover_Walk_Down.png │ ├── Spr_Clover_Walk_Left.png │ └── Spr_Clover_Walk_Up.png │ ├── CloverVengeance │ ├── Spr_CloverVengeance_Run_Down.png │ ├── Spr_CloverVengeance_Run_Left.png │ ├── Spr_CloverVengeance_Run_Up.png │ ├── Spr_CloverVengeance_Walk_Down.png │ ├── Spr_CloverVengeance_Walk_Left.png │ └── Spr_CloverVengeance_Walk_Up.png │ ├── Dalv │ ├── Spr_Dalv_Idle_Down.png │ ├── Spr_Dalv_Idle_Left.png │ ├── Spr_Dalv_Idle_Up.png │ ├── Spr_Dalv_Walk_Down.png │ ├── Spr_Dalv_Walk_Left.png │ └── Spr_Dalv_Walk_Up.png │ ├── Distractions │ ├── Spr_Distraction_BeamTip.png │ ├── Spr_Distraction_Bone_Long.png │ ├── Spr_Distraction_Bone_Medium.png │ ├── Spr_Distraction_Bone_Short.png │ ├── Spr_Distraction_Bone_VeryShort.png │ ├── Spr_Distraction_GasterBlaster.png │ └── Spr_Distraction_WhitePixel.png │ ├── Ed │ ├── Spr_Ed_Walk_Down.png │ ├── Spr_Ed_Walk_Left.png │ └── Spr_Ed_Walk_Up.png │ ├── Flowey │ ├── Spr_FloweyNewCut_Idle_Down.png │ ├── Spr_FloweyNewCut_Idle_Left.png │ ├── Spr_FloweyNewCut_Idle_Up.png │ ├── Spr_Flowey_Appear.png │ ├── Spr_Flowey_Disappear.png │ ├── Spr_Flowey_Idle_Down.png │ ├── Spr_Flowey_Idle_Left.png │ └── Spr_Flowey_Idle_Up.png │ ├── Frisk │ ├── Spr_Frisk_Walk_Down.png │ ├── Spr_Frisk_Walk_Left.png │ └── Spr_Frisk_Walk_Up.png │ ├── Froggit │ ├── Spr_Froggit_Walk_Down.png │ ├── Spr_Froggit_Walk_Left.png │ └── Spr_Froggit_Walk_Up.png │ ├── Kanako │ ├── Spr_Kanako_Idle_Down.png │ ├── Spr_Kanako_Idle_Left.png │ ├── Spr_Kanako_Idle_Up.png │ ├── Spr_Kanako_Walk_Down.png │ ├── Spr_Kanako_Walk_Left.png │ └── Spr_Kanako_Walk_Up.png │ ├── Kris │ ├── Spr_Kris_Walk_Down.png │ ├── Spr_Kris_Walk_Left.png │ └── Spr_Kris_Walk_Up.png │ ├── KrisDW │ ├── Spr_KrisDW_Walk_Down.png │ ├── Spr_KrisDW_Walk_Left.png │ ├── Spr_KrisDW_Walk_Right.png │ └── Spr_KrisDW_Walk_Up.png │ ├── Lancer │ ├── Spr_Lancer_Idle_Down.png │ ├── Spr_Lancer_Idle_Left.png │ └── Spr_Lancer_Idle_Up.png │ ├── Martlet │ ├── Spr_Martlet_Idle_Down.png │ ├── Spr_Martlet_Idle_Left.png │ ├── Spr_Martlet_Idle_Up.png │ ├── Spr_Martlet_Run_Down.png │ ├── Spr_Martlet_Run_Left.png │ ├── Spr_Martlet_Run_Up.png │ ├── Spr_Martlet_Walk_Down.png │ ├── Spr_Martlet_Walk_Left.png │ └── Spr_Martlet_Walk_Up.png │ ├── Mo │ ├── Spr_Mo_Idle_Down.png │ ├── Spr_Mo_Idle_Left.png │ ├── Spr_Mo_Idle_Up.png │ ├── Spr_Mo_Walk_Down.png │ ├── Spr_Mo_Walk_Left.png │ └── Spr_Mo_Walk_Up.png │ ├── Mooch │ ├── Spr_Mooch_Walk_Down.png │ ├── Spr_Mooch_Walk_Left.png │ ├── Spr_Mooch_Walk_Right.png │ └── Spr_Mooch_Walk_Up.png │ ├── Moray │ ├── Spr_Moray_Idle_Down.png │ ├── Spr_Moray_Idle_Left.png │ ├── Spr_Moray_Idle_Right.png │ ├── Spr_Moray_Idle_Up.png │ ├── Spr_Moray_Walk_Down.png │ ├── Spr_Moray_Walk_Left.png │ ├── Spr_Moray_Walk_Right.png │ └── Spr_Moray_Walk_Up.png │ ├── Napstablook │ ├── Spr_Napstablook_Walk_Down.png │ ├── Spr_Napstablook_Walk_Left.png │ └── Spr_Napstablook_Walk_Up.png │ ├── Noelle │ ├── Spr_Noelle_Walk_Down.png │ ├── Spr_Noelle_Walk_Left.png │ └── Spr_Noelle_Walk_Up.png │ ├── NoelleDW │ ├── Spr_NoelleDW_Walk_Down.png │ ├── Spr_NoelleDW_Walk_Left.png │ └── Spr_NoelleDW_Walk_Up.png │ ├── Papyrus │ ├── Spr_Papyrus_Walk_Down.png │ ├── Spr_Papyrus_Walk_Left.png │ ├── Spr_Papyrus_Walk_Right.png │ └── Spr_Papyrus_Walk_Up.png │ ├── Queen │ ├── Spr_Queen_Run_Left.png │ ├── Spr_Queen_Walk_Down.png │ ├── Spr_Queen_Walk_Left.png │ └── Spr_Queen_Walk_Up.png │ ├── Ralsei │ ├── Spr_Ralsei_Walk_Down.png │ ├── Spr_Ralsei_Walk_Left.png │ └── Spr_Ralsei_Walk_Up.png │ ├── RalseiHat │ ├── Spr_RalseiHat_Walk_Down.png │ ├── Spr_RalseiHat_Walk_Left.png │ └── Spr_RalseiHat_Walk_Up.png │ ├── Sans │ ├── Spr_Sans_Walk_Down.png │ ├── Spr_Sans_Walk_Left.png │ └── Spr_Sans_Walk_Up.png │ ├── Soul │ └── Spr_Soul.png │ ├── Spamton │ ├── Spr_Spamton_Left.png │ └── Spr_Spamton_Up.png │ ├── Starlo │ ├── Spr_Starlo_Idle_Down.png │ ├── Spr_Starlo_Idle_Left.png │ ├── Spr_Starlo_Idle_Right.png │ ├── Spr_Starlo_Idle_Up.png │ ├── Spr_Starlo_Run_Down.png │ ├── Spr_Starlo_Run_Left.png │ ├── Spr_Starlo_Run_Right.png │ ├── Spr_Starlo_Run_Up.png │ ├── Spr_Starlo_Walk_Down.png │ ├── Spr_Starlo_Walk_Left.png │ ├── Spr_Starlo_Walk_Right.png │ └── Spr_Starlo_Walk_Up.png │ ├── Susie │ ├── Spr_Susie_Walk_Down.png │ ├── Spr_Susie_Walk_Left.png │ └── Spr_Susie_Walk_Up.png │ ├── SusieDW │ ├── Spr_SusieDW_Walk_Down.png │ ├── Spr_SusieDW_Walk_Left.png │ └── Spr_SusieDW_Walk_Up.png │ ├── Toriel │ ├── Spr_Toriel_Walk_Down.png │ ├── Spr_Toriel_Walk_Left.png │ └── Spr_Toriel_Walk_Up.png │ ├── Undyne │ ├── Spr_Undyne_Walk_Down.png │ ├── Spr_Undyne_Walk_Left.png │ └── Spr_Undyne_Walk_Up.png │ └── UndyneArmored │ ├── Spr_UndyneArmored_Walk_Down.png │ ├── Spr_UndyneArmored_Walk_Left.png │ ├── Spr_UndyneArmored_Walk_Right.png │ └── Spr_UndyneArmored_Walk_Up.png ├── ContextMenu.cs ├── CreatePartyForm.cs ├── Desktoptale.cs ├── Desktoptale.csproj ├── Desktoptale.sln ├── DistractionManager.cs ├── Distractions ├── BoneDistraction.cs ├── GasterBlasterDistraction.cs ├── IDistraction.cs ├── IDistractionPattern.cs ├── LeftRightOppositeBonesPattern.cs ├── MovingBoneDistraction.cs ├── RandomGasterBlasterPattern.cs ├── ScreenEdgeBonesPattern.cs ├── SideGasterBlasterPattern.cs └── UpDownOppositeBonesPattern.cs ├── DuplicateOptionsForm.cs ├── FileEnumerator.cs ├── GlobalSettings.cs ├── GlobalSettingsManager.cs ├── IAnimatedSprite.cs ├── ICharacter.cs ├── IDistractionManager.cs ├── IPhysicsObject.cs ├── IState.cs ├── InputManager.cs ├── InteractionManager.cs ├── LICENSE ├── MathUtilities.cs ├── Messages ├── AddCharacterMessage.cs ├── AddCharacterRequestedMessage.cs ├── ChangeContainingWindowMessage.cs ├── CharacterChangeRequestedMessage.cs ├── CharacterChangeSuccessMessage.cs ├── ClickThroughChangeRequestedMessage.cs ├── ClickThroughChangedMessage.cs ├── ContextMenuStateChangedMessage.cs ├── DisplaySettingsChangedMessage.cs ├── FocusCharacterMessage.cs ├── GlobalPauseMessage.cs ├── IdleRoamingChangedMessage.cs ├── InteractionButtonChangedMessage.cs ├── JoinPartyMessage.cs ├── LeavePartyMessage.cs ├── OpenContextMenuRequestedMessage.cs ├── OtherInstanceStartedMessage.cs ├── RemoveCharacterMessage.cs ├── SavePresetRequestedMessage.cs ├── ScaleChangeRequestedMessage.cs ├── SetDistractionLevelMessage.cs ├── SetDistractionScaleMessage.cs ├── SetDistractionTrackedWindowMessage.cs ├── SetPresetFileAssociationRequestedMessage.cs ├── StartInteractionMessage.cs ├── UnfocusAllCharactersMessage.cs └── UnfocusedMovementChangedMessage.cs ├── Messaging ├── IMessageBroker.cs ├── MessageBroker.cs ├── MessageBus.cs └── Subscription.cs ├── MonitorManager.cs ├── Orientation.cs ├── OrientedAnimatedSprite.cs ├── Party.cs ├── PartyManager.cs ├── Physics.cs ├── Preset.cs ├── PresetManager.cs ├── Program.cs ├── ProgramInfo.cs ├── README.md ├── Registry ├── CharacterRegistry.cs ├── IRegistry.cs └── Registry.cs ├── Settings.cs ├── SpriteCache.cs ├── StateMachine.cs ├── States ├── Common │ ├── ActionState.cs │ ├── DragState.cs │ ├── IdleState.cs │ ├── PartyIdleState.cs │ ├── PartyRunState.cs │ ├── PartySpawnState.cs │ ├── PartyTeleportAppearState.cs │ ├── PartyTeleportDisappearState.cs │ ├── PartyTeleportFollowState.cs │ ├── PartyWalkState.cs │ ├── RandomActionState.cs │ ├── RandomMovementState.cs │ ├── RandomMovementWaitState.cs │ ├── RunState.cs │ ├── SpawnState.cs │ └── WalkState.cs └── GasterBlaster │ ├── BlasterAppearState.cs │ ├── BlasterFireState.cs │ └── BlasterWaitState.cs ├── TrackedWindow.cs ├── WindowInfo.cs ├── WindowTracker.cs ├── WindowsUtils.cs ├── app.manifest └── icon.ico /AnimatedSprite.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using Microsoft.Xna.Framework.Graphics; 4 | 5 | namespace Desktoptale 6 | { 7 | public class AnimatedSprite : IAnimatedSprite 8 | { 9 | public bool Playing { get; private set; } 10 | public bool Loop { get; set; } 11 | public int LoopPoint { get; set; } 12 | public double Framerate { get; set; } 13 | public int FrameCount { get; private set; } 14 | 15 | public int StartFrame 16 | { 17 | get => startFrame; 18 | set 19 | { 20 | startFrame = value; 21 | if (!Playing && CurrentFrameIndex == 0) CurrentFrameIndex = value; 22 | } 23 | } 24 | 25 | public int CurrentFrameIndex { get; set; } 26 | public Point FrameSize { get; } 27 | 28 | private Texture2D spritesheet; 29 | private bool justStarted; 30 | private TimeSpan nextFrameUpdate; 31 | private int startFrame; 32 | 33 | public AnimatedSprite(Texture2D spritesheet, int frameCount) 34 | { 35 | this.spritesheet = spritesheet; 36 | this.FrameCount = frameCount; 37 | FrameSize = new Point(spritesheet.Width / frameCount, spritesheet.Height); 38 | } 39 | 40 | public void Play() 41 | { 42 | Playing = true; 43 | justStarted = true; 44 | } 45 | 46 | public void Pause() 47 | { 48 | Playing = false; 49 | } 50 | 51 | public void Stop() 52 | { 53 | Playing = false; 54 | CurrentFrameIndex = StartFrame; 55 | } 56 | 57 | public void Update(GameTime gameTime) 58 | { 59 | if (Playing && FrameCount > 1) 60 | { 61 | if (justStarted) 62 | { 63 | TimeSpan nextScheduledUpdate = Framerate == 0 ? TimeSpan.MaxValue : gameTime.TotalGameTime + TimeSpan.FromSeconds(1 / Framerate); 64 | nextFrameUpdate = nextScheduledUpdate; 65 | justStarted = false; 66 | } 67 | 68 | if (nextFrameUpdate < gameTime.TotalGameTime) 69 | { 70 | TimeSpan nextScheduledUpdate = Framerate == 0 ? TimeSpan.MaxValue : gameTime.TotalGameTime + TimeSpan.FromSeconds(1 / Framerate); 71 | nextFrameUpdate = nextScheduledUpdate; 72 | 73 | if (CurrentFrameIndex < FrameCount - 1) 74 | { 75 | CurrentFrameIndex++; 76 | } 77 | else 78 | { 79 | if (Loop) CurrentFrameIndex = LoopPoint; 80 | } 81 | } 82 | } 83 | } 84 | 85 | public void Draw(SpriteBatch spriteBatch, 86 | Vector2 position, 87 | Color color, 88 | float rotation, 89 | Vector2 origin, 90 | Vector2 scale, 91 | SpriteEffects effects, 92 | float layerDepth) 93 | { 94 | Rectangle sourceRectangle = new Rectangle(CurrentFrameIndex * FrameSize.X, 0, FrameSize.X, FrameSize.Y); 95 | spriteBatch.Draw(spritesheet, position, sourceRectangle, color, rotation, origin, scale, effects, layerDepth); 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using Desktoptale; 3 | 4 | [assembly: AssemblyTitle(ProgramInfo.NAME)] 5 | [assembly: AssemblyCompany(ProgramInfo.AUTHOR)] 6 | [assembly: AssemblyVersion(ProgramInfo.VERSION)] 7 | [assembly: AssemblyFileVersion(ProgramInfo.VERSION)] 8 | -------------------------------------------------------------------------------- /CharacterProperties.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | using Desktoptale.Registry; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale 6 | { 7 | public class CharacterProperties 8 | { 9 | public CharacterType Type { get; set; } 10 | public Vector2 Position { get; set; } 11 | public Vector2 Scale { get; set; } 12 | public bool IdleRoamingEnabled { get; set; } 13 | public bool UnfocusedInputEnabled { get; set; } 14 | public WindowInfo StayInsideWindow { get; set; } 15 | public Party Party { get; set; } 16 | 17 | public CharacterProperties() 18 | { 19 | Type = CharacterRegistry.FRISK; 20 | Position = Vector2.Zero; 21 | Scale = new Vector2(2, 2); 22 | IdleRoamingEnabled = true; 23 | UnfocusedInputEnabled = false; 24 | StayInsideWindow = null; 25 | Party = null; 26 | } 27 | 28 | public CharacterProperties(CharacterType type, Vector2 position, Vector2 scale, bool idleRoamingEnabled, bool unfocusedInputEnabled, WindowInfo stayInsideWindow = null, Party party = null) 29 | { 30 | Type = type; 31 | Position = position; 32 | Scale = scale; 33 | IdleRoamingEnabled = idleRoamingEnabled; 34 | UnfocusedInputEnabled = unfocusedInputEnabled; 35 | StayInsideWindow = stayInsideWindow; 36 | Party = party; 37 | } 38 | 39 | public CharacterProperties(CharacterProperties source) 40 | { 41 | Type = source.Type; 42 | Position = source.Position; 43 | Scale = source.Scale; 44 | IdleRoamingEnabled = source.IdleRoamingEnabled; 45 | UnfocusedInputEnabled = source.UnfocusedInputEnabled; 46 | StayInsideWindow = source.StayInsideWindow; 47 | Party = source.Party; 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /Characters/Alphys.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Alphys : Character 7 | { 8 | public Alphys(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Up"), 2, 14 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Down"), 4, 15 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Left"), 4 16 | ); 17 | idleSprite.Loop = false; 18 | idleSprite.Framerate = 0; 19 | IdleSprite = idleSprite; 20 | 21 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 22 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Up"), 2, 23 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Down"), 4, 24 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Left"), 4 25 | ); 26 | walkSprite.Loop = true; 27 | walkSprite.Framerate = 5; 28 | walkSprite.StartFrame = 1; 29 | WalkSprite = walkSprite; 30 | 31 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 32 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Up"), 2, 33 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Down"), 4, 34 | contentManager.Load("Included/Alphys/Spr_Alphys_Walk_Left"), 4 35 | ); 36 | runSprite.Loop = true; 37 | runSprite.Framerate = 10; 38 | runSprite.StartFrame = 1; 39 | RunSprite = runSprite; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Characters/Asgore.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Asgore : Character 7 | { 8 | public Asgore(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Up"), 2, 14 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Down"), 4, 15 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Left"), 2 16 | ); 17 | idleSprite.Loop = false; 18 | idleSprite.Framerate = 0; 19 | IdleSprite = idleSprite; 20 | 21 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 22 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Up"), 2, 23 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Down"), 4, 24 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Left"), 2 25 | ); 26 | walkSprite.Loop = true; 27 | walkSprite.Framerate = 5; 28 | walkSprite.StartFrame = 1; 29 | WalkSprite = walkSprite; 30 | 31 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 32 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Up"), 2, 33 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Down"), 4, 34 | contentManager.Load("Included/Asgore/Spr_Asgore_Walk_Left"), 2 35 | ); 36 | runSprite.Loop = true; 37 | runSprite.Framerate = 10; 38 | runSprite.StartFrame = 1; 39 | RunSprite = runSprite; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Characters/Axis.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Axis : Character 7 | { 8 | public Axis(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Up"), 14 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Down"), 15 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Left"), 16 | 7 17 | ); 18 | idleSprite.Loop = true; 19 | idleSprite.Framerate = 10; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Up"), 24 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Down"), 25 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Left"), 26 | 7 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 10; 30 | WalkSprite = walkSprite; 31 | 32 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 33 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Up"), 34 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Down"), 35 | contentManager.Load("Included/Axis/Spr_Axis_Idle_Left"), 36 | 7 37 | ); 38 | runSprite.Loop = true; 39 | runSprite.Framerate = 10; 40 | RunSprite = runSprite; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /Characters/Ceroba.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Ceroba : Character 7 | { 8 | public Ceroba(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Idle_Up"), 14 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Idle_Down"), 15 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Idle_Left"), 16 | 1 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Walk_Up"), 24 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Walk_Down"), 25 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Walk_Left"), 26 | 4 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | walkSprite.StartFrame = 1; 31 | WalkSprite = walkSprite; 32 | 33 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Run_Up"), 35 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Run_Down"), 36 | contentManager.Load("Included/Ceroba/Spr_Ceroba_Run_Left"), 37 | 6 38 | ); 39 | runSprite.Loop = true; 40 | runSprite.Framerate = 10; 41 | runSprite.StartFrame = 1; 42 | RunSprite = runSprite; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Characters/CharacterCreationContext.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class CharacterCreationContext 7 | { 8 | public CharacterCreationContext(CharacterProperties properties, SpriteBatch spriteBatch, InputManager inputManager, MonitorManager monitorManager, WindowTracker windowTracker) 9 | { 10 | Properties = properties; 11 | SpriteBatch = spriteBatch; 12 | InputManager = inputManager; 13 | MonitorManager = monitorManager; 14 | WindowTracker = windowTracker; 15 | } 16 | 17 | public CharacterProperties Properties { get; private set; } 18 | public SpriteBatch SpriteBatch { get; private set; } 19 | public InputManager InputManager { get; private set; } 20 | public MonitorManager MonitorManager { get; private set; } 21 | public WindowTracker WindowTracker { get; private set; } 22 | } 23 | } -------------------------------------------------------------------------------- /Characters/CharacterType.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Desktoptale.Characters 4 | { 5 | public class CharacterType 6 | { 7 | public string Name { get; set; } 8 | public string Category { get; set; } 9 | public bool Hidden { get; set; } = false; 10 | public float WalkSpeed { get; set; } = 90f; 11 | public float RunSpeed { get; set; } = 180f; 12 | public bool Teleport { get; set; } = false; 13 | public bool BuiltIn { get; set; } = true; 14 | 15 | public Func FactoryFunction { get; set; } 16 | 17 | public CharacterType(string name, string category, Func factoryFunction) 18 | { 19 | Name = name; 20 | Category = category; 21 | FactoryFunction = factoryFunction; 22 | } 23 | 24 | public CharacterType(string name, string category, Func factoryFunction, float walkSpeed = 90f, float runSpeed = 180f, bool teleport = false) 25 | { 26 | Name = name; 27 | Category = category; 28 | FactoryFunction = factoryFunction; 29 | WalkSpeed = walkSpeed; 30 | RunSpeed = runSpeed; 31 | Teleport = teleport; 32 | } 33 | 34 | public override string ToString() 35 | { 36 | return $"{Category}/{Name}"; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /Characters/Chujin.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Chujin : Character 7 | { 8 | public Chujin(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Chujin/Spr_Chujin_Idle_Up"), 14 | contentManager.Load("Included/Chujin/Spr_Chujin_Idle_Down"), 15 | contentManager.Load("Included/Chujin/Spr_Chujin_Idle_Left"), 16 | contentManager.Load("Included/Chujin/Spr_Chujin_Idle_Right"), 17 | 1 18 | ); 19 | idleSprite.Loop = false; 20 | idleSprite.Framerate = 0; 21 | IdleSprite = idleSprite; 22 | 23 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 24 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Up"), 25 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Down"), 26 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Left"), 27 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Right"), 28 | 4 29 | ); 30 | walkSprite.Loop = true; 31 | walkSprite.Framerate = 5; 32 | walkSprite.StartFrame = 1; 33 | WalkSprite = walkSprite; 34 | 35 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 36 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Up"), 37 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Down"), 38 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Left"), 39 | contentManager.Load("Included/Chujin/Spr_Chujin_Walk_Right"), 40 | 4 41 | ); 42 | runSprite.Loop = true; 43 | runSprite.Framerate = 10; 44 | runSprite.StartFrame = 1; 45 | RunSprite = runSprite; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Characters/Clover.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.States.Common; 2 | using Microsoft.Xna.Framework.Content; 3 | using Microsoft.Xna.Framework.Graphics; 4 | 5 | namespace Desktoptale.Characters 6 | { 7 | public class Clover : Character 8 | { 9 | public Clover(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 10 | 11 | public override void Initialize(CharacterCreationReason reason) 12 | { 13 | base.Initialize(reason); 14 | RandomActionState = new RandomActionState(4, 16); 15 | } 16 | 17 | public override void LoadContent(ContentManager contentManager) 18 | { 19 | base.LoadContent(contentManager); 20 | 21 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 22 | contentManager.Load("Included/Clover/Spr_Clover_Idle_Up"), 23 | contentManager.Load("Included/Clover/Spr_Clover_Idle_Down"), 24 | contentManager.Load("Included/Clover/Spr_Clover_Idle_Left"), 25 | 1 26 | ); 27 | idleSprite.Loop = false; 28 | idleSprite.Framerate = 0; 29 | IdleSprite = idleSprite; 30 | 31 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 32 | contentManager.Load("Included/Clover/Spr_Clover_Walk_Up"), 4, 33 | contentManager.Load("Included/Clover/Spr_Clover_Walk_Down"), 4, 34 | contentManager.Load("Included/Clover/Spr_Clover_Walk_Left"), 2 35 | ); 36 | walkSprite.Loop = true; 37 | walkSprite.Framerate = 5; 38 | walkSprite.StartFrame = 1; 39 | WalkSprite = walkSprite; 40 | 41 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 42 | contentManager.Load("Included/Clover/Spr_Clover_Run_Up"), 43 | contentManager.Load("Included/Clover/Spr_Clover_Run_Down"), 44 | contentManager.Load("Included/Clover/Spr_Clover_Run_Left"), 45 | 6 46 | ); 47 | runSprite.Loop = true; 48 | runSprite.Framerate = 10; 49 | runSprite.StartFrame = 1; 50 | RunSprite = runSprite; 51 | 52 | AnimatedSprite danceSprite = new AnimatedSprite( 53 | contentManager.Load("Included/Clover/Spr_Clover_Dance"), 54 | 6 55 | ); 56 | danceSprite.Loop = true; 57 | danceSprite.Framerate = 7; 58 | ActionSprite = danceSprite; 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /Characters/CloverVengeance.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class CloverVengeance : Character 7 | { 8 | public CloverVengeance(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | base.LoadContent(contentManager); 13 | 14 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 15 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Up"), 4, 16 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Down"), 4, 17 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Left"), 2 18 | ); 19 | idleSprite.Loop = false; 20 | idleSprite.Framerate = 0; 21 | IdleSprite = idleSprite; 22 | 23 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 24 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Up"), 4, 25 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Down"), 4, 26 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Walk_Left"), 2 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | walkSprite.StartFrame = 1; 31 | WalkSprite = walkSprite; 32 | 33 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Run_Up"), 35 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Run_Down"), 36 | contentManager.Load("Included/CloverVengeance/Spr_CloverVengeance_Run_Left"), 37 | 6 38 | ); 39 | runSprite.Loop = true; 40 | runSprite.Framerate = 10; 41 | runSprite.StartFrame = 1; 42 | RunSprite = runSprite; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Characters/Dalv.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Dalv : Character 7 | { 8 | public Dalv(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Dalv/Spr_Dalv_Idle_Up"), 14 | contentManager.Load("Included/Dalv/Spr_Dalv_Idle_Down"), 15 | contentManager.Load("Included/Dalv/Spr_Dalv_Idle_Left"), 16 | 1 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Up"), 24 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Down"), 25 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Left"), 26 | 4 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | walkSprite.StartFrame = 1; 31 | WalkSprite = walkSprite; 32 | 33 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Up"), 35 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Down"), 36 | contentManager.Load("Included/Dalv/Spr_Dalv_Walk_Left"), 37 | 4 38 | ); 39 | runSprite.Loop = true; 40 | runSprite.Framerate = 10; 41 | runSprite.StartFrame = 1; 42 | RunSprite = runSprite; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Characters/ExternalCharacter.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Characters 2 | { 3 | public class ExternalCharacter : Character 4 | { 5 | public ExternalCharacter(CharacterCreationContext characterCreationContext) : base(characterCreationContext) { } 6 | } 7 | } -------------------------------------------------------------------------------- /Characters/ExternalCharacterDefinition.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Characters 2 | { 3 | public class ExternalCharacterDefinition 4 | { 5 | public string Name { get; set; } 6 | public string Category { get; set; } 7 | public bool? Hidden { get; set; } 8 | public bool? Override { get; set; } 9 | public float? WalkSpeed { get; set; } 10 | public float? RunSpeed { get; set; } 11 | public bool? Teleport { get; set; } 12 | public ExternalCharacterStateDefinition Idle { get; set; } 13 | public ExternalCharacterStateDefinition Walk { get; set; } 14 | public ExternalCharacterStateDefinition Run { get; set; } 15 | public ExternalCharacterStateDefinition Drag { get; set; } 16 | public ExternalCharacterStateDefinition Action { get; set; } 17 | public ExternalCharacterStateDefinition Spawn { get; set; } 18 | 19 | public ExternalCharacterStateDefinition Disappear { get; set; } 20 | public ExternalCharacterStateDefinition Appear { get; set; } 21 | 22 | public class ExternalCharacterStateDefinition 23 | { 24 | public ExternalCharacterSpriteDefinition Up { get; set; } 25 | public ExternalCharacterSpriteDefinition Down { get; set; } 26 | public ExternalCharacterSpriteDefinition Left { get; set; } 27 | public ExternalCharacterSpriteDefinition Right { get; set; } 28 | } 29 | 30 | public class ExternalCharacterSpriteDefinition 31 | { 32 | public string Sprite { get; set; } 33 | public double FrameRate { get; set; } 34 | public int FrameCount { get; set; } = 1; 35 | public int StartFrame { get; set; } = 0; 36 | public bool Loop { get; set; } = true; 37 | public int LoopPoint { get; set; } = 0; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /Characters/Flowey.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework.Content; 3 | using Microsoft.Xna.Framework.Graphics; 4 | 5 | namespace Desktoptale.Characters 6 | { 7 | public class Flowey : Character 8 | { 9 | public Flowey(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 10 | 11 | public override void Initialize(CharacterCreationReason reason) 12 | { 13 | base.Initialize(reason); 14 | EnabledAutoOrientation = false; 15 | } 16 | 17 | public override void LoadContent(ContentManager contentManager) 18 | { 19 | OrientedAnimatedSprite idleSprite; 20 | 21 | Random rng = new Random(GetHashCode()); 22 | if (rng.Next(0, 100) == 0) 23 | { 24 | idleSprite = new OrientedAnimatedSprite( 25 | contentManager.Load("Included/Flowey/Spr_FloweyNewCut_Idle_Up"), 26 | contentManager.Load("Included/Flowey/Spr_FloweyNewCut_Idle_Down"), 27 | contentManager.Load("Included/Flowey/Spr_FloweyNewCut_Idle_Left"), 28 | 1 29 | ); 30 | } 31 | else 32 | { 33 | idleSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/Flowey/Spr_Flowey_Idle_Up"), 35 | contentManager.Load("Included/Flowey/Spr_Flowey_Idle_Down"), 36 | contentManager.Load("Included/Flowey/Spr_Flowey_Idle_Left"), 37 | 1 38 | ); 39 | } 40 | 41 | 42 | idleSprite.Loop = false; 43 | idleSprite.Framerate = 0; 44 | IdleSprite = idleSprite; 45 | WalkSprite = idleSprite; 46 | RunSprite = idleSprite; 47 | 48 | AppearSprite = new OrientedAnimatedSprite( 49 | contentManager.Load("Included/Flowey/Spr_Flowey_Appear"), 50 | contentManager.Load("Included/Flowey/Spr_Flowey_Appear"), 51 | contentManager.Load("Included/Flowey/Spr_Flowey_Appear"), 52 | 4 53 | ); 54 | 55 | AppearSprite.Framerate = 15; 56 | AppearSprite.Loop = false; 57 | 58 | DisappearSprite = new OrientedAnimatedSprite( 59 | contentManager.Load("Included/Flowey/Spr_Flowey_Disappear"), 60 | contentManager.Load("Included/Flowey/Spr_Flowey_Disappear"), 61 | contentManager.Load("Included/Flowey/Spr_Flowey_Disappear"), 62 | 4 63 | ); 64 | 65 | DisappearSprite.Framerate = 15; 66 | DisappearSprite.Loop = false; 67 | 68 | SpawnSprite = AppearSprite; 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /Characters/Frisk.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Frisk : Character 7 | { 8 | public Frisk(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Up"), 4, 14 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Down"), 4, 15 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Left"), 2 16 | ); 17 | idleSprite.Loop = false; 18 | idleSprite.Framerate = 0; 19 | IdleSprite = idleSprite; 20 | 21 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 22 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Up"), 4, 23 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Down"), 4, 24 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Left"), 2 25 | ); 26 | walkSprite.Loop = true; 27 | walkSprite.Framerate = 5; 28 | walkSprite.StartFrame = 1; 29 | WalkSprite = walkSprite; 30 | 31 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 32 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Up"), 4, 33 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Down"), 4, 34 | contentManager.Load("Included/Frisk/Spr_Frisk_Walk_Left"), 2 35 | ); 36 | runSprite.Loop = true; 37 | runSprite.Framerate = 10; 38 | runSprite.StartFrame = 1; 39 | RunSprite = runSprite; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Characters/Kanako.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Kanako : Character 7 | { 8 | public Kanako(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Kanako/Spr_Kanako_Idle_Up"), 14 | contentManager.Load("Included/Kanako/Spr_Kanako_Idle_Down"), 15 | contentManager.Load("Included/Kanako/Spr_Kanako_Idle_Left"), 16 | 1 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Up"), 24 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Down"), 25 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Left"), 26 | 4 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | walkSprite.StartFrame = 1; 31 | WalkSprite = walkSprite; 32 | 33 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Up"), 35 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Down"), 36 | contentManager.Load("Included/Kanako/Spr_Kanako_Walk_Left"), 37 | 4 38 | ); 39 | runSprite.Loop = true; 40 | runSprite.Framerate = 10; 41 | runSprite.StartFrame = 1; 42 | RunSprite = runSprite; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Characters/Lancer.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Lancer : Character 7 | { 8 | public Lancer(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Lancer/Spr_Lancer_Idle_Up"), 14 | contentManager.Load("Included/Lancer/Spr_Lancer_Idle_Down"), 15 | contentManager.Load("Included/Lancer/Spr_Lancer_Idle_Left"), 16 | 1 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | WalkSprite = idleSprite; 22 | RunSprite = idleSprite; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /Characters/Martlet.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Martlet : Character 7 | { 8 | public Martlet(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Martlet/Spr_Martlet_Idle_Up"), 14 | contentManager.Load("Included/Martlet/Spr_Martlet_Idle_Down"), 15 | contentManager.Load("Included/Martlet/Spr_Martlet_Idle_Left"), 16 | 1 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Martlet/Spr_Martlet_Walk_Up"), 24 | contentManager.Load("Included/Martlet/Spr_Martlet_Walk_Down"), 25 | contentManager.Load("Included/Martlet/Spr_Martlet_Walk_Left"), 26 | 4 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | WalkSprite = walkSprite; 31 | 32 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 33 | contentManager.Load("Included/Martlet/Spr_Martlet_Run_Up"), 34 | contentManager.Load("Included/Martlet/Spr_Martlet_Run_Down"), 35 | contentManager.Load("Included/Martlet/Spr_Martlet_Run_Left"), 36 | 6 37 | ); 38 | runSprite.Loop = true; 39 | runSprite.Framerate = 10; 40 | RunSprite = runSprite; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /Characters/Moray.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Moray : Character 7 | { 8 | public Moray(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Moray/Spr_Moray_Idle_Up"), 14 | contentManager.Load("Included/Moray/Spr_Moray_Idle_Down"), 15 | contentManager.Load("Included/Moray/Spr_Moray_Idle_Left"), 16 | contentManager.Load("Included/Moray/Spr_Moray_Idle_Right"), 17 | 1 18 | ); 19 | idleSprite.Loop = false; 20 | idleSprite.Framerate = 0; 21 | IdleSprite = idleSprite; 22 | 23 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 24 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Up"), 25 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Down"), 26 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Left"), 27 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Right"), 28 | 4 29 | ); 30 | walkSprite.Loop = true; 31 | walkSprite.Framerate = 5; 32 | walkSprite.StartFrame = 1; 33 | WalkSprite = walkSprite; 34 | 35 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 36 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Up"), 37 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Down"), 38 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Left"), 39 | contentManager.Load("Included/Moray/Spr_Moray_Walk_Right"), 40 | 4 41 | ); 42 | runSprite.Loop = true; 43 | runSprite.Framerate = 10; 44 | runSprite.StartFrame = 1; 45 | RunSprite = runSprite; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Characters/Queen.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Queen : Character 7 | { 8 | public Queen(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Up"), 14 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Down"), 15 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Left"), 16 | 4 17 | ); 18 | idleSprite.Loop = false; 19 | idleSprite.Framerate = 0; 20 | IdleSprite = idleSprite; 21 | 22 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 23 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Up"), 24 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Down"), 25 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Left"), 26 | 4 27 | ); 28 | walkSprite.Loop = true; 29 | walkSprite.Framerate = 5; 30 | walkSprite.StartFrame = 1; 31 | WalkSprite = walkSprite; 32 | 33 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 34 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Up"), 35 | contentManager.Load("Included/Queen/Spr_Queen_Walk_Down"), 36 | contentManager.Load("Included/Queen/Spr_Queen_Run_Left"), 37 | 4 38 | ); 39 | runSprite.Loop = true; 40 | runSprite.Framerate = 9; 41 | runSprite.StartFrame = 0; 42 | RunSprite = runSprite; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Characters/Soul.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.States.Common; 2 | using Microsoft.Xna.Framework; 3 | using Microsoft.Xna.Framework.Content; 4 | using Microsoft.Xna.Framework.Graphics; 5 | 6 | namespace Desktoptale.Characters 7 | { 8 | public class Soul : Character 9 | { 10 | private Color color; 11 | private bool flip; 12 | 13 | public Soul(CharacterCreationContext characterCreationContext, Color color, bool flip = false) : base(characterCreationContext) 14 | { 15 | this.color = color; 16 | this.flip = flip; 17 | } 18 | 19 | public override void LoadContent(ContentManager contentManager) 20 | { 21 | AnimatedSprite idleSprite = new AnimatedSprite(contentManager.Load("Included/Soul/Spr_Soul"), 1); 22 | idleSprite.Loop = false; 23 | idleSprite.Framerate = 0; 24 | IdleSprite = idleSprite; 25 | WalkSprite = idleSprite; 26 | RunSprite = idleSprite; 27 | } 28 | 29 | public override void Initialize(CharacterCreationReason reason) 30 | { 31 | base.Initialize(reason); 32 | 33 | WalkState = new WalkState(100f, false); 34 | RunState = new RunState(50f, false); 35 | RandomMovementState = new RandomMovementState(100f); 36 | } 37 | 38 | public override void Draw(GameTime gameTime, SpriteBatch spriteBatch) 39 | { 40 | Vector2 origin = new Vector2(CurrentSprite.FrameSize.X / 2f, CurrentSprite.FrameSize.Y / 2f); 41 | CurrentSprite.Draw(spriteBatch, Position, color, 0, origin, Scale, flip ? SpriteEffects.FlipVertically : SpriteEffects.None, MathUtilities.Clamp(Depth, 0, 1)); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /Characters/Spamton.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Spamton : Character 7 | { 8 | public Spamton(CharacterCreationContext characterCreationContext) : base(characterCreationContext) 9 | { 10 | } 11 | 12 | public override void LoadContent(ContentManager contentManager) 13 | { 14 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 15 | contentManager.Load("Included/Spamton/Spr_Spamton_Up"), 16 | contentManager.Load("Included/Spamton/Spr_Spamton_Left"), 17 | contentManager.Load("Included/Spamton/Spr_Spamton_Left"), 18 | 1 19 | ); 20 | idleSprite.Loop = false; 21 | idleSprite.Framerate = 0; 22 | IdleSprite = idleSprite; 23 | WalkSprite = idleSprite; 24 | RunSprite = idleSprite; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /Characters/Starlo.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Starlo : Character 7 | { 8 | public Starlo(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Starlo/Spr_Starlo_Idle_Up"), 14 | contentManager.Load("Included/Starlo/Spr_Starlo_Idle_Down"), 15 | contentManager.Load("Included/Starlo/Spr_Starlo_Idle_Left"), 16 | contentManager.Load("Included/Starlo/Spr_Starlo_Idle_Right"), 17 | 1 18 | ); 19 | idleSprite.Loop = false; 20 | idleSprite.Framerate = 0; 21 | IdleSprite = idleSprite; 22 | 23 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 24 | contentManager.Load("Included/Starlo/Spr_Starlo_Walk_Up"), 25 | contentManager.Load("Included/Starlo/Spr_Starlo_Walk_Down"), 26 | contentManager.Load("Included/Starlo/Spr_Starlo_Walk_Left"), 27 | contentManager.Load("Included/Starlo/Spr_Starlo_Walk_Right"), 28 | 4 29 | ); 30 | walkSprite.Loop = true; 31 | walkSprite.Framerate = 5; 32 | walkSprite.StartFrame = 1; 33 | WalkSprite = walkSprite; 34 | 35 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 36 | contentManager.Load("Included/Starlo/Spr_Starlo_Run_Up"), 37 | contentManager.Load("Included/Starlo/Spr_Starlo_Run_Down"), 38 | contentManager.Load("Included/Starlo/Spr_Starlo_Run_Left"), 39 | contentManager.Load("Included/Starlo/Spr_Starlo_Run_Right"), 40 | 6 41 | ); 42 | runSprite.Loop = true; 43 | runSprite.Framerate = 10; 44 | runSprite.StartFrame = 0; 45 | RunSprite = runSprite; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Characters/Undyne.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework.Content; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale.Characters 5 | { 6 | public class Undyne : Character 7 | { 8 | public Undyne(CharacterCreationContext characterCreationContext) : base(characterCreationContext) {} 9 | 10 | public override void LoadContent(ContentManager contentManager) 11 | { 12 | OrientedAnimatedSprite idleSprite = new OrientedAnimatedSprite( 13 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Up"), 4, 14 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Down"), 4, 15 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Left"), 2 16 | ); 17 | idleSprite.Loop = false; 18 | idleSprite.Framerate = 0; 19 | IdleSprite = idleSprite; 20 | 21 | OrientedAnimatedSprite walkSprite = new OrientedAnimatedSprite( 22 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Up"), 4, 23 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Down"), 4, 24 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Left"), 2 25 | ); 26 | walkSprite.Loop = true; 27 | walkSprite.Framerate = 5; 28 | walkSprite.StartFrame = 1; 29 | WalkSprite = walkSprite; 30 | 31 | OrientedAnimatedSprite runSprite = new OrientedAnimatedSprite( 32 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Up"), 4, 33 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Down"), 4, 34 | contentManager.Load("Included/Undyne/Spr_Undyne_Walk_Left"), 2 35 | ); 36 | runSprite.Loop = true; 37 | runSprite.Framerate = 10; 38 | runSprite.StartFrame = 1; 39 | RunSprite = runSprite; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Content/Custom/PUT YOUR CUSTOM CHARACTERS HERE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Custom/PUT YOUR CUSTOM CHARACTERS HERE -------------------------------------------------------------------------------- /Content/Included/Ace/Spr_Ace_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ace/Spr_Ace_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Ace/Spr_Ace_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ace/Spr_Ace_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Ace/Spr_Ace_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ace/Spr_Ace_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Alphys/Spr_Alphys_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Alphys/Spr_Alphys_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Alphys/Spr_Alphys_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Alphys/Spr_Alphys_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Alphys/Spr_Alphys_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Alphys/Spr_Alphys_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Asgore/Spr_Asgore_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asgore/Spr_Asgore_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Asgore/Spr_Asgore_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asgore/Spr_Asgore_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Asgore/Spr_Asgore_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asgore/Spr_Asgore_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Asriel/Spr_Asriel_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asriel/Spr_Asriel_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Asriel/Spr_Asriel_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asriel/Spr_Asriel_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Asriel/Spr_Asriel_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Asriel/Spr_Asriel_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Axis/Spr_Axis_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Axis/Spr_Axis_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Axis/Spr_Axis_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Axis/Spr_Axis_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Axis/Spr_Axis_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Axis/Spr_Axis_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Berdly/Spr_Berdly_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Berdly/Spr_Berdly_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Berdly/Spr_Berdly_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Berdly/Spr_Berdly_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Berdly/Spr_Berdly_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Berdly/Spr_Berdly_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Berdly/Spr_Berdly_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Berdly/Spr_Berdly_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/BerdlyDW/Spr_BerdlyDW_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Run_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Run_Down.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Run_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Run_Up.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Ceroba/Spr_Ceroba_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ceroba/Spr_Ceroba_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Chara/Spr_Chara_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chara/Spr_Chara_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Chara/Spr_Chara_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chara/Spr_Chara_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Chara/Spr_Chara_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chara/Spr_Chara_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Idle_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Idle_Right.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Chujin/Spr_Chujin_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Chujin/Spr_Chujin_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Dance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Dance.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Run_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Run_Down.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Run_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Run_Up.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Clover/Spr_Clover_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Clover/Spr_Clover_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Down.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Run_Up.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/CloverVengeance/Spr_CloverVengeance_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Dalv/Spr_Dalv_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Dalv/Spr_Dalv_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_BeamTip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_BeamTip.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_Bone_Long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_Bone_Long.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_Bone_Medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_Bone_Medium.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_Bone_Short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_Bone_Short.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_Bone_VeryShort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_Bone_VeryShort.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_GasterBlaster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_GasterBlaster.png -------------------------------------------------------------------------------- /Content/Included/Distractions/Spr_Distraction_WhitePixel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Distractions/Spr_Distraction_WhitePixel.png -------------------------------------------------------------------------------- /Content/Included/Ed/Spr_Ed_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ed/Spr_Ed_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Ed/Spr_Ed_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ed/Spr_Ed_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Ed/Spr_Ed_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ed/Spr_Ed_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_FloweyNewCut_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_FloweyNewCut_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_FloweyNewCut_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_FloweyNewCut_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_FloweyNewCut_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_FloweyNewCut_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_Flowey_Appear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_Flowey_Appear.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_Flowey_Disappear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_Flowey_Disappear.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_Flowey_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_Flowey_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_Flowey_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_Flowey_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Flowey/Spr_Flowey_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Flowey/Spr_Flowey_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Frisk/Spr_Frisk_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Frisk/Spr_Frisk_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Frisk/Spr_Frisk_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Frisk/Spr_Frisk_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Frisk/Spr_Frisk_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Frisk/Spr_Frisk_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Froggit/Spr_Froggit_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Froggit/Spr_Froggit_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Froggit/Spr_Froggit_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Froggit/Spr_Froggit_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Froggit/Spr_Froggit_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Froggit/Spr_Froggit_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Kanako/Spr_Kanako_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kanako/Spr_Kanako_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Kris/Spr_Kris_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kris/Spr_Kris_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Kris/Spr_Kris_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kris/Spr_Kris_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Kris/Spr_Kris_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Kris/Spr_Kris_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/KrisDW/Spr_KrisDW_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/KrisDW/Spr_KrisDW_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/KrisDW/Spr_KrisDW_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/KrisDW/Spr_KrisDW_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/KrisDW/Spr_KrisDW_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/KrisDW/Spr_KrisDW_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/KrisDW/Spr_KrisDW_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/KrisDW/Spr_KrisDW_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Lancer/Spr_Lancer_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Lancer/Spr_Lancer_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Lancer/Spr_Lancer_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Lancer/Spr_Lancer_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Lancer/Spr_Lancer_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Lancer/Spr_Lancer_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Run_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Run_Down.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Run_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Run_Up.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Martlet/Spr_Martlet_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Martlet/Spr_Martlet_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Mo/Spr_Mo_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mo/Spr_Mo_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Mooch/Spr_Mooch_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mooch/Spr_Mooch_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Mooch/Spr_Mooch_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mooch/Spr_Mooch_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Mooch/Spr_Mooch_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mooch/Spr_Mooch_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Mooch/Spr_Mooch_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Mooch/Spr_Mooch_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Idle_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Idle_Right.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Moray/Spr_Moray_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Moray/Spr_Moray_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Napstablook/Spr_Napstablook_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Napstablook/Spr_Napstablook_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Napstablook/Spr_Napstablook_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Napstablook/Spr_Napstablook_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Napstablook/Spr_Napstablook_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Napstablook/Spr_Napstablook_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Noelle/Spr_Noelle_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Noelle/Spr_Noelle_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Noelle/Spr_Noelle_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Noelle/Spr_Noelle_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Noelle/Spr_Noelle_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Noelle/Spr_Noelle_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/NoelleDW/Spr_NoelleDW_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/NoelleDW/Spr_NoelleDW_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/NoelleDW/Spr_NoelleDW_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/NoelleDW/Spr_NoelleDW_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/NoelleDW/Spr_NoelleDW_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/NoelleDW/Spr_NoelleDW_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Papyrus/Spr_Papyrus_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Papyrus/Spr_Papyrus_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Papyrus/Spr_Papyrus_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Papyrus/Spr_Papyrus_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Papyrus/Spr_Papyrus_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Papyrus/Spr_Papyrus_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Papyrus/Spr_Papyrus_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Papyrus/Spr_Papyrus_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Queen/Spr_Queen_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Queen/Spr_Queen_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/Queen/Spr_Queen_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Queen/Spr_Queen_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Queen/Spr_Queen_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Queen/Spr_Queen_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Queen/Spr_Queen_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Queen/Spr_Queen_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Ralsei/Spr_Ralsei_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ralsei/Spr_Ralsei_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Ralsei/Spr_Ralsei_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ralsei/Spr_Ralsei_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Ralsei/Spr_Ralsei_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Ralsei/Spr_Ralsei_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/RalseiHat/Spr_RalseiHat_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/RalseiHat/Spr_RalseiHat_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/RalseiHat/Spr_RalseiHat_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/RalseiHat/Spr_RalseiHat_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/RalseiHat/Spr_RalseiHat_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/RalseiHat/Spr_RalseiHat_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Sans/Spr_Sans_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Sans/Spr_Sans_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Sans/Spr_Sans_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Sans/Spr_Sans_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Sans/Spr_Sans_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Sans/Spr_Sans_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Soul/Spr_Soul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Soul/Spr_Soul.png -------------------------------------------------------------------------------- /Content/Included/Spamton/Spr_Spamton_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Spamton/Spr_Spamton_Left.png -------------------------------------------------------------------------------- /Content/Included/Spamton/Spr_Spamton_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Spamton/Spr_Spamton_Up.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Idle_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Idle_Down.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Idle_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Idle_Left.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Idle_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Idle_Right.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Idle_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Idle_Up.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Run_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Run_Down.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Run_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Run_Left.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Run_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Run_Right.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Run_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Run_Up.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/Starlo/Spr_Starlo_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Starlo/Spr_Starlo_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Susie/Spr_Susie_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Susie/Spr_Susie_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Susie/Spr_Susie_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Susie/Spr_Susie_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Susie/Spr_Susie_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Susie/Spr_Susie_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/SusieDW/Spr_SusieDW_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/SusieDW/Spr_SusieDW_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/SusieDW/Spr_SusieDW_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/SusieDW/Spr_SusieDW_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/SusieDW/Spr_SusieDW_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/SusieDW/Spr_SusieDW_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Toriel/Spr_Toriel_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Toriel/Spr_Toriel_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Toriel/Spr_Toriel_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Toriel/Spr_Toriel_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Toriel/Spr_Toriel_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Toriel/Spr_Toriel_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/Undyne/Spr_Undyne_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Undyne/Spr_Undyne_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/Undyne/Spr_Undyne_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Undyne/Spr_Undyne_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/Undyne/Spr_Undyne_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/Undyne/Spr_Undyne_Walk_Up.png -------------------------------------------------------------------------------- /Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Down.png -------------------------------------------------------------------------------- /Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Left.png -------------------------------------------------------------------------------- /Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Right.png -------------------------------------------------------------------------------- /Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/Content/Included/UndyneArmored/Spr_UndyneArmored_Walk_Up.png -------------------------------------------------------------------------------- /Desktoptale.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | WinExe 4 | net48 5 | Major 6 | false 7 | false 8 | true 9 | 7.3 10 | false 11 | 12 | 13 | app.manifest 14 | Icon.ico 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Desktoptale.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.8.34309.116 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Desktoptale", "Desktoptale.csproj", "{CAA03776-528B-4362-A435-BA898207BC29}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {CAA03776-528B-4362-A435-BA898207BC29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {CAA03776-528B-4362-A435-BA898207BC29}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {CAA03776-528B-4362-A435-BA898207BC29}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {CAA03776-528B-4362-A435-BA898207BC29}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {6708CB1B-AC41-4423-B53C-197E8E9D0757} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Distractions/BoneDistraction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using Microsoft.Xna.Framework.Content; 4 | using Microsoft.Xna.Framework.Graphics; 5 | 6 | namespace Desktoptale.Distractions 7 | { 8 | public class BoneDistraction : IDistraction 9 | { 10 | public Vector2 Position { get; set; } 11 | public float Rotation { get; set; } 12 | public Vector2 Scale { get; set; } = Vector2.One; 13 | public virtual bool Disposed { get; set; } 14 | 15 | private static readonly string[] BoneTextures = { 16 | "Included/Distractions/Spr_Distraction_Bone_VeryShort", 17 | "Included/Distractions/Spr_Distraction_Bone_Short", 18 | "Included/Distractions/Spr_Distraction_Bone_Medium", 19 | "Included/Distractions/Spr_Distraction_Bone_Long" 20 | }; 21 | 22 | protected BoneLength boneLength; 23 | protected Texture2D boneTexture; 24 | protected float opacity = 1f; 25 | 26 | private Vector2 origin; 27 | 28 | public enum BoneLength { VeryShort = 0, Short = 1, Medium = 2, Long = 3 } 29 | 30 | public BoneDistraction(BoneLength length) 31 | { 32 | boneLength = length; 33 | } 34 | 35 | 36 | public virtual void Initialize() 37 | { 38 | 39 | } 40 | 41 | public virtual void LoadContent(ContentManager contentManager) 42 | { 43 | boneTexture = contentManager.Load(BoneTextures[(int)boneLength]); 44 | origin = new Vector2(boneTexture.Width / 2f, boneTexture.Height / 2f); 45 | } 46 | 47 | public virtual void Update(GameTime gameTime, Rectangle screenRectangle) 48 | { 49 | 50 | } 51 | 52 | public void Draw(GameTime gameTime, SpriteBatch spriteBatch, Rectangle screenRectangle) 53 | { 54 | spriteBatch.Draw(boneTexture, Position, null, new Color(opacity, opacity, opacity, opacity), Rotation, origin, Scale, SpriteEffects.None, 0f); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /Distractions/IDistraction.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | using Microsoft.Xna.Framework.Content; 3 | using Microsoft.Xna.Framework.Graphics; 4 | 5 | namespace Desktoptale.Distractions 6 | { 7 | public interface IDistraction 8 | { 9 | Vector2 Position { get; set; } 10 | float Rotation { get; set; } 11 | Vector2 Scale { get; set; } 12 | bool Disposed { get; } 13 | 14 | void Initialize(); 15 | void LoadContent(ContentManager contentManager); 16 | void Update(GameTime gameTime, Rectangle screenRectangle); 17 | void Draw(GameTime gameTime, SpriteBatch spriteBatch, Rectangle screenRectangle); 18 | } 19 | } -------------------------------------------------------------------------------- /Distractions/IDistractionPattern.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | 3 | namespace Desktoptale.Distractions 4 | { 5 | public interface IDistractionPattern 6 | { 7 | float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale); 8 | } 9 | } -------------------------------------------------------------------------------- /Distractions/LeftRightOppositeBonesPattern.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using SharpDX; 3 | using Rectangle = Microsoft.Xna.Framework.Rectangle; 4 | using Vector2 = Microsoft.Xna.Framework.Vector2; 5 | 6 | namespace Desktoptale.Distractions 7 | { 8 | public class LeftRightOppositeBonesPattern : IDistractionPattern 9 | { 10 | private int count; 11 | private float velocity; 12 | private float spacing; 13 | private float yOffset; 14 | private Random random; 15 | 16 | public LeftRightOppositeBonesPattern(int count, float velocity, float spacing, float yOffset) 17 | { 18 | this.count = count; 19 | this.velocity = velocity; 20 | this.spacing = spacing; 21 | this.yOffset = yOffset; 22 | 23 | random = new Random(); 24 | } 25 | 26 | public float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale) 27 | { 28 | Vector2 screenCenter = new Vector2(screenRectangle.Width / 2, screenRectangle.Height / 2); 29 | Vector2 leftOrigin = new Vector2(0, screenCenter.Y + yOffset * scale.Y); 30 | Vector2 rightOrigin = new Vector2(screenRectangle.Width, screenCenter.Y - yOffset * scale.Y); 31 | 32 | float velocityMultiplier = random.NextFloat(0.75f, 1.5f); 33 | 34 | for (int i = 0; i < count; i++) 35 | { 36 | MovingBoneDistraction rightBone = new MovingBoneDistraction(BoneDistraction.BoneLength.Long, new Vector2(-velocity * velocityMultiplier, 0)); 37 | rightBone.Position = screenRectangle.Location.ToVector2() + rightOrigin + new Vector2(spacing * scale.X * (i + 1), 0); 38 | manager.AddDistraction(rightBone); 39 | 40 | MovingBoneDistraction leftBone = new MovingBoneDistraction(BoneDistraction.BoneLength.Long, new Vector2(velocity * velocityMultiplier, 0)); 41 | leftBone.Position = screenRectangle.Location.ToVector2() + leftOrigin + new Vector2(-spacing * scale.X * (i + 1), 0); 42 | manager.AddDistraction(leftBone); 43 | } 44 | 45 | return 1f; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Distractions/MovingBoneDistraction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale.Distractions 5 | { 6 | public class MovingBoneDistraction : BoneDistraction 7 | { 8 | public Vector2 Velocity; 9 | 10 | protected bool onScreenBefore = false; 11 | 12 | private const float FadeDistance = 30f; 13 | private static readonly TimeSpan DespawnDelay = TimeSpan.FromSeconds(0.5f); 14 | 15 | private double movementAxisDistance = float.MaxValue; 16 | private TimeSpan? despawnAtTime; 17 | 18 | public MovingBoneDistraction(BoneLength length, Vector2 velocity) : base(length) 19 | { 20 | Velocity = velocity; 21 | } 22 | 23 | public override void Update(GameTime gameTime, Rectangle screenRectangle) 24 | { 25 | if (Math.Abs(Velocity.X) > Math.Abs(Velocity.Y)) 26 | { 27 | movementAxisDistance = (Position.X > screenRectangle.Left && Position.X < screenRectangle.Right) 28 | ? 0 29 | : Math.Min(Math.Abs(screenRectangle.Left - Position.X), Math.Abs(screenRectangle.Right - Position.X)); 30 | } 31 | else 32 | { 33 | movementAxisDistance = (Position.Y > screenRectangle.Top && Position.Y < screenRectangle.Bottom) 34 | ? 0 35 | : Math.Min(Math.Abs(screenRectangle.Top - Position.Y), Math.Abs(screenRectangle.Bottom - Position.Y)); 36 | } 37 | 38 | float scaledFadeDistance = FadeDistance * Math.Max(Scale.X, Scale.Y); 39 | if (movementAxisDistance < scaledFadeDistance && movementAxisDistance > 0) 40 | { 41 | opacity = 1 - ((float)movementAxisDistance / scaledFadeDistance); 42 | } 43 | else if(movementAxisDistance <= 0) 44 | { 45 | opacity = 1; 46 | } 47 | else 48 | { 49 | opacity = 0; 50 | } 51 | 52 | if (!onScreenBefore) 53 | { 54 | onScreenBefore = IsOnScreen(); 55 | } 56 | 57 | if (onScreenBefore && !IsOnScreen() && !despawnAtTime.HasValue) 58 | { 59 | despawnAtTime = gameTime.TotalGameTime + DespawnDelay; 60 | } 61 | 62 | if (despawnAtTime < gameTime.TotalGameTime) 63 | { 64 | Disposed = true; 65 | } 66 | 67 | Position += Velocity * Scale * (float)gameTime.ElapsedGameTime.TotalSeconds; 68 | } 69 | 70 | protected bool IsOnScreen() 71 | { 72 | return Math.Abs(movementAxisDistance) <= 0f; 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /Distractions/RandomGasterBlasterPattern.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using SharpDX; 4 | using Rectangle = Microsoft.Xna.Framework.Rectangle; 5 | using Vector2 = Microsoft.Xna.Framework.Vector2; 6 | 7 | namespace Desktoptale.Distractions 8 | { 9 | public class RandomGasterBlasterPattern : IDistractionPattern 10 | { 11 | private int count; 12 | private float interval; 13 | private Random random; 14 | 15 | public RandomGasterBlasterPattern(int count, float interval) 16 | { 17 | this.count = count; 18 | this.interval = interval; 19 | 20 | random = new Random(); 21 | } 22 | 23 | public float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale) 24 | { 25 | float xMin, xMax, yMin, yMax; 26 | xMin = screenRectangle.Width * 0.1f; 27 | xMax = screenRectangle.Width * 0.9f; 28 | yMin = screenRectangle.Height * 0.1f; 29 | yMax = screenRectangle.Height * 0.9f; 30 | 31 | Vector2 screenCenter = new Vector2(screenRectangle.Width / 2, screenRectangle.Height / 2); 32 | 33 | for (int i = 0; i < count; i++) 34 | { 35 | Vector2 position = new Vector2( 36 | MathHelper.Lerp(xMin, xMax, random.NextFloat(0, 1)), 37 | MathHelper.Lerp(yMin, yMax, random.NextFloat(0, 1)) 38 | ); 39 | 40 | GasterBlasterDistraction gasterBlaster = new GasterBlasterDistraction(TimeSpan.FromSeconds(interval * i)); 41 | gasterBlaster.Position = screenRectangle.Location.ToVector2() + position; 42 | 43 | Vector2 toCenter = screenCenter - position; 44 | Vector2 initialDirection = new Vector2(0, 1); 45 | float angle = MathUtilities.SignedAngleBetween(initialDirection, toCenter); 46 | 47 | gasterBlaster.Rotation = random.NextFloat(-MathHelper.Pi / 4f, MathHelper.Pi / 4f) + angle; 48 | 49 | manager.AddDistraction(gasterBlaster); 50 | } 51 | 52 | return 1f; 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /Distractions/ScreenEdgeBonesPattern.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using SharpDX; 3 | using Rectangle = Microsoft.Xna.Framework.Rectangle; 4 | using Vector2 = Microsoft.Xna.Framework.Vector2; 5 | 6 | namespace Desktoptale.Distractions 7 | { 8 | public class ScreenEdgeBonesPattern : IDistractionPattern 9 | { 10 | private int count; 11 | private float velocity; 12 | private float spacing; 13 | private Random random; 14 | private bool upper; 15 | 16 | public ScreenEdgeBonesPattern(int count, float velocity, float spacing, bool upper) 17 | { 18 | this.count = count; 19 | this.velocity = velocity; 20 | this.spacing = spacing; 21 | this.upper = upper; 22 | 23 | random = new Random(); 24 | } 25 | 26 | public float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale) 27 | { 28 | float yPosition = upper ? 0 : 1; 29 | bool left = random.Next(0, 2) == 0; 30 | float velocityMultiplier = (left ? 1 : -1) * random.NextFloat(0.75f, 1.5f); 31 | Vector2 origin = new Vector2( 32 | left ? 0 : screenRectangle.Width, 33 | screenRectangle.Height * yPosition + random.NextFloat(0f, 0.5f) * (yPosition > 0.5f ? 200f * scale.Y : -200f * scale.Y) + 50f * scale.Y * (yPosition > 0.5f ? -1 : 1)); 34 | 35 | for (int i = 0; i < count; i++) 36 | { 37 | MovingBoneDistraction bone = new MovingBoneDistraction(BoneDistraction.BoneLength.Long, new Vector2(velocity * velocityMultiplier, 0)); 38 | bone.Position = screenRectangle.Location.ToVector2() + origin + new Vector2(spacing * scale.X * (i + 1), 0) * (left ? -1 : 1); 39 | manager.AddDistraction(bone); 40 | } 41 | 42 | return 1f; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Distractions/SideGasterBlasterPattern.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using SharpDX; 4 | using Rectangle = Microsoft.Xna.Framework.Rectangle; 5 | using Vector2 = Microsoft.Xna.Framework.Vector2; 6 | 7 | namespace Desktoptale.Distractions 8 | { 9 | public class SideGasterBlasterPattern : IDistractionPattern 10 | { 11 | private int count; 12 | private float interval; 13 | private Random random; 14 | 15 | public SideGasterBlasterPattern(int count, float interval) 16 | { 17 | this.count = count; 18 | this.interval = interval; 19 | 20 | random = new Random(); 21 | } 22 | 23 | public float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale) 24 | { 25 | float leftEdge, rightEdge, yMin, yMax; 26 | leftEdge = screenRectangle.Width * 0.1f; 27 | rightEdge = screenRectangle.Width * 0.9f; 28 | yMin = screenRectangle.Height * 0.1f; 29 | yMax = screenRectangle.Height * 0.9f; 30 | 31 | for (int i = 0; i < count; i++) 32 | { 33 | bool left = random.Next(0, 2) == 0; 34 | 35 | Vector2 position = new Vector2( 36 | left ? leftEdge : rightEdge, 37 | MathHelper.Lerp(yMin, yMax, random.NextFloat(0, 1)) 38 | ); 39 | 40 | GasterBlasterDistraction gasterBlaster = new GasterBlasterDistraction(TimeSpan.FromSeconds(interval * i)); 41 | gasterBlaster.Position = screenRectangle.Location.ToVector2() + position; 42 | gasterBlaster.Rotation = left ? -MathHelper.Pi / 2 : MathHelper.Pi / 2; 43 | gasterBlaster.Scale = new Vector2(0.5f, 1); 44 | 45 | manager.AddDistraction(gasterBlaster); 46 | } 47 | 48 | return 1f; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /Distractions/UpDownOppositeBonesPattern.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using SharpDX; 4 | using Rectangle = Microsoft.Xna.Framework.Rectangle; 5 | using Vector2 = Microsoft.Xna.Framework.Vector2; 6 | 7 | namespace Desktoptale.Distractions 8 | { 9 | public class UpDownOppositeBonesPattern : IDistractionPattern 10 | { 11 | private int count; 12 | private float velocity; 13 | private float spacing; 14 | private float xOffset; 15 | private Random random; 16 | 17 | public UpDownOppositeBonesPattern(int count, float velocity, float spacing, float xOffset) 18 | { 19 | this.count = count; 20 | this.velocity = velocity; 21 | this.spacing = spacing; 22 | this.xOffset = xOffset; 23 | 24 | random = new Random(); 25 | } 26 | 27 | public float Spawn(IDistractionManager manager, Rectangle screenRectangle, Vector2 scale) 28 | { 29 | Vector2 screenCenter = new Vector2(screenRectangle.Width / 2, screenRectangle.Height / 2); 30 | Vector2 upperOrigin = new Vector2(screenCenter.X + xOffset * scale.X, 0); 31 | Vector2 lowerOrigin = new Vector2(screenCenter.X - xOffset * scale.X, screenRectangle.Height); 32 | 33 | float velocityMultiplier = random.NextFloat(0.75f, 1.5f); 34 | 35 | for (int i = 0; i < count; i++) 36 | { 37 | MovingBoneDistraction upBone = new MovingBoneDistraction(BoneDistraction.BoneLength.Long, new Vector2(0, -velocity * velocityMultiplier)); 38 | upBone.Position = screenRectangle.Location.ToVector2() + lowerOrigin + new Vector2(0, spacing * scale.Y * (i + 1)); 39 | upBone.Rotation = MathHelper.ToRadians(90); 40 | manager.AddDistraction(upBone); 41 | 42 | MovingBoneDistraction downBone = new MovingBoneDistraction(BoneDistraction.BoneLength.Long, new Vector2(0, velocity * velocityMultiplier)); 43 | downBone.Position = screenRectangle.Location.ToVector2() + upperOrigin + new Vector2(0, -spacing * scale.Y * (i + 1)); 44 | downBone.Rotation = MathHelper.ToRadians(90); 45 | manager.AddDistraction(downBone); 46 | } 47 | 48 | return 1f; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /FileEnumerator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | 6 | namespace Desktoptale 7 | { 8 | public static class FileEnumerator 9 | { 10 | public static IEnumerable EnumerateFilesRecursive(string path, string searchPattern) 11 | { 12 | List outputPaths = new List(); 13 | 14 | try 15 | { 16 | IEnumerable directories = Directory.EnumerateDirectories(path).OrderBy(d => d); 17 | foreach (string directory in directories) 18 | { 19 | outputPaths.AddRange(EnumerateFilesRecursive(directory, searchPattern)); 20 | } 21 | } 22 | catch (Exception e) { } 23 | 24 | try 25 | { 26 | IEnumerable files = Directory.EnumerateFiles(path, searchPattern); 27 | outputPaths.AddRange(files.OrderBy(s => s)); 28 | } 29 | catch (Exception e) { } 30 | 31 | return outputPaths; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /GlobalSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale 2 | { 3 | public class GlobalSettings 4 | { 5 | public bool ClickThroughMode { get; set; } = false; 6 | public bool EnableInteractionButton { get; set; } = true; 7 | public int DistractionLevel { get; set; } = 0; 8 | public int DistractionScale { get; set; } = 2; 9 | public string DistractionWindow { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /IAnimatedSprite.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | using Microsoft.Xna.Framework.Graphics; 4 | 5 | namespace Desktoptale 6 | { 7 | public interface IAnimatedSprite 8 | { 9 | bool Playing { get;} 10 | bool Loop { get; set; } 11 | int LoopPoint { get; set; } 12 | double Framerate { get; set; } 13 | int FrameCount { get; } 14 | int StartFrame { get; set; } 15 | int CurrentFrameIndex { get; set; } 16 | Point FrameSize { get; } 17 | 18 | void Play(); 19 | void Pause(); 20 | void Stop(); 21 | void Update(GameTime gameTime); 22 | 23 | void Draw(SpriteBatch spriteBatch, 24 | Vector2 position, 25 | Color color, 26 | float rotation, 27 | Vector2 origin, 28 | Vector2 scale, 29 | SpriteEffects effects, 30 | float layerDepth); 31 | } 32 | } -------------------------------------------------------------------------------- /ICharacter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | using Microsoft.Xna.Framework.Content; 5 | using Microsoft.Xna.Framework.Graphics; 6 | 7 | namespace Desktoptale 8 | { 9 | public interface ICharacter : IPhysicsObject 10 | { 11 | CharacterProperties Properties { get; } 12 | TrackedWindow TrackedWindow { get; } 13 | 14 | Vector2 Position { get; set; } 15 | Vector2 Velocity { get; set; } 16 | Vector2 Scale { get; set; } 17 | 18 | void Initialize(Character.CharacterCreationReason reason); 19 | void Dispose(Character.CharacterRemovalReason reason); 20 | void LoadContent(ContentManager contentManager); 21 | void Update(GameTime gameTime); 22 | void Draw(GameTime gameTime, SpriteBatch spriteBatch); 23 | } 24 | } -------------------------------------------------------------------------------- /IDistractionManager.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Distractions; 2 | 3 | namespace Desktoptale 4 | { 5 | public interface IDistractionManager 6 | { 7 | void AddDistraction(IDistraction distraction); 8 | void RemoveDistraction(IDistraction distraction); 9 | } 10 | } -------------------------------------------------------------------------------- /IPhysicsObject.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | 3 | namespace Desktoptale 4 | { 5 | public interface IPhysicsObject 6 | { 7 | Rectangle HitBox { get; } 8 | float Depth { get; } 9 | 10 | void OnLeftClicked(); 11 | void OnRightClicked(); 12 | } 13 | } -------------------------------------------------------------------------------- /IState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | 3 | namespace Desktoptale 4 | { 5 | public interface IState 6 | { 7 | void Enter(StateEnterContext context); 8 | void Update(StateUpdateContext context); 9 | void Exit(StateExitContext context); 10 | } 11 | } -------------------------------------------------------------------------------- /InteractionManager.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Messages; 2 | using Desktoptale.Messaging; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale 6 | { 7 | public class InteractionManager 8 | { 9 | private MonitorManager monitorManager; 10 | private GameWindow mainWindow; 11 | private InputManager inputManager; 12 | 13 | private bool clickthrough; 14 | private bool interactionEnabled; 15 | 16 | public InteractionManager(MonitorManager monitorManager, GameWindow mainWindow, InputManager inputManager) 17 | { 18 | this.monitorManager = monitorManager; 19 | this.mainWindow = mainWindow; 20 | this.inputManager = inputManager; 21 | 22 | MessageBus.Subscribe(OnStartInteractionMessage); 23 | MessageBus.Subscribe(OnClickThroughChangedMessage); 24 | MessageBus.Subscribe(OnInteractionButtonChangedMessage); 25 | } 26 | 27 | private void OnStartInteractionMessage(StartInteractionMessage message) 28 | { 29 | if (!interactionEnabled) return; 30 | 31 | Point previousPosition = WindowsUtils.GetCursorPosition(); 32 | 33 | if(!clickthrough) WindowsUtils.MakeClickthrough(mainWindow); 34 | 35 | Point hitboxCenter = message.Target.HitBox.Center; 36 | Point clickPosition = monitorManager 37 | .ToVirtualScreenCoordinates(new Vector2(hitboxCenter.X, MathHelper.Lerp(hitboxCenter.Y, message.Target.HitBox.Bottom, 0.9f))) 38 | .ToPoint(); 39 | 40 | WindowsUtils.SetCursorPosition(clickPosition); 41 | 42 | if (inputManager.ShiftPressed) 43 | { 44 | WindowsUtils.SendRightMouseButtonDown(); 45 | WindowsUtils.SendRightMouseButtonUp(); 46 | } 47 | else 48 | { 49 | WindowsUtils.SendLeftMouseButtonDown(); 50 | WindowsUtils.SendLeftMouseButtonUp(); 51 | } 52 | 53 | WindowsUtils.SetCursorPosition(previousPosition); 54 | 55 | if(!clickthrough) WindowsUtils.MakeClickable(mainWindow); 56 | 57 | MessageBus.Send(new FocusCharacterMessage() { Character = message.Target }); 58 | } 59 | 60 | private void OnClickThroughChangedMessage(ClickThroughChangedMessage message) 61 | { 62 | clickthrough = message.Enabled; 63 | } 64 | 65 | private void OnInteractionButtonChangedMessage(InteractionButtonChangedMessage message) 66 | { 67 | interactionEnabled = message.Enabled; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 ToadsworthLP 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. 22 | -------------------------------------------------------------------------------- /MathUtilities.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale 5 | { 6 | public class MathUtilities 7 | { 8 | public static float Min(float a, float b) 9 | { 10 | return a < b ? a : b; 11 | } 12 | 13 | public static float Clamp(float value, float min, float max) 14 | { 15 | if (value < min) 16 | value = min; 17 | else if (value > max) 18 | value = max; 19 | return value; 20 | } 21 | 22 | public static float InterpolateQuadraticGetSlowerTowardsEnd(float a, float b, float t) 23 | { 24 | float oneMinusT = 1 - t; 25 | float progress = 1 - oneMinusT * oneMinusT * oneMinusT * oneMinusT; 26 | 27 | return MathHelper.Lerp(a, b, progress); 28 | } 29 | 30 | public static float SignedAngleBetween(Vector2 v, Vector2 w) 31 | { 32 | return (float)Math.Atan2((w.Y * v.X) - (w.X * v.Y), (w.X * v.X) + (w.Y * v.Y)); 33 | } 34 | 35 | public static Orientation GetClosestOrientation(Vector2 direction) 36 | { 37 | float xDot = Vector2.Dot(direction, Vector2.UnitX); 38 | float yDot = Vector2.Dot(direction, Vector2.UnitY); 39 | 40 | if (Math.Abs(xDot) > Math.Abs(yDot)) 41 | { 42 | if (direction.X < 0) return Orientation.Left; 43 | return Orientation.Right; 44 | } 45 | else 46 | { 47 | if (direction.Y < 0) return Orientation.Up; 48 | return Orientation.Down; 49 | } 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /Messages/AddCharacterMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class AddCharacterMessage 4 | { 5 | public CharacterProperties Properties { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/AddCharacterRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | 3 | namespace Desktoptale.Messages 4 | { 5 | public class AddCharacterRequestedMessage 6 | { 7 | public ICharacter Target { get; set; } 8 | public CharacterType Character { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /Messages/ChangeContainingWindowMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class ChangeContainingWindowMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | public WindowInfo Window { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messages/CharacterChangeRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | 3 | namespace Desktoptale.Messages 4 | { 5 | public class CharacterChangeRequestedMessage 6 | { 7 | public ICharacter Target { get; set; } 8 | public CharacterType Character { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /Messages/CharacterChangeSuccessMessage.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | 3 | namespace Desktoptale.Messages 4 | { 5 | public class CharacterChangeSuccessMessage 6 | { 7 | public ICharacter Target { get; set; } 8 | public CharacterType Character { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /Messages/ClickThroughChangeRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class ClickThroughChangeRequestedMessage 4 | { 5 | public bool Enabled { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/ClickThroughChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class ClickThroughChangedMessage 4 | { 5 | public bool Enabled { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/ContextMenuStateChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class ContextMenuStateChangedMessage 4 | { 5 | public bool Open { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/DisplaySettingsChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class DisplaySettingsChangedMessage 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/FocusCharacterMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class FocusCharacterMessage 4 | { 5 | public ICharacter Character { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/GlobalPauseMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class GlobalPauseMessage 4 | { 5 | public bool Paused { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/IdleRoamingChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class IdleRoamingChangedMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | public bool Enabled { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messages/InteractionButtonChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class InteractionButtonChangedMessage 4 | { 5 | public bool Enabled { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/JoinPartyMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class JoinPartyMessage 4 | { 5 | public Party Party { get; set; } 6 | public ICharacter Character { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messages/LeavePartyMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class LeavePartyMessage 4 | { 5 | public Party Party { get; set; } 6 | public ICharacter Character { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messages/OpenContextMenuRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class OpenContextMenuRequestedMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/OtherInstanceStartedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class OtherInstanceStartedMessage 4 | { 5 | public string[] Args { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/RemoveCharacterMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class RemoveCharacterMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/SavePresetRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class SavePresetRequestedMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/ScaleChangeRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class ScaleChangeRequestedMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | public float ScaleFactor { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messages/SetDistractionLevelMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class SetDistractionLevelMessage 4 | { 5 | public int Level { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/SetDistractionScaleMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class SetDistractionScaleMessage 4 | { 5 | public int Scale { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/SetDistractionTrackedWindowMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class SetDistractionTrackedWindowMessage 4 | { 5 | public WindowInfo Window { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/SetPresetFileAssociationRequestedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class SetPresetFileAssociationRequestedMessage 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/StartInteractionMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class StartInteractionMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/UnfocusAllCharactersMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class UnfocusAllCharactersMessage 4 | { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /Messages/UnfocusedMovementChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale.Messages 2 | { 3 | public class UnfocusedMovementChangedMessage 4 | { 5 | public ICharacter Target { get; set; } 6 | public bool Enabled { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Messaging/IMessageBroker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Desktoptale.Messaging 4 | { 5 | public interface IMessageBroker 6 | { 7 | Subscription Subscribe(Action handler) where T : class; 8 | Subscription Subscribe(Type messageType, Action handler); 9 | void Unsubscribe(Subscription subscription); 10 | void Send(T message); 11 | void Send(Type messageType, object message); 12 | } 13 | } -------------------------------------------------------------------------------- /Messaging/MessageBroker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Desktoptale.Messaging 5 | { 6 | public class MessageBroker : IMessageBroker 7 | { 8 | private IDictionary>> handlers; 9 | private IList<(Type type, Action handler)> invalidTargets; 10 | 11 | public MessageBroker() 12 | { 13 | handlers = new Dictionary>>(); 14 | invalidTargets = new List<(Type type, Action handler)>(); 15 | } 16 | 17 | public Subscription Subscribe(Action handler) where T : class 18 | { 19 | return Subscribe(typeof(T), msg => handler((T)msg)); 20 | } 21 | 22 | public Subscription Subscribe(Type messageType, Action handler) 23 | { 24 | Subscription subscription = new Subscription(messageType, handler); 25 | 26 | if (!handlers.ContainsKey(messageType)) handlers.Add(messageType, new HashSet>()); 27 | handlers[messageType].Add(handler); 28 | 29 | return subscription; 30 | } 31 | 32 | public void Unsubscribe(Subscription subscription) 33 | { 34 | if (handlers.ContainsKey(subscription.messageType)) 35 | handlers[subscription.messageType].Remove(subscription.handler); 36 | } 37 | 38 | public void Send(T message) 39 | { 40 | Send(typeof(T), message); 41 | } 42 | 43 | public void Send(Type messageType, object message) 44 | { 45 | if (handlers.TryGetValue(messageType, out ISet> handlerSet)) 46 | { 47 | foreach (Action handler in handlerSet) 48 | { 49 | if (handler.Target != null) 50 | { 51 | handler.Invoke(message); 52 | } 53 | else 54 | { 55 | invalidTargets.Add((messageType, handler)); 56 | } 57 | } 58 | 59 | if (invalidTargets.Count > 0) 60 | { 61 | foreach (var target in invalidTargets) 62 | { 63 | if (handlers.ContainsKey(target.type)) 64 | handlers[target.type].Remove(target.handler); 65 | } 66 | 67 | invalidTargets.Clear(); 68 | } 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /Messaging/MessageBus.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Desktoptale.Messaging 4 | { 5 | public class MessageBus 6 | { 7 | private static MessageBus instance; 8 | private IMessageBroker messageBroker; 9 | 10 | static MessageBus() 11 | { 12 | instance = new MessageBus(); 13 | } 14 | 15 | public MessageBus() 16 | { 17 | messageBroker = new MessageBroker(); 18 | } 19 | 20 | public static Subscription Subscribe(Action handler) where T : class 21 | { 22 | return instance.messageBroker.Subscribe(handler); 23 | } 24 | 25 | public static Subscription Subscribe(Type messageType, Action handler) 26 | { 27 | return instance.messageBroker.Subscribe(messageType, handler); 28 | } 29 | 30 | public static void Unsubscribe(Subscription subscription) 31 | { 32 | instance.messageBroker.Unsubscribe(subscription); 33 | } 34 | 35 | public static void Send(T message) 36 | { 37 | instance.messageBroker.Send(message); 38 | } 39 | 40 | public static void Send(Type messageType, object message) 41 | { 42 | instance.messageBroker.Send(messageType, message); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /Messaging/Subscription.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Desktoptale.Messaging 4 | { 5 | public class Subscription 6 | { 7 | internal Type messageType { get; } 8 | internal Action handler { get; } 9 | 10 | public Subscription(Type messageType, Action handler) 11 | { 12 | this.messageType = messageType; 13 | this.handler = handler; 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /Orientation.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale 2 | { 3 | public enum Orientation 4 | { 5 | Up, Down, Left, Right 6 | } 7 | } -------------------------------------------------------------------------------- /PartyManager.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Desktoptale 4 | { 5 | public class PartyManager 6 | { 7 | private IDictionary parties; 8 | 9 | public PartyManager() 10 | { 11 | this.parties = new Dictionary(); 12 | } 13 | 14 | public bool IsNewPartyNameValid(string name) 15 | { 16 | bool valid = !string.IsNullOrWhiteSpace(name); 17 | 18 | if (valid) 19 | { 20 | return !parties.ContainsKey(name); 21 | } 22 | 23 | return false; 24 | } 25 | 26 | public Party GetOrCreateParty(string name) 27 | { 28 | if (parties.ContainsKey(name)) 29 | { 30 | return parties[name]; 31 | } 32 | 33 | Party party = new Party(this, name); 34 | party.PartyDissolved += () => 35 | { 36 | parties.Remove(name); 37 | }; 38 | parties.Add(name, party); 39 | 40 | return party; 41 | } 42 | 43 | public IEnumerable GetAllParties() 44 | { 45 | return parties.Values; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Physics.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Desktoptale.Messages; 3 | using Desktoptale.Messaging; 4 | using Microsoft.Xna.Framework; 5 | 6 | namespace Desktoptale 7 | { 8 | public class Physics 9 | { 10 | public IPhysicsObject PhysicsObjectUnderCursor { get; private set; } 11 | public bool HasColliderUnderCursorChanged { get; private set; } 12 | 13 | private ISet colliders; 14 | private InputManager inputManager; 15 | private bool clickThrough; 16 | 17 | public Physics(InputManager inputManager) 18 | { 19 | this.inputManager = inputManager; 20 | 21 | colliders = new HashSet(); 22 | 23 | MessageBus.Subscribe(OnClickThroughChangedMessage); 24 | } 25 | 26 | public void Update() 27 | { 28 | IPhysicsObject physicsObject; 29 | if (clickThrough && !inputManager.CtrlPressed) 30 | { 31 | physicsObject = null; 32 | } 33 | else 34 | { 35 | physicsObject = GetColliderAtPosition(inputManager.PointerPosition.ToVector2()); 36 | } 37 | 38 | if (PhysicsObjectUnderCursor != physicsObject) HasColliderUnderCursorChanged = true; 39 | PhysicsObjectUnderCursor = physicsObject; 40 | 41 | if(inputManager.LeftClickJustPressed) PhysicsObjectUnderCursor?.OnLeftClicked(); 42 | if(inputManager.RightClickJustPressed) PhysicsObjectUnderCursor?.OnRightClicked(); 43 | 44 | if (inputManager.LeftClickJustPressed && PhysicsObjectUnderCursor == null) 45 | { 46 | MessageBus.Send(new UnfocusAllCharactersMessage()); 47 | } 48 | } 49 | 50 | public void AddCollider(IPhysicsObject physicsObject) 51 | { 52 | colliders.Add(physicsObject); 53 | } 54 | 55 | public bool RemoveCollider(IPhysicsObject physicsObject) 56 | { 57 | return colliders.Remove(physicsObject); 58 | } 59 | 60 | public IPhysicsObject GetColliderAtPosition(Vector2 position) 61 | { 62 | IPhysicsObject result = null; 63 | float lowestZ = float.MaxValue; 64 | foreach (IPhysicsObject collider in colliders) 65 | { 66 | if (collider.HitBox.Contains(position) && collider.Depth < lowestZ) 67 | { 68 | result = collider; 69 | lowestZ = collider.Depth; 70 | } 71 | } 72 | 73 | return result; 74 | } 75 | 76 | private void OnClickThroughChangedMessage(ClickThroughChangedMessage message) 77 | { 78 | clickThrough = message.Enabled; 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /Preset.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale 6 | { 7 | public class Preset 8 | { 9 | public const int FILE_FORMAT_VERSION = 1; 10 | 11 | public int Version { get; set; } 12 | public string Character { get; set; } 13 | public float XPosition { get; set; } = -1; 14 | public float YPosition { get; set; } = -1; 15 | public int Scale { get; set; } 16 | public bool IdleRoaming { get; set; } 17 | public bool UnfocusedInput { get; set; } 18 | public string Window { get; set; } 19 | public string Party { get; set; } 20 | 21 | public Preset() 22 | { 23 | Version = FILE_FORMAT_VERSION; 24 | } 25 | 26 | public Preset(Settings settings) 27 | { 28 | Version = FILE_FORMAT_VERSION; 29 | Character = settings.Character; 30 | Scale = settings.Scale; 31 | IdleRoaming = !settings.DisableIdleRoaming; 32 | UnfocusedInput = settings.UnfocusedInput; 33 | Window = settings.Window; 34 | Party = settings.Party; 35 | } 36 | 37 | public Preset(CharacterProperties properties, Func idResolver) 38 | { 39 | Version = FILE_FORMAT_VERSION; 40 | Character = idResolver.Invoke(properties.Type); 41 | XPosition = properties.Position.X; 42 | YPosition = properties.Position.Y; 43 | Scale = (int)properties.Scale.X; 44 | IdleRoaming = properties.IdleRoamingEnabled; 45 | UnfocusedInput = properties.UnfocusedInputEnabled; 46 | Window = properties.StayInsideWindow?.ProcessName; 47 | Party = properties.Party?.Name; 48 | } 49 | 50 | public void Apply(Settings settings) 51 | { 52 | settings.Character = Character; 53 | settings.Scale = Scale; 54 | settings.DisableIdleRoaming = IdleRoaming; 55 | settings.UnfocusedInput = UnfocusedInput; 56 | settings.Window = Window; 57 | settings.Party = Party; 58 | 59 | settings.Validate(); 60 | } 61 | 62 | public CharacterProperties ToCharacterProperties(Func typeResolver, Func windowResolver, Func partyResolver) 63 | { 64 | CharacterProperties result = new CharacterProperties( 65 | typeResolver.Invoke(Character), 66 | new Vector2(XPosition, YPosition), 67 | new Vector2(Scale), 68 | IdleRoaming, 69 | UnfocusedInput, 70 | windowResolver.Invoke(Window), 71 | partyResolver.Invoke(Party) 72 | ); 73 | 74 | return result; 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Remoting; 3 | using System.Runtime.Remoting.Channels; 4 | using System.Runtime.Remoting.Channels.Ipc; 5 | using System.Threading; 6 | using CommandLine; 7 | using Desktoptale.Messages; 8 | using Desktoptale.Messaging; 9 | 10 | namespace Desktoptale 11 | { 12 | public static class Program 13 | { 14 | public const string AppId = "Desktoptale-14a4cfe9-1a59-45a4-b139-870346c425cb"; 15 | public const string IpcChannelUri = "DesktoptaleIPC"; 16 | 17 | [STAThread] 18 | public static void Main(string[] args) 19 | { 20 | if (args != null && args.Length > 0) 21 | { 22 | WindowsUtils.AttachConsole(); 23 | Console.WriteLine(); 24 | 25 | Parser parser = new Parser(config => 26 | { 27 | config.HelpWriter = Console.Out; 28 | }); 29 | parser.ParseArguments(args) 30 | .WithParsed((settings) => Run(settings, args)) 31 | .WithNotParsed(e => 32 | { 33 | WindowsUtils.FreeConsole(); 34 | }); 35 | } 36 | else 37 | { 38 | var settings = new Settings(); 39 | Run(settings, args); 40 | } 41 | } 42 | 43 | private static void Run(Settings settings, string[] args) 44 | { 45 | using (Mutex mutex = new Mutex(false, AppId)) 46 | { 47 | if (!mutex.WaitOne(0)) 48 | { 49 | RunOtherInstance(args); 50 | return; 51 | } 52 | 53 | RunFirstInstance(settings); 54 | } 55 | } 56 | 57 | private static void RunFirstInstance(Settings settings) 58 | { 59 | settings.Validate(); 60 | 61 | IpcChannel channel = new IpcChannel(AppId); 62 | ChannelServices.RegisterChannel(channel, false); 63 | RemotingConfiguration.RegisterWellKnownServiceType(typeof(IpcObject), IpcChannelUri, WellKnownObjectMode.Singleton); 64 | 65 | Desktoptale game = new Desktoptale(settings); 66 | game.Run(); 67 | game.Dispose(); 68 | 69 | if (settings.PrintRegistryKeys) 70 | { 71 | WindowsUtils.FreeConsole(); 72 | } 73 | } 74 | 75 | private static void RunOtherInstance(string[] argsToPass) 76 | { 77 | IpcChannel channel = new IpcChannel(); 78 | ChannelServices.RegisterChannel(channel, false); 79 | IpcObject ipcObject = (IpcObject)Activator.GetObject(typeof(IpcObject), $"ipc://{AppId}/{IpcChannelUri}"); 80 | ipcObject.SendOtherInstanceStartedMessage(argsToPass); 81 | } 82 | 83 | private class IpcObject : MarshalByRefObject 84 | { 85 | public void SendOtherInstanceStartedMessage(string[] args) 86 | { 87 | MessageBus.Send(new OtherInstanceStartedMessage() { Args = args }); 88 | } 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /ProgramInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Desktoptale 2 | { 3 | public static class ProgramInfo 4 | { 5 | public const string NAME = "Desktoptale"; 6 | public const string AUTHOR = "Toastworth"; 7 | public const string VERSION = "1.10.0.0"; 8 | public const string VERSION_SUFFIX = ""; 9 | public const string DISCLAIMER = "UNDERTALE and DELTARUNE created by Toby Fox\nUndertale Yellow created by Team UTY\nNot affiliated with or endorsed by Toby Fox or Team UTY"; 10 | 11 | public const string CREDITS = @"Additional Credits: 12 | @sdvlex, @RedCactusSound, @Comfnani, @TsukiMoonss - Testing 13 | @yigarjpg - Custom Starlo running animation 14 | @Inky_125 - Custom Chujin/Froggit sprites 15 | UnderFail - Custom Chara sprites 16 | FanFictionGamer - Custom Asriel sprites 17 | "; 18 | 19 | public const string WELCOME_MESSAGE = @"Welcome to Desktoptale! 20 | 21 | You can control your character by clicking it and using W/A/S/D or the arrow keys to move, X or Shift to run, Z or Space to trigger a mouse click where they are standing (left click by default, right click while holding Shift) and C to play a special animation (if available). 22 | For more options such as changing or adding characters, right click on a character to open the menu. 23 | 24 | Would you like to automatically open saved preset files (.dt) with this installation in the future? (This can be done at any time from Settings > Associate Preset Files) 25 | "; 26 | } 27 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # desktoptale -------------------------------------------------------------------------------- /Registry/IRegistry.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Desktoptale.Registry 4 | { 5 | public interface IRegistry 6 | { 7 | TIdentifier Add(TElement entry); 8 | TIdentifier Add(TElement entry, bool overrideExistingEntry); 9 | bool Contains(TIdentifier id); 10 | TElement Get(TIdentifier id); 11 | TIdentifier GetId(TElement element); 12 | ICollection GetAll(); 13 | ICollection GetAllIds(); 14 | } 15 | } -------------------------------------------------------------------------------- /Registry/Registry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Desktoptale.Registry 5 | { 6 | public class Registry : IRegistry 7 | { 8 | private readonly IDictionary elements; 9 | private readonly IDictionary reverseMapping; 10 | 11 | public Registry() 12 | { 13 | elements = new Dictionary(); 14 | reverseMapping = new Dictionary(); 15 | } 16 | 17 | public string Add(TElement entry) 18 | { 19 | string key = FindKeyForNewElement(entry); 20 | 21 | elements.Add(key, entry); 22 | reverseMapping.Add(entry, key); 23 | 24 | return key; 25 | } 26 | 27 | public string Add(TElement entry, bool overrideExistingEntry) 28 | { 29 | string key = overrideExistingEntry ? entry.ToString() : FindKeyForNewElement(entry); 30 | 31 | elements[key] = entry; 32 | reverseMapping[entry] = key; 33 | 34 | return key; 35 | } 36 | 37 | public bool Contains(string id) 38 | { 39 | return elements.ContainsKey(id); 40 | } 41 | 42 | public TElement Get(string id) 43 | { 44 | if (!elements.ContainsKey(id)) throw new IndexOutOfRangeException($"Registry element lookup failed: No element with ID {id} found in registry."); 45 | 46 | return elements[id]; 47 | } 48 | 49 | public string GetId(TElement element) 50 | { 51 | if (!reverseMapping.ContainsKey(element)) throw new IndexOutOfRangeException($"Registry identifier lookup failed: Element {element} not found in registry."); 52 | 53 | return reverseMapping[element]; 54 | } 55 | 56 | public ICollection GetAll() 57 | { 58 | return elements.Values; 59 | } 60 | 61 | public ICollection GetAllIds() 62 | { 63 | return elements.Keys; 64 | } 65 | 66 | private string FindKeyForNewElement(TElement entry) 67 | { 68 | string entryName = entry.ToString(); 69 | if (!elements.ContainsKey(entryName)) 70 | { 71 | return entryName; 72 | } 73 | 74 | int i = 0; 75 | string key; 76 | do 77 | { 78 | key = $"{entryName}{i}"; 79 | } while (elements.ContainsKey(key)); 80 | 81 | return key; 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /Settings.cs: -------------------------------------------------------------------------------- 1 | using CommandLine; 2 | 3 | namespace Desktoptale 4 | { 5 | public class Settings 6 | { 7 | [Value(0)] 8 | public string Preset { get; set; } 9 | 10 | [Option("character", HelpText = "Registry key of the character to use", Default = null)] 11 | public string Character { get; set; } 12 | 13 | [Option("scale", HelpText = "Scale of the character (must be greater than 1)", Default = 2)] 14 | public int Scale { get; set; } = 2; 15 | 16 | [Option("no-idle-roaming", HelpText = "Whether to disable the Idle Roaming option", Default = false)] 17 | public bool DisableIdleRoaming { get; set; } 18 | 19 | [Option("unfocused-input", HelpText = "Whether to enable the Unfocused Input option", Default = false)] 20 | public bool UnfocusedInput { get; set; } 21 | 22 | [Option("window", HelpText = "The window the character should stay in", Default = null)] 23 | public string Window { get; set; } 24 | 25 | [Option("party", HelpText = "The party that the character should join", Default = null)] 26 | public string Party { get; set; } 27 | 28 | [Option("print-registry-keys", HelpText = "Lists the registry keys of all currently available characters", Default = false)] 29 | public bool PrintRegistryKeys { get; set; } 30 | 31 | public void Validate() 32 | { 33 | if (Scale < 1) Scale = 1; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /SpriteCache.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Microsoft.Xna.Framework.Graphics; 3 | 4 | namespace Desktoptale 5 | { 6 | public class SpriteCache 7 | { 8 | private IDictionary cache; 9 | private GraphicsDevice graphicsDevice; 10 | 11 | public SpriteCache(GraphicsDevice graphicsDevice) 12 | { 13 | this.graphicsDevice = graphicsDevice; 14 | cache = new Dictionary(); 15 | } 16 | 17 | public Texture2D Get(string path) 18 | { 19 | if (cache.ContainsKey(path)) 20 | { 21 | return cache[path]; 22 | } 23 | 24 | Texture2D texture = Texture2D.FromFile(graphicsDevice, path); 25 | cache.Add(path, texture); 26 | 27 | return texture; 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /States/Common/ActionState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class ActionState : IState 7 | { 8 | public void Enter(StateEnterContext context) 9 | { 10 | if (context.Target.ActionSprite != null) 11 | { 12 | context.Target.UpdateSprite(context.Target.ActionSprite); 13 | context.Target.CurrentSprite.Play(); 14 | } 15 | 16 | context.Target.Velocity = Vector2.Zero; 17 | } 18 | 19 | public void Update(StateUpdateContext context) 20 | { 21 | if (!context.Target.IsActive || !context.Target.InputManager.ActionButtonPressed) 22 | { 23 | context.StateMachine.ChangeState(context.Target.IdleState); 24 | } 25 | } 26 | 27 | public void Exit(StateExitContext context) 28 | { 29 | context.Target.CurrentSprite.Stop(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /States/Common/DragState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | 3 | namespace Desktoptale.States.Common 4 | { 5 | public class DragState : IState 6 | { 7 | public void Enter(StateEnterContext context) 8 | { 9 | if (context.Target.DragSprite != null) 10 | { 11 | context.Target.UpdateSprite(context.Target.DragSprite); 12 | context.Target.CurrentSprite.Play(); 13 | } 14 | } 15 | 16 | public void Update(StateUpdateContext context) 17 | { 18 | 19 | } 20 | 21 | public void Exit(StateExitContext context) 22 | { 23 | context.Target.CurrentSprite.Stop(); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /States/Common/IdleState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.Common 6 | { 7 | public class IdleState : IState 8 | { 9 | private TimeSpan idleAnimationTime; 10 | 11 | private Random rng; 12 | 13 | public IdleState() 14 | { 15 | rng = new Random(GetHashCode()); 16 | } 17 | 18 | public virtual void Enter(StateEnterContext context) 19 | { 20 | idleAnimationTime = TimeSpan.FromSeconds(10); 21 | 22 | context.Target.UpdateSprite(context.Target.IdleSprite); 23 | context.Target.CurrentSprite.Play(); 24 | 25 | context.Target.Velocity = Vector2.Zero; 26 | } 27 | 28 | public virtual void Update(StateUpdateContext context) 29 | { 30 | if (context.Target.IsActive && context.Target.InputManager.ActionButtonPressed && context.Target.ActionSprite != null) 31 | { 32 | context.StateMachine.ChangeState(context.Target.ActionState); 33 | return; 34 | } 35 | 36 | if (context.Target.IsActive && context.Target.InputManager.DirectionalInput.LengthSquared() > float.Epsilon) 37 | { 38 | context.StateMachine.ChangeState(context.Target.WalkState); 39 | return; 40 | } 41 | 42 | if (context.Target.IdleRoamingEnabled && context.Time != null && context.StateTime > idleAnimationTime && !context.Target.IsBeingDragged) 43 | { 44 | context.StateMachine.ChangeState(context.Target.RandomMovementWaitState); 45 | return; 46 | } 47 | } 48 | 49 | public virtual void Exit(StateExitContext context) 50 | { 51 | context.Target.CurrentSprite.Stop(); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /States/Common/PartyIdleState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class PartyIdleState : IState 7 | { 8 | private float walkTriggerDistance; 9 | 10 | public PartyIdleState(float walkTriggerDistance) 11 | { 12 | this.walkTriggerDistance = walkTriggerDistance; 13 | } 14 | 15 | public virtual void Enter(StateEnterContext context) 16 | { 17 | context.Target.UpdateSprite(context.Target.IdleSprite); 18 | context.Target.CurrentSprite.Play(); 19 | 20 | context.Target.Velocity = Vector2.Zero; 21 | 22 | context.Target.EnabledAutoOrientation = false; 23 | } 24 | 25 | public virtual void Update(StateUpdateContext context) 26 | { 27 | if (context.Target.Properties.Party == null) 28 | { 29 | context.StateMachine.ChangeState(context.Target.IdleState); 30 | return; 31 | } 32 | 33 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 34 | if (inFront == null) 35 | { 36 | context.StateMachine.ChangeState(context.Target.IdleState); 37 | return; 38 | } 39 | 40 | float scaleFactor = MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 41 | if ((context.Target.Position - inFront.Position).Length() > walkTriggerDistance * scaleFactor) 42 | { 43 | context.StateMachine.ChangeState(context.Target.PartyWalkState); 44 | } 45 | } 46 | 47 | public virtual void Exit(StateExitContext context) 48 | { 49 | context.Target.CurrentSprite.Stop(); 50 | 51 | context.Target.EnabledAutoOrientation = true; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /States/Common/PartyRunState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class PartyRunState : IState 7 | { 8 | private float walkTriggerDistance; 9 | 10 | private float speed; 11 | 12 | public PartyRunState(float speed, float walkTriggerDistance) 13 | { 14 | this.speed = speed; 15 | this.walkTriggerDistance = walkTriggerDistance; 16 | } 17 | 18 | public virtual void Enter(StateEnterContext context) 19 | { 20 | context.Target.UpdateSprite(context.Target.RunSprite); 21 | context.Target.CurrentSprite.Play(); 22 | 23 | context.Target.EnabledAutoOrientation = false; 24 | } 25 | 26 | public virtual void Update(StateUpdateContext context) 27 | { 28 | if (context.Target.Properties.Party == null) 29 | { 30 | context.StateMachine.ChangeState(context.Target.IdleState); 31 | return; 32 | } 33 | 34 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 35 | if (inFront == null) 36 | { 37 | context.StateMachine.ChangeState(context.Target.IdleState); 38 | return; 39 | } 40 | 41 | Vector2 toInFront = inFront.Position - context.Target.Position; 42 | float scaleFactor = MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 43 | if (toInFront.Length() < walkTriggerDistance * scaleFactor) 44 | { 45 | context.StateMachine.ChangeState(context.Target.PartyWalkState); 46 | return; 47 | } 48 | 49 | Vector2 direction = toInFront; 50 | direction.Normalize(); 51 | 52 | context.Target.Velocity = 53 | direction * 54 | speed * 55 | (context.Target.InputManager.RawDirectionalInput.X != 0 && context.Target.InputManager.RawDirectionalInput.Y != 0 ? 1.4142135624f : 1f) * 56 | (float)(context.Time != null ? context.Time.ElapsedGameTime.TotalSeconds : 0) * 57 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 58 | 59 | context.Target.Orientation = MathUtilities.GetClosestOrientation(direction); 60 | } 61 | 62 | public virtual void Exit(StateExitContext context) 63 | { 64 | context.Target.CurrentSprite.Stop(); 65 | 66 | context.Target.EnabledAutoOrientation = true; 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /States/Common/PartySpawnState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.Common 6 | { 7 | public class PartySpawnState : IState 8 | { 9 | private TimeSpan duration; 10 | 11 | public void Enter(StateEnterContext context) 12 | { 13 | duration = TimeSpan.FromSeconds((1/(context.Target.SpawnSprite.Framerate > 0 ? context.Target.SpawnSprite.Framerate : 1)) * context.Target.SpawnSprite.FrameCount); 14 | 15 | context.Target.UpdateSprite(context.Target.SpawnSprite); 16 | context.Target.CurrentSprite.Play(); 17 | 18 | context.Target.Velocity = Vector2.Zero; 19 | } 20 | 21 | public void Update(StateUpdateContext context) 22 | { 23 | if (context.Target.Properties.Party == null) 24 | { 25 | context.StateMachine.ChangeState(context.Target.IdleState); 26 | return; 27 | } 28 | 29 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 30 | if (inFront == null) 31 | { 32 | if (context.Time != null && context.StateTime > duration) 33 | { 34 | context.StateMachine.ChangeState(context.Target.IdleState); 35 | return; 36 | } 37 | 38 | return; 39 | } 40 | 41 | if (context.Time != null && context.StateTime > duration) 42 | { 43 | context.StateMachine.ChangeState(context.Target.PartyIdleState); 44 | return; 45 | } 46 | } 47 | 48 | public void Exit(StateExitContext context) 49 | { 50 | context.Target.CurrentSprite.Stop(); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /States/Common/PartyTeleportAppearState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class PartyTeleportAppearState : IState 7 | { 8 | private TimeSpan duration; 9 | 10 | public void Enter(StateEnterContext context) 11 | { 12 | duration = TimeSpan.FromSeconds((1/(context.Target.AppearSprite.Framerate > 0 ? context.Target.AppearSprite.Framerate : 1)) * context.Target.AppearSprite.FrameCount); 13 | 14 | context.Target.UpdateSprite(context.Target.AppearSprite); 15 | context.Target.CurrentSprite.Play(); 16 | } 17 | 18 | public void Update(StateUpdateContext context) 19 | { 20 | if (context.Time != null && context.StateTime > duration) 21 | { 22 | context.StateMachine.ChangeState(context.Target.PartyIdleState); 23 | return; 24 | } 25 | } 26 | 27 | public void Exit(StateExitContext context) 28 | { 29 | context.Target.CurrentSprite.Stop(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /States/Common/PartyTeleportDisappearState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.Common 6 | { 7 | public class PartyTeleportDisappearState : IState 8 | { 9 | private TimeSpan duration; 10 | 11 | public void Enter(StateEnterContext context) 12 | { 13 | duration = TimeSpan.FromSeconds((1/(context.Target.DisappearSprite.Framerate > 0 ? context.Target.DisappearSprite.Framerate : 1)) * context.Target.DisappearSprite.FrameCount); 14 | 15 | context.Target.UpdateSprite(context.Target.DisappearSprite); 16 | context.Target.CurrentSprite.Play(); 17 | 18 | context.Target.Velocity = Vector2.Zero; 19 | } 20 | 21 | public void Update(StateUpdateContext context) 22 | { 23 | if (context.Target.Properties.Party == null) 24 | { 25 | context.StateMachine.ChangeState(context.Target.IdleState); 26 | return; 27 | } 28 | 29 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 30 | if (inFront == null) 31 | { 32 | if (context.Time != null && context.StateTime > duration) 33 | { 34 | context.StateMachine.ChangeState(context.Target.IdleState); 35 | return; 36 | } 37 | 38 | return; 39 | } 40 | 41 | if (context.Time != null && context.StateTime > duration) 42 | { 43 | context.StateMachine.ChangeState(context.Target.PartyTeleportFollowState); 44 | return; 45 | } 46 | } 47 | 48 | public void Exit(StateExitContext context) 49 | { 50 | context.Target.CurrentSprite.Stop(); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /States/Common/PartyTeleportFollowState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.Common 6 | { 7 | public class PartyTeleportFollowState : IState 8 | { 9 | private float idleTriggerDistance; 10 | private TimeSpan minStateTime; 11 | 12 | public PartyTeleportFollowState(float idleTriggerDistance, TimeSpan minStateTime) 13 | { 14 | this.idleTriggerDistance = idleTriggerDistance; 15 | this.minStateTime = minStateTime; 16 | } 17 | 18 | public virtual void Enter(StateEnterContext context) 19 | { 20 | context.Target.IsVisible = false; 21 | context.Target.EnabledAutoOrientation = false; 22 | } 23 | 24 | public virtual void Update(StateUpdateContext context) 25 | { 26 | if (context.Target.Properties.Party == null) 27 | { 28 | context.StateMachine.ChangeState(context.Target.PartyTeleportAppearState); 29 | return; 30 | } 31 | 32 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 33 | if (inFront == null) 34 | { 35 | context.StateMachine.ChangeState(context.Target.PartyTeleportAppearState); 36 | return; 37 | } 38 | 39 | Vector2 toInFront = inFront.Position - context.Target.Position; 40 | float distanceToInFront = toInFront.Length(); 41 | 42 | float scaleFactor = MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 43 | if (distanceToInFront < idleTriggerDistance * scaleFactor && context.Time != null && context.StateTime >= minStateTime) 44 | { 45 | context.StateMachine.ChangeState(context.Target.PartyTeleportAppearState); 46 | return; 47 | } 48 | 49 | Vector2 direction = toInFront; 50 | direction.Normalize(); 51 | 52 | context.Target.Velocity = 53 | direction * 54 | (distanceToInFront > 200f * scaleFactor ? 500f : (context.Target.InputManager.RunButtonPressed ? Math.Max(inFront.Properties.Type.RunSpeed, 180f) : Math.Max(inFront.Properties.Type.WalkSpeed, 90f))) * 55 | (context.Target.InputManager.RawDirectionalInput.X != 0 && context.Target.InputManager.RawDirectionalInput.Y != 0 ? 1.4142135624f : 1f) * 56 | (float)(context.Time != null ? context.Time.ElapsedGameTime.TotalSeconds : 0) * 57 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 58 | 59 | context.Target.Orientation = MathUtilities.GetClosestOrientation(direction); 60 | } 61 | 62 | public virtual void Exit(StateExitContext context) 63 | { 64 | context.Target.IsVisible = true; 65 | context.Target.EnabledAutoOrientation = true; 66 | 67 | context.Target.Velocity = Vector2.Zero; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /States/Common/PartyWalkState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.Common 6 | { 7 | public class PartyWalkState : IState 8 | { 9 | private float idleTriggerDistance; 10 | private float runTriggerDistance; 11 | 12 | private float speed; 13 | private TimeSpan teleportDelay; 14 | 15 | public PartyWalkState(float speed, float idleTriggerDistance, float runTriggerDistance, TimeSpan teleportDelay) 16 | { 17 | this.speed = speed; 18 | this.idleTriggerDistance = idleTriggerDistance; 19 | this.runTriggerDistance = runTriggerDistance; 20 | this.teleportDelay = teleportDelay; 21 | } 22 | 23 | public virtual void Enter(StateEnterContext context) 24 | { 25 | context.Target.UpdateSprite(context.Target.WalkSprite); 26 | context.Target.CurrentSprite.Play(); 27 | 28 | context.Target.EnabledAutoOrientation = false; 29 | } 30 | 31 | public virtual void Update(StateUpdateContext context) 32 | { 33 | if (context.Target.Properties.Party == null) 34 | { 35 | context.StateMachine.ChangeState(context.Target.IdleState); 36 | return; 37 | } 38 | 39 | ICharacter inFront = context.Target.Properties.Party.GetCharacterInFront(context.Target); 40 | if (inFront == null) 41 | { 42 | context.StateMachine.ChangeState(context.Target.IdleState); 43 | return; 44 | } 45 | 46 | Vector2 toInFront = inFront.Position - context.Target.Position; 47 | float distanceToInFront = toInFront.Length(); 48 | 49 | float scaleFactor = MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 50 | if (distanceToInFront < idleTriggerDistance * scaleFactor) 51 | { 52 | context.StateMachine.ChangeState(context.Target.PartyIdleState); 53 | return; 54 | } 55 | 56 | Vector2 direction = toInFront; 57 | direction.Normalize(); 58 | 59 | if (context.Target.Properties.Type.Teleport && context.Target.DisappearSprite != null && context.Target.AppearSprite != null) 60 | { 61 | if (context.Time != null && context.StateTime >= teleportDelay) 62 | { 63 | context.StateMachine.ChangeState(context.Target.PartyTeleportDisappearState); 64 | } 65 | } 66 | else 67 | { 68 | if (distanceToInFront > runTriggerDistance * scaleFactor) 69 | { 70 | context.StateMachine.ChangeState(context.Target.PartyRunState); 71 | return; 72 | } 73 | 74 | context.Target.Velocity = 75 | direction * 76 | speed * 77 | (context.Target.InputManager.RawDirectionalInput.X != 0 && context.Target.InputManager.RawDirectionalInput.Y != 0 ? 1.4142135624f : 1f) * 78 | (float)(context.Time != null ? context.Time.ElapsedGameTime.TotalSeconds : 0) * 79 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 80 | 81 | } 82 | 83 | context.Target.Orientation = MathUtilities.GetClosestOrientation(direction); 84 | } 85 | 86 | public virtual void Exit(StateExitContext context) 87 | { 88 | context.Target.CurrentSprite.Stop(); 89 | 90 | context.Target.EnabledAutoOrientation = true; 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /States/Common/RandomActionState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class RandomActionState : IState 7 | { 8 | private Random rng; 9 | private TimeSpan duration; 10 | private int minLoops; 11 | private int maxLoops; 12 | 13 | public RandomActionState(int minLoops = 1, int maxLoops = 1) 14 | { 15 | this.minLoops = minLoops; 16 | this.maxLoops = maxLoops; 17 | 18 | rng = new Random(GetHashCode()); 19 | } 20 | 21 | public void Enter(StateEnterContext context) 22 | { 23 | int loops = rng.Next(minLoops, maxLoops + 1); 24 | duration = TimeSpan.FromSeconds((1/(context.Target.ActionSprite.Framerate > 0 ? context.Target.ActionSprite.Framerate : 1)) * context.Target.ActionSprite.FrameCount * (context.Target.ActionSprite.Loop ? loops : 1)); 25 | 26 | context.Target.UpdateSprite(context.Target.ActionSprite); 27 | context.Target.CurrentSprite.Play(); 28 | } 29 | 30 | public void Update(StateUpdateContext context) 31 | { 32 | if (context.Target.IsActive && context.Target.InputManager.DirectionalInput.LengthSquared() > float.Epsilon) 33 | { 34 | context.StateMachine.ChangeState(context.Target.WalkState); 35 | return; 36 | } 37 | 38 | if (context.Target.IsBeingDragged || !context.Target.IdleRoamingEnabled) 39 | { 40 | context.StateMachine.ChangeState(context.Target.IdleState); 41 | return; 42 | } 43 | 44 | if (context.Time != null && context.StateTime > duration) 45 | { 46 | context.StateMachine.ChangeState(context.Target.RandomMovementWaitState); 47 | return; 48 | } 49 | } 50 | 51 | public void Exit(StateExitContext context) 52 | { 53 | context.Target.CurrentSprite.Stop(); 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /States/Common/RandomMovementState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using SharpDX; 4 | using Vector2 = Microsoft.Xna.Framework.Vector2; 5 | 6 | namespace Desktoptale.States.Common 7 | { 8 | public class RandomMovementState : IState 9 | { 10 | private static Vector2[] directions = { 11 | new Vector2(1, 0), 12 | new Vector2(-1, 0), 13 | new Vector2(0, 1), 14 | new Vector2(0, -1) 15 | }; 16 | 17 | private float speed; 18 | 19 | private Random rng; 20 | 21 | private TimeSpan duration; 22 | private Vector2 direction; 23 | 24 | public RandomMovementState(float speed) 25 | { 26 | rng = new Random(GetHashCode()); 27 | this.speed = speed; 28 | } 29 | 30 | public void Enter(StateEnterContext context) 31 | { 32 | duration = TimeSpan.FromSeconds(0.25 + rng.NextDouble() / 2); 33 | 34 | int directionIndex = rng.Next(0, 4); 35 | direction = directions[directionIndex]; 36 | 37 | context.Target.UpdateSprite(context.Target.WalkSprite); 38 | context.Target.CurrentSprite.Play(); 39 | } 40 | 41 | public void Update(StateUpdateContext context) 42 | { 43 | if (context.Target.IsActive && context.Target.InputManager.DirectionalInput.LengthSquared() > float.Epsilon) 44 | { 45 | context.StateMachine.ChangeState(context.Target.WalkState); 46 | return; 47 | } 48 | 49 | if (context.Target.IsBeingDragged || !context.Target.IdleRoamingEnabled) 50 | { 51 | context.StateMachine.ChangeState(context.Target.IdleState); 52 | return; 53 | } 54 | 55 | if (context.Time != null && context.StateTime > duration) 56 | { 57 | context.StateMachine.ChangeState(context.Target.RandomMovementWaitState); 58 | return; 59 | } 60 | 61 | if (speed < float.Epsilon) 62 | { 63 | Orientation? orientation = context.Target.GetOrientationFromVelocity(context.Target.InputManager.DirectionalInput); 64 | if (orientation != null) 65 | { 66 | context.Target.Orientation = orientation.Value; 67 | } 68 | } 69 | 70 | context.Target.Velocity = 71 | direction * 72 | speed * 73 | (float)context.Time.ElapsedGameTime.TotalSeconds * 74 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 75 | } 76 | 77 | public void Exit(StateExitContext context) 78 | { 79 | context.Target.CurrentSprite.Stop(); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /States/Common/RandomMovementWaitState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | using SharpDX; 4 | using Vector2 = Microsoft.Xna.Framework.Vector2; 5 | 6 | namespace Desktoptale.States.Common 7 | { 8 | public class RandomMovementWaitState : IState 9 | { 10 | protected TimeSpan duration; 11 | protected Random rng; 12 | 13 | private float actionProbability; 14 | 15 | public RandomMovementWaitState(float actionProbability = 0.01f) 16 | { 17 | this.actionProbability = actionProbability; 18 | 19 | rng = new Random(GetHashCode()); 20 | } 21 | 22 | public virtual void Enter(StateEnterContext context) 23 | { 24 | duration = TimeSpan.FromSeconds(rng.NextDouble() * 10); 25 | 26 | context.Target.UpdateSprite(context.Target.IdleSprite); 27 | context.Target.CurrentSprite.Play(); 28 | 29 | context.Target.Velocity = Vector2.Zero; 30 | } 31 | 32 | public virtual void Update(StateUpdateContext context) 33 | { 34 | if (context.Target.IsActive && context.Target.InputManager.DirectionalInput.LengthSquared() > float.Epsilon) 35 | { 36 | context.StateMachine.ChangeState(context.Target.WalkState); 37 | return; 38 | } 39 | 40 | if (context.Target.IsBeingDragged || !context.Target.IdleRoamingEnabled) 41 | { 42 | context.StateMachine.ChangeState(context.Target.IdleState); 43 | return; 44 | } 45 | 46 | if (context.Time != null && context.StateTime > duration) 47 | { 48 | if (context.Target.ActionSprite == null) 49 | { 50 | context.StateMachine.ChangeState(context.Target.RandomMovementState); 51 | } 52 | else 53 | { 54 | float random = rng.NextFloat(0f, 1f); 55 | if (random <= actionProbability) 56 | { 57 | context.StateMachine.ChangeState(context.Target.RandomActionState); 58 | } 59 | else 60 | { 61 | context.StateMachine.ChangeState(context.Target.RandomMovementState); 62 | } 63 | } 64 | 65 | return; 66 | } 67 | } 68 | 69 | public virtual void Exit(StateExitContext context) 70 | { 71 | 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /States/Common/RunState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | using Microsoft.Xna.Framework; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class RunState : WalkState 7 | { 8 | public RunState(float speed, bool useRawInput) : base(speed, useRawInput) 9 | { 10 | } 11 | 12 | public override void Enter(StateEnterContext context) 13 | { 14 | context.Target.UpdateSprite(context.Target.RunSprite); 15 | context.Target.CurrentSprite.Play(); 16 | } 17 | 18 | public override void Update(StateUpdateContext context) 19 | { 20 | if (context.Target.IsActive && context.Target.InputManager.ActionButtonPressed && context.Target.ActionSprite != null) 21 | { 22 | context.StateMachine.ChangeState(context.Target.ActionState); 23 | return; 24 | } 25 | 26 | if (!context.Target.IsActive || context.Target.InputManager.DirectionalInput.LengthSquared() < float.Epsilon) 27 | { 28 | context.StateMachine.ChangeState(context.Target.IdleState); 29 | return; 30 | } 31 | 32 | if (!context.Target.InputManager.RunButtonPressed) 33 | { 34 | context.StateMachine.ChangeState(context.Target.WalkState); 35 | return; 36 | } 37 | 38 | if (Speed < float.Epsilon) 39 | { 40 | Orientation? orientation = context.Target.GetOrientationFromVelocity(context.Target.InputManager.DirectionalInput); 41 | if (orientation != null) 42 | { 43 | context.Target.Orientation = orientation.Value; 44 | } 45 | } 46 | 47 | context.Target.Velocity = 48 | (UseRawInput ? context.Target.InputManager.RawDirectionalInput : context.Target.InputManager.DirectionalInput) * 49 | Speed * 50 | (float)context.Time.ElapsedGameTime.TotalSeconds * 51 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /States/Common/SpawnState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Characters; 3 | 4 | namespace Desktoptale.States.Common 5 | { 6 | public class SpawnState : IState 7 | { 8 | private TimeSpan duration; 9 | 10 | public void Enter(StateEnterContext context) 11 | { 12 | duration = TimeSpan.FromSeconds((1/(context.Target.SpawnSprite.Framerate > 0 ? context.Target.SpawnSprite.Framerate : 1)) * context.Target.SpawnSprite.FrameCount); 13 | 14 | context.Target.UpdateSprite(context.Target.SpawnSprite); 15 | context.Target.CurrentSprite.Play(); 16 | } 17 | 18 | public void Update(StateUpdateContext context) 19 | { 20 | if (context.Target.IsActive && context.Target.InputManager.DirectionalInput.LengthSquared() > float.Epsilon) 21 | { 22 | context.StateMachine.ChangeState(context.Target.WalkState); 23 | return; 24 | } 25 | 26 | if (context.Target.IsBeingDragged) 27 | { 28 | context.StateMachine.ChangeState(context.Target.IdleState); 29 | return; 30 | } 31 | 32 | if (context.Time != null && context.StateTime > duration) 33 | { 34 | context.StateMachine.ChangeState(context.Target.IdleState); 35 | return; 36 | } 37 | } 38 | 39 | public void Exit(StateExitContext context) 40 | { 41 | context.Target.CurrentSprite.Stop(); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /States/Common/WalkState.cs: -------------------------------------------------------------------------------- 1 | using Desktoptale.Characters; 2 | 3 | namespace Desktoptale.States.Common 4 | { 5 | public class WalkState : IState 6 | { 7 | protected float Speed; 8 | protected bool UseRawInput; 9 | 10 | public WalkState(float speed, bool useRawInput) 11 | { 12 | this.Speed = speed; 13 | this.UseRawInput = useRawInput; 14 | } 15 | 16 | public virtual void Enter(StateEnterContext context) 17 | { 18 | context.Target.UpdateSprite(context.Target.WalkSprite); 19 | context.Target.CurrentSprite.Play(); 20 | } 21 | 22 | public virtual void Update(StateUpdateContext context) 23 | { 24 | if (context.Target.IsActive && context.Target.InputManager.ActionButtonPressed && context.Target.ActionSprite != null) 25 | { 26 | context.StateMachine.ChangeState(context.Target.ActionState); 27 | return; 28 | } 29 | 30 | if (!context.Target.IsActive || context.Target.InputManager.DirectionalInput.LengthSquared() < float.Epsilon) 31 | { 32 | context.StateMachine.ChangeState(context.Target.IdleState); 33 | return; 34 | } 35 | 36 | if (context.Target.InputManager.RunButtonPressed) 37 | { 38 | context.StateMachine.ChangeState(context.Target.RunState); 39 | return; 40 | } 41 | 42 | if (Speed < float.Epsilon) 43 | { 44 | Orientation? orientation = context.Target.GetOrientationFromVelocity(context.Target.InputManager.DirectionalInput); 45 | if (orientation != null) 46 | { 47 | context.Target.Orientation = orientation.Value; 48 | } 49 | } 50 | 51 | context.Target.Velocity = 52 | (UseRawInput ? context.Target.InputManager.RawDirectionalInput : context.Target.InputManager.DirectionalInput) * 53 | Speed * 54 | (float)context.Time.ElapsedGameTime.TotalSeconds * 55 | MathUtilities.Min(context.Target.Scale.X, context.Target.Scale.Y); 56 | } 57 | 58 | public virtual void Exit(StateExitContext context) 59 | { 60 | context.Target.CurrentSprite.Stop(); 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /States/GasterBlaster/BlasterAppearState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Distractions; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.GasterBlaster 6 | { 7 | public class BlasterAppearState : IState 8 | { 9 | private IState nextState; 10 | private float targetRotation; 11 | private Vector2 initialPosition; 12 | private Vector2 targetPosition; 13 | private TimeSpan animationDuration; 14 | private float flyInDistance; 15 | 16 | public BlasterAppearState(IState nextState, float targetRotation, TimeSpan animationDuration, float flyInDistance) 17 | { 18 | this.nextState = nextState; 19 | this.targetRotation = targetRotation; 20 | this.animationDuration = animationDuration; 21 | this.flyInDistance = flyInDistance; 22 | } 23 | 24 | public void Enter(StateEnterContext context) 25 | { 26 | Vector2 movementVector = Vector2.Transform(new Vector2(0, 1), Matrix.CreateRotationZ(targetRotation)); 27 | initialPosition = context.Target.Position - movementVector * flyInDistance; 28 | targetPosition = context.Target.Position; 29 | 30 | context.Target.BlasterOpacity = 0f; 31 | context.Target.Rotation = targetRotation - (float)Math.PI; 32 | } 33 | 34 | public void Update(StateUpdateContext context) 35 | { 36 | float progress = MathUtilities.Clamp(context.StateTime.Ticks / (float)animationDuration.Ticks, 0, 1); 37 | context.Target.BlasterOpacity = progress; 38 | 39 | float smoothProgress = MathUtilities.InterpolateQuadraticGetSlowerTowardsEnd(0, 1, progress); 40 | context.Target.Rotation = MathHelper.Lerp(targetRotation - (float)Math.PI, targetRotation, smoothProgress); 41 | context.Target.Position = Vector2.Lerp(initialPosition, targetPosition, smoothProgress); 42 | 43 | if (context.StateTime > animationDuration) 44 | { 45 | context.StateMachine.ChangeState(nextState); 46 | } 47 | } 48 | 49 | public void Exit(StateExitContext context) 50 | { 51 | 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /States/GasterBlaster/BlasterFireState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Distractions; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale.States.GasterBlaster 6 | { 7 | public class BlasterFireState : IState 8 | { 9 | private TimeSpan fireTime; 10 | private Vector2 velocity; 11 | 12 | private float acceleration = 2f; 13 | private Vector2 movementVector; 14 | 15 | public BlasterFireState(TimeSpan fireTime) 16 | { 17 | this.fireTime = fireTime; 18 | } 19 | 20 | public void Enter(StateEnterContext context) 21 | { 22 | movementVector = Vector2.Transform(new Vector2(0, -1), Matrix.CreateRotationZ(context.Target.Rotation)); 23 | 24 | context.Target.BlasterSprite.Play(); 25 | } 26 | 27 | public void Update(StateUpdateContext context) 28 | { 29 | velocity += movementVector * acceleration; 30 | context.Target.Position += velocity * (float)context.Time.ElapsedGameTime.TotalSeconds; 31 | 32 | acceleration += acceleration * (acceleration * 0.55f) * (float)context.Time.ElapsedGameTime.TotalSeconds; 33 | 34 | float progress = MathUtilities.Clamp(context.StateTime.Ticks / (float)fireTime.Ticks, 0, 1); 35 | float beamLevel = GetBeamLevelAtTime(progress); 36 | 37 | context.Target.BeamOpacity = beamLevel; 38 | context.Target.BeamWidth = beamLevel + (float)Math.Sin(context.StateTime.TotalSeconds * 50f) * 0.1f; 39 | 40 | context.Target.BlasterOpacity = progress > 0.85f ? MathHelper.Lerp(1, 0, 5 * (progress - 0.85f)) : 1f; 41 | 42 | if (context.StateTime > fireTime) 43 | { 44 | context.Target.Disposed = true; 45 | } 46 | } 47 | 48 | public void Exit(StateExitContext context) 49 | { 50 | 51 | } 52 | 53 | private float GetBeamLevelAtTime(float t) 54 | { 55 | if (t < 0.05f) 56 | { 57 | return 0f; 58 | } 59 | else if (t < 0.1f) 60 | { 61 | return MathHelper.Lerp(0, 1, (t - 0.05f) * 20); 62 | } 63 | else if (t < 0.5f) 64 | { 65 | return 1f; 66 | } 67 | else 68 | { 69 | float val = 2 * (t - 0.5f); 70 | float final = 1 - (float)Math.Pow(val, 2); 71 | return final; 72 | } 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /States/GasterBlaster/BlasterWaitState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Desktoptale.Distractions; 3 | 4 | namespace Desktoptale.States.GasterBlaster 5 | { 6 | public class BlasterWaitState : IState 7 | { 8 | private IState nextState; 9 | private TimeSpan delayTime; 10 | 11 | public BlasterWaitState(IState nextState, TimeSpan delayTime) 12 | { 13 | this.nextState = nextState; 14 | this.delayTime = delayTime; 15 | } 16 | 17 | public void Enter(StateEnterContext context) 18 | { 19 | 20 | } 21 | 22 | public void Update(StateUpdateContext context) 23 | { 24 | if (context.StateTime > delayTime) 25 | { 26 | context.StateMachine.ChangeState(nextState); 27 | } 28 | } 29 | 30 | public void Exit(StateExitContext context) 31 | { 32 | 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /TrackedWindow.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | 3 | namespace Desktoptale 4 | { 5 | public class TrackedWindow 6 | { 7 | public delegate void TrackedWindowDestroyedEventHandler(); 8 | 9 | public event TrackedWindowDestroyedEventHandler WindowDestroyed; 10 | 11 | public Rectangle Bounds { get; set; } 12 | public WindowInfo Window { get; } 13 | 14 | public TrackedWindow(WindowInfo window) 15 | { 16 | Window = window; 17 | } 18 | 19 | public void NotifyWindowDestroyed() 20 | { 21 | WindowDestroyed?.Invoke(); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /WindowInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Desktoptale 4 | { 5 | public class WindowInfo 6 | { 7 | public string Title; 8 | public string ProcessName; 9 | public IntPtr hWnd; 10 | } 11 | } -------------------------------------------------------------------------------- /WindowTracker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Microsoft.Xna.Framework; 4 | 5 | namespace Desktoptale 6 | { 7 | public class WindowTracker 8 | { 9 | private IDictionary trackedWindows; 10 | private IDictionary usages; 11 | 12 | private MonitorManager monitorManager; 13 | private bool changed = false; 14 | 15 | private IEnumerator windowUpdateEnumerator; 16 | 17 | public WindowTracker(MonitorManager monitorManager) 18 | { 19 | this.monitorManager = monitorManager; 20 | 21 | trackedWindows = new Dictionary(); 22 | usages = new Dictionary(); 23 | } 24 | 25 | public void Update() 26 | { 27 | if (trackedWindows.Count == 0) 28 | { 29 | windowUpdateEnumerator?.Dispose(); 30 | return; 31 | } 32 | 33 | if (changed) 34 | { 35 | windowUpdateEnumerator?.Dispose(); 36 | windowUpdateEnumerator = null; 37 | changed = false; 38 | } 39 | 40 | if (windowUpdateEnumerator == null) 41 | { 42 | windowUpdateEnumerator = trackedWindows.Values.GetEnumerator(); 43 | } 44 | 45 | bool last = !windowUpdateEnumerator.MoveNext(); 46 | if (last) 47 | { 48 | windowUpdateEnumerator.Reset(); 49 | windowUpdateEnumerator.MoveNext(); 50 | } 51 | 52 | TrackedWindow current = windowUpdateEnumerator.Current; 53 | UpdateWindow(current); 54 | } 55 | 56 | public TrackedWindow Subscribe(WindowInfo window) 57 | { 58 | if (!trackedWindows.ContainsKey(window.hWnd)) 59 | { 60 | trackedWindows.Add(window.hWnd, new TrackedWindow(window)); 61 | usages.Add(window.hWnd, 0); 62 | changed = true; 63 | } 64 | 65 | usages[window.hWnd]++; 66 | return trackedWindows[window.hWnd]; 67 | } 68 | 69 | public void Unsubscribe(WindowInfo window) 70 | { 71 | var updatesUses = --usages[window.hWnd]; 72 | 73 | if (updatesUses <= 0) 74 | { 75 | trackedWindows.Remove(window.hWnd); 76 | usages.Remove(window.hWnd); 77 | changed = true; 78 | } 79 | } 80 | 81 | private void UpdateWindow(TrackedWindow window) 82 | { 83 | Rectangle? rect = WindowsUtils.GetWindowRect(window.Window.hWnd); 84 | if (rect.HasValue) 85 | { 86 | Rectangle val = rect.Value; 87 | val.Location = monitorManager.ToMonoGameCoordinates(val.Location.ToVector2()).ToPoint(); 88 | window.Bounds = val; 89 | } 90 | else 91 | { 92 | window.Bounds = Rectangle.Empty; 93 | window.NotifyWindowDestroyed(); 94 | changed = true; 95 | } 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | true/pm 39 | permonitorv2,permonitor 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToadsworthLP/desktoptale/4afbef5f9d97696ffdfc825476cef1800f14ec59/icon.ico --------------------------------------------------------------------------------