diff --git a/konabot/plugins/air_conditioner/__init__.py b/konabot/plugins/air_conditioner/__init__.py index b38cbb4..cf86e65 100644 --- a/konabot/plugins/air_conditioner/__init__.py +++ b/konabot/plugins/air_conditioner/__init__.py @@ -9,6 +9,9 @@ from konabot.common.longtask import DepLongTaskTarget from konabot.common.path import ASSETS_PATH from konabot.plugins.air_conditioner.ac import AirConditioner, generate_ac_image +import random +import math + def get_ac(id: str) -> AirConditioner: ac = AirConditioner.air_conditioners.get(id) if ac is None: @@ -82,14 +85,17 @@ async def _(event: BaseEvent, target: DepLongTaskTarget): return ac.temperature += 1 if ac.temperature > 40: - # 打开爆炸图片 - with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f: - output = BytesIO() - Image.open(f).save(output, format="GIF") - await evt.send(await UniMessage().image(raw=output).export()) - ac.burnt = True - await evt.send("太热啦,空调炸了!") - return + # 根据温度随机出是否爆炸,40度开始,呈指数增长 + possibility = -math.e ** ((40-ac.temperature) / 50) + 1 + if random.random() < possibility: + # 打开爆炸图片 + with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f: + output = BytesIO() + Image.open(f).save(output, format="GIF") + await evt.send(await UniMessage().image(raw=output).export()) + ac.burnt = True + await evt.send("太热啦,空调炸了!") + return await send_ac_image(evt, ac) evt = on_alconna(Alconna( @@ -105,7 +111,10 @@ async def _(event: BaseEvent, target: DepLongTaskTarget): return ac.temperature -= 1 if ac.temperature < 0: - ac.frozen = True + # 根据温度随机出是否冻结,0度开始,呈指数增长 + possibility = -math.e ** (ac.temperature / 50) + 1 + if random.random() < possibility: + ac.frozen = True await send_ac_image(evt, ac) evt = on_alconna(Alconna( diff --git a/konabot/plugins/air_conditioner/ac.py b/konabot/plugins/air_conditioner/ac.py index f346159..7e3468e 100644 --- a/konabot/plugins/air_conditioner/ac.py +++ b/konabot/plugins/air_conditioner/ac.py @@ -168,13 +168,13 @@ def precise_blend_with_perspective(background, foreground, corners): return result -def wiggle_transform(image) -> list[np.ndarray]: +def wiggle_transform(image, intensity=2) -> list[np.ndarray]: ''' 返回一组图像振动的帧组,模拟空调运作时的抖动效果 ''' frames = [] height, width = image.shape[:2] - shifts = [(-2, 0), (2, 0), (0, -2), (0, 2), (0, 0)] + shifts = [(-intensity, 0), (intensity, 0), (0, -intensity), (0, intensity), (0, 0)] for dx, dy in shifts: M = np.float32([[1, 0, dx], [0, 1, dy]]) shifted = cv2.warpAffine(image, M, (width, height)) @@ -218,8 +218,10 @@ async def generate_ac_image(ac: AirConditioner) -> BytesIO: final_image_simple = blend_with_transparency(ac_image, transformed_text, (0, 0)) - frames = wiggle_transform(final_image_simple) + intensity = max(2, abs(ac.temperature - 24) // 2) + + frames = wiggle_transform(final_image_simple, intensity=intensity) pil_frames = [Image.fromarray(frame) for frame in frames] output = BytesIO() - pil_frames[0].save(output, format="GIF", save_all=True, append_images=pil_frames[1:], loop=0, duration=50) + pil_frames[0].save(output, format="GIF", save_all=True, append_images=pil_frames[1:], loop=0, duration=50, disposal=2) return output \ No newline at end of file diff --git a/konabot/plugins/roll_dice/roll_dice.py b/konabot/plugins/roll_dice/roll_dice.py index d9159f8..fcc9c8c 100644 --- a/konabot/plugins/roll_dice/roll_dice.py +++ b/konabot/plugins/roll_dice/roll_dice.py @@ -394,7 +394,8 @@ async def generate_dice_image(number: str) -> BytesIO: append_images=images[1:], duration=frame_durations, format='GIF', - loop=1) + loop=1, + disposal=2) output.seek(0) # pil_final.save(output, format='PNG') return output \ No newline at end of file