| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- # -*- coding: utf-8 -*-
- """diag_walk.py — 走路帧布局矩阵对照实验。
- 背景: run5-11 比奇走路反复被拒(SC28拉回站桩), 等待图却全通。Lua 源
- (handleActionBegin)只有一种布局, 但 moveToNextGrid 先 SetActorMapXY(目标格)
- 再触发发送, recog/p3 到底谁是起点谁是目标存在两种读法。本脚本在同一会话
- 内依次测试布局变体 × 各走 3 步, 观察 SC28 增量判定接受性:
- V1: recog=目标point, p3=起点point (moveToNextGrid 先设目标的读法)
- V2: recog=起点point, p3=上一点point (字面 handleActionBegin 读法)
- V3: recog=起点point, p3=0 (README 旧布局去 lastPoint)
- V4: V1 + 走2格(验证步长语义)
- 判定: SC28 新增==0 → 布局被接受。
- 用法: .venv/bin/python diag_walk.py [--name 萌新2814]
- """
- import argparse
- import sys
- import time
- import requests as rq
- import urllib3
- urllib3.disable_warnings()
- HERE = __file__.rsplit("/", 1)[0]
- sys.path.insert(0, HERE)
- import login_996pc as L # noqa: E402
- import quest_bot3 as Q # noqa: E402
- from combat_bot import log, pack_point, proto_map_name # noqa: E402
- ZONE = 14492170
- def run_variant(bot, tag, mid, mk_recog, mk_p1, mk_p2, mk_p3, body, step_len=1, steps=3):
- """mk_* 是帧构造器: (d, x, y, nx, ny, last_x, last_y) → 字段值。"""
- sc28_b = bot.frame_log.get(28, 0)
- for i in range(steps):
- x, y = bot.me["x"], bot.me["y"]
- d = 2 # 恒向东
- nx, ny = x + step_len, y
- lx, ly = bot.me.get("last_x", x), bot.me.get("last_y", y)
- ctx = (d, x, y, nx, ny, lx, ly)
- bot.send(mid, mk_recog(*ctx), mk_p1(*ctx), mk_p2(*ctx), mk_p3(*ctx), body)
- bot.me["last_x"], bot.me["last_y"] = x, y
- bot.me["x"], bot.me["y"] = nx, ny
- t_end = time.time() + 1.2
- while time.time() < t_end:
- bot.pump(0.15)
- bot.tick_step_ack()
- sc28_a = bot.frame_log.get(28, 0)
- log(f"[{tag}] SC28+={sc28_a - sc28_b} pos=({bot.me['x']},{bot.me['y']})")
- return sc28_a - sc28_b == 0
- def main():
- ap = argparse.ArgumentParser()
- ap.add_argument("--name", default="萌新2814")
- args = ap.parse_args()
- s = rq.Session()
- j, _ = L.do_login(s, "longwu988", "Longwu1988")
- assert j.get("code") == 200, j.get("msg")
- jwt = j["data"]["token"]
- uid = str(j["data"]["userInfo"]["id"])
- g, bot = Q.enter_world(s, jwt, uid, ZONE, args.name, 0)
- log(f"出生: map={bot.me.get('mapname')} @({bot.me['x']},{bot.me['y']}) sid={bot.sid}")
- bot.pump(1.5)
- m = bot.me.get("mapname")
- if m == "等待地图":
- log("[!] 出生在等待图(1D走廊不敏感), 重进...")
- g.close()
- return
- bmap = proto_map_name(bot.me).encode()
- sid = bot.sid
- pt = pack_point # lo16=x hi16=y
- def pt_rev(x, y):
- return ((x & 0xFFFF) << 16) | (y & 0xFFFF) # lo16=y hi16=x
- # W1: CS3012 WALKEX + README CS3013 布局(p1=dir,p2=point,p3=sid)
- run_variant(bot, "W1 CS3012 p1=dir p2=pt p3=sid", 3012,
- lambda *c: 0, lambda *c: c[0], lambda *c: pt(c[1], c[2]),
- lambda *c: sid, bmap)
- # W2: CS3011 README 原布局(p1=dir, p2=point, p3=sid)
- run_variant(bot, "W2 CS3011 p1=dir p2=pt p3=sid", 3011,
- lambda *c: 0, lambda *c: c[0], lambda *c: pt(c[1], c[2]),
- lambda *c: sid, bmap)
- # W3: CS3011 point 字节序反转(recog=X<<16|Y, p2=dir, p3=lastPoint_rev)
- run_variant(bot, "W3 CS3011 pt_rev p2=dir", 3011,
- lambda *c: pt_rev(c[1], c[2]), lambda *c: 0,
- lambda *c: c[0], lambda *c: pt_rev(c[5], c[6]), bmap)
- # W4: CS3013 README 原布局(p1=dir, p2=point, p3=sid)
- run_variant(bot, "W4 CS3013 p1=dir p2=pt p3=sid", 3013,
- lambda *c: 0, lambda *c: c[0], lambda *c: pt(c[1], c[2]),
- lambda *c: sid, bmap)
- # W5: CS3011 Lua 源布局(recog=pt, p1=0, p2=dir, p3=lastPoint) — 当前实现
- run_variant(bot, "W5 CS3011 recog=pt p2=dir p3=pt", 3011,
- lambda *c: pt(c[1], c[2]), lambda *c: 0,
- lambda *c: c[0], lambda *c: pt(c[5], c[6]), bmap)
- g.close()
- log("[diag完成] SC28+=0 的变体即服务器接受的布局")
- if __name__ == "__main__":
- main()
|