Hello, loves!

A small idea about the Denizen state machine. Tout le monde déteste l’IA.

Here’s Denizen:

class Denizen:
    def __init__(self, *, name,
                 initial_sayings=None,
                 gift=None):
        if initial_sayings is None:
            initial_sayings = ['Hmm...']
        self.name = name
        self.initial_sayings = NameSayer.cycle(self.name, initial_sayings)
        self.gift = gift
        self.say = 0
        self.gift = gift
        self.state = 'seeking'

    def interact(self, interactor):
        if self.state == 'seeking':
            self.seeking(interactor)
        elif self.state == 'satisfied':
            self.satisfied(interactor)
        else:
            interactor.announce(message='Buzz: "Impossible Situation"')
        return False

    def seeking(self, interactor):
        if interactor.has('flower'):
            if self.gift:
                interactor.announce(message='Buzz: "Oh thank you!"')
                interactor.announce(message='Buzz: "Here\'s something you may need."')
                interactor.receive_content(self.gift)
            self.state = 'satisfied'
        else:
            interactor.announce(self.initial_sayings.saying)

    def satisfied(self, interactor):
        interactor.announce(message = 'Buzz: "I\'m just a happy little bee!')

We can get rid of the conditional and the strings, like this:

class Denizen:
    def __init__(self, *, name,
                 initial_sayings=None,
                 gift=None):
        if initial_sayings is None:
            initial_sayings = ['Hmm...']
        self.name = name
        self.initial_sayings = NameSayer.cycle(self.name, initial_sayings)
        self.gift = gift
        self.say = 0
        self.gift = gift
        self.state = self.seeking

    def interact(self, interactor):
        self.state = self.state(interactor)
        return False

    def seeking(self, interactor):
        if interactor.has('flower'):
            if self.gift:
                interactor.announce(message='Buzz: "Oh thank you!"')
                interactor.announce(message='Buzz: "Here\'s something you may need."')
                interactor.receive_content(self.gift)
            return self.satisfied
        else:
            interactor.announce(self.initial_sayings.saying)
            return self.seeking

    def satisfied(self, interactor):
        interactor.announce(message = 'Buzz: "I\'m just a happy little bee!')
        return self.satisfied

We set state to the method for that state, make each state method return the next state, and i interact, just execute the current state.

That seems better to me. Does it seem better to you?

See you next time!