Example #1
0
class LoadHouseOperation(FSM):
    def __init__(self, mgr, estate, index, avatar, callback):
        FSM.__init__(self, 'LoadHouseOperation')
        self.mgr = mgr
        self.estate = estate
        self.index = index
        self.avatar = avatar
        self.callback = callback
        self.done = False
        self.houseId = None
        self.house = None
        self.gender = None
        return

    def start(self):
        if self.avatar is None:
            taskMgr.doMethodLater(0.0,
                                  self.demand,
                                  'makeBlankHouse-%s' % id(self),
                                  extraArgs=['MakeBlankHouse'])
            return
        else:
            style = ToonDNA.ToonDNA()
            style.makeFromNetString(self.avatar.get('setDNAString')[0])
            self.houseId = self.avatar.get('setHouseId', [0])[0]
            self.gender = style.gender
            if self.houseId == 0:
                self.demand('CreateHouse')
            else:
                self.demand('LoadHouse')
            return

    def enterMakeBlankHouse(self):
        self.house = DistributedHouseAI(self.mgr.air)
        self.house.setHousePos(self.index)
        self.house.setColor(self.index)
        self.house.generateWithRequired(self.estate.zoneId)
        self.estate.houses[self.index] = self.house
        self.demand('Off')

    def enterCreateHouse(self):
        self.mgr.air.dbInterface.createObject(
            self.mgr.air.dbId,
            self.mgr.air.dclassesByName['DistributedHouseAI'], {
                'setName': [self.avatar['setName'][0]],
                'setAvatarId': [self.avatar['avId']]
            }, self.__handleHouseCreated)

    def __handleHouseCreated(self, houseId):
        if self.state != 'CreateHouse':
            return
        av = self.mgr.air.doId2do.get(self.avatar['avId'])
        if av:
            av.b_setHouseId(houseId)
        else:
            self.mgr.air.dbInterface.updateObject(
                self.mgr.air.dbId, self.avatar['avId'],
                self.mgr.air.dclassesByName['DistributedToonAI'],
                {'setHouseId': [houseId]})
        self.houseId = houseId
        self.demand('LoadHouse')

    def enterLoadHouse(self):
        self.mgr.air.sendActivate(
            self.houseId, self.mgr.air.districtId, self.estate.zoneId,
            self.mgr.air.dclassesByName['DistributedHouseAI'], {
                'setHousePos': [self.index],
                'setColor': [self.index],
                'setName': [self.avatar['setName'][0]],
                'setAvatarId': [self.avatar['avId']]
            })
        self.acceptOnce('generate-%d' % self.houseId,
                        self.__handleHouseGenerated)

    def __handleHouseGenerated(self, house):
        house.estate = self.estate
        house.interior.gender = self.gender
        house.interior.start()
        self.house = house
        self.estate.houses[self.index] = self.house
        if config.GetBool('want-gardening', False):
            self.house.createGardenManager()
        self.demand('Off')

    def exitLoadHouse(self):
        self.ignore('generate-%d' % self.houseId)

    def enterOff(self):
        self.done = True
        self.callback(self.house)
Example #2
0
class LoadHouseOperation(FSM):
    def __init__(self, mgr, estate, index, avatar, callback):
        FSM.__init__(self, 'LoadHouseOperation')
        self.mgr = mgr
        self.estate = estate
        self.index = index
        self.avatar = avatar
        self.callback = callback
        self.done = False
        self.houseId = None
        self.house = None
        self.gender = None

    def start(self):
        # We have a few different cases here:
        if self.avatar is None:
            # Case #1: There isn't an avatar in that estate slot. Make a blank house.
            # Because this state completes so fast, we'll use taskMgr to delay
            # it until the next iteration. This solves reentrancy problems.
            taskMgr.doMethodLater(0.0,
                                  self.demand,
                                  'makeBlankHouse-%s' % id(self),
                                  extraArgs=['MakeBlankHouse'])
            return

        style = ToonDNA.ToonDNA()
        style.makeFromNetString(self.avatar.get('setDNAString')[0])
        self.houseId = self.avatar.get('setHouseId', [0])[0]
        self.gender = style.gender
        if self.houseId == 0:
            # Case #2: There is an avatar, but no setHouseId. Make a new house:
            self.demand('CreateHouse')
        else:
            # Case #3: Avatar with a setHouseId. Load it:
            self.demand('LoadHouse')

    def enterMakeBlankHouse(self):
        self.house = DistributedHouseAI(self.mgr.air)
        self.house.setHousePos(self.index)
        self.house.setColor(self.index)
        self.house.generateWithRequired(self.estate.zoneId)
        self.estate.houses[self.index] = self.house
        self.demand('Off')

    def enterCreateHouse(self):
        self.mgr.air.dbInterface.createObject(
            self.mgr.air.dbId,
            self.mgr.air.dclassesByName['DistributedHouseAI'], {
                'setName': [self.avatar['setName'][0]],
                'setAvatarId': [self.avatar['avId']]
            }, self.__handleHouseCreated)

    def __handleHouseCreated(self, houseId):
        if self.state != 'CreateHouse':
            # This operation was likely aborted.
            return

        # Update the avatar's houseId:
        av = self.mgr.air.doId2do.get(self.avatar['avId'])
        if av:
            av.b_setHouseId(houseId)
        else:
            self.mgr.air.dbInterface.updateObject(
                self.mgr.air.dbId, self.avatar['avId'],
                self.mgr.air.dclassesByName['DistributedToonAI'],
                {'setHouseId': [houseId]})

        self.houseId = houseId
        self.demand('LoadHouse')

    def enterLoadHouse(self):
        # Activate the house:
        self.mgr.air.sendActivate(
            self.houseId, self.mgr.air.districtId, self.estate.zoneId,
            self.mgr.air.dclassesByName['DistributedHouseAI'], {
                'setHousePos': [self.index],
                'setColor': [self.index],
                'setName': [self.avatar['setName'][0]],
                'setAvatarId': [self.avatar['avId']]
            })

        # Wait for the house to generate:
        self.acceptOnce('generate-%d' % self.houseId,
                        self.__handleHouseGenerated)

    def __handleHouseGenerated(self, house):
        # The house will need to be able to reference
        # the estate for setting up gardens, so:
        house.estate = self.estate

        # Initialize our interior:
        house.interior.gender = self.gender
        house.interior.start()

        self.house = house
        self.estate.houses[self.index] = self.house
        if config.GetBool('want-gardening', False):
            # Initialize our garden:
            self.house.createGardenManager()

        self.demand('Off')

    def exitLoadHouse(self):
        self.ignore('generate-%d' % self.houseId)

    def enterOff(self):
        self.done = True
        self.callback(self.house)