|
@@ -340,7 +340,9 @@ class WorldUpdater:
|
|
|
aid = _safe_int(body_text(f))
|
|
aid = _safe_int(body_text(f))
|
|
|
m = world.monsters.get(aid)
|
|
m = world.monsters.get(aid)
|
|
|
if m:
|
|
if m:
|
|
|
- world.monsters[aid] = _mk_monster(aid, m.x, m.y, m.race, m.name, False)
|
|
|
|
|
|
|
+ world.monsters[aid] = _mk_monster(aid, m.x, m.y, m.race, m.name,
|
|
|
|
|
+ False,
|
|
|
|
|
+ contested_t=m.contested_t)
|
|
|
world.record("mon_reborn", m.name, aid)
|
|
world.record("mon_reborn", m.name, aid)
|
|
|
|
|
|
|
|
def _on_out_of_sight(self, world: WorldMirror, f: Frame) -> None:
|
|
def _on_out_of_sight(self, world: WorldMirror, f: Frame) -> None:
|
|
@@ -378,7 +380,8 @@ class WorldUpdater:
|
|
|
known = world.monsters.get(aid)
|
|
known = world.monsters.get(aid)
|
|
|
if known is not None:
|
|
if known is not None:
|
|
|
world.monsters[aid] = _mk_monster(aid, x, y, known.race,
|
|
world.monsters[aid] = _mk_monster(aid, x, y, known.race,
|
|
|
- known.name, known.is_dead)
|
|
|
|
|
|
|
+ known.name, known.is_dead,
|
|
|
|
|
+ contested_t=known.contested_t)
|
|
|
elif x or y:
|
|
elif x or y:
|
|
|
world.monsters[aid] = _mk_monster(aid, x, y, 0, "radar", False)
|
|
world.monsters[aid] = _mk_monster(aid, x, y, 0, "radar", False)
|
|
|
world.record("radar_mon", uid, aid)
|
|
world.record("radar_mon", uid, aid)
|
|
@@ -401,7 +404,8 @@ class WorldUpdater:
|
|
|
known = world.monsters.get(aid)
|
|
known = world.monsters.get(aid)
|
|
|
if known is not None:
|
|
if known is not None:
|
|
|
world.monsters[aid] = _mk_monster(aid, x, y, known.race,
|
|
world.monsters[aid] = _mk_monster(aid, x, y, known.race,
|
|
|
- known.name, known.is_dead)
|
|
|
|
|
|
|
+ known.name, known.is_dead,
|
|
|
|
|
+ contested_t=known.contested_t)
|
|
|
return
|
|
return
|
|
|
if aid in world.npcs:
|
|
if aid in world.npcs:
|
|
|
return
|
|
return
|
|
@@ -536,9 +540,17 @@ class WorldUpdater:
|
|
|
world.record("attacker_revealed", str(atk), atk)
|
|
world.record("attacker_revealed", str(atk), atk)
|
|
|
if aid in world.monsters:
|
|
if aid in world.monsters:
|
|
|
m = world.monsters[aid]
|
|
m = world.monsters[aid]
|
|
|
|
|
+ # 抢怪避让: 他人打这刀 → 记 contested_t(选怪窗口内跳过);
|
|
|
|
|
+ # 我打的刀 → 清标(归属确立)
|
|
|
|
|
+ contested = m.contested_t
|
|
|
|
|
+ if strike.attacker_uid and strike.attacker_uid != world.me.uid:
|
|
|
|
|
+ contested = time.time()
|
|
|
|
|
+ elif strike.attacker_uid == world.me.uid:
|
|
|
|
|
+ contested = 0.0
|
|
|
world.monsters[aid] = _mk_monster(
|
|
world.monsters[aid] = _mk_monster(
|
|
|
aid, m.x, m.y, m.race, m.name,
|
|
aid, m.x, m.y, m.race, m.name,
|
|
|
- m.is_dead or strike.hp <= 0)
|
|
|
|
|
|
|
+ m.is_dead or strike.hp <= 0,
|
|
|
|
|
+ contested_t=contested)
|
|
|
detail = (f"{aid} hp={strike.hp}/{strike.max_hp}"
|
|
detail = (f"{aid} hp={strike.hp}/{strike.max_hp}"
|
|
|
f" dmg={strike.damage} by={strike.attacker_uid}")
|
|
f" dmg={strike.damage} by={strike.attacker_uid}")
|
|
|
if strike.hp <= 0:
|
|
if strike.hp <= 0:
|
|
@@ -592,9 +604,9 @@ class WorldUpdater:
|
|
|
|
|
|
|
|
|
|
|
|
|
def _mk_monster(key: int, x: int, y: int, race: int, name: str, is_dead: bool,
|
|
def _mk_monster(key: int, x: int, y: int, race: int, name: str, is_dead: bool,
|
|
|
- is_boss: bool = False) -> Monster:
|
|
|
|
|
|
|
+ is_boss: bool = False, contested_t: float = 0.0) -> Monster:
|
|
|
return Monster(key=ActorKey(key), x=x, y=y, race=race, name=name,
|
|
return Monster(key=ActorKey(key), x=x, y=y, race=race, name=name,
|
|
|
- is_dead=is_dead, is_boss=is_boss)
|
|
|
|
|
|
|
+ is_dead=is_dead, is_boss=is_boss, contested_t=contested_t)
|
|
|
|
|
|
|
|
|
|
|
|
|
def _mk_npc(key: int, aid: str, name: str, x: int, y: int, index: int = 0) -> Npc:
|
|
def _mk_npc(key: int, aid: str, name: str, x: int, y: int, index: int = 0) -> Npc:
|