仙五前修改吧 关注:177贴子:15,473

uvlist.tb研究报告

只看楼主收藏回复

比global.sav要复杂一些,但不会太麻烦


IP属地:浙江1楼2015-03-16 17:08回复
    文件大体分成三部分:文件头、图片内容、编号索引
    文件头
    共一行,共计16字节
    前4个字节,标识,ASCII码对应有UVL,即uvlist
    接下来2个字节,为短整型(short),记录总编号数量
    接下来2个字节,为短整型,记录编号上限(应该不需要和实际最大编号相等吧)
    接下来4个字节,ASCII码为1.02,可能和版本有关
    接下来4个字节,为整型(int),记录索引偏移量
    索引偏移量:设索引偏移量为a,当前位置往下数a个字节则到达索引开头,即fseek(fp,a,1)


    IP属地:浙江本楼含有高级字体2楼2015-03-16 17:16
    收起回复
      2026-05-20 13:53:18
      广告
      不感兴趣
      开通SVIP免广告
      文件内容
      应该对文件内容分块处理,不出意外的话分成文件头的“总编号数量”块,不过暂时还未验证。
      每一块记录一张或一组图片。
      以下都是4个字节为一组,未特别标明的为一般整型(int)。
      第一组:全部都是0,修改未发现区别
      第二组:与图片组的循环有关,值为1代表不循环,为0则代表循环。对于单图片来说(应该)可以随便填
      第三组:记录本组图片数量,单图片的值为1。假设该值为m,方便作下面的解释
      第四组:记录本组调用的图片文件个数,单图片的值为1,图片组可以不为1。假设该值为n
      随后的m*6组:分别为图片组中m个图片的信息,对于每个图片有六组:
      第一组:列1(浮点数float)
      第二组:列2(浮点数float)
      第三组:行1(浮点数float)
      第四组:行2(浮点数float)
      第五组:该图片滞留时间,单位毫秒
      第六组:调用的图片临时编号
      接下来会有n*3组:
      第一组:全部都是0,修改未发现区别
      第二组:调用文件的路径长度k
      第三组:(注意,本组不是4个字节,是k个字节)图片文件的地址,主目录为Texture


      IP属地:浙江本楼含有高级字体3楼2015-03-16 17:26
      回复
        图片组
        uvlist有把一些图片打包放置,调取时连续放送,形成动画效果。
        举例:
        UI\UIP5\UP@.dds为升级图,由22个小图组成,人物升级时一次播放这22个小图片
        UI\UIP5\sp0[n]@.dds,这里的[n]是1~8的整数。呼出菜单时调取的图片,由8张组成,一次播放,形成扇形
        循环
        图片组的动画效果是可以循环播放的,比如升级。如果把呼出菜单也改成可以循环,就会非常好玩,根本停不下来。如果设成不循环,就会留住最后一张图片。
        图片数量
        就是连续播放的图片总数量,这关系到本块的字节长度,因此填错会出事情
        文件数量
        从上面升级图和呼出菜单的案例可以看出,这两种连续播放图片的方式不相同,一个是一张图片,多个小图片,另一个是调用好几张图片
        行/列
        这个楼下再说
        滞留时间
        播放本图片后,要等待滞留时间后再播放下一张,很好理解。我猜测是整型存储,因为想不出其他可能。
        例如升级图的每一张滞留时间都是28 00 00 00,也就是40毫秒,共22张图,耗费近一秒,实际确实如此
        路径长度
        准确说来是字符串长度,因为每个字符串都需要00作为结尾,所以比看到的数量多1。
        例如:“UI\UIP5\UP@”共有11个字符,占11字节,结尾处必定有00,故一共12字节,因此路径长度为0C 00 00 00


        IP属地:浙江本楼含有高级字体4楼2015-03-16 17:38
        收起回复
          调取的图片是从一个图片文件中截取的,用两条列直线、两条行直线可围成所需部分
          直线的位置怎么确定呢?用占总长度来记录,例如一张2048*2048的图片,把2048乘以列1的浮点数,可以得到第一条列直线的位置。
          见下图:

          这张图片示意了确定UI\UIP5W\z10@.dds中瑕的头像位置的方法:
          我需要第二行第二张图片,编号512
          找到第一条列直线:很明显在恰好图片左端,黑色部分最右边,用PS的裁剪工具看到,距离图片最左边宽度为15.95厘米
          找到第二条列直线:应该是恰好在第二行第三张图片的左端。显示为31.75厘米
          找到总宽度:72.25厘米
          15.95/72.25=0.22
          31.75/72.25=0.44
          同样的方法可以找到两行,其围成的部分就是这一张图片信息所调用的范围
          下面进入uvlist.tb,找到编号512的图片信息(具体找的方法楼下再说)
          发现对应列1为00 00 61 3E
          _______列2为00 00 E1 3E
          用浮点数转换的软件(精品区那个常用软件里面有)
          3E610000→0.22
          3EE10000→0.44
          浮点数
          这里使用的是单精度浮点数(float),和整型一样占用4字节。双精度浮点数(double)则占用8字节。由于一般浮点数要写成2进制才能算出它代表的十进制小数,因此用工具转换是更加科学的方法
          寻找行、列
          上面图片用的裁剪工具,其实是为了截图方便,我用的是PS的矩形选框工具,不过也只能看到距离左端的宽度,单位是厘米,最后还得作个除法。不知道有没有更加方便好用的软件。


          IP属地:浙江本楼含有高级字体5楼2015-03-16 18:06
          回复
            下面还有particle和role


            6楼2015-03-16 18:37
            回复
              行/列
              补充一个图,应该是不会看不懂了


              IP属地:浙江7楼2015-03-16 18:52
              回复
                索引
                正文内容结束后就是索引。
                索引也分成“总编号数量”块,每一块3组。
                第一组:编号文件内容开头偏移(以文件头为起点),设为a。
                第二组:编号文件内容长度。
                第三组:编号。
                例如,想找到编号512对应的内容,就是fseek(fp,a,0),在UE中就是按Ctrl+G输入a,或者直接输入0x,再输入十六进制也是可以的。
                索引内容实际之后编号和正文内容一块块地相对应,偏移和内容长度都是为了我们的查询方便,如果是要做MOD的话也建议不怕麻烦把索引写好(当然以后要是有辅助工具就很方便了),调试神马的会更好。


                IP属地:浙江本楼含有高级字体8楼2015-03-16 19:21
                收起回复
                  2026-05-20 13:47:18
                  广告
                  不感兴趣
                  开通SVIP免广告
                  @ad1234a


                  IP属地:浙江来自Android客户端9楼2015-03-17 13:20
                  收起回复
                    MARK...不过表示我这种没什么计算机基础的,还是需要从基础的方式方法入手,十六进制好讨厌
                    做扩增型MOD新增图片要学习,不过开发独立式MOD倒不是非常迫切,总有很多不需要的图片可以替换利用


                    IP属地:上海来自Android客户端10楼2015-03-17 19:13
                    回复
                      翻完最近的几篇帖子,已经完全看不懂你们在说什么了。


                      IP属地:内蒙古11楼2015-03-17 21:29
                      收起回复
                        uvlist修改器 v1.0
                        温馨提示:
                        1.需要NET4.0及以上,如果打开不了就代表没装,请自行百度下载
                        2.这次是一个压缩包,里面有库,所以要把压缩包内文件解压到一个固定的地方,比如一个文件夹下
                        3.本帖前文对uvlist.tb文件结构的介绍,看懂之后再修改。没看懂也可以用,就专门使用读取、查看部分的功能,修改前慎重。


                        IP属地:浙江12楼2015-04-03 17:32
                        回复
                          使用说明:
                          1.选择“打开”或者拖动可以加载uvlist.tb。程序只会检查文件头,因此手动改出问题的uvlist也会读取,可能出现各种bug,请小心
                          2.修改可分为三部分,一部分是总编号对应内容的修改,一部分是图片编号对应内容的修改,还有一部分是文件编号对应内容的修改。
                          总编号部分
                          有修改、新建和删除,“修改”会把本条的“是否循环”和“未知参数”的内容修改掉,“新建”会按用户在总编号的下拉框内输入的编号新建一个空的编号,删除会直接把本条删除。
                          所谓空的编号:以往的修改器新建时会把面板内用户输入的数据读入后新建,这一次新建的除了编号都是默认值,需要用户根据需要去修改。
                          为了简化操作,增加了“复制本条”的功能,在选择需要复制的模板后,在按钮右边的文本框输入一个新的编号,就会新建一个和此编号一模一样内容的条目。
                          图片编号部分
                          本帖已经介绍过,一个总编号可以有多个图片编号,uvlist里面只是按顺序列出,我在这里以下拉框的形式分别自动编号为0,1,....,n-1,修改会读取这一部分中文本框的数据存入,另外还会读取当前选择的文件编号——即本图片对应的文件。删除会删除这一条图片信息,新建会新建一条新的空的编号。
                          注意:这里不开放编号自由,用户新建的时候会自动在最后加上一条编号,删除会删除本条内容,但是编号是最大的没有了,所以看起来会像是没有删除成功。如果用户注意到总编号数量减少了,就是删除了。
                          文件编号部分
                          一个文件编号对应一个文件路径和一个未知参数。同样不开放自由编号,但是这里会有个漏洞:
                          假想有两个图片,对应两个文件。如果图片编号选择的文件被删掉了,就会出现问题。
                          所以这里要注意:删除或者新增,请先对图片编号操作,再对文件编号操作。如果你只是新建了一个文件编号,而没有图片去对应,那么刷新一下之后这个文件的信息又会丢失,由此还可能造成其他的问题。
                          路径查找
                          和str修改器的用法是类似的,只能搜索路径部分,不分大小写(因为路径本来就是不分大小写的嘛)。
                          排序
                          就是对编号进行排序。如果按下“按编号顺序新建”,且之前未排序的话,会提示排序。由于一般条目才5000多,所以很快。


                          IP属地:浙江本楼含有高级字体13楼2015-04-03 17:47
                          回复
                            预览贴图
                            选择后会打开一个预览贴图的部分,上面有Texture目录供选择(那个★按钮就是用来选目录的),还有一个拖动调节图片显示大小的控件,然后是两个按钮,获取行列和获取矩形。
                            调节大小
                            共100档,最大的一档为原图大小,这里肯定放不下,要用滚动条看。最小的一档是1/6^2大小还是多少来着,反正可以完全的看到全图了。
                            获取行列
                            用户在图片上拖动可以显示矩形框,松开后矩形框消失(我也不想让他消失,但这个目前是真的没办法解决,尝试了各种方法都失败了)。然后选择获取行列,就会读取刚才矩形表示的范围送给相应文本框。
                            另外,由于鼠标限制,最右边和最下边的位置都只有0.998,所以需要的话可以手动填1。
                            获取矩形
                            是刚才的逆向操作,把文本框的内容读进来,绘制矩形。这个矩形也是随时都可能消失的= =。如果看不到矩形,可以把图片大小调到最小,然后再绘制。看到矩形的大概位置后,放大,滚动条调到相应位置,再获取矩形,就可以了。
                            吐槽:由于上述功能实在是做的死去活来,最后没有了测试的心情。所以难免会有bug,请用户不吝指出,谢谢啊


                            IP属地:浙江本楼含有高级字体14楼2015-04-03 17:58
                            回复
                              2026-05-20 13:41:18
                              广告
                              不感兴趣
                              开通SVIP免广告
                              v1.0 下载地址 http://pan.baidu.com/s/1ntkOVR7


                              IP属地:浙江15楼2015-04-03 18:05
                              收起回复