# 名字映射锚点(只放**已确定**的;每条都要能说清依据,依据写进 混淆名对照表.md) # 列:owner name desc newName (desc 写 * 表示该 owner 下所有同名成员) # # ---- libGDX:Table(载荷名 et);依据 Obf.java + 直读字节码 ---- et D (Ldl;)LdR; add et D ([Ldl;)Let; addAll et I ()LdR; row et Z (Z)V setFillParent et SourceFile ()V clearChildren et D (Ljava/lang/CharSequence;)LdR; addLabel # ---- libGDX:Cell(载荷名 dR)---- dR StackMapTable ()LdR; expand dR D ()LdR; fill dR C ()LdR; left dR S ()LdR; top # ---- libGDX:Button / Label(保名类)---- com/badlogic/gdx/scenes/scene2d/ui/Button String ()Z isChecked com/badlogic/gdx/scenes/scene2d/ui/Button I (Z)V setChecked com/badlogic/gdx/scenes/scene2d/ui/Button B (ZZ)V setCheckedAndFire com/badlogic/gdx/scenes/scene2d/ui/Button a_ (Z)V setDisabled com/badlogic/gdx/scenes/scene2d/ui/Label D (Ljava/lang/CharSequence;)V setText com/badlogic/gdx/scenes/scene2d/ui/Label D ()Ljava/lang/StringBuilder; getTextBuilder # ---- libGDX:SelectBox(载荷名 KP);依据 DumpSites 解出的 (Ljava/lang/String;)V ---- KP B (Ljava/lang/String;)V setSelected KP B ()Ljava/lang/String; getSelected KP B (I)V setSelectedIndex # ---- 场景模型:Gp = 骨骼;依据 gp_2.java 的 toString()/D(String,boolean)V ---- Gp D Ljava/lang/String; name Gp D (Ljava/lang/String;Z)V setName # ---- 场景模型:Gp = 骨骼的变换字段 ---- # 证据:用户在编辑器里把 root 转到 341.456 / 平移(-168,-116) / 缩放(0.8799,0.572) / 斜切(-52.221,-28.63), # 面板 Inspector 同步显示 Z=-168.00009 V=-116.0 F=33.676704 Code=0.8799178 SourceFile=0.5720396 # StackMapTable=-52.220505 LineNumberTable=-28.629883 —— 一一对应,故确定语义。 Gp Z F x Gp V F y Gp F F rotation Gp Code F scaleX Gp SourceFile F scaleY Gp StackMapTable F shearX Gp LineNumberTable F shearY # 静止姿态(rest pose)那一组:值与默认姿态吻合(0,0,0,1,1,0),且未改动时与上面那组相等 —— 推断,留注释待复核 Gp D F setupX Gp B F setupY Gp L F setupRotation Gp I F setupScaleX Gp S F setupScaleY Gp C F setupShear # 引用类字段:skeleton 由 hd.D(set, bone.D)+GP.D(LGp;) 的用法确定;parent 由创建骨骼时 bone.D=parent 确定 Gp D LGP; skeleton Gp D LGp; parent Gp B Lcom/badlogic/gdx/graphics/Color; color # ---- 2026-10-16 setup pose 实测补充(用户拍照:root/bone/slot/region 四种对象)---- # Gp(root/bone):面板 Length=0.0 与 float Class=0.0 同;Ljava/java 与 Code/SourceFile 相等 → 世界缩放 Gp Class F length Gp Ljava F worldScaleX Gp java F worldScaleY # GU(插槽 mega_dg4):面板 Slot 属性只有 Name/Color;Inspector 里 String D=mega_dg4、Gp D=所属骨骼、Gn D=附件 GU D Ljava/lang/String; name GU D LGp; bone GU D LGn; attachment GU D Lcom/badlogic/gdx/graphics/Color; color # GO(region 附件 mega_dg4):面板只有 Image path/Color;Inspector 六个 float 与 # Region 附件的 旋转49.00014 / 缩放(1.997,1.335) / 宽高(157,154) 一一对应 GO S F rotation GO L F scaleX GO I F scaleY GO C F width GO Z F height # ---- ScrollPane(保名类 com/badlogic/gdx/scenes/scene2d/ui/ScrollPane)---- # 依据:MapMethods 对 gdx-1.11.0 指纹比对(tools/deobf/anchors-libgdx.tsv 自动生成), # 并且**踩过一次**:一直以为 B(ZZ)V 是 setForceScroll,传了 (false,true), # 结果纵向滚动被关掉(那其实是 setScrollingDisabled(x,y))—— 现象就是"列表滚不动"。 com/badlogic/gdx/scenes/scene2d/ui/ScrollPane B (ZZ)V setScrollingDisabled com/badlogic/gdx/scenes/scene2d/ui/ScrollPane L (FFFF)V scrollTo com/badlogic/gdx/scenes/scene2d/ui/ScrollPane D (Ldl;)V addActor com/badlogic/gdx/scenes/scene2d/ui/ScrollPane D (Ldl;Z)Z removeActor # ---- ScrollPane / Cell 的滚动与尺寸方法(用于把面板列表改成可滚动;依据:MapMethods 指纹比对)---- # ScrollPane:B(ZZ)V=setScrollingDisabled、I(ZZ)V=setForceScroll、L(ZZ)V=setOverscroll #(候选顺序 size/… 已核对;踩坑:把 B(ZZ) 当 setForceScroll 用,等于关掉纵向滚动) com/badlogic/gdx/scenes/scene2d/ui/ScrollPane I (ZZ)V setForceScroll com/badlogic/gdx/scenes/scene2d/ui/ScrollPane L (ZZ)V setOverscroll # Cell 的 (F)LdR; 成组按声明顺序:B=size L=width I=height S=minWidth C=minHeight Z=prefWidth V=prefHeight dR B (F)LdR; size dR L (F)LdR; width dR I (F)LdR; height dR S (F)LdR; minWidth dR C (F)LdR; minHeight dR Z (F)LdR; prefWidth dR V (F)LdR; prefHeight # ---- Actor 的 Touchable(点击/进入命中相关;用于让 ScrollPane 收到鼠标进入→拿到 scroll focus)---- # 定位方式(不靠名字):`Actor.getTouchable()` = **无参且返回枚举**的那个方法;枚举类 = dv; # libGDX Touchable 声明顺序 enabled/disabled/childrenOnly → 第 0 个常量就是 enabled。 # 现象佐证:ScrollPane 默认 childrenOnly 时自己不是命中目标,收不到 enter → 滚轮事件不会送到它, # 但程序化 scrollY() 是生效的(实测 before=0 after=200)。 dl L (Ldv;)V setTouchable # ---- Cell.height(2026-10-16 实测确认)---- # 依据:对 Cell 的候选 (float) 方法依次调用 900,等一帧后量"根表格高度": # Cell.I(900) -> root 高度 580 -> 1080(其它候选 L/B/Z/V/C/S/F 都没这个效果) # => Cell.I(float) 就是 height(float);现象佐证:设了它之后列表区出现滚动条、可滚。 dR I (F)LdR; height # ---- Stage 宽高(2026-10-16 实测)---- # 依据:编辑器窗口 4K 下读 Stage 的无参 float 只有两个:B=2044、D=3726(高<宽), # 故 B()F = getHeight、D()F = getWidth。 dt B ()F getHeight dt D ()F getWidth # ---- 图片附件 GO 的 7 个 float 字段(2026-10-16 确认,两条独立证据)---- # 证据 1:编辑器自己的 JSON 写入器 sb_0.java:669-675(写 region 时依次读) # x=GO.D y=GO.B scaleX=GO.L scaleY=GO.I rotation=GO.S width=GO.C height=GO.Z # 旁证:width/height 与图片实际像素一致(mega_dg4.png = 157x154,运行时读到的 C=157.0 Z=154.0) # 证据 2:GO 自己的 setTransform 字节码 javap -c GO 的 D(FFFFF)V: # putfield D(第1个参数) -> putfield B(2) -> putfield S(3) -> putfield L(4) -> putfield I(5) # => D(float) = x、B(float) = y(这两个字段名与别的字段重复,必须按类型取 float 那个) GO D F x GO B F y # 图片附件的"设置变换"入口(编辑器自己用的):setTransform(x, y, rotation, scaleX, scaleY) GO D (FFFFF)V setTransform # 图片附件没有 shear 字段:region 只有 x/y/rotation/scaleX/scaleY(+ 只读的 width/height) # ---- 附件删除(编辑器自己的删除流程)---- # 证据:javap -c Gn 的 L()V => this.GU.skeleton.removeAttachment(this, true, true) # GP 的 D(Gn,ZZ)V 字节码里 getfield L:LfI; fI.B(Object,boolean) 把它从附件表移除, # 并同步清掉 GU 上指向它的引用(同一方法里遍历 Z:LfI 即插槽表)。 Gn L ()V delete GP L (LGn;ZZ)V removeAttachment GP L LfI attachments GP Z LfI slots # ---- 附件种类 / 占位附件 ---- # 证据:可读源码 hi_2.java(= 载荷类 Hi)的 I() 直接 return "placeholder"; # 它出现在骨架附件表里但"既不是当前附件也不是静止附件",就是 skin/占位附件。 Gn I ()Ljava/lang/String; type # 附件上指向自己所属占位附件的引用:GP.removeAttachment 的占位分支按它级联删除 Gn D LHi; placeholderRef