Rasmus Winterhag Portfolio

This page contains a preview of all my notable projects, click the name of the project to see more information and my contributions!.

View on GitHub
NewFolder

Back

New Folder

Itch Page

Worked as Programmer
2024 november - 2025 June
Language: c#
Nominated and won Swedish Game Awards 2025 in the category “best outside of the box”


I worked on a little bit of everything but some highlights are:

The glitch system was designed so you could easily customize it as a developer.

The glitch system viewed from unity I wanted to make it so only the relevant values showed up for what you had selected, but unfortunatly i couldnt figure it out when it was in an array. So I settled for this.
The glitch events in code

[Serializable]
public class GlitchEvents
{
    public enum Trigger
    {
        FolderUnlocked,
        FolderOpend,
        WindowOpened,
        WindowClosed,
        SoundPlayed,
        iconBinned,
        ShutDown,
        EmailOpened,
        PinOpened,
        ImageAssembled,
        DoorKnocked
    }

    public enum Function
    {
        OpenWindow,
        SpamWindows,
        MoveWindow,
        StealWindow,
        ScatterIcons,
        ActivatePhysics,
        CreateFolder,
        WindowShake,
        ScreenGlitch,
        DebugLog
    }

    public enum ScatterType
    {
        DESKTOP,
        TRASHCAN,
        OPENED
    }

    [Tooltip("Make negative for unlimited uses")] public int triggerCount;
    [Tooltip("if the list is empty the glitch wont play a sound")] public AudioClip[] glitchSounds;

    [Header("----------------Trigger Settings----------------")]
    public Trigger trigger;

    [Header("Folder unlocked | Folder Opend | iconBinned | PinOpend")]
    public string iconToCheck;

    [Header("Window Opened | Window Closed | iconBinned | PinOpend")]
    public WindowData dataToCheckFor;

    [Header("Window Opened | PinOpend")] 
    public Icon.IconType iconType;

    [Header("Sound Played")]
    public AudioClip soundClip;

    [Header("Email")]
    public int emailId;


    [Header("----------------Function Settings----------------")]
    public Function function;

    [Header("Open Window")]
    public GameObject windowToOpen;
    public WindowData windowData;
    public Vector2 spawnPosition;

    [Header("Window Spam")]
    public int spamCount;
    public GameObject[] windowsToSpam;
    public WindowData[] windowSpamData;
    public float delayBetweenWindows = 0.1f;

    [Header("Move Window")]
    public float mouseSpeed = 10f;
    [Tooltip("Index of window to move, lower is higher up")] public int windowToTarget = 0;
    public Vector2 targetPosition;

    [Header("Window To Steal")]
    [Tooltip("Index of window to steal, lower is higher up")] public int windowToSteal = 0;

    [Header("Scatter Icons")]
    [Tooltip("What folder whill scatter all of its and its subfolders icons")] public ScatterType folderToScatter;

    [Header("Time for scatter, screen glitch and physics to activate")]
    public float totalGlitchTime;

    [Header("Create Folder")]
    public Vector2 folderPosition;
    public string folderName;

    [Header("WindowShake")]
    public int windowToShake;
    public float shakeIntensity;
    public float timeToShake = 1;

    [Header("Debug Log")]
    public string log;
}

and here is what is using the GlitchEvents to trigger the GlitchFunctions

GlitchEvents TriggerChecker(GlitchEvents.Trigger type, WindowData windowData = null, string GUID = null, int id = 0, Icon icon = null, Icon.IconType iconType = 0)
    {
        foreach (GlitchEvents item in glitchEvents)
        {
            if (type != item.trigger || item.triggerCount == 0) { continue; }

            switch (type)
            {
                case GlitchEvents.Trigger.FolderUnlocked:
                    if (item.iconToCheck == GUID)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.FolderOpend:
                    if (item.iconToCheck == GUID)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item, icon);
                    }
                    break;
                case GlitchEvents.Trigger.WindowOpened:
                    if (item.dataToCheckFor == windowData || item.iconType == iconType)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.WindowClosed:
                    if (item.dataToCheckFor == windowData)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.SoundPlayed:
                    if (CheckForSound(item.soundClip))
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.iconBinned:
                    if ((item.iconToCheck == GUID || item.dataToCheckFor == windowData) && (item.iconType == iconType || item.iconType == Icon.IconType.Missing))
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.ShutDown:
                    glitchEventsToDecrease.Add(item);
                    FunctionStarter(item);
                    break;
                case GlitchEvents.Trigger.EmailOpened:
                    if (item.emailId == id)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.PinOpened:
                    if (item.iconToCheck == GUID || item.dataToCheckFor == windowData || item.iconType == iconType)
                    {
                        glitchEventsToDecrease.Add(item);
                        FunctionStarter(item);
                    }
                    break;
                case GlitchEvents.Trigger.ImageAssembled:
                    glitchEventsToDecrease.Add(item);
                    FunctionStarter(item);
                    break;
                case GlitchEvents.Trigger.DoorKnocked:
                    glitchEventsToDecrease.Add(item);
                    FunctionStarter(item);
                    break;
            }

        }
        DecreaseUses();
        return null;
    }

Screenshots