from core import *
from util import *
import event
class Civ(Actor):
ld = 0 # last drink
cash = 100
def __init__(S):
super(Civ,S).__init__()
S.init()
def init(S):
event.adde(randint(10,15),0,nup,[S])
def __setstate__(S,s):
super(Civ,S).__setstate__(s)
S.init()
# ranks different drinks in order of interest
def rankall(S):
ranks = []
for o in Thing.all:
if o.shop:
for z in o.shop.inv:
if is_a(z[0],Drink):
ranks += [[S.rank(o.room,*z),o.room,o.shop,z]]
return sorted(ranks,reverse=1)
# How much do I want a particular drink?
# This formula is really lousy. Fix it.
def rank(S,r,x,q,pr):
s = randint(0,10) # starting score
if not q: s -= 999 # out of stock
if S.ld == x.fls: s -= 200 # already drank one
if r == S.room: s += 10 # no walking == good
s += (S.cash/pr)**0.3 * 10 # Price matters
c = '/'.join(x.fls)
# Try something new? Familiar flavors help.
# Ideally, there would be a slight chance that NPCs would go try out
# new drinks, but the better way would be advertising and free samples
if c not in S.tastes:
s += 100 + 2*sum([S.tastes[fl] for fl in x.fls if fl in S.tastes])
else:
s += S.tastes[c] * 5
return s
class Pie(Item):
dam = 16
def on_splat(S,v,by):
Act(S,v).vict("$SN hits you in the face!").room("$SN splatters on $VN's face!")
by.rhit(S.dam,"pie throw")
S.goto(0)
class Drink(Item):
fls = ()
dam = 12
def on_splat(S,v,by):
Act(S,v).vict("$SN spills all over you!").room("$SN spills all over $VN!")
by.rhit(S.dam,"spillage")
S.goto(0)
def on_drink(S,by):
Act(by,S).subj("You drink $VN.").room("$SN drinks $VN.")
if is_a(by,Civ):
by.ld = S.fls
c = '/'.join(S.fls) # combo name
if c not in by.tastes: # new combo based on avg of old tastes
by.tastes[c] = gauss(0,20)
for fl in S.fls:
by.tastes[c] += by.tastes.setdefault(fl,gauss(10,5)) / len(S.fls)
S.goto(0)
class Vial(Item):
def on_drop(S,by): Item.on_drop(S,by); S.on_splat(0,by)
def on_splat(S,v,by): # sorry, not a weapon to make opponent smell bad
Act(S).room("$SN shatters, releasing a foul gas.")
# random npcs flee
as = [a for a in S.room.people if a.npc and not a.foe]
for a in sample(as,randint(0,len(as))): a.flee()
S.goto(0)
start = wload()