Pål Schakonat

+46732632905

 

Deep Down 7

Deep down 7 is a deck building rouge lite made in UNITY

Game systems

Game Loops

Deep down 7 is a deck-building rogue-lite inspired by the game Slay the spire. 

The purpose in this piece is to use Slay the spire's core gameplay with an extra game loop on top of it to add more replayability. My inspiration comes from the rogue-lite Darkest Dungeon. The heroes in Darkest dungeon gains buffs and nerfs in the dungeons and then you remove some of the nerfs in the city.

 

I wanted to try this with my cards i.e. get buffs and nerfs that you can manage. I call this "the possess system". The green boxes (see picture below) represent the systems that I implemented in this portfolio. My theory is that if these systems are engaging, then the core part of the game would be engaging. My next chapter cover a post mortem of the possess system.

Divisions of the systems

  • Villages​​ - Managning buffs and nerfs, deck building

  • Dungeon - Deck management and life/reward risk managment 

  • Encounters - Sets up plays, combos

  • Player/Enemy turn - Defend/attack risk management

Overview

Possess System - Post Mortem

Possess system replace Slay the spire core reward system.

The card that kills a possessed enemy gets upgraded. The possess system is the only system I completely invented myself and with that comes high risk. The possesses change the core reward system from my reference game Slay the spire. Slay the spire rewards the player with a new card while I reward the player with upgrading an already existing card.   

Possess as a reward

Possesses as a reward doesn't create a synergy narrative

Possesses and getting a new card can appear equally strong as a reward, since they both affect the strength of the deck. However, I think gaining a new card has a stronger impression on the player. I believe the strong impact of getting a new card is due to the synergy narrative that the player forms in their head.

 

When the player is rewarded with an interesting card, the player sees possible plays with cards in their deck. For example, when the player is rewarded with a card that gives “double block” and have the card “Deal damage equal to your block” in their deck, they immediately get the feeling of synergy. The player creates a narrative where the player plays both cards on the same turn. I believe that rewarding every combat with this strong synergy narrative is what put Slay the spire on this written moment at no. 2 on meta critic for newly releases to PC. 

Conclusion

If I completed the whole game, I would add the possibility to gain a new card as a reward every time you win a combat. I think the possess system creates a strong long-term meta game, but not the immediate impact that gaining a new card provides. 

"I believe that rewarding every combat with this strong synergy narrative is what put Slay the spire on this written moment at no. 2 on meta critic for newly releases to PC games"

Here I use the same object shaker to show card abilities on different targets
if (!myPlayer.myTryUseCardEnergy(mySelectedCard.myGetCardData().myGetEnergyCost()))
{
    Shaker.self.myShakeObject(myPlayer.getct, myObjShakeDuration, myObjShakeMagnitud); 
    Shaker.self.myShakeObject(mySelectedCard.gameObject, myObjShakeDuration, myObjShakeMagnitud);
    return false;
}
Code Sample: This function checks if I had energy to cast my card. I simply added two lines of code in an already existing "has card energy" check. This implementation took almost no time and I used it in the final version.
Playtest as quickly as possible with an object shaker
Communication is vital to test your game in a proper way. You want to add it as quickly as possible to start your playtest. I added a singleton that so I could shake any object with a single line of code. With this implemented early I could start to give feedback to the player immediately after I added a new feature.

Communication

private void myResolveAbilities(AbilityData data)
{
   
for (int i = 0; data.myGetAbilityList().Count > i; i++)
    {
        
BasicAbility ability = data.myGetAbilityList()[i];

        switch (ability.myGetTarget()) {

            case myTargetType.Player:
                myPlayer.myTargetByAbility(ability);
                
break;

            case myTargetType.FrontEnemy:
                myUseAbilityOnEnemy(ability);
                
break;

            case myTargetType.RangeSingelEnemy:
                myUseAbilityOnEnemy(ability);
                
break;

            case myTargetType.IsNotUsed:
                
break;
                            
            
default:
                print("no Targets");
                
break
        }
    }

    myUpdateEnemiesDeaths();
}

Code Sample: Here you see an agnostic function for abilities used by both enemies and player cards. It takes an ability data where it extracts a list of all different abilities and applies these to relevant targets. The ability list can change in size and doesn't need to be rewritten if I add new abilities.
I use the same ability class for cards and enemies. This means that when I add a new ability to a card, I can also add that same ability as an enemy attack. For example, if I have the ability "player draws X cards", it can be used on both enemies and player cards.

Agnostic Abilities