Mads Lildholdt Hansen
Mads Lildholdt Hansen

Reputation: 49

an enemy class in a RPG-game

I am in the midst of making an RPG game in Python. I have made different classes, but I am having problems with one of my enemy types. It is a spider, and to spice things up, I tried to make the spider do dot (damage over time). It is not guaranteed poison damage, but when it does poison you, it stacks. This is my parent class (enemy):

class Enemy():
    def __init__(self, number_of, name):
        self.number_of = int(number_of)
        self.name = name
        self.hp = 20 * self.number_of
        self.dmg = 2 * self.number_of
    def attack(self):
        print(f"you now have {round(class1.hp)} health" + "\n")
    def appearing(self):
        if self.number_of > 1:
            print (f"{self.number_of} {self.name}s have appeared")
        else:
            print(f"A {self.name} has appeared")
        print (f"They have {self.hp} health")

Note: the class1 is the player

This is my spider class:

class Spider(Enemy):
    posion_dmg = 0
    def __init__(self, number_of, name):
        Enemy.__init__(self, number_of, name)
        self.posion_dmg = 0
    def attack(self,player):
        if self.posion_dmg > 0:
            dot = 2 ** (self.poison_dmg + 1)
            player.hp -= dot
            print ("you are posioned" + "\n")
            print (f"it deals {round(dot)} damage")
        dmg = random.uniform(1.2 * self.dmg, 1.8* self.dmg)
        player.hp -= dmg
        print ("The spider(s) bite(s) you. ")
        print(f"It deals {round(dmg)} damage")
        if randint(1,4) == 1:
            self.poison_dmg += 1
            if self.number_of == 1:
                print ("The spider poisons you")
            else:
                print ("The spiders poison you")
        return Enemy.attack(self)
    def appearing(self):
        print ("*Spiders have a chance to hit you with poison that deals damage over time - this stack exponentially*")
        return Enemy.appearing(self)

When I go in combat with the spider, and the randint is 1, it says that "Spider" has no attribute "poison_dmg", but I made it an attribute, right?

Upvotes: 0

Views: 543

Answers (1)

Yeti
Yeti

Reputation: 51

im kind of a newbie to python but i've successfully gone through the "Make Your Own Python Text Adventure" guide and i got a basic grip of how this works, although i do not completely understand how you're making the dot work, i think your problem is:

class Spider(Enemy):
    posion_dmg = 0
    def __init__(self, number_of, name):
        Enemy.__init__(self, number_of, name)
        self.posion_dmg = 0  <-----------------------HERE

in combination with this:

def attack(self,player):
        if self.posion_dmg > 0:
            dot = 2 ** (self.poison_dmg + 1)
            player.hp -= dot
            print ("you are posioned" + "\n")
            print (f"it deals {round(dot)} damage")
        dmg = random.uniform(1.2 * self.dmg, 1.8* self.dmg)
        player.hp -= dmg
        print ("The spider(s) bite(s) you. ")
        print(f"It deals {round(dmg)} damage")
        if randint(1,4) == 1:     <----------------------------HERE
            self.poison_dmg += 1
            if self.number_of == 1:
                print ("The spider poisons you")
            else:
                print ("The spiders poison you")

The if statement is indented within a def that begins with another if poison_dmg > 0, and is not because you've already defined it to be 0 in the init. i would invert the order of the if statements within the attack function, so you first generate a poison_dmg value, and then you evaluate wether or not that value is greater than 0.

Hope it works!

PD1: This is my firs stackoverflow comment ever, sorry if i missed some answering standards.

PD2: English is not my mother tongue, please let me know if i didn't make myself clear at any point.

Upvotes: 1

Related Questions