-
Notifications
You must be signed in to change notification settings - Fork 1
/
custom.py
111 lines (95 loc) · 5.13 KB
/
custom.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from objects import Object, register_object
from effects import Effect
from player import Player
from constants import DIRECTIONS
class FeelMyPower(Effect):
def event(self, game, player, event):
super(FeelMyPower, self).event(game, player, event)
if isinstance(player, Geanie):
return False
if event == "before_move":
for other in game.players:
if (other.position == player.position
and isinstance(other, Geanie)
and player is not other.master):
game.log("Вы не можете пошевелиться, настолько страшен вид этого джина")
game.next_move()
return False
class Geanie(Player):
MAX_HEALTH = 40
def __init__(self, master):
super(Geanie, self).__init__("Джин ибн {}".format(master.name), master.position)
self.master = master
self.pid = master.pid
self.inventory.add("ятаган")
self.live = 5
def disappear(self, game):
game.log(self, "Я ХОРОШО ПОСЛУЖИЛ ТЕБЕ, ПОВЕЛИТЕЛЬ. прощай...")
self._die(game)
game.players.remove(self)
def event(self, game, event):
if event == "before_move":
game.log("СЛУШАЮ И ПОВИНУЮСЬ")
prevent_default = super(Geanie, self).event(game, event)
if not prevent_default:
if event == "die":
self.disappear(game)
return True
elif event == "win":
game.log("ТЫ ШУТИШЬ, ПОВЕЛИТЕЛЬ! КАК Я МОГУ ПРОЛЕЗТЬ В ЭТО ИГОЛЬНОЕ УШКО?!")
return True
@register_object("ятаган")
class Yataghan(Object):
"""в/н/л/п - сломать стену в заданном направлении"""
@staticmethod
def action(game, player, action):
if not isinstance(player, Geanie):
game.log("Его и нести-то тяжело, куда уж тут махать")
return None
if action in DIRECTIONS:
direction = DIRECTIONS[action]
if not game.field.is_legal(player.position + direction):
game.log("Джин наносит сокрушительные удары, но все тщетно - стена стоит нерушимо")
elif game.field.can_move(player.position, direction):
game.log("Ятаган рассек воздух")
else:
game.log("Пара мощных ударов - и стены как не бывало")
game.log("РАД СТАРАТЬСЯ, ПОВЕЛИТЕЛЬ")
subfield = game.field.fields[player.position.field]
position = player.position
if direction[0] == 0:
subfield.vert_walls[position.x()][position.y() + min(0, direction[1])] = False
else:
subfield.hor_walls[position.x() + min(0, direction[0])][position.y()] = False
return False
@register_object("бутылка")
class Bottle(Object):
"""Старая замшелая бутылка с большой сургучной печатью на пробке. Может открыть?"""
@staticmethod
def action(game, player, action):
if action == "открыть":
game.log("Раздался страшный треск, из бытылки пошел дым и появился джин.")
game.log("БЛАГОДАРЮ ТЕБЯ, ОСВОБОДИВШЕГО МЕНЯ ИЗ ЗАТОЧЕНИЯ")
game.log("Я ПОЙДУ, КУДА ТЫ ПРИКАЖЕШЬ И СОКРУШУ ЛЮБЫЕ СТЕНЫ СВОИМ ЯТАГАНОМ")
game.players.insert(game.players.index(player), Geanie(player))
return True
@register_object("зачарованная_бутылка")
class CharmedBottle(Object):
"""Эта бутылка так и тянет к себе. Наверное, чуть только зазеваешься, сразу же затянет. Жутковато.
Наверное, если наклонить ее вбок (в/н/л/п), то затянет даже из соседней комнаты
"""
@staticmethod
def action(game, player, action):
if action in DIRECTIONS:
direction = DIRECTIONS[action]
if not game.field.can_move(player.position, direction):
game.log("Какой толк поворачивать туда бутылку? Там же стена")
else:
for other in game.players:
if other.position == player.position + direction and isinstance(other, Geanie):
other.disappear(game)
game.log("Раздался легкий свист и... скорее, где пробка?!")
player.inventory.add("бутылка")
return True
game.log("Кажется, затея не удалась")
return False