# -*- 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()