mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2025-01-09 17:53:50 +00:00
Pet file cleanup
This commit is contained in:
parent
227595fc64
commit
985b2a345b
3 changed files with 74 additions and 84 deletions
|
@ -3,53 +3,51 @@ from direct.distributed.DistributedObjectUD import DistributedObjectUD
|
||||||
|
|
||||||
class DistributedPetUD(DistributedObjectUD):
|
class DistributedPetUD(DistributedObjectUD):
|
||||||
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPetUD")
|
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPetUD")
|
||||||
|
|
||||||
def setDNA(self, dna):
|
def setDNA(self, dna):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setOwnerId(self, ownerId):
|
def setOwnerId(self, ownerId):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setTraitSeed(self, traitSeed):
|
def setTraitSeed(self, traitSeed):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setSafeZone(self, safeZone):
|
def setSafeZone(self, safeZone):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setHead(self, head):
|
def setHead(self, head):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setEars(self, ears):
|
def setEars(self, ears):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setNose(self, nose):
|
def setNose(self, nose):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setTail(self, tail):
|
def setTail(self, tail):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setBodyTexture(self, bodyTexture):
|
def setBodyTexture(self, bodyTexture):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setColor(self, color):
|
def setColor(self, color):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setColorScale(self, colorScale):
|
def setColorScale(self, colorScale):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setEyeColor(self, eyeColor):
|
def setEyeColor(self, eyeColor):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setGender(self, gender):
|
def setGender(self, gender):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setLastSeenTimestamp(self, timestamp):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def setTrickAptitudes(self, aptitudes):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def setLastSeenTimestamp(self, timestamp):
|
def setLastSeenTimestamp(self, timestamp):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def setTrickAptitudes(self, aptitudes):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setLastSeenTimestamp(self, timestamp):
|
||||||
|
pass
|
||||||
|
|
|
@ -10,77 +10,73 @@ DAY = 24 * HOUR
|
||||||
|
|
||||||
def getDayId():
|
def getDayId():
|
||||||
return int(time.time() // DAY)
|
return int(time.time() // DAY)
|
||||||
|
|
||||||
class PetManagerAI:
|
class PetManagerAI:
|
||||||
NUM_DAILY_PETS = 5 # per hood
|
NUM_DAILY_PETS = 5 # Per hood.
|
||||||
cachePath = config.GetString('air-pet-cache', 'astron/databases/air_cache/')
|
cachePath = config.GetString('air-pet-cache', 'astron/databases/air_cache/')
|
||||||
|
|
||||||
def __init__(self, air):
|
def __init__(self, air):
|
||||||
self.air = air
|
self.air = air
|
||||||
self.cacheFile = '%spets_%d.pets' % (self.cachePath, self.air.districtId)
|
self.cacheFile = '%spets_%d.pets' % (self.cachePath, self.air.districtId)
|
||||||
if os.path.isfile(self.cacheFile):
|
if os.path.isfile(self.cacheFile):
|
||||||
with open(self.cacheFile, 'rb') as f:
|
with open(self.cacheFile, 'rb') as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
|
|
||||||
self.seeds = cPickle.loads(data)
|
self.seeds = cPickle.loads(data)
|
||||||
if self.seeds.get('day', -1) != getDayId() or len(self.seeds.get(ToontownGlobals.ToontownCentral, [])) != self.NUM_DAILY_PETS:
|
if self.seeds.get('day', -1) != getDayId() or len(self.seeds.get(ToontownGlobals.ToontownCentral, [])) != self.NUM_DAILY_PETS:
|
||||||
self.generateSeeds()
|
self.generateSeeds()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.generateSeeds()
|
self.generateSeeds()
|
||||||
|
|
||||||
def generateSeeds(self):
|
def generateSeeds(self):
|
||||||
seeds = range(0, 255)
|
seeds = range(0, 255)
|
||||||
random.shuffle(seeds)
|
random.shuffle(seeds)
|
||||||
|
|
||||||
self.seeds = {}
|
self.seeds = {}
|
||||||
for hood in (ToontownGlobals.ToontownCentral, ToontownGlobals.DonaldsDock, ToontownGlobals.DaisyGardens,
|
for hood in (ToontownGlobals.ToontownCentral, ToontownGlobals.DonaldsDock, ToontownGlobals.DaisyGardens,
|
||||||
ToontownGlobals.MinniesMelodyland, ToontownGlobals.TheBrrrgh, ToontownGlobals.DonaldsDreamland,
|
ToontownGlobals.MinniesMelodyland, ToontownGlobals.TheBrrrgh, ToontownGlobals.DonaldsDreamland,
|
||||||
ToontownGlobals.FunnyFarm):
|
ToontownGlobals.FunnyFarm):
|
||||||
self.seeds[hood] = [seeds.pop() for _ in xrange(self.NUM_DAILY_PETS)]
|
self.seeds[hood] = [seeds.pop() for _ in xrange(self.NUM_DAILY_PETS)]
|
||||||
|
|
||||||
self.seeds['day'] = getDayId()
|
self.seeds['day'] = getDayId()
|
||||||
|
|
||||||
with open(self.cacheFile, 'wb') as f:
|
with open(self.cacheFile, 'wb') as f:
|
||||||
f.write(cPickle.dumps(self.seeds))
|
f.write(cPickle.dumps(self.seeds))
|
||||||
|
|
||||||
def getAvailablePets(self, seed, safezoneId):
|
def getAvailablePets(self, seed, safezoneId):
|
||||||
if self.seeds.get('day', -1) != getDayId():
|
if self.seeds.get('day', -1) != getDayId():
|
||||||
self.generateSeeds()
|
self.generateSeeds()
|
||||||
|
|
||||||
return list(set(self.seeds.get(safezoneId, [seed])))
|
return list(set(self.seeds.get(safezoneId, [seed])))
|
||||||
|
|
||||||
def createNewPetFromSeed(self, avId, seed, nameIndex, gender, safeZoneId):
|
def createNewPetFromSeed(self, avId, seed, nameIndex, gender, safeZoneId):
|
||||||
av = self.air.doId2do[avId]
|
av = self.air.doId2do[avId]
|
||||||
|
|
||||||
name = TTLocalizer.getPetName(nameIndex)
|
name = TTLocalizer.getPetName(nameIndex)
|
||||||
_, dna, traitSeed = PetUtil.getPetInfoFromSeed(seed, safeZoneId)
|
_, dna, traitSeed = PetUtil.getPetInfoFromSeed(seed, safeZoneId)
|
||||||
head, ears, nose, tail, body, color, cs, eye, _ = dna
|
head, ears, nose, tail, body, color, cs, eye, _ = dna
|
||||||
numGenders = len(PetDNA.PetGenders)
|
numGenders = len(PetDNA.PetGenders)
|
||||||
gender %= numGenders
|
gender %= numGenders
|
||||||
|
|
||||||
fields = {'setOwnerId' : avId, 'setPetName' : name, 'setTraitSeed' : traitSeed, 'setSafeZone' : safeZoneId,
|
fields = {'setOwnerId' : avId, 'setPetName' : name, 'setTraitSeed' : traitSeed, 'setSafeZone' : safeZoneId,
|
||||||
'setHead' : head, 'setEars' : ears, 'setNose' : nose, 'setTail' : tail, 'setBodyTexture' : body,
|
'setHead' : head, 'setEars' : ears, 'setNose' : nose, 'setTail' : tail, 'setBodyTexture' : body,
|
||||||
'setColor' : color, 'setColorScale' : cs, 'setEyeColor' : eye, 'setGender' : gender}
|
'setColor' : color, 'setColorScale' : cs, 'setEyeColor' : eye, 'setGender' : gender}
|
||||||
|
|
||||||
def response(doId):
|
def response(doId):
|
||||||
if not doId:
|
if not doId:
|
||||||
self.air.notify.warning("Cannot create pet for %s!" % avId)
|
self.air.notify.warning("Cannot create pet for %s!" % avId)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.air.writeServerEvent('bought-pet', avId, doId)
|
self.air.writeServerEvent('bought-pet', avId, doId)
|
||||||
av.b_setPetId(doId)
|
av.b_setPetId(doId)
|
||||||
|
|
||||||
self.air.dbInterface.createObject(self.air.dbId, self.air.dclassesByName['DistributedPetAI'],
|
self.air.dbInterface.createObject(self.air.dbId, self.air.dclassesByName['DistributedPetAI'],
|
||||||
{k: (v,) for k,v in fields.items()}, response)
|
{k: (v,) for k,v in fields.items()}, response)
|
||||||
|
|
||||||
def deleteToonsPet(self, avId):
|
def deleteToonsPet(self, avId):
|
||||||
av = self.air.doId2do[avId]
|
av = self.air.doId2do[avId]
|
||||||
pet = av.getPetId()
|
pet = av.getPetId()
|
||||||
if pet:
|
if pet:
|
||||||
if pet in self.air.doId2do:
|
if pet in self.air.doId2do:
|
||||||
self.air.doId2do[pet].requestDelete()
|
self.air.doId2do[pet].requestDelete()
|
||||||
|
|
||||||
av.b_setPetId(0)
|
av.b_setPetId(0)
|
||||||
# XXX to do: check for current pet and destroy it if generated
|
|
||||||
|
|
||||||
|
|
|
@ -15,14 +15,13 @@ def inCircle(x, y, c=estateCenter, r=estateRadius):
|
||||||
center_x, center_y = c
|
center_x, center_y = c
|
||||||
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
|
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
|
||||||
return square_dist <= r ** 2
|
return square_dist <= r ** 2
|
||||||
|
|
||||||
def housePointCollision(x, y):
|
def housePointCollision(x, y):
|
||||||
for i, h in enumerate(houses):
|
for i, h in enumerate(houses):
|
||||||
if inCircle(x, y, h, houseRadius):
|
if inCircle(x, y, h, houseRadius):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def generatePos():
|
def generatePos():
|
||||||
def get():
|
def get():
|
||||||
r = random.randint(0, estateRadius) - estateRadius / 2
|
r = random.randint(0, estateRadius) - estateRadius / 2
|
||||||
|
@ -31,39 +30,38 @@ def generatePos():
|
||||||
y = r2 + estateCenter[1]
|
y = r2 + estateCenter[1]
|
||||||
assert inCircle(x, y)
|
assert inCircle(x, y)
|
||||||
return x, y
|
return x, y
|
||||||
|
|
||||||
p = get()
|
p = get()
|
||||||
while housePointCollision(*p):
|
while housePointCollision(*p):
|
||||||
p = get()
|
p = get()
|
||||||
|
|
||||||
return p
|
return p
|
||||||
|
|
||||||
def lineInCircle(pt1, pt2, circlePoint, circleRadius=houseRadius):
|
def lineInCircle(pt1, pt2, circlePoint, circleRadius=houseRadius):
|
||||||
x1, y1 = pt1
|
x1, y1 = pt1
|
||||||
x2, y2 = pt2
|
x2, y2 = pt2
|
||||||
|
|
||||||
dist = math.hypot(x2 - x1, y2 - y1)
|
dist = math.hypot(x2 - x1, y2 - y1)
|
||||||
if dist == 0:
|
if dist == 0:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
dx = (x2 - x1) / dist
|
dx = (x2 - x1) / dist
|
||||||
dy = (y2 - y1) / dist
|
dy = (y2 - y1) / dist
|
||||||
|
|
||||||
t = dx * (circlePoint[0] - x1) + dy * (circlePoint[1] - y1)
|
t = dx * (circlePoint[0] - x1) + dy * (circlePoint[1] - y1)
|
||||||
|
|
||||||
ex = t * dx + x1
|
ex = t * dx + x1
|
||||||
ey = t * dy + y1
|
ey = t * dy + y1
|
||||||
|
|
||||||
d2 = math.hypot(ex - circlePoint[0], ey - circlePoint[1])
|
d2 = math.hypot(ex - circlePoint[0], ey - circlePoint[1])
|
||||||
return d2 <= circleRadius
|
return d2 <= circleRadius
|
||||||
|
|
||||||
def houseCollision(pt1, pt2):
|
def houseCollision(pt1, pt2):
|
||||||
for i, h in enumerate(houses):
|
for i, h in enumerate(houses):
|
||||||
if lineInCircle(pt1, pt2, h):
|
if lineInCircle(pt1, pt2, h):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def generatePath(start, end):
|
def generatePath(start, end):
|
||||||
points = [start]
|
points = [start]
|
||||||
if not houseCollision(start, end):
|
if not houseCollision(start, end):
|
||||||
|
@ -74,22 +72,22 @@ def generatePath(start, end):
|
||||||
next = generatePos()
|
next = generatePos()
|
||||||
while houseCollision(points[-1], next):
|
while houseCollision(points[-1], next):
|
||||||
next = generatePos()
|
next = generatePos()
|
||||||
|
|
||||||
points.append(next)
|
points.append(next)
|
||||||
if not houseCollision(next, end):
|
if not houseCollision(next, end):
|
||||||
points.append(end)
|
points.append(end)
|
||||||
return points
|
return points
|
||||||
|
|
||||||
def angle(A, B):
|
def angle(A, B):
|
||||||
ax = A.getX()
|
ax = A.getX()
|
||||||
ay = A.getY()
|
ay = A.getY()
|
||||||
|
|
||||||
bx = B.getX()
|
bx = B.getX()
|
||||||
by = B.getY()
|
by = B.getY()
|
||||||
|
|
||||||
return math.atan2(by-ay, bx-ax)
|
return math.atan2(by-ay, bx-ax)
|
||||||
|
|
||||||
class PetMoverAI(FSM):
|
class PetMoverAI(FSM):
|
||||||
def __init__(self, pet):
|
def __init__(self, pet):
|
||||||
self.pet = pet
|
self.pet = pet
|
||||||
FSM.__init__(self, 'PetMoverAI-%d' % self.pet.doId)
|
FSM.__init__(self, 'PetMoverAI-%d' % self.pet.doId)
|
||||||
|
@ -99,91 +97,89 @@ class PetMoverAI(FSM):
|
||||||
self.rotSpeed = 360.0
|
self.rotSpeed = 360.0
|
||||||
self.__moveFromStill()
|
self.__moveFromStill()
|
||||||
self.__chaseCallback = None
|
self.__chaseCallback = None
|
||||||
|
|
||||||
def enterStill(self):
|
def enterStill(self):
|
||||||
taskMgr.doMethodLater(random.randint(15, 60), self.__moveFromStill, self.pet.uniqueName('next-state'))
|
taskMgr.doMethodLater(random.randint(15, 60), self.__moveFromStill, self.pet.uniqueName('next-state'))
|
||||||
|
|
||||||
def exitStill(self):
|
def exitStill(self):
|
||||||
taskMgr.remove(self.pet.uniqueName('next-state'))
|
taskMgr.remove(self.pet.uniqueName('next-state'))
|
||||||
|
|
||||||
def __moveFromStill(self, task=None):
|
def __moveFromStill(self, task=None):
|
||||||
choices = ["Wander"]
|
choices = ["Wander"]
|
||||||
nextState = random.choice(choices)
|
nextState = random.choice(choices)
|
||||||
self.request(nextState)
|
self.request(nextState)
|
||||||
|
|
||||||
def enterWander(self):
|
def enterWander(self):
|
||||||
target = self.getPoint()
|
target = self.getPoint()
|
||||||
self.walkToPoint(target)
|
self.walkToPoint(target)
|
||||||
|
|
||||||
def getPoint(self):
|
def getPoint(self):
|
||||||
x, y = generatePos()
|
x, y = generatePos()
|
||||||
return Point3(x, y, 0)
|
return Point3(x, y, 0)
|
||||||
|
|
||||||
def walkToPoint(self, target):
|
def walkToPoint(self, target):
|
||||||
here = self.pet.getPos()
|
here = self.pet.getPos()
|
||||||
dist = Vec3(here - target).length()
|
dist = Vec3(here - target).length()
|
||||||
|
|
||||||
self.__seq = Sequence(Func(self.pet.lookAt, target), Func(self.pet.setP, 0), self.pet.posInterval(dist / self.fwdSpeed, target, here),
|
self.__seq = Sequence(Func(self.pet.lookAt, target), Func(self.pet.setP, 0), self.pet.posInterval(dist / self.fwdSpeed, target, here),
|
||||||
Func(self.__stateComplete))
|
Func(self.__stateComplete))
|
||||||
self.__seq.start()
|
self.__seq.start()
|
||||||
|
|
||||||
def exitWander(self):
|
def exitWander(self):
|
||||||
if self.__seq:
|
if self.__seq:
|
||||||
self.__seq.pause()
|
self.__seq.pause()
|
||||||
|
|
||||||
self.__seq = None
|
self.__seq = None
|
||||||
|
|
||||||
def __stateComplete(self):
|
def __stateComplete(self):
|
||||||
try:
|
try:
|
||||||
self.request("Still")
|
self.request("Still")
|
||||||
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
self.demand("Off")
|
self.demand("Off")
|
||||||
|
|
||||||
def setFwdSpeed(self, speed):
|
def setFwdSpeed(self, speed):
|
||||||
self.fwdSpeed = speed
|
self.fwdSpeed = speed
|
||||||
|
|
||||||
def getFwdSpeed(self):
|
def getFwdSpeed(self):
|
||||||
return self.fwdSpeed
|
return self.fwdSpeed
|
||||||
|
|
||||||
def setRotSpeed(self, speed):
|
def setRotSpeed(self, speed):
|
||||||
self.rotSpeed = speed
|
self.rotSpeed = speed
|
||||||
|
|
||||||
def getRotSpeed(self):
|
def getRotSpeed(self):
|
||||||
return self.rotSpeed
|
return self.rotSpeed
|
||||||
|
|
||||||
def lock(self):
|
def lock(self):
|
||||||
if self.state != "Still":
|
if self.state != "Still":
|
||||||
self.demand("Still")
|
self.demand("Still")
|
||||||
|
|
||||||
def enterChase(self, target=None):
|
def enterChase(self, target=None):
|
||||||
if not target:
|
if not target:
|
||||||
target = hidden.attachNewNode('target')
|
target = hidden.attachNewNode('target')
|
||||||
target.setPos(self.getPoint())
|
target.setPos(self.getPoint())
|
||||||
|
|
||||||
pos = target.getPos()
|
pos = target.getPos()
|
||||||
theta = angle(self.pet.getPos(), pos) * (math.pi / 180)
|
theta = angle(self.pet.getPos(), pos) * (math.pi / 180)
|
||||||
dx = dist * math.cos(theta)
|
dx = dist * math.cos(theta)
|
||||||
dy = dist * math.sin(theta)
|
dy = dist * math.sin(theta)
|
||||||
|
|
||||||
self.walkToPoint(Point3(pos.getX() - dx, pos.getY() - dy, pos.getZ()))
|
self.walkToPoint(Point3(pos.getX() - dx, pos.getY() - dy, pos.getZ()))
|
||||||
|
|
||||||
def exitChase(self):
|
def exitChase(self):
|
||||||
if self.__chaseCallback:
|
if self.__chaseCallback:
|
||||||
self.__chaseCallback()
|
self.__chaseCallback()
|
||||||
self.__chaseCallback = None
|
self.__chaseCallback = None
|
||||||
|
|
||||||
if self.__seq:
|
if self.__seq:
|
||||||
self.__seq.pause()
|
self.__seq.pause()
|
||||||
|
|
||||||
self.__seq = None
|
self.__seq = None
|
||||||
|
|
||||||
def walkToAvatar(self, av, callback=None):
|
def walkToAvatar(self, av, callback=None):
|
||||||
if callback:
|
if callback:
|
||||||
self.__chaseCallback = callback
|
self.__chaseCallback = callback
|
||||||
|
|
||||||
self.demand("Chase", av)
|
self.demand("Chase", av)
|
||||||
|
|
Loading…
Reference in a new issue