cyphesis/rulesets/basic/world/objects/animals/Animal.py

75 lines
2.9 KiB
Python
Executable file

#This file is distributed under the terms of the GNU General Public license.
#Copyright (C) 1999 Aloril (See the file COPYING for details).
from atlas import *
from common import log,const
import server
# Rate at which energy is used per tick
energyConsumption = 0.01
# Rate at which food boosts energy
foodConsumption = 0.1
# Weight lost when energy is exhausted
massConsumption = 1.0
# Energy gained when mass is lost
energyGain = 0.5
# Excess energy that is to be turned into mass
energyLoss = 0.1
# Weight gained from the excess energy
massGain = 0.5
class Animal(server.Thing):
"""This is base class for all kind of animals"""
def __init__(self, cppthing, **kw):
self.base_init(cppthing, kw)
self.status=1.0
self.mass=1.0
self.food=0
self.maxmass=50
self.tickcount=0
def tick_operation(self, op):
"""check energy state and see if we are starving"""
#CHEAT!: fix this with changing tick model to:
#use tick_list in worldrouter where it's stored next tick for each
#object
#print self, self.status, self.mass
res = Oplist()
self.tickcount=self.tickcount+1
if self.tickcount<30:
return res
self.tickcount=0
## if not res:
## res = Operation("tick",to=self)
## res.setFutureSeconds(const.basic_tick)
ent = Entity(self.id)
if self.food>=foodConsumption and self.status < 2.0:
self.status = self.status + foodConsumption
self.food = self.food - foodConsumption
#Send a private sight op to ourselves so our mind know how much food we have
res.append(Operation("sight", Operation("set", Entity(self.id, food=self.food)), to=self))
if self.status>(1.5+energyLoss) and self.mass < self.maxmass:
self.status = self.status - energyLoss
ent.mass = self.mass + massGain
if self.status<=energyConsumption and self.mass>massConsumption:
ent.status = self.status - energyConsumption + energyGain
ent.mass = self.mass - massConsumption
else:
ent.status = self.status - energyConsumption
res.append(Operation("set", ent, to = self))
return res
def nourish_operation(self, op):
mass=op[0].mass
self.food = self.food + mass
#ent = Entity(self.id)
#ent.status = self.status + energyGain
#return Operation("set", ent, to = self)
#Send a private sight op to ourselves so our mind know how much food we have
return Operation("sight", Operation("set", Entity(self.id, food=self.food)), to=self)
def eat_operation(self, op):
ent=Entity(self.id,status=-1)
res = Operation("set",ent,to=self)
to_ = op.from_
nour=Entity(to_,mass=self.mass)
res = res + Operation("nourish",nour,to=to_)
return res