Problem developing a turn-based battle system - python

So, I have recently got into coding and I am currently developing a small turn-based RPG, but I have encountered some real issue with the battle system. I am still learning and I never thought about asking questions here. Anyway, after getting many things done correctly, I have encountered this issue where using the defend command rises the player hp for some reason. Here is the code:
import random
import sys
import os
class Entity():
def __init__(self, hp, atk, dif):
self.hp = hp
self.atk = atk
self.dif = dif
class Battle():
def Attack(self, attacker, defender):
damage = attacker.atk - defender.dif
defender.hp -= damage
def Combat(self, player, enemy):
turns = []
while True:
while len(turns) < 5:
turn = random.randint(1, 2)
if turn == 1:
turns.append("player")
else:
turns.append("enemy")
for current_turn in turns:
print(player.hp, enemy.hp)
if current_turn == "player":
print(f"TURNS: \n{current_turn}\n{turns[turns.index(current_turn)+ 1:]}")
choice = input("1. Attack\n2. Defend\n")
if choice == "1":
self.Attack(player, enemy)
player.dif = 20
elif choice == "2":
player.dif *= 2
else:
print("Lost your chance!")
elif current_turn == "enemy":
print("Enemy turn!")
print(f"Next turns are: {turns}")
enemy_choice = random.randint(1, 2)
if enemy_choice == 2:
print("He attacks you!")
self.Attack(enemy, player)
enemy.dif = 0
else:
print("He defends himself.")
enemy.dif = 10
os.system("clear")
turns.pop(0)
if player.hp <= 0:
print("You died!")
sys.exit(0)
elif enemy.hp <= 0:
print("YOU WON!")
sys.exit(0)
break
charachter = Entity(100, 15, 15)
boss = Entity(300, 40, 0)
testbattle = Battle()
testbattle.Combat(charachter, boss)

In your Battle.Attack method:
def Attack(self, attacker, defender):
damage = attacker.atk - defender.dif
defender.hp -= damage
If attacker.atk - defender.dif is a negative number, then you'll be subtracting a negative number from defender.hp, increasing it.
If I'm the player, and my defense starts out as 15, and then I defend, my defense will become 30 because of player.dif *= 2. If I defend again the next turn, my defense will be 60, which is greater than the boss' attack of 40. So, if the boss then attacks me in Battle.Attack, we would get damage = 40 - 60, which is damage = -20, effectively healing the player by twenty points.

The entity will be healed if the attackers attack value is less than the defender's defence value. Perhaps instead of subtracting the 2 values you could use a defence divisor/ multiplier

Related

Battle system in rock , paper, scissors game unable to effectively pull hp values

When entering a battle in my game, I update both the enemy and players hp as the battle progresses. The game is a basic Rock, Paper, Scissors battle type. I've deleted a lot a lot of the other command you can use to make it shorter but the error still occurs
Here is the code:
import random
equippedweapon = ['Bare Fists', 'Attack: ', 5]
backpack = []
hp = 10
def battle(diff):
battleactive = 0
if diff == 0:
#WOLF PUP
enemyhp = 10
enemydef = 4
while battleactive == 0:
enemyrockpaperscissors = random.randint(0,2)
if enemyrockpaperscissors == 0:
print("The wolf looks agitated!") #ROCK
elif enemyrockpaperscissors == 1:
print("The wolf pup is on their guard") #PAPER
elif enemyrockpaperscissors == 2: #SCISSORS
print("The wolf pup isn't paying attention to you")
print("What would you like to do? Equipped Weapon = " + str(equippedweapon[0])) #Access weapon name
print("Enemy HP: " + str(enemyhp) + ", Your HP: " + str(hp))
print("Attack [0], Defend [1], Distract [2], Heal [3]") #Deleted Defend, Distract, and Heal
control = input('')
if control == "0": #ROCK
if enemyrockpaperscissors == 0: #ENEMY USED ROCK
print("You and the wolf charge at each other")
if equippedweapon[0][2] > enemydef:
print("You came out on top")
damage = equippedweapon[0][2] - enemydef
print(str(damage) + " damage inflicted")
enemyhp -= damage
else:
print("No one comes out on top")
print("No Damage Inflicted")
elif enemyrockpaperscissors == 1: #ENEMY USED PAPER
print("The wolf parries your attack and scratches you with its claws.")
print("2 damage taken")
hp -= 2
elif enemyrockpaperscissors == 2: #ENEMY USED SCISSORS
print("The wolf was caught off guard by your attack")
damage = equippedweapon[0][2]
print(str(damage) + " damage inflicted")
enemyhp -= damage
if enemyhp <= 0 or hp <= 0:
print("The Battle has ended")
if hp <= 0:
print("You got no items")
else:
print("You got a Wolf Pup Tooth")
backpack.append("Wolf Pup Tooth")
battleactive += 1
battle(0)
The Enemy HP properly subtracts and the check at the end works
The Player HP does not work.
I've tried pulling the HP variable into the function with another parameter and it properly runs and displays, however the HP is not properly changed after the battle is over (If the player loses 5 hp, it only lasts for that battle. The players hp is not -5 after the battle is over)
I expect for the hp to be a global variable and properly or for the battle function to properly return the hp after the battle has ended.
Numerous issues. I've stayed with your code structure below however as a next step you might look to creating a character/monster class where the name, hp, weapon are all properties. This will allow you to abstract your code.
Also, use 4 space indents. If your indent is too deep the message is that your code structure needs work. Another good thing to do is to use a code linter.
import random
equippedweapon = ['Bare Fists', 'Attack: ', 5]
backpack = []
hp = 10
# create constants, this makes it easier to do your tests
ROCK = 0
PAPER = 1
SCISSORS = 2
def battle(diff, hp):
battleactive = 0
if diff == 0:
# WOLF PUP
enemyhp = 10
enemydef = 4
while battleactive == 0:
enemyrockpaperscissors = random.randint(0, 2)
if enemyrockpaperscissors == ROCK:
print("The wolf looks agitated!")
elif enemyrockpaperscissors == PAPER:
print("The wolf pup is on their guard")
elif enemyrockpaperscissors == SCISSORS:
print("The wolf pup isn't paying attention to you")
# Multi-line prints can be more readable, also have a look at f-strings
print("What would you like to do? Equipped Weapon = "
f"{str(equippedweapon[0])}")
# f-strings cast your int to str without you having to do so
print(f"Enemy HP: {enemyhp}, Your HP: {hp}")
print("Attack [0], Defend [1], Distract [2], Heal [3]")
# convert the string to int immediately - personal preference
control = int(input(''))
if control == ROCK:
if enemyrockpaperscissors == ROCK:
print("You and the wolf charge at each other")
# you were indexing as [0][2] when you just needed [2]
if equippedweapon[2] > enemydef:
print("You came out on top")
damage = equippedweapon[2] - enemydef
print(str(damage) + " damage inflicted")
enemyhp -= damage
else:
print("No one comes out on top")
print("No Damage Inflicted")
elif enemyrockpaperscissors == PAPER:
print("The wolf parries your attack and scratches you with"
" its claws. 2 damage taken")
hp -= 2
elif enemyrockpaperscissors == SCISSORS:
print("The wolf was caught off guard by your attack")
damage = equippedweapon[2]
print(str(damage) + " damage inflicted")
enemyhp -= damage
if enemyhp <= 0 or hp <= 0:
print("The Battle has ended")
if hp <= 0:
print("You got no items")
else:
print("You got a Wolf Pup Tooth")
backpack.append("Wolf Pup Tooth")
battleactive += 1
# pass your global HP through
battle(0, hp)

Issue with Python Classes

I'm writing a simple Python program which is a text-based fighting simulator, and I'm using classes to allow myself to create heroes and enemies. I've created an attack function within my hero class, but it doesn't seem to be subtracting the enemy health from the hero strength like I want it to.
Here's the code:
import random
class Enemy:
eName = "Name"
eHealth = 0
eStrength = 0
def __init__ (self, eName, eHealth, eStrength):
self.eName = eName
self.eHealth = eHealth
self.eStrength = eStrength
def attack (self):
print("The enemy attacked you and dealt", self.eStrength, "damage!")
Hero.health -= self.eStrength
def __repr__(self):
if self.eName == "Zombie":
return "Zombie"
elif self.eName == "Skeleton":
return "Skeleton"
else:
return "Spider"
class Hero:
name = "Name"
health = 0
strength = 0
def __init__ (self, name, health, strength):
self.name = name
self.health = health
self.strength = strength
def attack(self, enemy):
print("You attacked", enemy, "for", self.strength, "damage!\n")
Enemy.eHealth -= self.strength
print(enemy, "now has", enemy.eHealth, "health points left!\n")
print("Welcome to my fighting simulator!")
hName = input("Please input your character's name:\n")
hHealth = int(input("Please enter your hero's amount of health points (10-25):\n"))
hStrength = int(input("Please enter your hero's amount of strength points (2-4): \n"))
character = Hero(hName, hHealth, hStrength)
zombie = Enemy("Zombie", 25, 3)
skeleton = Enemy("Skeleton", 15, 4)
spider = Enemy("Spider", 20, 2)
randEnemy = random.randint(1, 3)
if randEnemy == 1:
print("\nYour enemy will be a zombie!\n")
chosenEnemy = zombie
elif randEnemy == 2:
print("\nYour enemy will be a skeleton!\n")
chosenEnemy = skeleton
else:
print("\nYour enemy will be a spider!\n")
chosenEnemy = spider
while True:
if character.health == 0:
print("You died!")
elif chosenEnemy.eHealth == 0:
print("You won!")
action = input("What would you like to do? (h = heal, a = attack): ")
if (action == 'a') or (action == 'A'):
character.attack(chosenEnemy)
The main things that need to be seen are the variables in the Enemy class, the attack function in the Hero class, and the input variables for the heroes stats.
You just had a typo. In the attack() method, you wrote
Enemy.eHealth -= self.strength
instead of
enemy.eHealth -= self.strength
And since you are unable to subtract health from the Enemy class, the described problem that you mentioned occurs.

how can I subtract the amount Randint generates in the while loop from enemies HP without getting 2 different numbers?

If you run the code you should see that the print says "14" for example, but It retracts something else from enemies HP.
Calculating attack damage for each "spell":
from random import randint
import time
class Player(object):
def __init__(self, health):
self.health = health
#staticmethod
def use_heal():
return randint(9, 21)
#staticmethod
def attack_slice():
return randint(5, 29)
#staticmethod
def attack_bash():
return randint(11, 18)
class Enemy(object):
def __init__(self, health):
self.health = health
#staticmethod
def enemy_attack():
return randint(9, 19)
For setting HP:
player = Player(100)
enemy = Enemy(100)
The loop that is the "game":
while True:
print(f"Your hp: {player.health}\nEnemy hp: {enemy.health}\n")
print("(1) Bash _ (2) Slice _ (3) Heal")
attack_choice = int(input(">>"))
if attack_choice == 1:
print(f"You hit for {Player.attack_bash()}")
enemy.health -= Player.attack_bash()
elif attack_choice == 2:
print(f"You hit for {Player.attack_slice()}")
enemy.health -= Player.attack_slice()
elif attack_choice == 3:
print(f"You heal for {Player.use_heal()}")
player.health += Player.use_heal()
when it calls Player.attack_* it returns a random value to print, and then calls it a second time to actualy damage the enemy so it is likely a defarent value. what it should do is call it once, store it in a variable and use the variable
while True:
print(f"Your hp: {player.health}\nEnemy hp: {enemy.health}\n")
print("(1) Bash _ (2) Slice _ (3) Heal")
attack_choice = int(input(">>"))
if attack_choice == 1:
damage = Player.attack_bash()
print(f"You hit for {damage}")
enemy.health -= damage
elif attack_choice == 2:
damage = Player.attack_slice()
print(f"You hit for {damage}")
enemy.health -= damage
elif attack_choice == 3:
damage = Player.use_heal()
print(f"You heal for {damage}")
player.health += damage
The problem is you are generating two random numbers for each case: The one that gets print and the one that gets subtracted/added.
...
print(f"You hit for {Player.attack_bash()}") # Generates a random number
enemy.health -= Player.attack_bash() # Generates another random number
...
You need to use a temporary variable so you can use the same value twice:
...
damage = Player.attack_bash()
print(f"You hit for {damage}")
enemy.health -= damage
...

Python3: help - script over complicated

Ive just started python yesterday and tried to make a randomized fighting game for bets with friends. I think this script could be alot shorter, but i dont know how. Ive just googled everything. plr1_hit and plr2_hit are mostly the same. Is there a way to make it just one thing? Like i said, im fairly new to python. Any help would be very appreciated. Thanks in advance!
import random
import time
dmg = random.randrange(1, 40)
plr2_health = 100
plr1_health = 100
plr2_live = True
plr1_live = True
def plr1_hit():
global plr1_health
global plr2_health
global plr2_live
dmg = random.randrange(1, 40)
plr2_health = plr2_health - dmg
if plr2_health < 1:
plr2_live = False
print("-----------------")
print("PLAYER 1 LAYS DOWN THE FINAL PUNCH")
print("Player 2 had died. Player 1 wins!")
else:
print("-----------------")
if dmg < 30:
if dmg < 15:
if dmg < 5:
hit = "pokes"
else:
hit = "slaps"
else:
hit = "punches"
else:
hit = "DESTROYS"
print("player 1 " + hit + " player 2")
print("--")
print("--")
print("Damage done:")
print(dmg)
print("--")
print("Player 1 health:")
print(plr1_health)
print("Player 2 health:")
print(plr2_health)
print("-----------------")
def plr2_hit():
global plr1_health
global plr2_health
global plr1_live
dmg = random.randrange(1, 40)
plr1_health = plr1_health - dmg
if plr1_health < 1:
plr1_live = False
print("-----------------")
print("PLAYER 2 LAYS DOWN THE FINAL PUNCH")
print("Player 1 had died. Player 2 wins!")
else:
print("-----------------")
if dmg < 30:
if dmg < 15:
if dmg < 5:
hit = "pokes"
else:
hit = "slaps"
else:
hit = "punches"
else:
hit = "DESTROYS"
print("player 2 " + hit + " player 1")
print("--")
print("--")
print("Damage done:")
print(dmg)
print("--")
print("Player 1 health:")
print(plr1_health)
print("Player 2 health:")
print(plr2_health)
print("-----------------")
while plr1_live == True and plr2_live == True:
plr1_hit()
time.sleep(5)
if plr1_live == True:
plr2_hit()
time.sleep(5)
This seems like a pretty natural place to use a class for your players. If you've not learned anything about Object Oriented Programming yet, this may seem complicated, but it's not really all that bad (though you might want to read a tutorial). A class is a convenient way to store some data (like the health of a player) along with some methods, which are functions that operate on that data.
Here's how I'd modify your plrX_hit functions so they were implemented by a single hit method of a Player class:
class Player:
def __init__(self, name): # the __init__ method sets up an instance
self.name = name
self.health = 100 # save the player stats as attributes, rather than globals
self.alive = True
def hit(self, hitby): # this works like your functions, self gets hit by hitby
dmg = random.randrange(1, 40)
self.health -= dmg
if self.health < 1:
self.alive = False
print("-----------------")
print(f"{hitby.name} LAYS DOWN THE FINAL PUNCH") # use the name variables
print(f"{self.name} has died. {hitby.name} wins!") # rather than hardcoding
else:
print("-----------------")
if dmg < 30:
if dmg < 15:
if dmg < 5:
hit_descr = "pokes"
else:
hit_descr = "slaps"
else:
hit_descr = "punches"
else:
hit_descr = "DESTROYS"
print(f"{hitby.name} {hit_desc} {self.name}")
print("--")
print("--")
print("Damage done:")
print(dmg)
print("--")
# the last part of the function, printing the health of both players,
# is moved out of the method, because it was always in a specific order
# (not related to who hit who).
player1 = Player("Player 1") # here we create two instances of the Player class
player2 = Player("Player 2")
while player1.alive and player2.alive: # you never need == True, just use the value
player1.hit(player2)
print("Player 1 health:")
print(player1.health)
print("Player 2 health:")
print(player2.health)
print("-----------------")
time.sleep(5)
if player1.alive:
player2.hit(player1)
print("Player 1 health:")
print(player1.health)
print("Player 2 health:")
print(player2.health)
print("-----------------")
time.sleep(5)
There are many possible ways to write this shorter and a bit more elegant.
You said yourself, that the two methods are mostly the same, so that's a clear sign, that you could combine them. All you need for a general hit_func() is a parameter you send when the function is called. With this parameter you could specify which player is hit.
And when you call the function, you do this alternating with player1, then with player2, etc.
Maybe something like this:
activePlayer = player1
while plr1_live == True and plr2_live == True:
hit(activePlayer)
time.sleep(5)
# change the player that is hit
if activeplayer == player1:
activeplayer = player2
else:
activeplayer = player1
In the hit function you then could use the passed in activeplayer to decide which health to reduce and what messages to print, etc.
Even more convenient you could write it with a player class and two objects for the players. Then every player object could have a hit method and the necessary variables like health, alive, etc. With this approach you could get rid of your global variables easily, which usually should be avoided.
class Player:
def __init__(self, health):
self.health = health
self.alive = True
def hit(self):
#generate random damage and reduce the health of self accordingly, etc
Then you can create two player instances and hit them as before in a loop like this:
player1 = Player(100)
player2 = Player(100)
while player1.alive and player2.alive:
#call the hit method alternating for both players
I hope that helps and gives you some ideas for improvements and new things to learn.

Python code unexpected behavior when entering my loop [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I am having a problem with my attack loop, when it runs it gets to the checkAtk function then restarts the direction loop.
I don't have a clue what's wrong with this code (and need to fix it before next Saturday). I welcome any advice or hint you might have.
import random
import time
#We define the intro function to introduce the player to the world
def displayIntro():
# [...] content: calls to print() and sleep()
#Define a function to ask the player what direction they want to go
def chooseDir():
direction = ''
while direction != '1' and direction != '2' and direction != '3' and direction != '4':
# [...] content: calls to print() and sleep()
direction = input()
return direction
#Define a function that check if the direction = a random int that the computer generates
def checkDir(direction, health, mana, money):
# [...] content: calls to print() and sleep()
friendlyDir = random.randint(1, 4)
#If it does the player recieves 100 Rupees
if direction == friendlyDir:
# [...] content: calls to print() and sleep()
health = 100
mana = 100
money = money + 100
#if it dosent match we prepare for a fight
else:
# [...] content: calls to print() and sleep()
#define a function to ask the player to choose an attack
def chooseAtk(mana):
chooseAtk = ''
while chooseAtk != '1' and chooseAtk != '2' :
# [...] content: calls to print() and sleep()
#if players mana is > 0 they get a choice of a strength or a mana attack
if mana > 0:
# [...] content: calls to print() and sleep()
chooseAtk = int(input())
#if players mana < 0 the attack automatically goes to strength
else:
chooseAtk = 1
return chooseAtk
#define a function to check the attack against Player Attack Power vs Monster Defense
def checkAtk(chooseAtk, health, mana, money):
while chooseAtk == 1 and health > 0:
if playerAp > monsterDef:
# [...] content: calls to prin() and sleep()
money = money + 100
else:
# [...] content: calls to print() and sleep()
health = health - 10
#if player chooses a mana based attack its Player Magic Power vs Monster Defense
while chooseAtk == 2 and health > 0 and mana > 0:
if playerMp > monsterDef:
# [...] content: calls to print() and sleep()
money = money + 100
mana = mana - 10
else:
# [...] content: calls to print() and sleep()
health = health - 10
mana = mana - 10
#Set global variables
health = 100
mana = 100
money = 0
playerAp = random.randint(1,50)
playerMp = random.randint(1,50)
monsterDef = random.randint(1,50)
#Initiate the loop
displayIntro()
playAgain = 'yes'
while playAgain == 'yes' or playAgain == 'y':
if health > 0:
print('------------------------------')
print('Health: ' + str(health))
print('Mana: ' + str(mana))
print('Rupees: ' + str(money))
print('------------------------------')
chosenDir = chooseDir()
checkDir(chosenDir, health, mana, money)
chooseAtk(mana)
checkAtk(chooseAtk, health, mana, money)
while health == 0:
print('Do you want to play again? (yes or no)')
playAgain = input()
In this function call:
checkAtk(chooseAtk, health, mana, money)
The chooseAtk argument isn't going to work as expected, it's passing the function instead of the return value.
Consider this:
>>> def a():
return 'a'
>>> def b(a):
print a
>>> b(a)
<function a at 0x01E5C130>
>>> b(a())
a
I think this will work...
Here's where you went wrong:
1: You completely replaced function names with variables..
2: The return-value of checkMana was never used, you passed a function to checkAtk, see this code difference:
chooseAtk(mana)
checkAtk(chooseAtk, health, mana, money)
Vs working:
chosenAttack = chooseAtk(mana)
checkAtk(chosenAttack, health, mana, money)
3: The following code will never break because 1 != '1'.
def chooseAtk(mana):
chooseAtkString = -1
while chooseAtkString != 1 and chooseAtkString != 2 :
print(' You must fight. ')
if mana > 0:
chooseAtkString = int(input())
else:
chooseAtkString = 1
return chooseAtkString
4: The reason for an endless loop is not my fault even tho it sounds like I created that issue and I hate when people do that. This is your mess, not mine. I'm cleaning it up.
Here's why the loop occurs:
while AttackChosen == 1 and health > 0:
if playerAp > monsterDef:
money = money + 100
else:
health = health - 10
For the first if block, you don't loose any HP.. It's as simple as that.
So i did:
while AttackChosen == 1 and health > 0:
if playerAp > monsterDef:
money = money + 100
health = health - 10
5: Why isn't mana/health updated? because...
Defining a function like this def checkAtk(AttackChosen, health, mana, money): will create local variables called health, mana, money instead of using the globals you've defined. Which means you will need to return these local variables back to the originating call which is:
checkAtk(chosenAttack, health, mana, money)
Try replacing that with:
health, mana, money = checkAtk(chosenAttack, health, mana, money)
and inside checkAtk do the following and the end:
return health, mana, money
Working code (For the love of the internets, next time post less code..)
import random
import time
#We define the intro function to introduce the player to the world
def displayIntro():
print('You awake in a land like no other.')
#Define a function to ask the player what direction they want to go
def chooseDir():
direction = ''
while direction != '1' and direction != '2' and direction != '3' and direction != '4':
print('In which direction do you continue North(1), South(2), East(3) or West(4)? ')
direction = input()
return direction
#Define a function that check if the direction = a random int that the computer generates
def checkDir(direction, health, mana, money):
print('You are walking briskly through the forest when you hear a creature cry out ')
friendlyDir = random.randint(1, 4)
#If it does the player recieves 100 Rupees
if direction == friendlyDir:
print('In the clearing there is a treasure chest and a natural spring')
health = 100
mana = 100
money = money + 100
#if it dosent match we prepare for a fight
else:
print('Dno what this does, but your code gave a ident syntax error because else: must be followed by something...')
#define a function to ask the player to choose an attack
def chooseAtk(mana):
chooseAtkString = -1
while chooseAtkString != 1 and chooseAtkString != 2 :
print(' You come face to face with a creature you cannot identify ')
if mana > 0:
print( ' Will you use your Strength(1) or your Wisdom(2) to vanquish this foe ')
chooseAtkString = int(input())
else:
chooseAtkString = 1
return chooseAtkString
#define a function to check the attack against Player Attack Power vs Monster Defense
def checkAtk(AttackChosen, health, mana, money):
while AttackChosen == 1 and health > 0:
if playerAp > monsterDef:
print(' The creature charges at you with his sword held high ')
money = money + 100
else:
print(' The creature charges at you with his sword held high ')
print(' You lose 10 health ')
health = health - 10
#if player chooses a mana based attack its Player Magic Power vs Monster Defense
while AttackChosen == 2 and health > 0 and mana > 0:
if playerMp > monsterDef:
print(' The creature charges at you with his sword held high ')
money = money + 100
mana = mana - 10
else:
print(' The creature charges at you with his sword held high ')
health = health - 10
mana = mana - 10
return health, mana, money
#Set global variables
health = 100
mana = 100
money = 0
playerAp = random.randint(1,50)
playerMp = random.randint(1,50)
monsterDef = random.randint(1,50)
displayIntro()
playAgain = 'yes'
while playAgain == 'yes' or playAgain == 'y':
if health > 0:
print('------------------------------')
print('Health: ' + str(health))
print('Mana: ' + str(mana))
print('Rupees: ' + str(money))
print('------------------------------')
chosenDir = chooseDir()
checkDir(chosenDir, health, mana, money)
chosenAttack = chooseAtk(mana)
health, mana, money = checkAtk(chosenAttack, health, mana, money)
while health == 0:
print('Do you want to play again? (yes or no)')
playAgain = input()

Categories