git.fiddlerwoaroof.com
Raw Blame History
from . import dice

from .combat_parts import races
from .combat_parts import equipment
from .combat_parts import skills
from .combat_parts import constants as const

from src import events
eh = events.EventHandler()

import collections
import random

def get_stats(sum_):
	stats = [sum_/4]*4
	if sum(stats) != sum_:
		stats[0] += sum_ - sum(stats)

	mod = +1
	for x in range(100):
		idx = random.choice([x for x in range(len(stats)) if stats[x] > 3])
		stats[idx] += mod
		mod *= -1
	return stats

class Attributes(object):
	@classmethod
	def randomize(cls, sum_):
		chosen_stats = get_stats(sum_)
		return cls(*chosen_stats)

	def __init__(self, strength, intellect, dexterity, spirit):
		self.str = strength
		self.int = intellect
		self.dex = dexterity
		self.spt = spirit
		self.state = const.HEALTHY
	def __str__(self):
		return '%s %s %s %s %s' % (self.str, self.int, self.dex, self.spt, self.state)


@equipment.Slot.add_slot('weapon', equipment.Weapon)
@equipment.Slot.add_slot('armor', equipment.Armor)
class Adventurer(object):
	@property
	def state(self):
		return self.attributes.state
	@state.setter
	def state(self, val):
		if val < 0: val == 0
		if val > const.KNOCKOUT: val = const.KNOCKOUT
		self.attributes.state = val

	@property
	def readable_state(self):
		return ['healthy', 'wounded', 'knocked out'][self.state if self.state < 3 else 2]

	@classmethod
	def randomize(cls, stat_sum=28):
		name = '%s %s%s' % (
			random.choice(['Bill', 'Bob', 'Jerry']),
			random.choice(['Longnose', 'Short-Tail', 'Squint']),
			random.choice(['', ' the Great', ' The Cross-eyed', ' The Magnificent'])
		)
		race = races.Race.random_race()
		attr = Attributes.randomize(stat_sum)
		print attr
		return cls(name, race, attr)

	@classmethod
	def with_stats(cls, name, race, str, int, dex, spt):
		attr = Attributes(str, int, dex, spt)
		return cls(name, race, attr)

	def __init__(self, name, race, attr):
		self.name = name
		self.attributes = attr
		self.skills = skills.Skills(self.attributes)
		self.race = races.Race.registry[race](self.attributes)

	def wield(self, slot, equipment):
		turns = 1
		if self.equipment_slots[slot].filled(self):
			turns += 1
		self.equipment_slots[slot].setitem(self, equipment)
		return turns

	def attack(self, opponent, type='fighting', num_allies=0):
		dieroll = dice.DieRoll()

		ally_bonus = -1 if num_allies > 0 else 0
		# TODO: implement professions, figure out how to mod ally_bonus for thieves cleanly
		dieroll.add_adjustment(add=ally_bonus)

		pass_, damage = self.skills.check(type, dieroll)
		if pass_:
			if self.weapon is not None:
				damage += self.weapon.damage_mod
			eh.trigger_event('msg',
				'%s inflicts %d damage upon %s' % (self.name, damage, opponent.name)
			)
			opponent.take_damage(damage)

	def take_damage(self, damage):
		if self.armor is not None:
			damage += self.armor.damage_mod

		dieroll = dice.DieRoll()
		dieroll.add_adjustment(-damage)

		result, __ = self.skills.check('toughness', dieroll)

		if not result:
			if damage > 0:
				self.state += 1
				eh.trigger_event('msg',
					'%s takes %d damage and is now %s' % (self.name, damage, self.readable_state)
				)
				if self.state >= const.KNOCKOUT:
					self.die()

	def die(self): pass

if __name__ == '__main__':
	a = Adventurer.randomize(28)
	b = Adventurer.randomize(28)

	while const.KNOCKOUT not in {a.state, b.state}:
		a.attack(b)
		b.attack(a)

	print a.name, 'is', ['healthy', 'wounded', 'ko'][a.state if a.state < 3 else 2]
	print b.name, 'is', ['healthy', 'wounded', 'ko'][b.state if b.state < 3 else 2]