---
# System prepended metadata

title: 'Labb 3: Arv - Slay the spire-klon'
tags: [inlämningsuppgift]

---

# Labb 3: Arv - Slay the spire-klon

I den här labben ska vi öva på att använda klasser och arv i Unity. Labben går ut på att vi ska bygga kort-mekaniken från spel som till exempel [Slay the Spire](https://en.wikipedia.org/wiki/Slay_the_Spire). I det spelet har man en hand med kort som har olika funktioner. Man spelar kort på antingen sin fiende eller sig själv för att till exempel göra skada eller heala.

![image](https://hackmd.io/_uploads/HJ4VHkXZ-g.png)

I labben får du skal till spelet i form av ett Unity projekt. I projektet finns funktionalitet för att visa upp kort och kunna dra runt dem på skärmen. Din uppgift blir att framförallt skapa kort-klasser där du implementerar olika kort-funktioner.


### Beskrivning av projektet

I Unity-projektet finns följande:

**Monobehaviour (Unity-skript)**
* `GameManager` - hanterar din hand med kort och hur kort-objektet interagerar med musen
* `CardView` - skript som ligger på kort-objektet och hanterar att visa upp information om korten
* `Character` - skript som ligger på karaktärerna och hanterar deras liv

**Rena C#-klasser**
* `Card` - representerar ett kort och ska innehålla information om kortets egenskaper och funktioner
* `Deck` - representerar alla spelarens kort och hanterar funktioner för att dra och slänga kort.


### 0. Förberedelse

Använd länken på classroom för att acceptera uppgiften i github-classroom. Då får du ett git-repository med ett Unity projekt som du ska klona i Github desktop och öppna i Unity Hub. Gör det till en vana att commita och pusha i slutet av varje lektion eller efter varje gång du har jobbat på projektet.

### 1. Kort-klassen


I projektet har du fått en ganska tom klass `Card`. Här ska du fylla på med attribut för *namn, beskrivning, sprite-index (alltså siffra som motsvarar vilken sprite som ska användas, se nästa steg) och kostnad* och en konstruktor som ger värden till alla attribut utifrån argument.

Skapa även get-metoder för varje attribut.

### 2. CardView

I skriptet cardView finns referenser till Unity objekt som ska användas för att visa kortet. Fyll på i metoden `Init(Card card)` så att texterna får värden utifrån card-variabeln. Sprite för kortet ska sättas utifrån listan på sprites och index angivet i Card-klassen. Vilka sprites som finns i listan anger du i inspektorn i Unity för kort-prefaben.

Testa att det funkar genom att i `Deck`s metod `DrawNextCard` returnera ett test-kort. Spela spelet och trycka på Enter för att dra ett nytt kort.

### 3. Deck

I `Deck`-klassen ska du skapa två listor av `Card`s - en för en "draghög" och en för "slänghög".

Skapa en konstruktor för klassen där du skapar och lägger till kort i draghögen. Använd metoden `Shuffle` för att blanda draghögen.

Implementera metoden `DrawNextCard` som ska returnera första korten i draghögen. Om draghögen är tom ska alla flyttas från kasthögen till draghögen.

Implementera även metoden `DiscardCard(Card card)` som ska lägga till kort i kasthögen.

### 4. Skapa olika kort

Nu har vi en grund vi faktiskt kan bygga på! 

Skapa följande två subklasser till Card. Lägg till relevanta attribut och overrida metoden `Use`. Lägg även till konstruktorer som anropar superklassens konstruktor samt ger värde till de specifika attributen

* `AttackCard` med attribut för skada. Use-metoden ska göra skada på karaktären som anges genom `ChangeHealth` metoden.
* `HealCard` med attribut för hur mycket kortet ska heala. Use-metoden ska göra återställa hälsa på karaktären genom `ChangeHealth` metoden.

Testa dina nya kort-klasser genom att lägga till dem i din Deck-klass.

### 5. Extra funktionalitet

Det finns mycket man kan göra om man vill bygga vidare på det här projektet!
Förslag:

* Gör om GetDescription metoden i Card-klassen till virtual och overrida den i subklasserna så att de även tar med deras specifika attribut i beskrivningen.
* Lägg till i karaktärsklassen att de kan ha *Armor* som fungerar som extra hälsa. Skapa en nya slags kort som ökar armor, minskar armor och attackerar genom att ignorerar armor.
* Gör en subklass till `Character` som heter `EnemyCharacter`. Lägg till en metod och eventuella attribut för att karaktären ska göra skada på spelaren. Anropa metoden från GameManager-klassen i NextTurn-metoden.
* Just nu används inte kostnaden för korten till något. Lägg till att man har ett begränsad antal "energi" att spendera varje runda, och att när man spelar ett kort dras kostnaden från energin.
* Just nu är din kortlek hårdkodad i konstruktorn till Deck. Ändra så att kortleken skapas utifrån en text-fil där varje rad i textfilen motsvarar ett kort.
