-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathEntity.py
121 lines (103 loc) · 4.02 KB
/
Entity.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
112
113
114
115
116
117
118
119
120
121
from random import uniform
from Events import Event
from Item import Armor, Weapon
class Entity(Event):
def __init__(self, name, hp, atk, dfd):
self.name = name
self.hp = hp
self.atk = atk
self.dfd = dfd
def entity_type(self):
return "Entity"
def fight(self, B):
A = self
a_dmg = A.atk - B.dfd
b_dmg = B.atk - A.dfd
print(a_dmg, b_dmg)
print(A.name,A.atk,A.dfd)
print(B.name,B.atk,B.dfd)
if(hasattr(A,"weapon")):
a_dmg+=A.weapon.atk+A.armor.atk
b_dmg-=A.weapon.dfd+A.armor.dfd
if(hasattr(B,"weapon")):
b_dmg+=B.weapon.atk+B.armor.atk
a_dmg-=B.weapon.dfd+B.armor.dfd
print(a_dmg, b_dmg)
a_dmg = max(a_dmg,0)
b_dmg = max(b_dmg,0)
if a_dmg == 0 and b_dmg == 0:
print("垃圾互打")
return;
fight_str = ""
while 1:
# Attack Phase
dmg = round(a_dmg * uniform(0.9, 1.1))
B.hp -= dmg
fight_str += "{} 攻擊 {},{} 剩下 {} 滴血\n".format(A.name, B.name, B.name, max(B.hp, 0))
# HP Judge Phase
if B.hp <= 0:
return fight_str
A, B = B, A # Malignant
a_dmg, b_dmg = b_dmg, a_dmg
def invoke_event(self, player, out, first_time):
raise NotImplementedError()
class Monster(Entity):
def __init__(self, name, atk, dfd, hp, exp, coin):
super(Monster, self).__init__(name, hp, atk, dfd)
self.exp = exp
self.coin = coin
def entity_type(self):
return "小怪"
def invoke_event(self, player, out, first_time):
said_msg = None
said_msg = out.send_meet(player.name, self.entity_type(), self.name, said_msg)
res = player.fight(self)
said_msg = out.send_fight_result(res, said_msg)
if self.hp <= 0:
said_msg = out.send_beat(player.name, self.name, self.coin, self.exp, said_msg)
said_msg = player.add_exp(self.exp, out, said_msg)
player.coin += self.coin
elif player.hp <= 0:
said_msg = out.send_beaten(player.name, self.name, said_msg)
player.restart()
else :
said_msg = out.send_tie(said_msg)
return True
class Boss(Monster):
def __init__(self, name, atk, dfd, hp, exp, coin, drop_item):
super(Boss, self).__init__(name, atk, dfd, hp, exp, coin)
if drop_item[0]:
self.drop_item = (Weapon(drop_item[0]), Armor(drop_item[1]))
else:
self.drop_item = (None, None)
def entity_type(self):
return "首領"
def invoke_event(self, player, out, first_time):
said_msg = None
said_msg = out.send_meet(player.name, self.entity_type(), self.name, said_msg)
res = player.fight(self)
said_msg = out.send_fight_result(res, said_msg)
if self.hp <= 0: # boss was beaten
said_msg = out.send_beat(player.name, self.name, self.coin, self.exp, said_msg)
said_msg = player.level_to(min(10*(player.phase()+1) + 1, 40), out, said_msg)
if(player.phase() == 3):
said_msg = out.send_congrats_clear(player.name, said_msg)
return "Starburst"
drop_weapon, drop_armor = self.drop()
if drop_weapon:
player.unused_weapons.append(drop_weapon)
player.unused_armors.append(drop_armor)
said_msg = out.send_last_strike(player.name, drop_weapon.name, drop_armor.name, said_msg)
said_msg = player.add_exp(self.exp, out, said_msg)
player.coin += self.coin
elif player.hp <= 0:
said_msg = out.send_beaten(player.name, self.name, said_msg)
player.restart()
else:
said_msg = out.send_tie(said_msg)
player.restart()
return True
def drop(self):
dropped = self.drop_item
self.drop_item = (None, None)
return dropped