# Module for recurring events and world updates import time,sched from util import * sc = sched.scheduler(time.time,time.sleep) adde = sc.enter def init(): # setup hourly update, starting at the next hour t = list(time.localtime()) t[4] = t[5] = 0; t[3] += 1 sc.enterabs(time.mktime(t),1,hup,()) sc.enter(15,9,sup,()) # hourly update def hup(): import core for a in core.Thing.all: if is_a(a,core.Actor): a.sendl("{YYou receive your hourly stipend of {g${x20{Y.{x") a.cash += 20 for r in core.Thing.all: e = 0 # expenses i = 0 # income if r.shop: e = r.shop.restock(); i += r.shop.rev; r.shop.rev = 0 if is_a(r,core.Room): e += r.biz.rent # expenses for p in cplayers(): if p.name == r.biz.owner: p.cash += i - e p.sendl("{rYou pay {g${r%d in rent and expenses.{x" % e) p.sendl("{YYou get {g${Y%d in sales revenue." % i) adde(3600,1,hup,()) # reschedule # fighting update def fup(p): foe = p.foe if not foe: return p.ks = randint(1,2) p.sendl("{G>> You are ready to attack or insult {g%d{G time%s.{x" % (p.ks, p.ks > 1 and "s" or "")) adde(10,1,fup,(p,)) if p.npc: # handle npc fighting # really dumb at the moment # it'd be cool to have an insult generator here for x in xrange(p.ks): # schedule reaction adde(x+1,3,p.do,[choice(["slap","pat","laugh","scold"])]) # ambient crowd response during a fight def fam(*ps): p1,p2 = ps if p1.foe != p2: return bs = p1.room.crowd # bystanders -- well, not always (bug) if len(bs) > 1: b = choice(bs) r = randint(0,2) if r == 1: Act(b).all('The crowd chants, "{RFIGHT! FIGHT! FIGHT!{x"') if r == 2 and b not in ps: b.do("say You both suck!") adde(15,3,fam,ps) # travel update for NPCs def tup(S): if S.path: if not S.foe: S.go(S.path.pop()) adde(3,4,tup,[S]) # spawn random flavor samples def sup(): import core,world rs = [r for r in core.Thing.all if is_a(r,core.Room)] s = core.Sample() s.fl = choice(["peach","strawberry","chocolate","cinnamon"]) s.name = "a "+s.fl s.goto(choice(rs)) # NPC update def nup(S): import world if S.path: return else: for x in S.inv: if is_a(x,world.Drink): x.on_drink(S); adde(randint(60,95),9,nup,[S]); return adde(randint(15,30),9,nup,[S]) if randint(0,9) < 2: return ranks = S.rankall() if not ranks: return for k,r,s,z in ranks: # rank, room, shop, item data if z not in s.inv or not z[1]: continue # skip unavailable if r == S.room: if not S.buy(s,z): continue else: S.travel(r); S.do("say I'm going to %s to buy %s." % (r.name,z[0].name)) return else: # wander S.flee()