cyphesis/rulesets/basic/world/objects/plants/Tree.py

411 lines
15 KiB
Python
Executable file

from atlas import *
from common import log,const
#from world.objects.plants import prob
from random import *
from Vector3D import Vector3D
import server
debug_tree = 0
"""
energy per tick durning day = (1/2water) * soil quality * leaf coverage%
energy usage per tick = tree size * (1/2 leaf coverage%)
energy per tick of growth = (tree size * new tree size) 1/2
energy per tick in hibanation = 1/4 tree size
energy to grow flower = flowerusage * 2
energy to grow fruit = fruitusage * 3 - flowerusage
energy to mantain flower = flowerusage * numberofflowers
energy to mantain fruit = fruitusage * numberoffruit
max leaves = amountofleaves * size
"""
# This will later be moved into tree specific code #
# This is how fast the tree does it's stuff... use a low number for debugging a high number for real stuff
speed = 2
# Speed of growth
growthspeed = 6
# This is the size the main goal stops from growing to reporducing #
sizeadult = 10
# Cordinate sizes. These are the left and right mutiples of each cordinates. To work out the actual size its the current codinate + size * the below number
# X or up axies (tall)
x1 = 1
x2 = 3
# Y or long axies
y1 = 1
y2 = 1
# Z or depth
z1 = 1
z2 = 1
# These are the maximums widths between the 2 above cordinates
xMax = 40
yMax = 10
zMax = 10
#seed/fruit object
fruitname = "Acorn"
#The upkeep costs
# Size
supkeep = 10
# Leaf
lupkeep = 2
# Flower
flupkeep = 10
# Fruit
fuupkeep = 15
# Maximums
# Leaves
amountofleaves = 10
# Fruit
amountoffruits = 2
# Flowers
amountofflowers = 7
# Energy Usage
# Growth
growthusage = 100
# Flower growth
flowerusage = 10
# Fruit Growth
fruitusage = 2 * flowerusage
# Leaf growth
leafusage = 0
# Reaping Cost
repaircost = 10
# Energy Gain
# Leaf energy produce
leafenergy = 10
#The amount it cost to remove water/nurtrients from the ground
extraction_cost = 10
# Soil quality
soil_quality = 20
# Season
# The season flower starts
flowerseason = "winter"
# The season the tree drops its leaves
fallseason = "autumn"
# The season the tree dorminates
dormantseason = "summer"
#The maximum amount of leaves to drop, this will be times by 3 for fallseason and times by health% to find out how many drop ( this is per tick )
# leaves
maxldrop = 10
# flowers
maxfdrop = 1
# Fruit
maxudrop = 1
#The minimum amount of stuff that will drop per tick
# leaves
minldrop = 0
# flowers
minfdrop = 0
# Fruit
minudrop = 1
# Chances
# The chance for a flower to germinate
fruitchance = 1
def cs(a, b, max):
if a+b > max:
return a
else:
return max
class Tree(server.Thing):
#This base class for houses, building material is wood#
def tick_operation(self, op):
if debug_tree:
print "I this big ", self.size
print "I have so much energy ", self.energy
print "I have so many leaves ", self.leaves
print `self`,"Got tick operation:"
#in any case send ourself next tick#
opTick=Operation("tick",to=self)
opTick.setFutureSeconds(const.basic_tick*speed)
result = Oplist(opTick)
#CHEAT!: handle these cases correctly
#see another "self.healt<0" -test
print self.health
if self.health<0:
#when self.health==-6
#then-1 == maxldrop * self.health / 100
#and this causes exception:
#(it calls randint(0,-1))
#new_leaves = randint(minldrop, maxldrop * self.health / 100 )
return
if self.health < -100:
if debug_tree:
print "Kill me now!"
elif self.energy < 0:
if debug_tree:
print "Tree is dieing", self.health
self.health = self.health + self.energy
#CHEAT: see previous "self.health<0" -test
if self.health<0:
return
elif self.health < 100 and self.energy > repaircost:
if debug_tree:
print "The tree is damaged, repairing"
self.energy = self.energy - repaircost
self.health = self.health + 1
else:
if debug_tree:
print "Tree is all well"
# add energy #
if server.world.get_time()=="night":
if debug_tree:
print "Its night"
# Put your night stuff in this operation
if hasattr(self,"do_night_things"):
result = result + self.do_night_things()
else:
# Put you day stuff in this operation
if debug_tree:
print "Its day"
if hasattr(self,"do_day_things"):
result = result + self.do_day_things()
if debug_tree:
print "Water ", self.water, " Soil ", soil_quality, " Leafenergy ", leafenergy
print "I get his much energy", self.water * soil_quality / extraction_cost * self.leaves * leafenergy
self.energy = self.energy + self.water * soil_quality / extraction_cost * self.leaves * leafenergy
# Useage per tick for general stuff..
# Size upkeep
if debug_tree:
print "Size upkeep ", self.size * supkeep
self.energy = self.energy - self.size * supkeep
# Leaf upkeep
if debug_tree:
print "Leaf upkeep ", self.leaves * lupkeep
self.energy = self.energy - self.leaves * lupkeep
# Flower upkeep
if debug_tree:
print "Flowers upkeep ", self.flowers * flupkeep
self.energy = self.energy - self.flowers * flupkeep
# Fruit upkeep
if debug_tree:
print "Fruit upkeep ", self.fruits * fuupkeep
self.energy = self.energy - self.fruits * fuupkeep
# Should people be informed of leave changes?
if debug_tree:
print server.world.get_time().season, " is the current season"
if not (server.world.get_time() == dormantseason):
if server.world.get_time() == fallseason :
#Fall season is when stops the growing of leaves and
if self.leaves > 0:
if debug_tree:
print "Kill lotsa leaves"
self.leaves = self.leaves - randint(minldrop, maxldrop * 3 )
else:
if debug_tree:
print "I have no leaves left"
self.leaves = 0
if self.flowers > 0:
self.flowers = self.flowers - randint(minfdrop, maxfdrop * 10 )
else:
self.flowers = 0
if self.fruits > 0:
rand = randint(minudrop, maxudrop * self.health / 100 )
self.fruits = self.fruits - rand
for x in range(rand):
# pick a random spot between the 2 extremes of the plant
if debug_tree:
print "Creating Fruit"
randx = uniform ( self.location.coordinates.x - cs( x1 * self.size, x2 * self.size, xMax) , self.location.coordinates.x + cs( x2 * self.size, x1 * self.size, xMax) )
randy = uniform ( self.location.coordinates.y - cs( y1 * self.size, y2 * self.size, yMax) , self.location.coordinates.y + cs( y2 * self.size, y1 * self.size, yMax) )
randz = uniform ( self.location.coordinates.z - cs( z1 * self.size, z2 * self.size, zMax) , self.location.coordinates.z + cs( z2 * self.size, z1 * self.size, zMax) )
if hasattr(self,"coords_modify"):
randx,randy,randz=coords_modify(randx,randy,randz)
fruit=Entity(location=Location(server.world,Point3D(randx,randy,randz)),type=[fruitname])
result = result + Operation("create",fruit,to=self)
if debug_tree:
print fruit
else:
self.fruits = 0
else:
if debug_tree:
print "It's normal growing time"
# simulate the falling of leaves and the growing of new ones, aswell it kills of extra flowers
if self.leaves > 0:
dleaves = randint(minldrop,
int(maxldrop * (1.0 - self.health / 100.0)) )
if debug_tree:
print dleaves, "are going to die"
self.leaves = self.leaves - dleaves
else:
if debug_tree:
print "I have no leaves left"
self.leaves = 0
if self.flowers > 0:
self.flowers = self.flowers - randint(minfdrop, int(maxldrop * (1.0 - self.health / 100.0)) )
else:
self.flowers = 0
if self.fruits > 0:
if debug_tree:
print "Bombs away ",
drandf = randint(minudrop, maxudrop * self.health / 100 )
self.fruits = self.fruits - drandf
if debug_tree:
print drandf
for x in range(drandf):
if debug_tree:
print "Creting new fruit"
# pick a random spot between the 2 extremes of the plant
randx = uniform ( self.location.coordinates.x - cs( x1 * self.size, x2 * self.size, xMax) , self.location.coordinates.x + cs( x2 * self.size, x1 * self.size, xMax) )
randy = uniform ( self.location.coordinates.y - cs( y1 * self.size, y2 * self.size, yMax) , self.location.coordinates.y + cs( y2 * self.size, y1 * self.size, yMax) )
randz = uniform ( self.location.coordinates.z - cs( z1 * self.size, z2 * self.size, zMax) , self.location.coordinates.z + cs( z2 * self.size, z1 * self.size, zMax) )
if hasattr(self,"coords_modify"):
randx,randy,randz=coords_modify(randx,randy,randz)
fruit=Entity(location=Location(server.world,Point3D(randx,randy,randz)),type=[fruitname])
result = result + Operation("create",fruit,to=self)
### Create a fruit on the ground ###
else:
self.fruits = 0
# result = result + Operation("set",Entity(self.id,leaves=self.leaves),to=self)
# result = result + Operation("set",Entity(self.id,flowers=self.flowers),to=self)
# result = result + Operation("set",Entity(self.id,fruits=self.fruits),to=self)
if debug_tree:
print self.leaves
new_leaves = randint(minldrop, maxldrop * self.health / 100 )
if self.leaves < ( amountofleaves * self.size ) and self.energy > ( leafusage * new_leaves ) :
if debug_tree:
print "I'm growing a new leaf", new_leaves,
self.leaves = self.leaves + new_leaves
if debug_tree:
print " ", self.leaves
self.energy = self.energy - ( leafusage * new_leaves )
else:
pass
seconds=server.world.get_time().seconds()
if debug_tree:
print self.last_growth, " time last growth ", seconds, " time now"
print self.last_growth + growthspeed * self.size * 1000, "till next growth"
if server.world.get_time() != dormantseason:
if debug_tree:
print "Time to check to see if the tree can grow"
if self.size < sizeadult :
if seconds > (self.last_growth + growthspeed * self.size * 1000 ):
if debug_tree:
print "I'm only small so i better grow"
print " self.energy ", self.energy, " growthusage ", growthusage, " self.size ", self.size, " ",
print self.energy > growthusage * self.size
if self.energy > ( growthusage * self.size ) :
if debug_tree:
print "I'm going to grow!"
self.last_growth = seconds
self.energy = self.energy - growthusage
result = result + Operation("set",Entity(self.id,size=self.size+1),to=self)
else:
if self.flowers < amountofflowers * self.size and server.world.get_time() == flowerseason and self.energy > flowerusage :
if debug_tree:
print "I'm going to grow a flower"
self.energy = self.energy - flowerusage
self.flowers = self.flowers + 1
else:
if debug_tree:
print "I already have enough flowers or is isn't spring"
if self.flowers > 0 and self.fruits < amountoffruits * self.size and self.energy > fruitusage :
if debug_tree:
print " I'm going to try and grow a fruit!"
if randint(1, fruitchance) == 1 :
if debug_tree:
print "I'm growing a fruit!"
self.flowers = self.flowers - 1
self.fruits = self.fruits + 1
self.energy = self.energy - fruitusage
else:
if debug_tree:
print "I didn't grow a fruit"
else:
if debug_tree:
print "I already have enough fruit"
if self.energy > growthusage and ( seconds > (self.last_growth + growthspeed * self.size * 1000 ) ) :
if debug_tree:
print "I'm going to grow bigger!"
self.last_growth = seconds
self.energy = self.energy - growthusage
result = result + Operation("set",Entity(self.id,size=self.size+1),to=self)
print type(result)
return result
#check for desiese#
# reduce health count #
#check to see if we have dieded because of lack of water etc
def water_operation(self, op):
#If somebody tends to us we grow much faster#
pass
def trim_operation(self, op):
#If somebody tends to us we grow much faster#
pass
def shake_operation(self, op):
pass
def chop_operation(self, op):
new_status=self.status-0.2
ent=Entity(self.id,status=new_status)
if new_status>=0:
return Operation("set",ent,to=self)
return Oplist(Operation("set",ent,to=self),Operation("create",Entity(name='lumber',type=['lumber'],location=self.location.parent.location.copy()),to=self))
def rain_operation(self, op):
pass
def pick_flower_operation(self, op):
pass
def pick_fruit_operation(self, op):
pass