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)
class LoadHouseFSM(FSM): def __init__(self, mgr, estate, houseIndex, toon, callback): FSM.__init__(self, 'LoadHouseFSM') self.mgr = mgr self.estate = estate self.houseIndex = houseIndex self.toon = toon self.callback = callback self.done = False def start(self): # We have a few different cases here: if self.toon is None: # Case #1: There isn't a Toon 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 re-entrancy problems. taskMgr.doMethodLater(0.0, self.demand, 'makeBlankHouse-%s' % id(self), extraArgs=['MakeBlankHouse']) return self.houseId = self.toon.get('setHouseId', [0])[0] if self.houseId == 0: # Case #2: There is a Toon, but no setHouseId. Gotta make one. self.demand('CreateHouse') else: # Case #3: Toon with a setHouseId. Load it. self.demand('LoadHouse') def enterMakeBlankHouse(self): self.house = DistributedHouseAI(self.mgr.air) self.house.setHousePos(self.houseIndex) self.house.setColor(self.houseIndex) self.house.generateWithRequired(self.estate.zoneId) self.estate.houses[self.houseIndex] = self.house self.demand('Off') def enterCreateHouse(self): self.mgr.air.dbInterface.createObject( self.mgr.air.dbId, self.mgr.air.dclassesByName['DistributedHouseAI'], { 'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']], }, self.__handleCreate) def __handleCreate(self, doId): if self.state != 'CreateHouse': return # Update the avatar's houseId: av = self.mgr.air.doId2do.get(self.toon['ID']) if av: av.b_setHouseId(doId) else: self.mgr.air.dbInterface.updateObject( self.mgr.air.dbId, self.toon['ID'], self.mgr.air.dclassesByName['DistributedToonAI'], {'setHouseId': [doId]}) self.houseId = doId self.demand('LoadHouse') def enterLoadHouse(self): # Quickly parse DNA and get gender. dna = ToonDNA() dna.makeFromNetString(self.toon['setDNAString'][0]) gender = 1 if dna.getGender() == 'm' else 0 # Activate the house: self.mgr.air.sendActivate( self.houseId, self.mgr.air.districtId, self.estate.zoneId, self.mgr.air.dclassesByName['DistributedHouseAI'], { 'setHousePos': [self.houseIndex], 'setColor': [self.houseIndex], 'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']], 'setGender': [gender] }) # Now we wait for the house to show up... We do this by hanging a messenger # hook which the DistributedHouseAI throws once it spawns. self.acceptOnce('generate-%d' % self.houseId, self.__gotHouse) def __gotHouse(self, house): self.house = house self.estate.houses[self.houseIndex] = self.house self.demand('Off') def exitLoadHouse(self): self.ignore('generate-%d' % self.houseId) def enterOff(self): self.done = True self.callback(self.house)
class LoadHouseFSM(FSM): def __init__(self, mgr, estate, houseIndex, toon, callback): FSM.__init__(self, 'LoadHouseFSM') self.mgr = mgr self.estate = estate self.houseIndex = houseIndex self.toon = toon self.callback = callback self.done = False def start(self): # We have a few different cases here: if self.toon is None: # Case #1: There isn't a Toon 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 re-entrancy problems. taskMgr.doMethodLater(0.0, self.demand, 'makeBlankHouse-%s' % id(self), extraArgs=['MakeBlankHouse']) return self.houseId = self.toon.get('setHouseId', [0])[0] if self.houseId == 0: # Case #2: There is a Toon, but no setHouseId. Gotta make one. self.demand('CreateHouse') else: # Case #3: Toon with a setHouseId. Load it. self.demand('LoadHouse') def enterMakeBlankHouse(self): self.house = DistributedHouseAI(self.mgr.air) self.house.setHousePos(self.houseIndex) self.house.setColor(self.houseIndex) self.house.generateWithRequired(self.estate.zoneId) self.estate.houses[self.houseIndex] = self.house self.demand('Off') def enterCreateHouse(self): self.mgr.air.dbInterface.createObject( self.mgr.air.dbId, self.mgr.air.dclassesByName['DistributedHouseAI'], { 'setName' : [self.toon['setName'][0]], 'setAvatarId' : [self.toon['ID']], }, self.__handleCreate) def __handleCreate(self, doId): if self.state != 'CreateHouse': return # Update the avatar's houseId: av = self.mgr.air.doId2do.get(self.toon['ID']) if av: av.b_setHouseId(doId) else: self.mgr.air.dbInterface.updateObject( self.mgr.air.dbId, self.toon['ID'], self.mgr.air.dclassesByName['DistributedToonAI'], {'setHouseId': [doId]}) self.houseId = doId 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.houseIndex], 'setColor': [self.houseIndex], 'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']]}) # Now we wait for the house to show up... We do this by hanging a messenger # hook which the DistributedHouseAI throws once it spawns. self.acceptOnce('generate-%d' % self.houseId, self.__gotHouse) def __gotHouse(self, house): self.house = house self.estate.houses[self.houseIndex] = self.house self.demand('Off') def exitLoadHouse(self): self.ignore('generate-%d' % self.houseId) def enterOff(self): self.done = True self.callback(self.house)
class LoadHouseFSM(FSM): def __init__(self, mgr, estate, houseIndex, toon, callback): FSM.__init__(self, 'LoadHouseFSM') self.mgr = mgr self.estate = estate self.houseIndex = houseIndex self.toon = toon self.callback = callback self.done = False def start(self): if self.toon is None: taskMgr.doMethodLater(0.0, self.demand, 'makeBlankHouse-%s' % id(self), extraArgs=['MakeBlankHouse']) return self.houseId = self.toon.get('setHouseId', [0])[0] if self.houseId == 0: self.demand('CreateHouse') else: self.demand('LoadHouse') def enterMakeBlankHouse(self): self.house = DistributedHouseAI(self.mgr.air) self.house.setHousePos(self.houseIndex) self.house.setColor(self.houseIndex) self.house.generateWithRequired(self.estate.zoneId) self.estate.houses[self.houseIndex] = self.house self.demand('Off') def enterCreateHouse(self): self.mgr.air.dbInterface.createObject(self.mgr.air.dbId, self.mgr.air.dclassesByName['DistributedHouseAI'], {'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']]}, self.__handleCreate) def __handleCreate(self, doId): if self.state != 'CreateHouse': return av = self.mgr.air.doId2do.get(self.toon['ID']) if av: av.b_setHouseId(doId) else: self.mgr.air.dbInterface.updateObject(self.mgr.air.dbId, self.toon['ID'], self.mgr.air.dclassesByName['DistributedToonAI'], {'setHouseId': [doId]}) self.houseId = doId 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.houseIndex], 'setColor': [self.houseIndex], 'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']]}) self.acceptOnce('generate-%d' % self.houseId, self.__gotHouse) def __gotHouse(self, house): self.house = house self.estate.houses[self.houseIndex] = self.house self.demand('Off') def exitLoadHouse(self): self.ignore('generate-%d' % self.houseId) def enterOff(self): self.done = True self.callback(self.house)
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)
class LoadHouseFSM(FSM): def __init__(self, mgr, estate, houseIndex, toon, callback): FSM.__init__(self, 'LoadHouseFSM') self.mgr = mgr self.estate = estate self.houseIndex = houseIndex self.toon = toon self.callback = callback self.done = False def start(self): if self.toon is None: taskMgr.doMethodLater(0.0, self.demand, 'makeBlankHouse-%s' % id(self), extraArgs=['MakeBlankHouse']) return self.houseId = self.toon.get('setHouseId', [0])[0] if self.houseId == 0: self.demand('CreateHouse') else: self.demand('LoadHouse') def enterMakeBlankHouse(self): self.house = DistributedHouseAI(self.mgr.air) self.house.setHousePos(self.houseIndex) self.house.setColor(self.houseIndex) self.house.generateWithRequired(self.estate.zoneId) self.estate.houses[self.houseIndex] = self.house self.demand('Off') def enterCreateHouse(self): self.mgr.air.dbInterface.createObject(self.mgr.air.dbId, self.mgr.air.dclassesByName['DistributedHouseAI'], {'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']]}, self.__handleCreate) def __handleCreate(self, doId): if self.state != 'CreateHouse': return av = self.mgr.air.doId2do.get(self.toon['ID']) if av: av.b_setHouseId(doId) else: self.mgr.air.dbInterface.updateObject(self.mgr.air.dbId, self.toon['ID'], self.mgr.air.dclassesByName['DistributedToonAI'], {'setHouseId': [doId]}) self.houseId = doId self.demand('LoadHouse') def enterLoadHouse(self): dna = ToonDNA() dna.makeFromNetString(self.toon['setDNAString'][0]) gender = 1 if dna.getGender() == 'm' else 0 self.mgr.air.sendActivate(self.houseId, self.mgr.air.districtId, self.estate.zoneId, self.mgr.air.dclassesByName['DistributedHouseAI'], {'setHousePos': [self.houseIndex], 'setColor': [self.houseIndex], 'setName': [self.toon['setName'][0]], 'setAvatarId': [self.toon['ID']], 'setGender': [gender]}) self.acceptOnce('generate-%d' % self.houseId, self.__gotHouse) def __gotHouse(self, house): self.house = house self.estate.houses[self.houseIndex] = self.house self.demand('Off') def exitLoadHouse(self): self.ignore('generate-%d' % self.houseId) def enterOff(self): self.done = True self.callback(self.house)