Update data management + bug fixes
parent
852c672198
commit
a87bc5bae4
100
botany.py
100
botany.py
|
@ -15,7 +15,6 @@ import threading
|
||||||
# seed -> seedling -> sprout -> young plant -> mature plant -> flower ->
|
# seed -> seedling -> sprout -> young plant -> mature plant -> flower ->
|
||||||
# pollination -> fruit -> seeds
|
# pollination -> fruit -> seeds
|
||||||
|
|
||||||
# mutations over time to yield different things? idk
|
|
||||||
# neighboring plants can cross pollinate for different plants
|
# neighboring plants can cross pollinate for different plants
|
||||||
# health based on checkups and watering
|
# health based on checkups and watering
|
||||||
|
|
||||||
|
@ -27,8 +26,24 @@ import threading
|
||||||
|
|
||||||
# interaction
|
# interaction
|
||||||
# - watering?
|
# - watering?
|
||||||
# - look at plant, how do you feel?
|
# - look at plant, how do you feel? (also gets rid of pests)
|
||||||
# - fertilize?
|
#
|
||||||
|
# if >5 days with no water, plant dies
|
||||||
|
# events
|
||||||
|
# - heatwave
|
||||||
|
# - rain
|
||||||
|
# - bugs
|
||||||
|
#
|
||||||
|
# neighborhood system
|
||||||
|
# - create plant id (sort of like userid)
|
||||||
|
# - list sorted by plantid that wraps so everybody has 2 neighbors :)
|
||||||
|
# - can water neighbors plant once (have to choose which)
|
||||||
|
# - pollination - seed is combination of your plant and neighbor plant
|
||||||
|
# - create rarer species by diff gens
|
||||||
|
# - if neighbor plant dies, node will be removed from list
|
||||||
|
#
|
||||||
|
# garden system
|
||||||
|
# - can plant your plant in the garden to start a new plant
|
||||||
|
|
||||||
# build time system
|
# build time system
|
||||||
# build persistence across sessions
|
# build persistence across sessions
|
||||||
|
@ -55,6 +70,7 @@ import threading
|
||||||
# curses.endwin()
|
# curses.endwin()
|
||||||
|
|
||||||
class Plant(object):
|
class Plant(object):
|
||||||
|
# This is your plant!
|
||||||
stage_dict = {
|
stage_dict = {
|
||||||
0: 'seed',
|
0: 'seed',
|
||||||
1: 'seedling',
|
1: 'seedling',
|
||||||
|
@ -119,7 +135,8 @@ class Plant(object):
|
||||||
19: 'glossy',
|
19: 'glossy',
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, this_filename):
|
||||||
|
# Constructor
|
||||||
self.stage = 0
|
self.stage = 0
|
||||||
self.mutation = 0
|
self.mutation = 0
|
||||||
self.species = random.randint(0,len(self.species_dict)-1)
|
self.species = random.randint(0,len(self.species_dict)-1)
|
||||||
|
@ -127,8 +144,10 @@ class Plant(object):
|
||||||
self.rarity = self.rarity_check()
|
self.rarity = self.rarity_check()
|
||||||
self.ticks = 0
|
self.ticks = 0
|
||||||
self.dead = False
|
self.dead = False
|
||||||
|
self.filename = this_filename
|
||||||
|
|
||||||
def rarity_check(self):
|
def rarity_check(self):
|
||||||
|
# Generate plant rarity
|
||||||
CONST_RARITY_MAX = 256.0
|
CONST_RARITY_MAX = 256.0
|
||||||
rare_seed = random.randint(1,CONST_RARITY_MAX)
|
rare_seed = random.randint(1,CONST_RARITY_MAX)
|
||||||
common_range = round((2/3)*CONST_RARITY_MAX)
|
common_range = round((2/3)*CONST_RARITY_MAX)
|
||||||
|
@ -159,19 +178,33 @@ class Plant(object):
|
||||||
return rarity
|
return rarity
|
||||||
|
|
||||||
def growth(self):
|
def growth(self):
|
||||||
|
# Increase plant growth stage
|
||||||
if self.stage < (len(self.stage_dict)-1):
|
if self.stage < (len(self.stage_dict)-1):
|
||||||
self.stage += 1
|
self.stage += 1
|
||||||
# do stage growth stuff
|
# do stage growth stuff
|
||||||
CONST_MUTATION_RARITY = 9 # Increase this # to make mutation rarer (chance 1 out of x)
|
|
||||||
mutation_seed = random.randint(0,CONST_MUTATION_RARITY)
|
|
||||||
if mutation_seed == CONST_MUTATION_RARITY:
|
|
||||||
mutation = random.randint(0,len(self.mutation_dict)-1)
|
|
||||||
if self.mutation == 0:
|
|
||||||
self.mutation = mutation
|
|
||||||
else:
|
else:
|
||||||
# do stage 5 stuff (after fruiting)
|
# do stage 5 stuff (after fruiting)
|
||||||
1==1
|
1==1
|
||||||
|
|
||||||
|
def mutate_check(self):
|
||||||
|
# Create plant mutation
|
||||||
|
# TODO: when out of debug this needs to be set to high number (1000
|
||||||
|
# even maybe)
|
||||||
|
CONST_MUTATION_RARITY = 10 # Increase this # to make mutation rarer (chance 1 out of x)
|
||||||
|
mutation_seed = random.randint(1,CONST_MUTATION_RARITY)
|
||||||
|
if mutation_seed == CONST_MUTATION_RARITY:
|
||||||
|
# mutation gained!
|
||||||
|
mutation = random.randint(0,len(self.mutation_dict)-1)
|
||||||
|
if self.mutation == 0:
|
||||||
|
self.mutation = mutation
|
||||||
|
print "mutation!"
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def parse_plant(self):
|
def parse_plant(self):
|
||||||
|
# reads plant info (maybe want to reorg this into a different class
|
||||||
|
# with the reader dicts...)
|
||||||
output = ""
|
output = ""
|
||||||
output += self.rarity_dict[self.rarity] + " "
|
output += self.rarity_dict[self.rarity] + " "
|
||||||
if self.mutation != 0:
|
if self.mutation != 0:
|
||||||
|
@ -184,16 +217,16 @@ class Plant(object):
|
||||||
print output
|
print output
|
||||||
|
|
||||||
def start_life(self):
|
def start_life(self):
|
||||||
# runs forever
|
# runs life on a thread
|
||||||
thread = threading.Thread(target=self.life, args=())
|
thread = threading.Thread(target=self.life, args=())
|
||||||
thread.daemon = True
|
thread.daemon = True
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
def life(self):
|
def life(self):
|
||||||
# I've created life :)
|
# I've created life :)
|
||||||
|
# TODO: change out of debug
|
||||||
# life_stages = (5, 15, 30, 45, 60)
|
# life_stages = (5, 15, 30, 45, 60)
|
||||||
life_stages = (1, 2, 3, 4, 5)
|
life_stages = (1, 2, 3, 4, 5)
|
||||||
# TODO: stopped here 3/6 evening
|
|
||||||
# leave this untouched bc it works for now
|
# leave this untouched bc it works for now
|
||||||
while (self.stage < 5) or (self.dead == False):
|
while (self.stage < 5) or (self.dead == False):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
@ -203,8 +236,8 @@ class Plant(object):
|
||||||
if self.ticks == life_stages[self.stage]:
|
if self.ticks == life_stages[self.stage]:
|
||||||
self.growth()
|
self.growth()
|
||||||
self.parse_plant()
|
self.parse_plant()
|
||||||
|
if self.mutate_check():
|
||||||
# raw_input("...")
|
self.parse_plant()
|
||||||
|
|
||||||
# what kills the plant?
|
# what kills the plant?
|
||||||
|
|
||||||
|
@ -215,47 +248,60 @@ class Plant(object):
|
||||||
# my_plant.parse_plant()
|
# my_plant.parse_plant()
|
||||||
|
|
||||||
class DataManager(object):
|
class DataManager(object):
|
||||||
|
# handles user data, puts a .botany dir in user's home dir (OSX/Linux)
|
||||||
|
# TODO: windows... lol
|
||||||
|
user_dir = os.path.expanduser("~")
|
||||||
|
botany_dir = os.path.join(user_dir,'.botany')
|
||||||
|
this_user = getpass.getuser()
|
||||||
|
savefile_name = this_user + '_plant.dat'
|
||||||
|
savefile_path = os.path.join(botany_dir,savefile_name)
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.this_user = getpass.getuser()
|
self.this_user = getpass.getuser()
|
||||||
|
if not os.path.exists(self.botany_dir):
|
||||||
|
os.makedirs(self.botany_dir)
|
||||||
self.savefile_name = self.this_user + '_plant.dat'
|
self.savefile_name = self.this_user + '_plant.dat'
|
||||||
|
|
||||||
def check_plant(self):
|
def check_plant(self):
|
||||||
if os.path.isfile(self.savefile_name):
|
# check for existing save file
|
||||||
print "found savefile!"
|
if os.path.isfile(self.savefile_path):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print "no savefile found"
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def save_plant(self, this_plant):
|
def save_plant(self, this_plant):
|
||||||
with open(self.savefile_name, 'wb') as f:
|
# create savefile
|
||||||
|
with open(self.savefile_path, 'wb') as f:
|
||||||
pickle.dump(this_plant, f, protocol=2)
|
pickle.dump(this_plant, f, protocol=2)
|
||||||
|
|
||||||
def load_plant(self):
|
def load_plant(self):
|
||||||
with open(self.savefile_name, 'rb') as f:
|
# load savefile
|
||||||
|
with open(self.savefile_path, 'rb') as f:
|
||||||
this_plant = pickle.load(f)
|
this_plant = pickle.load(f)
|
||||||
return this_plant
|
return this_plant
|
||||||
|
|
||||||
def data_write_json(self, this_plant):
|
def data_write_json(self, this_plant):
|
||||||
json_filename = self.this_user + '_plant_data.json'
|
# create json file for user to use outside of the game (website?)
|
||||||
with open(json_filename, 'w') as outfile:
|
json_file = os.path.join(self.botany_dir,self.this_user + '_plant_data.json')
|
||||||
|
with open(json_file, 'w') as outfile:
|
||||||
json.dump(this_plant.__dict__, outfile)
|
json.dump(this_plant.__dict__, outfile)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
my_data = DataManager()
|
my_data = DataManager()
|
||||||
# if plant save file does not exist
|
# if plant save file exists
|
||||||
if my_data.check_plant():
|
if my_data.check_plant():
|
||||||
|
print "Welcome back, " + getpass.getuser()
|
||||||
my_plant = my_data.load_plant()
|
my_plant = my_data.load_plant()
|
||||||
my_plant.parse_plant()
|
my_plant.parse_plant()
|
||||||
# otherwise create new plant
|
# otherwise create new plant
|
||||||
else:
|
else:
|
||||||
my_plant = Plant()
|
print "Welcome, " + getpass.getuser()
|
||||||
|
#TODO: onboarding, select seed, select whatever else
|
||||||
# print my_plant.stage, my_plant.species, my_plant.color, my_plant.rarity, my_plant.mutation
|
my_plant = Plant(my_data.savefile_path)
|
||||||
my_plant.start_life()
|
my_plant.start_life()
|
||||||
print "Thread's running!"
|
print "Your plant is living :)"
|
||||||
raw_input('...')
|
raw_input('Press return to save and exit...\n')
|
||||||
my_data.save_plant(my_plant)
|
my_data.save_plant(my_plant)
|
||||||
my_data.data_write_json(my_plant)
|
my_data.data_write_json(my_plant)
|
||||||
print "end"
|
print "end"
|
||||||
|
|
Loading…
Reference in New Issue