影之诗安卓国服mod放在哪里

影之诗安卓国服mod放在哪里,第1张

第一部分:理论知识与工具准备

卡面文件位置在这里:

内部存储\Android\data\com.cygams.Shadowverse\files\a\

这是游戏资源文件夹,里面有种形如card_xxxxxxxxx.unity3d的文件,这种储存了卡面数据的文件就是我们要改动的文件。你们的老婆就在这里面。

那串x号代表了卡片编号。查询卡图对应编号的方法:在浏览器中打开http://shadowverse-portal.com/cards 。打开后,先点击右上角的language,将英语转换成繁体中文,然后找到你想改的卡面,点进去之后看网址。

以次元超越为例:

101334020就是超越的编号。记好这个编号,下面会用到。

然后是一些事前准备工作。

备份:将资源包,也就是Android/data/com.cygames.Shadowvers/files/a中的文件进行备份,放在一边。就算玩坏了也有个备份可以再玩一次。

所需软件:Adobe Photoshop CS6(简称PS)、Unity Assets Bundle Extractor(简称UABE)和UnityEX。

2

/14

第二部分:实际 *** 作

第一步

上面我们查到了超越的编号,下面搜索出它所对应的card_xxxxxxxxx.unity3d文件,复制粘贴到新建文件夹。

最后一位对应的进化前后的卡面,0是进化前,1是进化后

第二步

打开PS,随便打开一张图片,新建图片也可以,将它改为512x512像素格式。这个是重点,其他格式都不行。

另存为png格式,命名为xxxxxxxxxx(在前9个x里填入超越的编号,在最后一个x里,想要更改进化前的图片就填0,想要更改进化后的图片就填1)。

3

/14

第三步

然后打开UnityEX。点击左上角的Open archive Unity。

4

/14

然后选择刚刚复制粘贴出来的unity3d文件,点击打开。

5

/14

点击Export all files。这时在刚刚新建的文件夹里会释放出一个名为Unity_Assets_Files的文件夹(卡面数据就在这个文件夹)。

6

/14

先来打开文件。点击File,点击open,选中刚刚复制粘贴出来的unity3d文件。

7

/14

8

/14

9

/14

10

/14

选中一个文件,然后在右上角name一格下查看文件名,找到assets/_wizardresources/resources/card/spell/textures/xxxxxxxxxx.png这样的文件名,如果没找到该文件名就再选中、再找(看最后一位数字,0代表进化前的卡面,1则代表进化后的卡面)。

选中该文件,点击Plugins,在d出的界面点击Exit,点击OK,会d出下面的界面:

11

/14

12

/14

13

/14

点上面界面里的File,点save。

现在离成功很近了,点击软件初始界面里的File,点击save,保存的文件名填card_xxxxxxxxxx.unity3d(x可以随便填,但不能填和源文件一样的名称)

第五步

再次打开UnityEX。将上一步保存的unity3d文件按照第三步 *** 作,释放的文件也在文件夹Unity_Assets_Files里。

在以下路径的文件夹里有扩展名为.tex.pvr的文件,这就是卡图数据存放的地方。

14

/14

将后释放出的pvr文件覆盖之前释放出的pvr文件。

调出之前没关闭的UnityEX界面,点击lmpor all files。

最后在Unity_Assets_Files所在文件夹得到的与源文件名相同的unity3d文件就是我们的补丁文件。

将补丁文件覆盖到游戏资源文件夹,就可以在游戏中愉快的玩耍了

 什么是PVR呢?英文全称是Personal video recorder。用一句概括起来讲,PVR 实际上是不需要录象带的VCR(录象机)。 普通的VCR只是将电视机节目录制到VHS 录象带上,而PVR用一块内置硬盘驱动器代替了录象带。在将电视节目录制到PVR的内置硬盘中,您就可以播放录制的节目,可以快进,想看多少便就看多少遍,等最后看够了,就从硬盘上删除。 所有的PVR在机壳后部的面板上都有耳机插孔。通过这个插孔还可以用来更新PVR的节目收视指南(指南概括显示了在一周内将要播放的节目,同有线电视或电视卫星服务向您提供的节目收视指南很相似。)通过节目收视指南,您可以浏览在接下来的一周内将要播放的所有节目(就象您每天吃了晚饭,坐在沙发上随手翻看电视报,盘算着有什么有趣的节目看一样),您还可以通过编排节目收视指南,只录制具有某些关键词的节目。举个例子,假设您输入“动物世界”,PVR就可以把下周播出的动物世界的每一集都录制下来(甚至包括在不同频道播出的)。PVR还有更强大的功能,PVR的检索功能远不仅仅限于节目名称检索。PVR可以检索演员、导演、流派等,只要是在电视节目的说明中出现了,PVR就可以检索。例如,如果您是Sylvester Stallone的影迷,您在编排节目时,输入他的名字,那么PVR 就会把下周内播出的所有的有Sylvester Stallone出现的节目录制下来。

pvr格式的数据在IOS上直接交给显卡渲染的,而cocos2dx 中的texture是直接交给显卡渲染的,所以理论上将pvr格式的数据可以不进行任何数据的转换就可以生成一张texture,事实上确实是这样的。

一, 保存为pvr格式

要保存pvr文件,我们首先分析cocos2dx引擎中是怎样解析pvr文件的。可以看到cocos2dx库中的CCTexturePVR类提供了两个方法来解析pvr格式图片分别是unpackPVRv2Data、unpackPVRv3Data,两个方法分别解析的是PVR的v2和v3版本。本文只分析v2版本:

bool CCTexturePVR::unpackPVRv2Data(unsigned char* data, unsigned int len)//data数据是直接从文件里读出来没有做任何处理的

{

bool success = false

ccPVRv2TexHeader *header = NULL

unsigned int flags, pvrTag

unsigned int dataLength = 0, dataOffset = 0, dataSize = 0

unsigned int blockSize = 0, widthBlocks = 0, heightBlocks = 0

unsigned int width = 0, height = 0, bpp = 4

unsigned char *bytes = NULL

unsigned int formatFlags

// 用header指向data数据的头部(PVR v2格式的头部固定是52个字节,也就是data的前52个字节的数据,data剩下的数据就是生成texture的数据了)

header = (ccPVRv2TexHeader *)data

// 这是头部的一个标识值为 "PVR!" 占4字节

pvrTag = CC_SWAP_INT32_LITTLE_TO_HOST(header->pvrTag)

if (gPVRTexIdentifier[0] != (char)(((pvrTag >> 0) &0xff)) ||

gPVRTexIdentifier[1] != (char)(((pvrTag >> 8) &0xff)) ||

gPVRTexIdentifier[2] != (char)(((pvrTag >>16) &0xff)) ||

gPVRTexIdentifier[3] != (char)(((pvrTag >>24) &0xff)))

{

return false

}

CCConfiguration *configuration = CCConfiguration::sharedConfiguration()

flags = CC_SWAP_INT32_LITTLE_TO_HOST(header->flags)

formatFlags = flags &PVR_TEXTURE_FLAG_TYPE_MASK

bool flipped = (flags &kPVR2TextureFlagVerticalFlip) ? true : false

if (flipped)

{

CCLOG("cocos2d: WARNING: Image is flipped. Regenerate it using PVRTexTool")

}

if (! configuration->supportsNPOT() &&

(header->width != ccNextPOT(header->width) || header->height != ccNextPOT(header->height)))

{

CCLOG("cocos2d: ERROR: Loading an NPOT texture (%dx%d) but is not supported on this device", header->width, header->height)

return false

}

unsigned int pvr2TableElements = PVR2_MAX_TABLE_ELEMENTS

if (! CCConfiguration::sharedConfiguration()->supportsPVRTC())

{

pvr2TableElements = 9

}

for (unsigned int i = 0i <pvr2TableElementsi++)

{

//Does image format in table fits to the one parsed from header?

if (v2_pixel_formathash[i].pixelFormat == formatFlags)

{

m_pPixelFormatInfo = v2_pixel_formathash[i].pixelFormatInfo

//Reset num of mipmaps

m_uNumberOfMipmaps = 0

//Get size of mipmap

m_uWidth = width = CC_SWAP_INT32_LITTLE_TO_HOST(header->width)

m_uHeight = height = CC_SWAP_INT32_LITTLE_TO_HOST(header->height)

//Do we use alpha ?

if (CC_SWAP_INT32_LITTLE_TO_HOST(header->bitmaskAlpha))

{

m_bHasAlpha = true

}

else

{

m_bHasAlpha = false

}

//Get ptr to where data starts..

dataLength = CC_SWAP_INT32_LITTLE_TO_HOST(header->dataLength)

//跳过头部,bytes直接指向了图片数据部分

bytes = ((unsigned char *)data) + sizeof(ccPVRv2TexHeader)

m_eFormat = m_pPixelFormatInfo->ccPixelFormat

bpp = m_pPixelFormatInfo->bpp

// Calculate the data size for each texture level and respect the minimum number of blocks

while (dataOffset <dataLength)

{

switch (formatFlags) {

case kPVR2TexturePixelFormat_PVRTC_2BPP_RGBA:

blockSize = 8 * 4// Pixel by pixel block size for 2bpp

widthBlocks = width / 8

heightBlocks = height / 4

break

case kPVR2TexturePixelFormat_PVRTC_4BPP_RGBA:

blockSize = 4 * 4// Pixel by pixel block size for 4bpp

widthBlocks = width / 4

heightBlocks = height / 4

break

case kPVR2TexturePixelFormat_BGRA_8888:

if (CCConfiguration::sharedConfiguration()->supportsBGRA8888() == false)

{

CCLOG("cocos2d: TexturePVR. BGRA8888 not supported on this device")

return false

}

default:

blockSize = 1

widthBlocks = width

heightBlocks = height

break

}

// Clamp to minimum number of blocks

if (widthBlocks <2)

{

widthBlocks = 2

}

if (heightBlocks <2)

{

heightBlocks = 2

}

dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8)

unsigned int packetLength = (dataLength - dataOffset)

packetLength = packetLength >dataSize ? dataSize : packetLength

// bytes指向的是data,而data是直接从文件里面读出来的数据,m_asMipmaps则是用来生成texture的数据,

// 所以这里可以得出结论,pvr的图片数据到texture不需要经过任何转换,

// 也就是说pvr格式的数据可以不进行任何数据的转换就可以生成一张texture

m_asMipmaps[m_uNumberOfMipmaps].address = bytes + dataOffset

m_asMipmaps[m_uNumberOfMipmaps].len = packetLength

m_uNumberOfMipmaps++

//Check that we didn"t overflow

CCAssert(m_uNumberOfMipmaps <CC_PVRMIPMAP_MAX,

"TexturePVR: Maximum number of mipmaps reached. Increase the CC_PVRMIPMAP_MAX value")

dataOffset += packetLength

//Update width and height to the next lower power of two

width = MAX(width >>1, 1)

height = MAX(height >>1, 1)

}

//Mark pass as success

success = true

break

}

通过上面的分析,我们知道了要把texture保存成pvr格式的文件只需为这样texture添加一个头部即可。关于pvr头部在CCTexturePVR.cpp中我们可以看到 _PVRTexHeader 这个结构体,这个结构体就是PVR的头部格式,现在要做的工作就是分析出_PVRTexHeader的成员的含义。这个可以参考imageination关于pvr的文档,需要提醒的是要注意版本差别。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11459377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存