How to make a complex upgrade mechanic?

I’m making a top-down shooter roguelike, and for the level-up mechanic I am trying to make something somewhat complex, and I need some help on what to do. I want the mechanic to be card-based. There are a bunch of cards, each with different things. Upon level-up, some cards should be drawn and displayed. These cards can be dragged to one of 5 places, 1 upgrade, 2 normal downgrade, and 2 double downgrade. When the player puts a card on one of the 5 spaces, other cards will have their colors changed based on certain variables. There will be 3 buttons: reroll*, skip*, and confirm. For the confirm button, it will check that there is a card in the upgrade section and a card in at least one of the downgrade sections, and that the card in the upgrade section doesn’t have the same value of a variable as any in the downgrade sections. Then, if the conditions are met, the player will have their stats modified based on the cards in each of the sections.

*I will attach a video showcasing roughly what I want below:
You start with 4 rerolls, forgot to note that in the video

If anyone knows of a free asset close to this, or is able to give me some pointers for how to do this myself, please let me know. If you need further clarification, let me know and I’ll get back to you.

I think i get what you want to do from the video that you posted , here are some remarks :

  • You don’t want to do this kind of stuff with an asset , free or not , with something that seems like such a core feature to the game , the more knowledge and hands-on control you have the better , you want to reduce dependencies as much as possible.
  • You didn’t specify which aspects do you need help with , is it the internal implementation of the system ? is it the visual aspect of having cards and shuffling/drag and dropping ? both ?
  • It would be nice to get a sense of your proficiency with C# / Unity , to know where to start from when it comes to advice.

Now , ill just assume that you need help with the whole thing , so here are some general pointers that come to my head for now :

  • Use ScriptableObjects to define your cards effects , this can depend on the complexity , but it can vary from having each card being a ScriptableObject itself , to the card being a “container” ScriptableObject that has arrays of effect like below (something that i personally would go towards)
public class CardData : ScriptableObject
{
     public Sprite backgroundImage;
     public string cardName;
     public string cardDescription;
     public CardEffectProvider[] cardEffectProviders
     public CardConditionValidator[] cardValidators;
}

This is just an example , but you can imagine the effects are an array of what the card can do when it’s used , and the validators are conditions that need to be met in order to be able to play the card (this is just pure speculation about what you need , and it’s just to get the point across)

  • Make use of the IPointerEnterHandler , IPointerExitHandler, IBeginDragHandler, IEndDragHandler and the other related interfaces that facilitate dealing with drag and dropping things and interactions in general.
  • Try to program your system where you operate with the ScriptableObjects as much as possible instead of dealing with the cards asMonoBehaviours , you will thank yourself for that once you reach a point where you want to “simulate” or “preview” a certain card combination/mix , you don’t really need to do the whole prefab spawning for the cards just to “preview” their effect or do a stat comparison , you can do that while strictly using the scriptables and the data they provide.

If you need other specific tips/advice ill try to respond.