4c1a58d5 by Barry

Added regneration for magic, stamina. Added handlers for spells and

special attacks for monsters.
1 parent 97404a56
......@@ -32,12 +32,13 @@ class CommandHandler(object):
locals()['tokens'] = tokens
locals()['next_command'] = None
try:
# try:
if cmd in utils.load_object_from_file('rooms/' + players[id]["room"] + '.txt').get('exits'):
params = cmd + " " + params.lower().strip()
cmd = "go"
if cmd == '':
return True
command = cmd
ldict = locals()
with open('commands/{}.txt'.format(cmd), 'r', encoding='utf-8') as f:
exec(f.read(), globals(), ldict)
......@@ -47,10 +48,10 @@ class CommandHandler(object):
with open('commands/{}.txt'.format(ldict['next_command']), 'r', encoding='utf-8') as f:
exec(f.read())
return True
except Exception as e:
print('Something happened...')
print(e)
mud.send_message(id, "Unknown command '{}'".format(cmd))
return False
# except Exception as e:
# print('Something happened...')
# print(e)
# mud.send_message(id, "Unknown command '{}'".format(cmd))
# return False
......
......@@ -49,4 +49,6 @@ def go(id, params, players, mud, tokens, command):
else:
# send back an 'unknown exit' message
mud.send_message(id, "Unknown exit '{}'".format(params))
if command is None and cmd is not None:
command = cmd
next_command = go(id, params, players, mud, tokens, command)
\ No newline at end of file
......
......@@ -102,7 +102,7 @@ while True:
"name": None,
"room": None,
"inventory": {},
"prompt": "> ",
"prompt": "hp %hp mp %mp> ",
"aliases": {},
"hp": 100,
"mp": 100,
......
......@@ -38,30 +38,90 @@ def run_mobs(players, mud):
for pid, player in players.items():
if not player['name']:
continue
print(player)
print('checking actions in room: ' + player['room'])
# print(player)
# print('checking actions in room: ' + player['room'])
room_monsters = utils.load_object_from_file('rooms/{}_monsters.json'.format(player['room']))
if not room_monsters:
continue
for mon_name, monster in room_monsters.items():
print(mon_name)
monster_template = utils.load_object_from_file('mobs/{}.json'.format(mon_name))
if not monster_template:
continue
print(monster)
for active_monster in monster['active']:
for active_monster_idx, active_monster in enumerate(monster['active']):
# Recover MP and Stamina
mp = active_monster['mp']
hp = active_monster['hp']
sta = active_monster['sta']
if mp < active_monster['maxmp']:
mp += monster_template['mpr']
active_monster['mp'] = mp
if sta < active_monster['maxsta']:
sta += monster_template['star']
active_monster['sta'] = sta
if active_monster['action'] == "attack" and active_monster['target'] == player['name']:
if active_monster['hp'] == 0:
if hp == 0:
DEAD = 1
if "d" in monster_template['aa']:
dice = monster_template['aa'].split('d')
att = 0
for d in range(int(dice[0])):
att += randrange(int(dice[1]) + 1)
att += randrange(int(dice[1])) + 1
players[pid]['hp'] -= att
mud.send_message(pid, "You were hit by a %s for %d" % (mon_name, att,))
# wait until at least 50% of stamina or mp are regenerated or hp is less than 25%
if (hp/active_monster['maxhp'] < 0.25) or (mp > 0 and mp/active_monster['maxmp'] > 0.5) or (sta > 0 and sta/active_monster['maxsta'] > 0.5):
magic_cast = False
# Try magic first
if mp > 0:
valid_spells = []
for spell in monster_template['sp']:
if spell['cost'] < mp:
valid_spells.append(spell)
# Select a random spell
if len(valid_spells) > 0:
spell = valid_spells[randrange(len(valid_spells))]
del valid_spells
att = 0
if 'd' in spell['dmg']:
dice = spell['dmg'].split('d')
for d in range(int(dice[0])):
att += randrange(int(dice[1])) + 1
else:
att = int(spell['dmg'])
active_monster['mp'] -= spell['cost']
players[pid]['hp'] -= att
mud.send_message(pid, "%s for %d" % (spell['desc'], att,))
magic_cast = True
if not magic_cast:
# if mp is exhaused or unavailable switch to stamina actions
if sta > 0:
print(sta)
valid_attacks = []
for attack in monster_template['at']:
if attack['cost'] < sta:
valid_attacks.append(attack)
# Select a random attack
if len(valid_attacks) > 0:
rand_val = randrange(len(valid_attacks))
print("Random attack result: {} Len: {}".format(rand_val, len(valid_attacks)))
attack = valid_attacks[rand_val]
del valid_attacks
att = 0
if 'd' in attack['dmg']:
dice = attack['dmg'].split('d')
for d in range(int(dice[0])):
att += randrange(int(dice[1])) + 1
else:
print(randrange(120))
att = int(attack['dmg'])
active_monster['sta'] -= attack['cost']
players[pid]['hp'] -= att
mud.send_message(pid, "%s for %d" % (attack['desc'], att,))
magic_cast = True
room_monsters[mon_name]['active'][active_monster_idx] = active_monster
utils.save_object_to_file(room_monsters, 'rooms/{}_monsters.json'.format(player['room']))
# {
# "cricket": {
# "max": 1,
......
......@@ -2,16 +2,20 @@
"name": "cricket",
"desc": "A small green chirping insect with large legs suited for jumping.",
"aa": "1d2",
"mpr": 0.25,
"star": 0.4,
"spawn": {
"hp": "2d2",
"mp": "0",
"mp": "10",
"sta": "10"
},
"say": [
"A cricket quietly chirps",
"A cricket moves quietly"
],
"sp": [],
"sp": [
{"name": "zap", "cost":5, "dmg": "2d4", "desc": "The cricket magically sparks lightning by rubbing it's legs together"}
],
"at": [
{"name": "kick", "cost":5, "dmg": "2d4", "desc": "The cricket kicks with powerful legs"},
{"name": "antenna tickle", "cost":2, "dmg": "1d3", "desc": "The cricket brushes you with antenna"}
......
{"name": "test", "room": "Outside", "inventory": {"candle": 1}, "prompt": "%hp> ", "aliases": {}, "hp": 96, "mp": 100, "sta": 10}
\ No newline at end of file
{"name": "test", "room": "Tavern", "inventory": {"candle": 1}, "prompt": "%hp> ", "aliases": {}, "hp": 953, "mp": 100, "sta": 10}
\ No newline at end of file
......
{
"cricket": {
"max": 1,
"active": [
{
"hp": 100,
"mp": 0,
"sta": 10,
"action": "attack",
"target": "test"
}
]
}
}
\ No newline at end of file
{"cricket": {"max": 1, "active": [{"hp": 100, "mp": 4.0, "sta": 2.550000000000001, "maxhp": 100, "maxmp": 10, "maxsta": 10, "action": "attack", "target": "test"}]}}
\ No newline at end of file
......