<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>口袋技术盒子 Beta</title>
	<atom:link href="http://www.poketb.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.poketb.com</link>
	<description>the Pokemon Tech. Box , 口袋妖怪游戏改版专题站点。</description>
	<lastBuildDate>Sun, 18 Dec 2011 16:23:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>无名人物编辑器【Nameless Sprite Editor】</title>
		<link>http://www.poketb.com/944.html</link>
		<comments>http://www.poketb.com/944.html#comments</comments>
		<pubDate>Mon, 08 Aug 2011 15:56:34 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[汉化工具]]></category>
		<category><![CDATA[GBA]]></category>
		<category><![CDATA[NSE]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[改版]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=944</guid>
		<description><![CDATA[点点就能改GBA ROM人物的傻瓜化工具。这是首次尝试汉化.NET应用程序，走了不少弯路。 不过总算放出来了。 大部分地方汉化了，小部分出现问题是因为文件解析错误。 看着8.03MB纯文本的反编译档我实在没有勇气再回去从头检查了。那就这样吧。. 应用程序执行需要.NET 2.0环境，原版需要3.5环境。重编译的路过。]]></description>
			<content:encoded><![CDATA[<p>点点就能改GBA ROM人物的傻瓜化工具。这是首次尝试汉化.NET应用程序，走了不少弯路。</p>
<p>不过总算放出来了。</p>
<p>大部分地方汉化了，小部分出现问题是因为文件解析错误。</p>
<p>看着8.03MB纯文本的反编译档我实在没有勇气再回去从头检查了。那就这样吧。.</p>
<p><img src="http://olda.poketb.cn/bbs/attachments/month_1007/20100711_6e6c1b47ffc2fca0caacwmF10INGPxq5.jpg" alt="" border="0" /></p>
<p>应用程序执行需要.NET 2.0环境，原版需要3.5环境。重编译的路过。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/944.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TMEd GSC汉化版</title>
		<link>http://www.poketb.com/935.html</link>
		<comments>http://www.poketb.com/935.html#comments</comments>
		<pubDate>Mon, 08 Aug 2011 15:34:35 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[汉化工具]]></category>
		<category><![CDATA[GBC]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[技能]]></category>
		<category><![CDATA[水晶]]></category>
		<category><![CDATA[金]]></category>
		<category><![CDATA[银]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=935</guid>
		<description><![CDATA[修改金银水晶ROM各个技能机器学什么的工具 此工具非开源，我修改的程序，由于内部空间不足，有些技能汉化没写完全，各位可以参看下面的技能列表。 拍打 空手道 往复拍打 连锁拳 百万吨级铁拳 招财猫 火焰拳 冷冻拳 闪电拳 抓 夹 剪刀断头台 镰鼬 剑之舞 居合切 起风 翅膀攻击 吹飞 飞天 勒住 打倒 蔓藤鞭 践踏 二段踢 百万吨级强踢 飞踢 回旋踢 扔沙 头突 角突 乱突 尖角钻 撞击 压制 卷紧 突进 暴走 舍身一击 &#8230; <a href="http://www.poketb.com/935.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>修改金银水晶ROM各个技能机器学什么的工具<br />
此工具非开源，我修改的程序，由于内部空间不足，有些技能汉化没写完全，各位可以参看下面的技能列表。</p>
<p>拍打<br />
空手道<br />
往复拍打<br />
连锁拳<br />
百万吨级铁拳<br />
招财猫<br />
火焰拳<br />
冷冻拳<br />
闪电拳<br />
抓<br />
夹<br />
剪刀断头台<br />
镰鼬<br />
剑之舞<br />
居合切<br />
起风<br />
翅膀攻击<br />
吹飞<br />
飞天<br />
勒住<br />
打倒<br />
蔓藤鞭<br />
践踏<br />
二段踢<br />
百万吨级强踢<br />
飞踢<br />
回旋踢<br />
扔沙<br />
头突<br />
角突<br />
乱突<br />
尖角钻<br />
撞击<br />
压制<br />
卷紧<br />
突进<br />
暴走<br />
舍身一击<br />
摇尾巴<br />
毒针<br />
双针<br />
导弹针<br />
瞪眼<br />
齿突<br />
叫声<br />
吼叫<br />
唱歌<br />
超音波<br />
音速波<br />
束缚<br />
溶解液<br />
火花<br />
火焰喷射<br />
白雾<br />
水枪<br />
高压水泵<br />
冲浪<br />
冰冻光线<br />
暴风雪<br />
精神光线<br />
泡泡光线<br />
极光光线<br />
破坏光线<br />
啄<br />
钻孔啄<br />
地狱车<br />
低踢<br />
反击<br />
地球投<br />
怪力<br />
吸取<br />
百万威力吸取<br />
寄生种子<br />
成长<br />
八叶斩<br />
太阳光线<br />
毒粉<br />
麻痹粉<br />
睡眠粉<br />
花瓣之舞<br />
吐丝<br />
龙之怒<br />
火旋涡<br />
电气震<br />
十万伏特<br />
电磁波<br />
闪电<br />
落石<br />
地震<br />
地裂<br />
挖洞<br />
剧毒<br />
念力<br />
精神干扰<br />
催眠术<br />
瑜珈之形<br />
高速移动<br />
电光石火<br />
愤怒<br />
瞬间移动<br />
黑夜魔影<br />
素描<br />
讨厌的声音<br />
影分身<br />
自我再生<br />
变硬<br />
变小<br />
烟幕<br />
混乱光<br />
躲进贝壳<br />
变圆<br />
栅栏<br />
光之壁<br />
黑雾<br />
反射盾<br />
蓄气<br />
勒住<br />
摇手指<br />
鹦鹉学舌<br />
自爆<br />
蛋蛋爆弹<br />
舌头舔<br />
烟雾<br />
泥攻击<br />
骨头击<br />
大字火<br />
攀瀑<br />
贝壳夹<br />
流星<br />
火箭头突<br />
尖刺加农炮<br />
缠绕<br />
超级健忘<br />
折弯匙子<br />
生蛋<br />
飞膝踢<br />
蛇瞪眼<br />
食梦<br />
毒烟<br />
投蛋<br />
吸血<br />
恶魔之吻<br />
神鸟<br />
变身<br />
泡泡<br />
漂漂拳<br />
蘑菇孢子<br />
闪光<br />
精神波动<br />
弹跳<br />
溶化<br />
大钳槌<br />
大爆炸<br />
乱抓<br />
骨头回旋镖<br />
睡眠<br />
岩崩<br />
必杀门牙<br />
变方<br />
属性切换<br />
三角攻击<br />
愤怒门牙<br />
切裂<br />
替身<br />
绝境反击<br />
模仿<br />
三连踢<br />
盗窃<br />
蜘蛛丝<br />
心眼<br />
恶梦<br />
火炎车<br />
鼾声<br />
诅咒<br />
挣扎<br />
属性切换<br />
空中爆破<br />
棉花孢子<br />
起死回生<br />
恨<br />
小雪<br />
保护<br />
音速拳<br />
恐惧颜<br />
偷袭<br />
天使之吻<br />
腹太鼓<br />
泥爆弹<br />
扔泥<br />
墨汁炮<br />
卷入<br />
电磁炮<br />
识破<br />
殊途同归<br />
灭亡之歌<br />
冰结之风<br />
见切<br />
骨头闪<br />
锁定<br />
激鳞<br />
沙尘暴<br />
亿万威力吸取<br />
忍耐<br />
撒娇<br />
滚动<br />
刀背打<br />
虚张声势<br />
饮奶<br />
电火花<br />
连续切<br />
钢之翼<br />
黑暗眼神<br />
着迷<br />
梦话<br />
愈之铃<br />
报恩<br />
礼物<br />
撒气<br />
神秘的守护<br />
分担痛苦<br />
圣炎<br />
震级变化<br />
爆裂拳<br />
百万威力角突<br />
龙之息吹<br />
接力棒<br />
鼓掌<br />
追击<br />
高速旋转<br />
香甜气息<br />
钢之尾<br />
钢之爪<br />
当身投<br />
朝之阳<br />
光合成<br />
月之光<br />
觉醒力量<br />
十字切<br />
龙卷风<br />
祈雨<br />
日本晴<br />
咬碎<br />
镜像反射<br />
自我暗示<br />
神速<br />
原始力量<br />
影子球<br />
未来预知<br />
岩碎<br />
漩涡<br />
围攻</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/935.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pokescript 详细图文教程（四）</title>
		<link>http://www.poketb.com/909.html</link>
		<comments>http://www.poketb.com/909.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 23:29:00 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[脚本教程]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[raw]]></category>
		<category><![CDATA[改版]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=909</guid>
		<description><![CDATA[7.Pokemart 交易 交易可不是商店的专利,在脚本领域,我们可以控制任何一个NPC和玩家交易. 不过pokemart并不像givepokemon那样单纯,例子: #org $start lock faceplayer pokemart $values release end #org $values #binary int 0&#215;1 0&#215;2 0&#215;3 0&#215;4 0&#215;5 0&#215;6 0&#215;7 0&#215;8 #binary int 0&#215;9 0xA 0xB 0xC 0&#215;13 0&#215;14 0&#215;0 显然,$values中存放了有关商品的信息,它的格式是这样的: #binary int [道具编号] 0&#215;0 这里比较随意的是,道具可以分多行写,也可以单行写,以下的写法都没问题: #binary &#8230; <a href="http://www.poketb.com/909.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>7.Pokemart 交易</strong></p>
<p>交易可不是商店的专利,在脚本领域,我们可以控制任何一个NPC和玩家交易.<br />
不过pokemart并不像givepokemon那样单纯,例子:</p>
<blockquote><p>#org $start<br />
lock<br />
faceplayer<br />
pokemart $values<br />
release<br />
end</p></blockquote>
<blockquote><p>#org $values<br />
#binary int 0&#215;1 0&#215;2 0&#215;3 0&#215;4 0&#215;5 0&#215;6 0&#215;7 0&#215;8<br />
#binary int 0&#215;9 0xA 0xB 0xC 0&#215;13 0&#215;14 0&#215;0</p></blockquote>
<p>显然,$values中存放了有关商品的信息,它的格式是这样的:<br />
#binary int [道具编号] 0&#215;0<br />
这里比较随意的是,道具可以分多行写,也可以单行写,以下的写法都没问题:</p>
<blockquote><p>#binary int 0&#215;1 0&#215;2 0&#215;3 0&#215;4 0&#215;5 0&#215;6 0&#215;7 0&#215;8<br />
#binary int 0&#215;9 0xA 0xB 0xC 0&#215;13 0&#215;14 0&#215;0</p>
<p>#binary int 0&#215;1 0&#215;2 0&#215;3 0&#215;4 0&#215;5 0&#215;6 0&#215;7 0&#215;8 0&#215;9 0xA 0xB 0xC 0&#215;13 0&#215;14 0&#215;0</p>
<p>#binary int 0&#215;1 0&#215;2 0&#215;3 0&#215;4 0&#215;5 0&#215;6 0&#215;7 0&#215;8<br />
#binary int 0&#215;9<br />
#binary int 0xA 0xB 0xC 0&#215;13 0&#215;14 0&#215;0</p></blockquote>
<p>道具的编号我前面已经给出了对照表了,二者一致.<br />
不过对照表中绝对没有0&#215;0,因为它表示结束,也是pokemart命令不能缺少的.</p>
<p>另外,请不要尝试出售剧情道具和重要道具,其后果是不可预料的.</p>
<p><strong>※16进制的一些常用知识</strong><br />
随着脚本的深入,越来越多的数字和信息都需要依赖于16进制的知识,所以我特地加了一节,用来说说16进制的事.</p>
<p>首先,16进制是一种类似于10进制的计数方法.相比于10进制,16进制是2进制的衍生产品,它更接近于真实的CPU计算.使用16进制可以给电脑运算带来不可言表的便利.<br />
在GBA平台上,为了方便,所有的游戏数据都以16进制进行储存、计算,PM也是一样的.<br />
大家可能知道一些金手指,100级PM的金手指中,一定带着64吧?金手指就是手动将数值写进内存,因为内存中充满了16进制的数据,因此100级这个数据也必须写作16进制形式,即64.</p>
<p>100怎么会变成64呢?<br />
16进制以16个字符作为数字,除去1,2,3,4,5,6,7,8,9,0之外,还加入了A,B,C,D,E,F.所以在16进制中,3F是数字,EF也是数字.<br />
因为人的大脑长期习惯于10进制,所以要在16进制与10进制之间自由转化还是比较有难度的,如果大家想快速转化,可以借助Windows自带计算器的科学型.</p>
<p>现在不难理解100=64了吧?</p>
<p>不过如果在任何场合下都直接写16进制数字,会引起误解.为了更加清楚,我们这样写16进制数:0&#215;64或者&#038;h64(在英文中,hex就是16进制的意思).</p>
<p>最后,就是16进制长串变短串了.<br />
在Pokescript中,未被编译的命令一旦要写入数值,就必须一个字节一个字节的写,这样,16进制的长串,如0x13EF,显然就没法写进一个字节(一个字节只允许写0&#215;00～0xFF,也就是0～256).<br />
在16进制中,短串数字的排列必须遵从一定的规则才可以被识别,那就是&#8221;高位存高数,低位存低数&#8221;.怎么说呢,比如对于0x13EF,首先切分为0&#215;13,0xEF,紧接着再进行排序,0xEF 0&#215;13,这就是最终结果了.<br />
在教程中,一旦提到倒序,就是这么个意思.另外对于共有奇数位的数字时,从后向前分割,最前处补0,例如:0x1EF→0xEF 0&#215;01.有些地方可能要求其体积为两个字节,而对于0&#215;19这样的单字节数字怎么办呢?我们直接补写一个0&#215;00,合起来就是0&#215;19 0&#215;00.<br />
(注:凡是涉及道具、PM等可能含有大量数字的参数,一般都为2个字节的容量;而大地图中NPC的形象这种数字容量小的参数,一般只有1个字节)<br />
现在,基本上和16进制有关的知识都简略的说到了.<br />
注:以上关于16进制的知识都是我个人的理解,如果我的理解有问题,请及时告诉我,以免误人子弟.</p>
<p><strong>#raw 0x7A 赠送蛋</strong><br />
之前在附加的章节里已经说过了#raw系命令的概况,这里就不多作解释了.<br />
#raw 0x7A就是像givepokemon一样,赠送PM的命令,不同的是,#raw 0x7A赠送的是蛋.<br />
#raw 0x7A是未经编译的命令,因而其参数只接受16进制短串,我们需要对参数[编号]进行倒序.例子:</p>
<blockquote><p>#raw 0x7A 0&#215;19 0&#215;00</p></blockquote>
<p>以上是赠与了一个皮卡丘的蛋,而皮卡丘在对照表中为25,转16进制为19,转换短串:0&#215;19 0&#215;00.</p>
<p><strong>#raw 0&#215;90～#raw 0&#215;95 关于金钱</strong><br />
早期的脚本命令中,是没有关于金钱的命令的.不过随着技术的推进,这些命令到底还是被找到了.</p>
<p>#raw 0&#215;90 获得金钱<br />
格式:#raw 0&#215;90 [XX] [XX] [XX] [XX] 0&#215;00<br />
#raw 0&#215;90是命令主体,末尾的0&#215;00则表示命令结尾,中间的4个字节都是金额.<br />
不过金额必须调整为16进制短串,而且位数绝对不能少.<br />
假设要获得10000＄,例子:</p>
<blockquote><p>#raw 0&#215;90 0&#215;10 0&#215;27 0&#215;00 0&#215;00 0&#215;00</p></blockquote>
<p>#raw 0&#215;91 扣除金钱<br />
格式和#raw 0&#215;90完全相同,只是作用相反.<br />
#raw 0&#215;91 [XX] [XX] [XX] [XX] 0&#215;00<br />
例子,扣除10000＄:</p>
<blockquote><p>#raw 0&#215;91 0&#215;10 0&#215;27 0&#215;00 0&#215;00 0&#215;00</p></blockquote>
<p>注:我们无法预测如果主角随身携带的金额小于10000＄会怎样,所以以下的检查金额命令,你必须看,也必须使用!</p>
<p><strong>#raw 0&#215;92 检查金额</strong></p>
<p>正如上文所说,我们无法预测如果主角随身携带的金额小于10000＄会怎样,因此,在扣除之前检查是否足够,是很必要的.<br />
#raw 0&#215;92 [XX] [XX] [XX] [XX] 0&#215;00<br />
将检查参数中的对应金额,其后,我们用判断语句来进行比较:</p>
<blockquote><p>#raw 0&#215;92 0&#215;10 0&#215;27 0&#215;00 0&#215;00 0&#215;00<br />
compare lastresult 0&#215;1<br />
if B_>= goto $continue<br />
message $notenough<br />
boxset 6</p></blockquote>
<p>在上面的例子中,如果所带的金钱大于10000＄才能继续,否则我们可以终止原本的脚本.</p>
<p><strong>※.游戏中的坐标</strong><br />
又是一个附加的章节.每次我要开设一个附加章节,那必然是有一些比较复杂的概念需要理解了.这回我们得谈谈游戏中的坐标了.</p>
<p>凡是接触了中学数学的人,都应该知道平面直角坐标系吧?不清楚没关系,忘了也没关系,我们来复习一下:平面直角坐标系就是在一个平面内依托横纵两个坐标轴上的各任意一点,构造一个二维数组,这样和该平面内的点一一对应,达到了表示平面内任一点的作用.<br />
纯数学会晕?那么知道经纬度就行了.<br />
这样的坐标系可以表示平面上的每一个点,也就可以充分描述平面了.<br />
对于PM游戏,GBA上的只是平面游戏.因而借助坐标系,我们也可以描述游戏上的每一点.</p>
<p>修改过地图的玩家应该知道,PM的地图上,一个基本单位就是一个图块.我们可以把这样的一个图块看作一个点.<br />
不过这里必须说明,地图上的坐标表示以整个地图为背景,而实际进行游戏时,屏幕的大小又是另一种背景.我们在使用坐标描述的时候,必须清楚现在的背景是屏幕还是整个地图,也就是弄清参考系.</p>
<p>借助AM或者EM,我们可以获得以整个地图为参考的坐标值.而以屏幕为参考的坐标值,就需要我们自己估算了.<br />
我们稍微讲讲以屏幕为参考的坐标值.</p>
<p>在PM的ROM中,我们可以发现,以屏幕为参考的坐标,实际它的建系规则是这样的:<br />
①以屏幕的上限为y轴,正方向向右<br />
②以屏幕的左限为x轴,正方向向下<br />
③两轴交于屏幕的左上角,即左上角记为(0,0)</p>
<p>牢记上述的建系规则.<br />
对于一个确立的图像,坐标值所表示的,只是图像中一个具有代表性的点的位置,而不是每一个点的位置.一般的,这个点取图像左上顶点.这样,在安排一个图像的时候,我们只需要描述这个代表点的位置就可以了.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/909.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pokescript 详细图文教程（三）</title>
		<link>http://www.poketb.com/904.html</link>
		<comments>http://www.poketb.com/904.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 17:05:10 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[脚本教程]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[改版]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=904</guid>
		<description><![CDATA[感谢会员 liuyanghejerry的投递 ※.脚本中的逻辑关系 1.YES OR NO 脚本选择 前面的几节知识都没有用到逻辑关系,是直白的脚本命令堆放,但是如果我们需要一个这样的脚本呢: ①和一个NPC说话 ②他问:今天天气好吗? ③回答是就送你一个伤药 ④回答否就说:也许明天是个好天气 显然,用现有的脚本知识是无法达到我们的目的的. 现在来看,将脚本导向不同结果的第一种方式:boxset5. 前面曾说过boxset6,boxset5和boxset6的最大区别就在于boxset5可以弹出关于YES和NO的选择,来看示例: #org $talk lock faceplayer message $1 boxset5 compare LASTRESULT 0&#215;1 if b_true goto $give message $2 boxset 6 release end #org $give giveitem 13 1 &#8230; <a href="http://www.poketb.com/904.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>感谢会员 liuyanghejerry的投递</p>
<p>※.脚本中的逻辑关系<br />
1.YES OR NO 脚本选择<br />
前面的几节知识都没有用到逻辑关系,是直白的脚本命令堆放,但是如果我们需要一个这样的脚本呢:<br />
①和一个NPC说话<br />
②他问:今天天气好吗?<br />
③回答是就送你一个伤药<br />
④回答否就说:也许明天是个好天气<br />
显然,用现有的脚本知识是无法达到我们的目的的.<br />
现在来看,将脚本导向不同结果的第一种方式:boxset5.<br />
前面曾说过boxset6,boxset5和boxset6的最大区别就在于boxset5可以弹出关于YES和NO的选择,来看示例:</p>
<blockquote><p>#org $talk<br />
lock<br />
faceplayer<br />
message $1<br />
boxset5<br />
compare LASTRESULT 0&#215;1<br />
if b_true goto $give<br />
message $2<br />
boxset 6<br />
release<br />
end<br />
#org $give<br />
giveitem 13 1<br />
message $3<br />
boxset 6<br />
release<br />
end<br />
#org $1<br />
$1 1 =How&#8217;s the weather?<br />
#org $2<br />
$2 1 =Maybe tomorrow isna good day.<br />
#org $3<br />
$3 1 =You obtain a potion!</p></blockquote>
<p>有点长是不是?新东西也稍稍多了点,不过冷静思考下,新出现的只有:</p>
<blockquote><p>boxset5<br />
compare LASTRESULT 1<br />
if b_true goto $give</p></blockquote>
<p>而已.<br />
首先是boxset5.boxset5会弹出&#8221;YESNO&#8221;的选择,当玩家进行选择后,就轮到compare LASTRESULT 1了.<br />
boxset5选择后的结果作为一个值被存入了一个叫LASTRESULT(中文意为&#8221;最后结果&#8221;)的公共变量之中.<br />
紧接着,compare这个命令负责进行对比,把LASTRESULT中的结果和0&#215;1进行对比.<br />
0&#215;1是什么呢?它代表&#8221;是&#8221;,也就是说这一步就是在考证玩家选取的是不是YES<br />
if b_true goto $give,就是如果对比后没有差异,二者完全相同,就命令脚本跳转到$give部分.<br />
而否则的话就要继续原脚本的执行.<br />
注:b_ture也等同于b_==或者 1,三种写法均正确.<br />
通过boxset5式的选择,脚本最终走向了两个方向.<br />
但是别急,LASTRESULT还有更多的把戏,如果b_true的位置换成以下:</p>
<p>B_&lt;&lt; 小于 (0)<br />
B_== 等于 (1)<br />
B_&gt;&gt; 大于 (2)<br />
B_= 大于等于 (4)<br />
B_!= 不等于 (5)</p>
<p>那么可以分得的情况就更加丰富了.<br />
2.setflag 脚本递进<br />
虽然上面的脚本已经满足了我们的基本要求,但在得到了伤药之后和该NPC对话,仍旧会不断触发赠送剧情,这就成了一个BUG.<br />
于是,我们需要在剧情中给已经发生过的打个记号,我们需要用setflag 设立标识.<br />
setflag只有一个参数,就是标识的存放地点.我们这样写:setflag 0&#215;201.<br />
但问题也来了,游戏原剧情本身就占去了很多位置,那么我们自己的标识该在哪放呢?通常,位于0&#215;200 &#8211; 0x29F, 0&#215;500-0x79F, 0&#215;1000-0x109F的位置都是空的(注意,16进制的数字是按0123456789ABCDEF逐步递升的,比十进制多了6个),可供我们自由使用的.当然,除了这些还有不少,你可以自己没事试着玩.<br />
系统中,有些标识是很有用的,比如下面这些:<br />
火叶:</p>
<blockquote><p>0&#215;820 &#8211; 第一个 徽章<br />
0&#215;821 &#8211; 第二个 徽章<br />
0&#215;822 &#8211; 第三个 徽章<br />
0&#215;823 &#8211; 第四个 徽章<br />
0&#215;824 &#8211; 第五个 徽章<br />
0&#215;825 &#8211; 第六个 徽章<br />
0&#215;826 &#8211; 第七个 徽章<br />
0&#215;827 &#8211; 第八个 徽章<br />
0&#215;828 &#8211; &#8220;精灵&#8221;菜单<br />
0&#215;829 &#8211; &#8220;图鉴&#8221;菜单<br />
0x82F &#8211; 跑鞋</p></blockquote>
<p>红蓝宝石:</p>
<blockquote><p>0&#215;800 &#8211; &#8220;精灵&#8221;菜单<br />
0&#215;801 &#8211; &#8220;图鉴&#8221;菜单<br />
0&#215;802 &#8211; 小光赠送的那个机器 菜单<br />
0&#215;807 &#8211; 第一个 徽章<br />
0&#215;808 &#8211; 第二个 徽章<br />
0&#215;809 &#8211; 第三个 徽章<br />
0x80A &#8211; 第四个 徽章<br />
0x80B &#8211; 第五个 徽章<br />
0x80C &#8211; 第六个 徽章<br />
0x80D &#8211; 第七个 徽章<br />
0x80E &#8211; 第八个 徽章<br />
0&#215;860 &#8211; 跑鞋</p></blockquote>
<p>绿宝石:</p>
<blockquote><p>0&#215;860 &#8211; &#8220;精灵&#8221;菜单<br />
0&#215;861 &#8211; &#8220;图鉴&#8221;菜单<br />
0&#215;862 &#8211; 小光赠送的那个机器 菜单</p></blockquote>
<p>现在我们来看看setflag的实际应用:</p>
<blockquote><p>#org $talk<br />
lock<br />
faceplayer<br />
checkflag 0&#215;201<br />
compare LASTRESULT 0&#215;1<br />
if b_true goto $2<br />
message $1<br />
boxset5<br />
compare LASTRESULT 0&#215;1<br />
if b_true goto $give<br />
message $2<br />
boxset 6<br />
release<br />
end<br />
#org $give<br />
setflag 0&#215;201<br />
giveitem 13 1<br />
release<br />
end<br />
#org $1<br />
$1 1 =How&#8217;s the weather?<br />
#org $2<br />
$2 1 =Maybe tomorrow isna good day.</p></blockquote>
<p>这里,我们在上节的脚本中稍做了优化,增加了checkflag和setflag,使得赠送的情节不会重复发生.<br />
checkflag的格式和setflag相同,后面唯一的参数就是标识位置,它的作用是检查指定位置是否设立了标识.<br />
之后的<br />
compare LASTRESULT 0&#215;1<br />
if b_true goto $2<br />
则是在做后续处理,原理和上节相同,不再解释了.以后类似的结构还会经常见到,大家一定要学会在不同场合适当的拼装这些脚本段.<br />
关于flag,还有一个可以清除的命令,它的格式是:clearflag 0&#215;201,和前两者携带参数相同.</p>
<p>3.goto,gosub and call 脚本跳转<br />
在前面我们已经见过goto了,它的用法就是goto $pointer,携带的唯一参数就是地址.<br />
类似的,gosub也是这样用:gosub $pointer,同样携带的是地址作为参数.另外,go和goto也像可以带这样的参数:goto 0&#215;80000,这里0&#215;80000也是地址.<br />
但是二者却有一个很大的不同.goto将从一个脚本跳进另一个脚本,之后不会再自动回到原脚本;而gosub则会在跳转到的脚本运行完毕时回到原脚本.<br />
最后的call适合于跳至ROM中已写入的脚本.<br />
call也有自己的特殊性质,那就是必须加return回到原脚本,来看示例:</p>
<blockquote><p>#org $take<br />
givepokemon 4 5 0<br />
message $4<br />
boxset 5<br />
compare LASTRESULT 0&#215;1<br />
if b_true gosub $name<br />
message $5<br />
boxset 6<br />
release<br />
end<br />
#org $name<br />
call 0x1A74EB<br />
return</p></blockquote>
<p>这是我从别的地方截取的脚本,在这里我们可以清楚的看到,为了让脚本回归,尽管已经用了gosub,但仍在call后追加了return.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/904.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pokescript 详细图文教程（二）</title>
		<link>http://www.poketb.com/901.html</link>
		<comments>http://www.poketb.com/901.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 16:33:35 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[脚本教程]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=901</guid>
		<description><![CDATA[二、常见脚本命令详解 Ⅰ.脚本的基本格式 之前我们已经写过一个典型的脚本了,它的功能虽然简单,但是脚本的几个基本要素都具备了,因而这里我拿它来说说脚本的格式. #org $1 Lock Faceplayer message $2 $2 1 = Hi!nWelcome to lPoketb.com! boxset 6 release end 毫无异议,这段脚本将会触发对话,那么每行的意义呢? #org是每段脚本所必备的,它告诉程序,以下就是脚本的开始了. $1和$2是两个地址的代表,这里我们稍微花点功夫说下地址. 前面我们已经知道,游戏中的信息都是以16进制的方式存储的.想要制作自己的剧情就必须把信息写入ROM当中,而保存的位置则通常用一个地址来表示.一般来讲,地址都会写成一段16进制的数字,例如0&#215;80000.这一点在其它的改版工具中很容易见到,比如Advance Map(它省略了&#8221;0x&#8221;).不过对于改版来说,我们所写的信息一定要找ROM的空白,而不能随意覆盖原来的信息,这就使得地址的选择变得犹为艰难.在另一款脚本工具:ScriptED中,地址就是要我们自己找的,这时就很容易出错. 幸运的是,Pokescript这款后起之秀的软件并不需要我们再手动寻找空白,对于一般的地址,我们只需要以符号$开头的一串字母或者数字来表示就可以了.比如$start,$abc1,$1.但是诸如$i am a boy,$汉字,$ ,$(),等形式是不可以的.另外,这个名字通常不推荐过长,最好不要超出15个字母或数字. 回到我们的脚本,$1和$2都是地址.那么这个地址存放了什么呢?虽然前面讲的知识还没涉及到整个脚本的意思,但我可以先告诉大家,$1存放了整个脚本的支干,而$2则存放了对话的文字部分,也就是&#8221;Hi!nWelcome to lPoketb.com!&#8221;这句话. Lock Faceplayer 这两个命令是针对脚本发出者的,比如把脚本安排给NPC,那么NPC就承受Lock和Faceplayer.注意,尽管脚本的接受者是主角,但这两个命令却不是针对他的. Lock表示锁定,这时原本有其它动作的NPC就要停下 Faceplayer表示面向主角,一个转身的动作. 这两个命令几乎所有的脚本都要用到,且顺序不可以变动! 跳过中间的几行来看接下来的release,它表示恢复,和lock相对;而紧跟着的end则和#org相对,代表脚本结束. 这两个命令通常也必须保留且顺序不能变动! &#8230; <a href="http://www.poketb.com/901.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>二、常见脚本命令详解</p>
<p>Ⅰ.脚本的基本格式<br />
之前我们已经写过一个典型的脚本了,它的功能虽然简单,但是脚本的几个基本要素都具备了,因而这里我拿它来说说脚本的格式.</p>
<blockquote><p>#org $1<br />
Lock<br />
Faceplayer<br />
message $2<br />
$2 1 = Hi!nWelcome to lPoketb.com!<br />
boxset 6<br />
release<br />
end</p></blockquote>
<p>毫无异议,这段脚本将会触发对话,那么每行的意义呢?<br />
#org是每段脚本所必备的,它告诉程序,以下就是脚本的开始了.<br />
$1和$2是两个地址的代表,这里我们稍微花点功夫说下地址.<br />
前面我们已经知道,游戏中的信息都是以16进制的方式存储的.想要制作自己的剧情就必须把信息写入ROM当中,而保存的位置则通常用一个地址来表示.一般来讲,地址都会写成一段16进制的数字,例如0&#215;80000.这一点在其它的改版工具中很容易见到,比如Advance Map(它省略了&#8221;0x&#8221;).不过对于改版来说,我们所写的信息一定要找ROM的空白,而不能随意覆盖原来的信息,这就使得地址的选择变得犹为艰难.在另一款脚本工具:ScriptED中,地址就是要我们自己找的,这时就很容易出错.<br />
幸运的是,Pokescript这款后起之秀的软件并不需要我们再手动寻找空白,对于一般的地址,我们只需要以符号$开头的一串字母或者数字来表示就可以了.比如$start,$abc1,$1.但是诸如$i am a boy,$汉字,$ ,$(),等形式是不可以的.另外,这个名字通常不推荐过长,最好不要超出15个字母或数字.<br />
回到我们的脚本,$1和$2都是地址.那么这个地址存放了什么呢?虽然前面讲的知识还没涉及到整个脚本的意思,但我可以先告诉大家,$1存放了整个脚本的支干,而$2则存放了对话的文字部分,也就是&#8221;Hi!nWelcome to lPoketb.com!&#8221;这句话.<br />
Lock<br />
Faceplayer<br />
这两个命令是针对脚本发出者的,比如把脚本安排给NPC,那么NPC就承受Lock和Faceplayer.注意,尽管脚本的接受者是主角,但这两个命令却不是针对他的.<br />
Lock表示锁定,这时原本有其它动作的NPC就要停下<br />
Faceplayer表示面向主角,一个转身的动作.<br />
这两个命令几乎所有的脚本都要用到,且顺序不可以变动!<br />
跳过中间的几行来看接下来的release,它表示恢复,和lock相对;而紧跟着的end则和#org相对,代表脚本结束.<br />
这两个命令通常也必须保留且顺序不能变动!<br />
这样,我们的脚本结构就清晰了:</p>
<blockquote><p>#org $1 &#8216;脚本必备!<br />
Lock &#8216;个别情况可以不写<br />
Faceplayer &#8216;个别情况可以不写<br />
&#8216;这里是真正的脚本区<br />
release &#8216;个别情况可以不写<br />
end &#8216;脚本必备!</p></blockquote>
<p>中间的部分就是我们以后研究的重点,从下节开始就以常用命令的介绍为主了.<br />
另外大家也应该发现了,从本节开始我们已经不需要大量的图片作以解释了,以后就不再配详图了.<br />
希望大家从这里开始就不要再遗留问题了,一定要搞清脚本的实质,熟识脚本的结构,这样以后才不会晕.否则别人都能熟练使用了,而你还像在看天书.</p>
<p>Ⅱ.最常见的脚本命令<br />
1.message──显示对话<br />
让我们再来看一遍最初的脚本:</p>
<blockquote><p>#org $1<br />
Lock<br />
Faceplayer<br />
message $2<br />
$2 1 = Hi!nWelcome to lPoketb.com!<br />
boxset 6<br />
release<br />
end</p></blockquote>
<p>这次我们把焦点放到这里:</p>
<blockquote><p>message $2<br />
$2 1 = Hi!nWelcome to lPoketb.com!<br />
boxset 6</p></blockquote>
<p>message是命令的主角,它负责触发一次文字显示,它的英文意思就是&#8221;信息&#8221;.<br />
在message的后面跟随了一个地址$2,$2里存放了信息的具体内容.<br />
紧接着$2 1 = Hi!nWelcome to lPoketb.com!就是给地址$2放入了内容.<br />
请注意,我们不可以写成&#8221;$2 = &#8220;的形式,而必须写&#8221;$2 1 = &#8220;,因为中间的那个1是有含义的.<br />
而&#8221;Hi!nWelcome to lPoketb.com!&#8221;这一串就是信息本身了,先不要想n和l是怎么回事,其它的内容可以理解吧?<br />
信息可以囊括的是英文,数字和符号,中文禁止写入!(包括中文的符号,空心句号之类的)<br />
那么除了最基本的文本,还有什么花梢的呢?<br />
相信大家已经在之前的脚本中发现了些痕迹──n和l充当的是什么角色呢?<br />
在pokescript的message命令当中,存在着一批以符号&#8221;"开头的,具有特殊含义的字符串,以下是一张列表:<br />
\h<br />
\n<br />
\l<br />
\p<br />
\v<br />
\c<br />
现在我来解释下,h表示从ROM的字符表里直接调取字符,比如hB7会调出&#8221;$&#8221;这个符号.关于原版火红叶绿和宝石,我这里有一份字符对照表:</p>
<blockquote><p>00=<br />
01=&amp;Agrave;<br />
02=&amp;Aacute;<br />
03=&amp;Acirc;<br />
04=&amp;Ccedil;<br />
05=&amp;Egrave;<br />
06=&amp;Eacute;<br />
07=&amp;Ecirc;<br />
08=&amp;Euml;<br />
09=&amp;Igrave;<br />
0B=&amp;Icirc;<br />
0C=&amp;Iuml;<br />
0D=&amp;Ograve;<br />
0E=&amp;Oacute;<br />
0F=&amp;Ocirc;<br />
10=&amp;AElig;<br />
11=&amp;Ugrave;<br />
12=&amp;Uacute;<br />
13=&amp;Ucirc;<br />
14=&amp;Ntilde;<br />
15=&amp;szlig;<br />
16=à<br />
17=á<br />
19=&amp;ccedil;<br />
1A=è<br />
1B=é<br />
1C=ê<br />
1D=&amp;euml;<br />
1E=ì<br />
20=&amp;icirc;<br />
21=&amp;iuml;<br />
22=ò<br />
23=ó<br />
24=&amp;ocirc;<br />
25=&amp;aelig;<br />
26=ù<br />
27=ú<br />
28=&amp;ucirc;<br />
29=&amp;ntilde;<br />
2A=&amp;ordm;<br />
2B=&amp;ordf;<br />
2C=·<br />
2D=&amp;<br />
2E=+<br />
34=[Lv]<br />
35==<br />
36=;<br />
51=&amp;iquest;<br />
52=&amp;iexcl;<br />
53=[PK]<br />
54=[MN]<br />
55=[PO]<br />
56=[Ke]<br />
57=[BL]<br />
58=[OC]<br />
59=[K]<br />
5A=&amp;Iacute;<br />
5B=%<br />
5C=(<br />
5D=)<br />
68=&amp;acirc;<br />
6F=í<br />
79=<br />
7A=[D]<br />
7B=[L]<br />
7C=[R]<br />
A1=0<br />
A2=1<br />
A3=2<br />
A4=3<br />
A5=4<br />
A6=5<br />
A7=6<br />
A8=7<br />
A9=8<br />
AA=9<br />
AB=!<br />
AC=?<br />
AD=.<br />
AE=-<br />
AF=·<br />
B0=[...]<br />
B1=&#8221;<br />
B2=["]<br />
B3=&#8217;<br />
B4=[']<br />
B5=[m]<br />
B6=[f]<br />
B7=$<br />
B8=,<br />
B9=[x]<br />
BA=/<br />
BB=A<br />
BC=B<br />
BD=C<br />
BE=D<br />
BF=E<br />
C0=F<br />
C1=G<br />
C2=H<br />
C3=I<br />
C4=J<br />
C5=K<br />
C6=L<br />
C7=M<br />
C8=N<br />
C9=O<br />
CA=P<br />
CB=Q<br />
CC=R<br />
CD=S<br />
CE=T<br />
CF=U<br />
D0=V<br />
D1=W<br />
D2=X<br />
D3=Y<br />
D4=Z<br />
D5=a<br />
D6=b<br />
D7=c<br />
D8=d<br />
D9=e<br />
DA=f<br />
DB=g<br />
DC=h<br />
DD=i<br />
DE=j<br />
DF=k<br />
E0=l<br />
E1=m<br />
E2=n<br />
E3=o<br />
E4=p<br />
E5=q<br />
E6=r<br />
E7=s<br />
E8=t<br />
E9=u<br />
EA=v<br />
EB=w<br />
EC=x<br />
ED=y<br />
EE=z<br />
EF=[&gt;]<br />
F0=:<br />
F1=&amp;Auml;<br />
F2=&amp;Ouml;<br />
F3=&amp;Uuml;<br />
F4=&amp;auml;<br />
F5=&amp;ouml;<br />
F6=ü<br />
F7=<br />
F8=[d]<br />
F9=[l]<br />
FA=\l<br />
FB=\p<br />
FC=\c<br />
FD=\v<br />
FE=\n<br />
FF=\x</p></blockquote>
<p>但\h对于我们中国玩家来说意义决不仅此而已,因为汉化后的ROM字符表已经被公布出来了,虽然说pokescript不可以直接处理中文,但通过\h加上中文字符表,我们是否可以直接创造出中文对话呢?问题的答案是肯定的,但在答案彻底揭晓之前,大家还是自己先尝试一下吧.而在教程的最后,我会单独来讨论这个问题的.回到我们的教程之中,\n和\l都表示换行.(为什么要换行?大家去掉脚本中的它们试试看吧&#8230;)但注意,第一次换行必须用\n,之后才可以用\l.\p会让游戏的文本框关闭再打开,大家可以自己体验下.\v一般只有两个用途,一个是\v\h01,表示主角的名字;一个是\v\h06,表示对手的名字.\c最为有趣,它可以使文本变色!(在汉化的游戏中,我可不敢保证是这样&#8230;)火叶:</p>
<blockquote><p>
白色 &#8211; \c\h01\h00<br />
黑色 &#8211; \c\h01\h02<br />
灰色 &#8211; \c\h01\h03<br />
红色 &#8211; \c\h01\h04<br />
橙色 &#8211; \c\h01\h05<br />
暗绿 &#8211; \c\h01\h06<br />
青色 &#8211; \c\h01\h07<br />
蓝色 &#8211; \c\h01\h08<br />
亮蓝 &#8211; \c\h01\h09
</p></blockquote>
<p>宝石:</p>
<blockquote><p>
白色 &#8211; \c\h01\h01<br />
红色 &#8211; \c\h01\h02<br />
灰色 &#8211; \c\h01\h03<br />
蓝色 &#8211; \c\h01\h04<br />
黑色 &#8211; \c\h01\h09<br />
紫色 &#8211; \c\h01\h0C<br />
棕色 &#8211; \c\h01\h0D
</p></blockquote>
<p>用在游戏里一定很亮眼吧?<br />
好了,花梢完之后,再来看message的搭配命令:boxset 6.<br />
boxset 6表示最普通的对话框,boxset 5是选择对话框(会弹出yes和no的选择),而boxset 4则是一个不会自动关闭的文本框.<br />
boxset 5和boxset 4我们以后再讲,一般我们只用boxset 6就可以了.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/901.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>教你如何用pokescript修改口袋游戏剧情！</title>
		<link>http://www.poketb.com/867.html</link>
		<comments>http://www.poketb.com/867.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 16:11:47 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[脚本教程]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[剧情]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=867</guid>
		<description><![CDATA[感谢会员liuyanghejerry的投递 嗯……看了上一篇文章的人应该多少对文章有一定了解了，这个教程就是对软件pokescript的一番讲解。pokescript是什么呢？它是老外开发的一款剧情编辑工具，输入脚本，就可以直接操作ROM，相当方便。 本文是liuyanghejerry在看了软件作者Irish witch的教程之后翻译＋修改的，使得文章能让我们看的更顺眼，部分教程还做了调整，不过有些不好翻译的地方我仍旧保持着原文（看目录就知道了），如果有什么地方看不懂，大家可以跟帖表示，我会尽我所能回答的。 OK以下开始正文： Pokescript教程 我注意到许多人来到我们论坛都会问道一个共同的问题:如何利用Pokescript制作改版?那么现在就让我来完整的回答这个问题吧. 当然,我所讲的一切都基于我的软件──Pokescript. 首先,我们需要下载两样东西:Pokescript(见附件),以及一个数据库,PkmAdv(见附件). PokeScript的安装相当简单,通常会安装在c:/pokewitch,而PkmAdv也是一样的,注意保持它们在相同的文件夹内即可. 下面我们来看看教程的安排,也就是目录: 0. 准备知识 1. 基础内容 1.1 开始学习 1.2 显示一段文字 1.3 写入ROM 1.4 真正显示于游戏 2. 关于物品赠送 2.1 只给一次的情形处理(使用标识) 2.2 是或不是的问题处理 2.3 接收物品 2.4 检查物品 2.5 删除物品 3. 关于精灵赠送 3.1 让精灵消失 3.2 &#8230; <a href="http://www.poketb.com/867.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>感谢会员liuyanghejerry的投递</p>
<p>嗯……看了<a title="Pokescript 详细图文教程" href="http://www.poketb.com/874.html" target="_blank">上一篇文章</a>的人应该多少对文章有一定了解了，这个教程就是对软件pokescript的一番讲解。pokescript是什么呢？它是老外开发的一款剧情编辑工具，输入脚本，就可以直接操作ROM，相当方便。<br />
<span style="color: red;">本文是liuyanghejerry在看了软件作者Irish witch的教程之后翻译＋修改的</span>，使得文章能让我们看的更顺眼，部分教程还做了调整，不过有些不好翻译的地方我仍旧保持着原文（看目录就知道了），如果有什么地方看不懂，大家可以跟帖表示，我会尽我所能回答的。<br />
OK以下开始正文：<br />
Pokescript教程<br />
我注意到许多人来到我们论坛都会问道一个共同的问题:如何利用Pokescript制作改版?那么现在就让我来完整的回答这个问题吧.<br />
当然,我所讲的一切都基于我的软件──Pokescript.<br />
首先,我们需要下载两样东西:Pokescript(见附件),以及一个数据库,PkmAdv(见附件).<br />
PokeScript的安装相当简单,通常会安装在c:/pokewitch,而PkmAdv也是一样的,注意保持它们在相同的文件夹内即可.<br />
下面我们来看看教程的安排,也就是目录:<br />
0. 准备知识<br />
1. 基础内容<br />
1.1 开始学习<br />
1.2 显示一段文字<br />
1.3 写入ROM<br />
1.4 真正显示于游戏</p>
<p>2. 关于物品赠送<br />
2.1 只给一次的情形处理(使用标识)<br />
2.2 是或不是的问题处理<br />
2.3 接收物品<br />
2.4 检查物品<br />
2.5 删除物品</p>
<p>3. 关于精灵赠送<br />
3.1 让精灵消失<br />
3.2 给予精灵的情形处理<br />
3.3 给精灵起个昵称<br />
3.4 让图鉴工作起来<br />
3.5 统计精灵<br />
3.6 选择精灵</p>
<p>4. 野外的场景<br />
4.1 控制NPC移动<br />
4.2 计算路线<br />
4.3 开始移动<br />
4.4 设置路标<br />
4.5 跟随NPC</p>
<p>5. 道馆中的情形<br />
5.1 地图中的人物<br />
5.2 与野生精灵战斗<br />
5.3 寻找训练师<br />
5.4 基本的训练师战斗<br />
5.5 双人战斗<br />
5.6 道馆馆主<br />
5.7 再次相遇的战斗<br />
5.8 训练师的可视范围</p>
<p>0.准备知识<br />
现在让我们来接触一下需要了解的一些基础知识吧.<br />
十六进制数字<br />
十六进制数字是相对于十进制的一种数字表达方法,它用的不是0,1,2,3,4,5,6,7,8,9而是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F这十六个字符.使用十六进制数字更有利于和二进制的处理器交换数据,但我们不需要深入了解.通常,我们表示时在前面加上&#8221;&amp;H&#8221;或者&#8221;0x&#8221;.<br />
你无需使用十六进制数字去做什么艰难的工作,顶多,就是用它们写写地址之类的东西.<br />
那么接下来要说的就是地址.<br />
地址是什么?我没法具体的去说明它,而且也没有必要,我们只需要知道它长这样:0&#215;800100.<br />
但实际上在Pokescript当中我们并不(或者说很少)用到这种表达方式,我们会用到这个:$Offset,来看一段简单的示例:<br />
code:<br />
#inline $Variable 1 = Hi I&#8217;m John!<br />
$Variable 1 = Hi I&#8217;m John!<br />
以上说的什么?你完全不用理会,你需要注意的是这个$Variable.在Pokescript当中,一个英文词语前加$就可以表示一个地址,当然,这个词语当中不允许有任何符号.至于它表示的地址具体是什么,完全不必理会(至少现在如此),那是程序的任务.</p>
<p>注:在一些特别的时候,我们需要将地址表示为0&#215;800100的形式,因为这是所有工具都认识的格式</p>
<p>下面开始进入正题:</p>
<p>1. 基础内容<br />
在我的教程中,我们时刻都要考虑你的脚本需要做什么,比如现在正要说的显示信息和道具给予.</p>
<p>1.1开始学习<br />
通常在整个改版过程中,我们得有一套完整的事件流程,就像一个剧本,比如:<br />
1. 你在地图上激活一个NPC.<br />
2. NPC将会问你一个问题.<br />
3. 如果你回答是,那么他将会给你一块饼干.<br />
4. 如果你已经要过饼干了,那么他会说另一段话</p>
<p>以上是一个很基本的例子,但我们现在还不到那个地步,我们得先来点更简单的:显示信息,也就是让NPC对你说一句话,然后来看看脚本是如何输出并写入ROM的.</p>
<p>首先打开记事本,并在其中输入以下的内容:<br />
Code:<br />
#ORG $ShowText<br />
Lock<br />
Faceplayer</p>
<p>以上是几条最为基本的命令,最开始的是地址标志,也就是$ShowText,前面我们曾经说过.而#ORG则表示脚本开始.这两个命令相当重要,因为它们不仅在这里要用到,而且以后几乎所有的脚本中都要用到,我们把它们看做一条命令,必须牢记.<br />
第二行的命令Lock表示将NPC锁定,而不是让他跑动.<br />
第三行命令更好理解,它表示面对主角.<br />
通常开始一段对话的时候都要写以上的部分,这几乎成了惯例.<br />
那么下一步就是:</p>
<p>1.2 显示一段文字<br />
以上的那些命令在每次显示一段文字时都要用到,那么来看看下面的代码:<br />
message $NoCookie<br />
$NoCookie 1 = I&#8217;m not made of cookies!\lYou only get one.<br />
boxset 6<br />
$NoCookie的格式前面已经说过,是一个地址,但不仅仅表示地址,此处我们认为它是一个变量.(变量是编程中用到的词语,完全不懂的话可以百度一下,当然,你跟着教程也能自己悟出)<br />
而I&#8217;m not made of cookies!\lYou only get one.则是我们想要显示的信息,其中\l表示换行.与\l类似的还有\n和\p ,区别大家可以自己体会.<br />
boxset 是设置对话框的意思,表示这里的内容在对话框中显示,6表示普通的文本对话框.<br />
看起来我们已经完成了所要做的,但请等一下,在末尾加上:<br />
release<br />
end<br />
表示恢复NPC原始形态,并结束脚本.这样整个脚本就是:<br />
#ORG $ShowText<br />
Lock<br />
Faceplayer<br />
message $NoCookie<br />
$NoCookie 1 = I&#8217;m not made of cookies!\lYou only get one.<br />
boxset 6<br />
release<br />
end<br />
现在我们在记事本当中,选择另存为,存为*.rbc格式即可.<br />
接下来我们将脚本写入ROM.</p>
<p>1.3 写入ROM</p>
<p>现在在&#8221;我的电脑&#8221;中找到刚才保存好的脚本,右键可以看到&#8221;合并脚本到ROM&#8221;的相关字样(英文:complie the script),点击.这时程序会弹出两个窗口,一个类似于工作日志,我们关闭它;而另一个则是Pokescript合并器的主窗口.(如果这个窗口未能弹出,那么双击同目录生成的文件即可)<br />
紧接着我们有两个方法来完成剩余的工作.<br />
①比较直接的方法<br />
单击那个好像书本一样的按钮,然后载入你想合并的ROM.<br />
注意,如果此时底下的列表中有多项内容你希望添加,那么使用shift可以复选,否则选中一个就好.<br />
现在就会弹出一个小窗口─此窗口会告诉你,即将写入的信息有多少以及ROM有多少剩余空间、从什么地方开始写起.如果是第一次使用,那么我们大可按照默认的地址0&#215;800000开始写入,因为在原来的ROM中,这个地方是空的.按下你需要写入的地址,然后点&#8221;assign&#8221;.<br />
瞧,又回到主窗口了.点击&#8221;file&#8221;菜单中的&#8221;Burn&#8221;,程序就开始工作了.<br />
工作完毕后千万不要直接关闭,记下程序回显中紧跟着起始地址的一行数字,我们一会有用的哦.<br />
②推荐的方法<br />
回到刚才,弹出小窗口的时候.大家应该注意到&#8221;assign&#8221;按钮上有一个复选框,钩选之后按钮就会显示&#8221;Reserve&#8221;,如此你所写入ROM的信息就不会覆盖到任何其它数据了(如果这不是个Clean ROM的话).</p>
<p>1.4 真正显示于游戏<br />
经过刚才的步骤,脚本已经被输入到ROM当中了,但是我们并没有让脚本的内容进入游戏.<br />
打开经典的工具Advanced Map,调至你所想要修改对话的NPC(在event view页面选中),在地图右边找到&#8221;Script Offset&#8221;一项(也就是地址了),还记得刚才我要大家记下的数字吗?粘贴替换掉现在那个,保存,测试!<br />
那么,现在一个最基本的步骤就算结束了,后面,我们就来完成一开始的那个小剧本吧.</p>
<p>注意了，如果您在ROM当中发现修改后的对话成为了乱码，那么您必须参见这里解决：<a href="http://www.poketb.com/868.html">http://www.poketb.com/868.html</a></p>
<p>2. 关于物品赠送<br />
学习完以上的内容,大家应该对脚本制作有一个大概的了解了.如何开始一个脚本、如何结束一个脚本以及如何使脚本在游戏中实现,都必须牢记.<br />
现在让我们来看看关于物品赠送的部分.<br />
以下的例子和上文中的很相似,不过这次我们给变量一个新名字:$GotCookie(上文名为$ShowText).</p>
<p>2.1 只给一次的情形处理(使用标识)<br />
当然,就和前面一样,我们的脚本仍然这么开头:<br />
#org $Startscript<br />
Lock<br />
Faceplayer<br />
为了能使得游戏知道每一个事件,我们通常要用到一个命令:setflag,中文即是设立标识.这就好比公交车站牌一样,告诉公交车何时该停下.<br />
大概有6000个标识可以使用。但是，在0&#215;300 &#8211; 0&#215;400 和 0&#215;800 &#8211; 0&#215;900 有许多游戏本身使用的，所以要避开这些去进行HACK.<br />
标识通常写作16进制,不过我们这会还不用亲自设立标识,而只需要让游戏检查标识.<br />
说到这大家可能晕了,什么是检查标识?我们并没有设立任何标识啊.是这样的,检查标识是一个预备性的命令,而关于设立标识,则是以后几节的重点,现在只要认得这个:<br />
checkflag 0&#215;200<br />
if B_TRUE goto $GotCookie<br />
你可能看不懂以上的脚本,没关系,我现在来讲解一下.<br />
checkflag这个命令在检查标识0&#215;200.<br />
而这里,B_TRUE也可以写作1或者0&#215;1,它们都表示&#8221;正确&#8221;.<br />
$GotCookie是我们事先写好的脚本.<br />
也就是这么个意思:检查标识0&#215;200,如果该标识存在,则进入脚本$GotCookie<br />
为了能更好的理解上面所说的,我们来进入下一节.当一切联系起来的时候,你就会明了了.</p>
<p>2.2 是或不是的问题处理<br />
是或不是的问题在对话时显得相当简洁,同时在结构上和之前显示对话的样式也很相似,因为它们都由对话引起.<br />
message $AskMe<br />
$AskMe 1 = Would you like a Lava Cookie?<br />
boxset 5<br />
以上的脚本和之前的很相似,唯一的区别就是命令boxset后的数字了.我们前面学过,6表示普通的文本对话框,那么5呢?5则表示一个&#8221;是或否&#8221;的选择框.游戏中我们经常见到这样的选择框,不是吗?比如在捕捉到新精灵时,系统会自动问你,要起昵称吗,此时用到的就是这个了.<br />
与checkflag型的语法不同,语句块是不可以直接跟在if之后的,我们需要这样做:<br />
compare LASTRESUILT B_TRUE<br />
if B_False goto $DontGet<br />
compare命令是在做对比,即如果以上的YES OR NO的问题中你选则了和YES不同的答案,那么将跳转到$DontGet部分的脚本.<br />
当然,compare命令不只可以用在YES OR NO的问题判断中,它还可以处理其它多值问题当中,这一点我们将在增加精灵一节展示出来,你会发现那是多么的事半功倍.<br />
而现在,我们得看看如何接收物品了.</p>
<p>2.3 接收物品<br />
在上例中,我们最终会得到一块饼干,饼干的值是0&#215;26.你可以从附件中的items.txt获得(L:文章的最后我会提供下载的).<br />
在获得饼干的过程中不必担心背包已满而发生数据溢出的问题,系统会自动处理这一切:回绝别人的赠送.<br />
紧跟着上面的代码,我们还要加一句:<br />
setflag 0&#215;200<br />
很眼熟吧?这就是上节中我们检查的那个标识,有了setflag这个命令,标识0&#215;200就被建立起来了,而当checkflag再次检查时,得到的结果就是B_TRUE了.<br />
现在我们来结束这个脚本,写上:<br />
Release<br />
end<br />
完整的脚本就是:</p>
<p>#org $Startscript<br />
Lock<br />
Faceplayer<br />
checkflag 0&#215;200<br />
if B_TRUE goto $GotCookie<br />
message $AskMe<br />
$AskMe 1 = Would you like a Lava Cookie?<br />
boxset 5<br />
compare LASTRESUILT B_TRUE<br />
if B_False goto $DontGet<br />
giveitem 0&#215;26 1<br />
setflag 0&#215;200<br />
Release<br />
end</p>
<p>#ORG $GotCookie<br />
Lock<br />
Faceplayer<br />
message $NoCookie<br />
$NoCookie 1 = I&#8217;m not made of cookies!\lYou only get one.<br />
boxset 6<br />
release<br />
end</p>
<p>#ORG $DontGet<br />
Lock<br />
Faceplayer<br />
message $AllMine<br />
$AllMine 1 = All the more for me!<br />
boxset 6<br />
release<br />
end</p>
<p>如果你还不能理解整个脚本,那么请让我来注释一番:</p>
<p>脚本$Startscript部分<br />
锁定人物<br />
面向主角<br />
如果标识0&#215;200存在,则跳转至$GotCookie部分<br />
否则显示$AskMe部分的信息<br />
$AskMe表示Would you like a Lava Cookie?<br />
弹出YES OR NO选择框<br />
对比选择框结果和 B_TRUE<br />
如果不匹配则跳转至$DontGet部分<br />
否则将饼干给予1块<br />
设立标识0&#215;200<br />
恢复人物状态<br />
脚本结束</p>
<p>脚本$GotCookie部分<br />
锁定人物<br />
面向主角<br />
显示信息$NoCookie<br />
信息$NoCookie表示I&#8217;m not made of cookies!换行You only get one.<br />
弹出标准文本框<br />
恢复人物状态<br />
脚本结束</p>
<p>脚本$DontGet部分<br />
锁定人物<br />
面向主角<br />
显示信息$AllMine<br />
信息$AllMine表示All the more for me!<br />
弹出标准文本框<br />
恢复人物状态<br />
脚本结束</p>
<p>2.4 检查物品<br />
我们有时会考虑这样一种情形:<br />
1. 首先我们激活一个NPC.<br />
2. 如果你有一块饼干,那么她会用一个超级球作为交换.<br />
3. 如果你在上文的脚本中没有获得饼干她会说她想要饼干.<br />
4. 如果你给过她饼干了,再次对话时她会说十分感谢.</p>
<p>这个构思把我们之前所写的脚本紧紧的联系到了一起,这正体现出RPG游戏一贯严谨的剧情风格.<br />
因为上例中我们已经使用了标识0&#215;200,所以本次的例子我们将使用标识0&#215;201,同时再启用一些新的地址变量,比如$GotBall.<br />
现在来接触一下新的命令:<br />
Checkitem 0&#215;26</p>
<p>Checkitem是一个检查物品数量的命令,它返回的值是一个数字.而且这个返回值是可以被命令compare所使用的,比如:<br />
Compare LASTRESULT 1<br />
表示比较结果和1是否相同,结果就是上面Checkitem返回的值,那么我们就可以这么理解:<br />
Compare Checkitem 0&#215;26 1<br />
当然,这只是我们所想象的过程,真正脚本在处理时必须写作:<br />
Compare LASTRESULT 1</p>
<p>但是这个脚本在我们的剧本中只能用来判断有或是没有饼干,也就是比较0和1,尽管正常情况下饼干只能得到一块,但如果发生意外了呢?──难道有两块饼干就不能换超级球了么?<br />
我们必须考虑一个范围的问题,也就是说,当背包中只要有饼干就换球,而不仅仅是1块饼干.我们用如下的命令格式来完成它:<br />
B_&lt;&lt; 小于 (0)<br />
B_== 等于 (1)<br />
B_&gt;&gt; 大于 (2)<br />
B_&lt;= 小于等于 (3)<br />
B_&gt;= 大于等于 (4)<br />
B_!= 不等于 (5)<br />
括号内的数字表示的是另一种表达方式,我们暂且不管.<br />
用上面的语句格式,就可以拓展我们的IF判断命令了:<br />
#Org $StartScript<br />
checkflag 0&#215;201<br />
if B_True goto $GotBall<br />
checkitem 0&#215;26<br />
compare LASTRESULT 1<br />
if B_&lt;&lt; goto $NoCookie</p>
<p>2.5 删除物品<br />
我们来瞧瞧已经完成的脚本:<br />
$WantBall 1 = Oh, You have a lavacookie.\pIf you give it to me I&#8217;ll\lgive<br />
you this UltraBall&#8230;\pWhat do you say?<br />
message 5<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_FALSE goto $DontGet<br />
在这之后NPC便会给主角一个超级球,但是问题也来了:饼干仍旧在主角的背包当中,于是我们得加上这样一个命令使得交易公平起来:<br />
removeitem 0&#215;26 1<br />
参数格式和giveitem命令完全一样,连在一起就是:<br />
giveitem 0&#215;2 1<br />
removeitem 0&#215;26 1<br />
而如果我们希望5个饼干才能换取一个超级球,那么则可以这样:<br />
compare LASTRESULT 5<br />
if B_&lt;&lt; goto $NoCookie<br />
giveitem 0&#215;2 1<br />
removeitem 0&#215;26 5<br />
最后别忘了再加上:<br />
Release<br />
end<br />
现在来看看完善后的脚本:<br />
#Org $StartScript<br />
checkflag 0&#215;201<br />
if B_True goto $GotBall<br />
checkitem 0&#215;26<br />
compare LASTRESULT 1<br />
if B_&lt;&lt; goto $NoCookie<br />
message $WantBall<br />
$WantBall 1 = Oh, You have a lavacookie.\pIf you give it to me I&#8217;ll\lgive you this UltraBall&#8230;\pWhat do you say?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_FALSE goto $DontGet<br />
giveitem 0&#215;2 1<br />
removeitem 0&#215;26 1<br />
Release<br />
end</p>
<p>#ORG $GotBall<br />
Lock<br />
Faceplayer<br />
message $LikeCookie<br />
$LikeCookie 1 = Thanks for the cookie!<br />
boxset 6<br />
release<br />
end</p>
<p>#ORG $NoCookie<br />
Lock<br />
Faceplayer<br />
message $LoveCookie<br />
$LoveCookie 1 = I Absolutely LOVE Lava Cookies!\lThey&#8217;re Just so Spicy!<br />
boxset 6<br />
release<br />
end</p>
<p>#ORG $DontGet<br />
Lock<br />
Faceplayer<br />
message $AAAW<br />
$AAAW 1 = Aaw C&#8217;Mon. It&#8217;s a fair trade!!\nI Love those things.<br />
boxset 6<br />
release<br />
end<br />
这次我不再翻译了,看不懂的人得再阅读上文.<br />
3. 关于精灵赠送<br />
相信这个章节应该是大家最期盼的了吧?精灵赠送在游戏中总是让人感到无比兴奋,现在我们就来进入这一环节.<br />
在本章节中,我们需要3个放置于地上或者桌子上的精灵球,但如何构造并不是我们现阶段要讨论的问题.<br />
来构想这样一个情景:<br />
1. 首先你激活了一个精灵球.<br />
2. 然后系统就会告诉你里面是个什么精灵,并询问你是否要.<br />
3. 如果你回答否,那么精灵球仍旧在那里放着<br />
4. 如果你回答是,那么这只精灵就属于你了,同时系统问你是否想给它起个昵称.<br />
5. 当然,如果你已经有了第一只精灵,那么系统会显示另外一段话来回绝你.<br />
以上的情景很熟悉吧?这就是火红/叶绿开始的情节,我们每个玩家都曾经历过,不过我们也应该注意到,以上的情节中存在着两个脚本.</p>
<p>3.1 让精灵消失<br />
先不要误会,这里的&#8221;让精灵消失&#8221;并不是指让你已经拥有的精灵丢失,而是指你在得到精灵球中精灵的同时,地图上的那个精灵球也要消失的过程.这个过程远比得到精灵重要,同时,这种使得精灵球从地图上消失的技巧也可以用在NPC或者其它物品上.<br />
那么这如何做到呢?<br />
打开Advanced map,在EVENT页面选中任意一个人物,然后在右侧的边栏中找到People ID一项.还记得前面说的标识吗?这里的People ID就是系统内置的标识,如果我们要告诉系统这个事件已经发生过了,那么只要使用Setflag加上0x再加People ID就可以让人物消失了!这时系统会自动刷新屏幕.但是,必须在Setflag命令结束之后再加一个release命令,否则会发生意外!<br />
如果把以上的内容镶嵌到物品赠与的脚本中,就要参照这个格式:<br />
#ORG $begin<br />
lock<br />
faceplayer<br />
checkflag 0&#215;200<br />
if B_true goto $done<br />
message $aidtalk<br />
boxset 6<br />
giveitem 0xD 1<br />
setflag 0&#215;200<br />
release<br />
end</p>
<p>3.2 给予精灵的情形处理<br />
现在一切都准备停当了,我们写下精灵给予的脚本:<br />
#org $StartChik<br />
checkflag 0&#215;800<br />
if B_True goto $NoBall<br />
message $Chick<br />
$Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $PutBack<br />
以上的部分和物品赠与完全相同,不过现在我们要添加两条命令了:一条是Jingle,Jingle就是得到物品后的声音;而另一条命令我们来看下面:<br />
givepokemon 152 5 0<br />
jingle<br />
message $GotChick<br />
$GotChick 1 = You Recieved a Chikorita<br />
boxset 6<br />
对了,就是givepokemon命令,这个命令含有3个参数,它们依次为:编号、等级、携带物品,需要说明的是,编号参数和全国图鉴略有不同,它有一共411个值可供选择,至于为什么这里暂不解释;而物品的编号则需参照文末即将提供的一份文本列表,这和之前物品赠与的规则是一样的;而等级参数就写作10进制的数字就好,不过一定要靠谱.<br />
现在来看看接下来发生的事:</p>
<p>3.3 给精灵起个昵称<br />
给精灵起昵称的过程并不复杂,我们像往常一样:<br />
message $NameChick<br />
$NameChick 1 = Would You like to give Chikorita a name?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if b_False goto $GiveDex<br />
Namepokemon<br />
瞧,Namepokemon什么参数也没有!是的,Namepokemon命令只是触发了系统的命名功能,而具体的事情并不由我们来完成.但是为了告诉系统,我们已经命名,必须在其后写一个设立标识的语句,如下:<br />
#org $StartChik<br />
checkflag 0&#215;800<br />
if B_True goto $NoBall<br />
message $Chick<br />
$Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $PutBack<br />
givepokemon 152 5 0<br />
jingle<br />
message $GotChick<br />
$GotChick 1 = You Recieved a Chikorita<br />
boxset 6<br />
message $NameChick<br />
$NameChick 1 = Would You like to give Chikorita a name?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if b_False goto $GiveDex<br />
Namepokemon<br />
setflag 0&#215;203<br />
goto $GiveDex<br />
最后的goto命令无条件的跳转到了下一个环节:</p>
<p>3.4 让图鉴工作起来<br />
事实上无论你获得或者捕捉到什么精灵,图鉴总会立即更新,但如果你还没有图鉴呢?那么游戏会变得很奇怪并且容易出错.<br />
因此如果这是你改版的第一个脚本,我们得加上:<br />
setflag 0&#215;800<br />
setflag 0&#215;801<br />
事实上,标识0&#215;800使菜单中出现&#8221;精灵&#8221;这一项,而标识0&#215;801才是打开图鉴的标志,但是很显然,二者都不可缺少.因此完整的脚本如下:<br />
#org $StartChik<br />
checkflag 0&#215;800<br />
if B_True goto $NoBall<br />
message $Chick<br />
$Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $PutBack<br />
givepokemon 152 5 0<br />
jingle<br />
message $GotChick<br />
$GotChick 1 = You Recieved a Chikorita<br />
boxset 6<br />
message $NameChick<br />
$NameChick 1 = Would You like to give Chikorita a name?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if b_False goto $GiveDex<br />
Namepokemon<br />
setflag 0&#215;203<br />
goto $GiveDex</p>
<p>#org $StartShrew<br />
checkflag 0&#215;800<br />
if B_True goto $NoBall<br />
message $Shrew<br />
$Shrew 1 = SandShrew!\lDesert Mole.\pTake the Sandshrew?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $PutBack<br />
givepokemon 27 5 0<br />
jingle<br />
message $GotChick<br />
$GotShrew 1 = You Recieved a Sandshrew<br />
boxset 6<br />
message $NameShrew<br />
$NameShrew 1 = Would You like to give Sandshrew a name?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if b_False goto $GiveDex<br />
Namepokemon<br />
setflag 0&#215;204<br />
goto $GiveDex</p>
<p>#org $StartWing<br />
checkflag 0&#215;800<br />
if B_True goto $NoBall<br />
message $Chick<br />
$Wing 1 = Wingull!\lThe Ocean Bird.\pTake the Wingull?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $PutBack<br />
givepokemon 152 5 0<br />
jingle<br />
message $GotGull<br />
$GotGull 1 = You Recieved a Wingull<br />
boxset 6<br />
message $NameGull<br />
$NameGull 1 = Would You like to give Wingull a name?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if b_False goto $GiveDex<br />
Namepokemon<br />
setflag 0&#215;205<br />
goto $GiveDex</p>
<p>#org $GiveDex<br />
setflag 0&#215;800<br />
setflag 0&#215;801<br />
message $Pokedex<br />
$Pokedex 1 = I hope You like your new pokemon.\pWhile your on your journeys I have\la favour to ask you.\pProf OAK and I are trying to make an\lindex of everything pokemon.\pTake this pokedex with you and it\lwill log all the pokemon you see and catch.\pIt would greatly help our studies!<br />
boxset 6<br />
jingle<br />
message $GotDex<br />
$Gotdex 1 = You got the Pokedex!<br />
boxset 6<br />
end</p>
<p>#org $PutBack<br />
message $PutBack<br />
$PutBack 1 = You put the pokeball back.<br />
boxset 6<br />
end</p>
<p>#org $NoBall<br />
message $Lastball<br />
$Lastball 1 = You already have your pokemon.\nDont be so greedy!<br />
boxset 6</p>
<p>注意,以上的脚本是专为&#8221;选择初始精灵&#8221;而准备的,如果是其它情形,则脚本还可以更简单.<br />
L:大家仔细看脚本可以发现,其实激活图鉴是在获得精灵之后的,这显然不符合逻辑,有没有更好的写法呢?大家可以试试把goto $GiveDex提前,看看会出现什么结果.</p>
<p>3.5 统计精灵<br />
统计精灵其实只是为了进行一次确认──确认在得到精灵时队伍是否已满.通常我们必须这么做,否则一旦向满队伍中增加精灵,数据就会溢出.<br />
countpokemon<br />
compare LASTRESULT 6<br />
if b_True goto $FullParty<br />
以上就是一个绝好的countpokemon命令例子.但countpokemon并不是只有这一处用武之地,它还可以:<br />
限制至少有一只精灵才能进入<br />
compare LASTRESULT 1<br />
if b_&gt;&gt; goto $EnterRoom<br />
限制至少有两只精灵才能战斗<br />
compare LASTRESULT 2<br />
if b_!= goto $DualBattle<br />
携带3只以上的精灵不能进入<br />
compare LASTRESULT 3<br />
if b_&lt;= goto $EnterBattle<br />
还有很多其它用法.</p>
<p>3.6 选择精灵<br />
选择精灵这个命令很少出现,唯一记忆清晰的就是在重命名的时候会用到,示例如下:<br />
#org $GivePoke<br />
message $ChangeName<br />
$WantPoke 1 = Hi! I&#8217;m the Name Rater\pI Rate pokemons name and\nallow people to change them.\pWould you like to rate the name of\lyour pokemon?<br />
boxset 5<br />
compare LASTRESULT 1<br />
if B_False goto $Later<br />
selectpokemon<br />
message $NamePoke<br />
$NamePoke 1 = Alright, what name shall we give it?<br />
boxset 6<br />
Namepokemon<br />
message $MuchBetter<br />
$MuchBetter 1 = You&#8217;re right.\lThat&#8217;s a much better name.<br />
boxset 6<br />
end</p>
<p>#org $Later<br />
message $Banter<br />
$Banter 1 = Ok.\lLet me know if you change your mind?<br />
boxset 6<br />
end</p>
<p>4. 野外的场景<br />
第4个章节我们研究的是如何安排人物的行动,这和之前的脚本在结构上会有所不同,而使用的命令也将有许多是之前未曾讲过的,所以大家务必用心.<br />
在本章当中,我们的联系对象是&#8221;博士的研究所&#8221;当中发生的情节,各位可以拿出红蓝宝石先回味一下.<br />
另外,本章节所需要的资料Ruby-Move.txt和FR-Move.txt会在文末一同放出.</p>
<p>4.1 准备行动<br />
我们现在又开始需要Advanced Map这款软件的帮忙了,打开Advanced Map,找到&#8221;博士的研究所&#8221;并切换到Event view页面.<br />
看到一些写着S的方框了么,但这些方框是不同的:在入口处的那个表示一个事件,而其余的则都表示标志.什么是标志呢?就是当主角激活它的时候,它只显示一段文字,好比:&#8221;电视上正播出着妈妈爱看的节目&#8230;&#8230;&#8221;.<br />
&#8220;博士的研究所&#8221;中桌子上放的三个精灵球,实际上则被游戏界定为人物,因而它们都写着&#8221;P&#8221;,编号为59.<br />
现在我们不用去管标志,而将重点放在人物和事件两个方面.<br />
在我们的脚本当中,我们希望Professor Birch和Brendan都能够动起来,所以现在得看看关于他俩的人物信息,好比是如下这样:<br />
Professor Birch:<br />
- 人物编号: 2<br />
- 距离门口的S框8个格子</p>
<p>Brendan:<br />
- 人物编号: 3<br />
- 同样距离门口的S框8个格子<br />
- 距离精灵球旁的S框4个格子.</p>
<p>同时为了确保两人静止,我们还必须在&#8221;Movement&#8221;一栏选择&#8221;None&#8221;(两个人都要如此).事实上只有处于这种状态之下,关于移动NPC的脚本才能够实现.<br />
我们现在希望他们怎样呢?<br />
1. 我们要主角移动到博士面前,然后显示得到图鉴的那个脚本.<br />
2. 得到图鉴.<br />
看起来上面的内容相当简单,而实际上则远比这两行字麻烦.</p>
<p>4.2 计算路线<br />
当明确了人物的行动目的之后,我们就要开始盘算行动路线了,也就是计算路线.路线铺设相对比较繁琐,累计下来的脚本恐怕比得上很多给予物品的脚本,我们必须灵活的应用if和goto考虑到玩家的各种行动可能,以免意外发生.<br />
Code:<br />
#org $IF_OR<br />
checkflag 0&#215;203<br />
if b_True gosub $Move1<br />
checkflag 0&#215;204<br />
if b_True gosub $Move2<br />
checkflag 0&#215;205<br />
if b_True gosub $Move3<br />
end</p>
<p>&#8216; 每一个$Move脚本在运行之后都必须用return命令来使脚本回归:<br />
#org $IF_AND<br />
checkflag 0&#215;203<br />
if b_True gosub $TestFlag2<br />
end</p>
<p>#ORG $TestFlag2<br />
checkflag 0&#215;204<br />
if b_True gosub $DoMove<br />
return<br />
以上的if&#8230;gosub命令是借鉴了VB当中的IF语句形式,如果你懂得一些,可以看看这个:<br />
IF_OR参考:<br />
if checkflag(0&#215;203) then<br />
&#8216; Move 1<br />
endif<br />
if checkflag(0&#215;204) then<br />
&#8216; Move 2<br />
endif<br />
if checkflag(0&#215;205) then<br />
&#8216; Move 3<br />
endif<br />
IF_AND参考:</p>
<p>if checkflag(0&#215;203) then<br />
if checkflag(0&#215;204) then<br />
&#8216; DoMove<br />
endif<br />
endif<br />
当然,以上只是了解一下,我们在软件中也不能用以上的代码.<br />
言规正传,我们来看完善后的脚本:<br />
#org $GiveDex<br />
setflag 0&#215;800<br />
setflag 0&#215;801<br />
checkflag 0&#215;203<br />
if b_True gosub $Move1<br />
checkflag 0&#215;204<br />
if b_True gosub $Move2<br />
checkflag 0&#215;205<br />
if b_True gosub $Move3<br />
message $Pokedex<br />
$Pokedex 1 = I hope You like your new pokemon.\pWhile your on your journeys I have\la favour to ask you.\pProf OAK and I are trying to make an\lindex of everything pokemon.\pTake this pokedex with you and it\lwill log all the pokemon you see and catch.\pIt would greatly help our studies!<br />
boxset 6<br />
jingle<br />
message $GotDex<br />
$Gotdex 1 = You got the Pokedex!<br />
boxset 6<br />
end<br />
L:事实上大家可以将gosub换回我们熟悉的goto命令,因为笔者在参考了其它资料后发现只有在Irish Witch的教程中出现了这个命令,而其它人一律用的是goto.<br />
下面来进入最最关键的步骤:</p>
<p>4.3 开始移动<br />
以上都是很简单的准备性工作,当然,移动也并非很难,只是稍稍繁琐而已,来看命令:<br />
Applymovement &lt;人物编号&gt; &lt;地址&gt;<br />
pausemove 0<br />
applymovement表示给人物一个起始信号,好比一个通知;而下面的pausemove暂且不管.<br />
需要说明的是:<br />
1.人物编号我们之前曾经说过,但当你要命令主角的时候则需要写&#8221;0xFF&#8221;<br />
2.在移动的脚本之内,不要使用lock命令,否则人物不会移动!具体写成什么样子,看下面:<br />
#org $Move1<br />
applymovement 0xFF $Ball1Move<br />
pausemove 0<br />
return<br />
由于无论拿到桌子上的哪只精灵都会触发走到博士旁边的动作,所以这段脚本需要写三次.</p>
<p>关于移动的命令<br />
由于每个版本所需要的移动不同,故而我们需要区分版本的写命令:如果你改的是红宝石,那么你需要使用ruby-move.txt当中的命令,而如果你改的是蓝宝石或者火红/叶绿,那么你需要用到FR-Move.txt当中的命令(同样在文末送出).<br />
L:奇怪的是,红蓝宝石的命令竟然会不同,疑为原作者笔误,还有待验证.<br />
先来看:<br />
Left 0 = 脚不离地的向转身<br />
Left 1 = 向左一步<br />
Left 2 = 快速左走2步<br />
Left 3 = 急速走3步<br />
也就是说,数字既代表步数,又代表了速度.同时记住,left1  left1 left1 left1 = left2 left2,它们速度虽然不同,但位移的结果却是完全相同的.<br />
但是,以上并不是命令的真实面目,我们在写脚本时,必须在前面加命令#Binary,并且要这样写:<br />
#Binary 0&#215;06 0&#215;06 0&#215;06 0&#215;06 0xFE<br />
#Binary 0x0a 0x0a 0xFE<br />
以上是红宝石中的命令,完整的就是:<br />
#org $GiveDex<br />
setflag 0&#215;800<br />
setflag 0&#215;801<br />
checkflag 0&#215;203<br />
if b_True gosub $Move1<br />
checkflag 0&#215;204<br />
if b_True gosub $Move2<br />
checkflag 0&#215;205<br />
if b_True gosub $Move3<br />
message $Pokedex<br />
$Pokedex 1 = I hope You like your new pokemon.\pWhile your on your journeys I have\la favour to ask you.\pProf OAK and I are trying to make an\lindex of everything pokemon.\pTake this pokedex with you and it\lwill log all the pokemon you see and catch.\pIt would greatly help our studies!<br />
boxset 6<br />
jingle<br />
message $GotDex<br />
$Gotdex 1 = You got the Pokedex!<br />
boxset 6<br />
end</p>
<p>#org $Move1<br />
applymovement 0xFF $Ball1Move<br />
pausemove 0<br />
return<br />
#org $Move2<br />
applymovement 0xFF $Ball2Move<br />
pausemove 0<br />
return<br />
#org $Move3<br />
applymovement 0xFF $Ball3Move<br />
pausemove 0<br />
return</p>
<p>#org $Ball3Move<br />
#Binary 0&#215;06<br />
#org $Ball2Move<br />
#Binary 0&#215;06<br />
#org $Ball1Move<br />
#Binary 0&#215;06 0&#215;06 0&#215;06 0&#215;01 0xFE<br />
注意,移动的最终需要添加一个终止标志,在红宝石中是0xFE,而其它的则需要参考资料.<br />
以下是火红的移动全资料:<br />
&#8216; Specials<br />
0x4A &#8216; Face player<br />
0x4B &#8216; Face against player<br />
0&#215;60 &#8216; Disappear (removes the sprite, but the person can still be interacted with)<br />
0&#215;62 &#8216; &#8220;!&#8221; pops up<br />
0&#215;63 &#8216; &#8220;?&#8221; pops up<br />
0&#215;64 &#8216; &#8220;X&#8221; pops up (vs-seeker cant fight)<br />
0&#215;65 &#8216; &#8220;!!&#8221; pops up (vs-seeker can fight)<br />
0&#215;66 &#8216; &#8220;&#8221; pops up</p>
<p>&#8216; walking<br />
0&#215;01 &#8216; step Up0<br />
0&#215;02 &#8216; step Left0<br />
0&#215;03 &#8216; step Right0<br />
0&#215;04 &#8216; step Down0<br />
0&#215;08 &#8216; step down1<br />
0&#215;09 &#8216; step up1<br />
0x0A &#8216; step left1<br />
0x0B &#8216; step right1<br />
0x0C &#8216; step down2<br />
0x0D &#8216; step up2<br />
0x0E &#8216; step left2<br />
0x0F &#8216; step right2<br />
0&#215;10 &#8216; step down3<br />
0&#215;11 &#8216; step up3<br />
0&#215;12 &#8216; step left3<br />
0&#215;13 &#8216; step right3<br />
0x1D &#8216; step down4<br />
0x1E &#8216; step up4<br />
0x1F &#8216; step left4<br />
0&#215;20 &#8216; step right4</p>
<p>&#8216; jump in place looking where it says<br />
0&#215;52 &#8216; jump0 down<br />
0&#215;53 &#8216; jump0 up<br />
0&#215;54 &#8216; jump0 left<br />
0&#215;55 &#8216; jump0 right</p>
<p>&#8216; jump in place looking in the order it says<br />
0&#215;56 &#8216; jump0 down/up<br />
0&#215;57 &#8216; jump0 up/down<br />
0&#215;58 &#8216; jump0 left/right<br />
0&#215;59 &#8216; jump0 right/left</p>
<p>&#8216; Jump Direction<br />
0x4E &#8216; jump1 down<br />
0x4F &#8216; jump1 up<br />
0&#215;50 &#8216; jump1 left<br />
0&#215;51 &#8216; jump1 right</p>
<p>0&#215;14 &#8216; jump2 down<br />
0&#215;15 &#8216; jump2 up<br />
0&#215;16 &#8216; jump2 left<br />
0&#215;17 &#8216; jump2 right</p>
<p>0&#215;46 &#8216; jumpLookingLeft1 down<br />
0&#215;47 &#8216; jumpLookingDown1 up (jump backwards)<br />
0&#215;48 &#8216; jumpLookingUp1 left<br />
0&#215;49 &#8216; jumpLookingLeft right (jump backwards)</p>
<p>These are the offsets for basic movement:<br />
UP = 0&#215;11<br />
DOWN = 0&#215;10<br />
LEFT = 0&#215;12<br />
RIGHT = 0&#215;13<br />
实在懒得翻译了,大家稍微翻翻词典就知道注释的意思了.</p>
<p>4.4 设置路标<br />
路标(var),这是个什么概念?大家可能会想起我们前边所讲的标识(flag),其实它们是差不多的,同样是为了做个标记.不过路标的英文var实际表示的是变量,这意味着什么?这意味着路标不仅可以表示&#8221;有&#8221;或&#8221;无&#8221;,还可以放置一个数字!这就给我们作出多种假设方案提供了便利.<br />
#org $LeftExit<br />
setvar 0&#215;4400 2<br />
checkflag 0&#215;800<br />
if 0&#215;0 gosub $UmPokemon<br />
checkflag 0&#215;207<br />
if 0&#215;0 goto $Followme<br />
end<br />
以上就是命令setvar在0&#215;4400放置数字2的过程.<br />
但是这个脚本只是一小部分,我们这次打算计划的是什么?<br />
1.如果你想要走出研究所,那么博士的助手就会叫住我们<br />
2.紧接着把我们带到放有精灵球的盒子旁<br />
2b.这时给你一个超级球<br />
3.如果你尝试绕过助手,那么脚本会强制你走到助手旁触发脚本<br />
4.如果你已经有一个超级球,那么你什么也得不到.<br />
结合上面的脚本,补充如下:<br />
#org $Followme<br />
message $HeyWait<br />
$HeyWait 1 = Brendan: Hey Wait!\p<br />
boxset 6<br />
compare 0&#215;4400 1<br />
if 0&#215;1 gosub $AdjustLeft<br />
compare 0&#215;4400 2<br />
if 0&#215;1 gosub $AdjustRight</p>
<p>4.5 跟随NPC<br />
跟随NPC实际和上面的人物移动脚本差别并没有多大,只需要让主角走得慢NPC一步.我们为此需要一个命令:pause.pause并不是等待所有脚本结束后才开始运行,而是在等待一个特别的时机.我们来看示例:<br />
1.首先,Brendan开始移动.<br />
2.使主角以慢1步的形式作相同的脚本移动.<br />
3.等到Brendan停止移动的时候.<br />
4.主角会停止在Brendan后面,而不是撞上去<br />
5.现在所有人都停下了.<br />
这样我们就会得到类似的脚本:<br />
applymovement 0&#215;3 $Brendanwalk2<br />
applymovement 0xff $StepRight<br />
applymovement 0xff $Brendanwalk2<br />
&#8216;结果是: Up0 Up2 Up2 Up2 Up1 left0 left1 left1 left1<br />
$BrendanWalk2 1 ; 0&#215;05 0&#215;09 0&#215;09 0&#215;09 0&#215;05 0&#215;02 0&#215;07 0&#215;07 0&#215;07 0xfe<br />
pause 0&#215;110</p>
<p>applymovement 3 $StepRight<br />
$StepRight 1 ; #Binary 0&#215;07 0xfe<br />
pausemove 0</p>
<p>我们在这里新加了一些东西.如果你已经明白了之前的内容,那么很容易看出我们即将写:<br />
#org $StepRight<br />
#Binary 0&#215;07 0xfe<br />
因为之前也学过类似的结构:<br />
#org $MyText<br />
= Any old text we want!<br />
同样的结构,但是表达上却有一点小区别.在以前的脚本中,我们常用=来赋值,而在移动的脚本中,我们却要用;<br />
和前几个小节的脚本结合,得到如下完整的脚本:<br />
&#8216; 脚本开始<br />
&#8216; &#8212;&#8212;&#8212;&#8212;-<br />
#org $RightExit<br />
setvar 0&#215;4400 1<br />
checkflag 0&#215;800<br />
if 0&#215;0 gosub $UmPokemon<br />
checkflag 0&#215;207<br />
if 0&#215;0 goto $Followme<br />
end</p>
<p>#org $LeftExit<br />
setvar 0&#215;4400 2<br />
checkflag 0&#215;800<br />
if 0&#215;0 gosub $UmPokemon<br />
checkflag 0&#215;207<br />
if 0&#215;0 goto $Followme<br />
end</p>
<p>&#8216; 如果你没有精灵<br />
&#8216; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
#org $UmPokemon<br />
message $WhatNoPoke<br />
$WhatNoPoke 1 = BIRCH: Don&#8217;t you want a Pokemon?<br />
boxset 6<br />
applymovement 0xff $TurnPlayer<br />
$TurnPlayer 1 ; #Binary 0&#215;05 0&#215;09 0xfe<br />
pausemove 0<br />
end</p>
<p>&#8216; 将主角移到一旁<br />
&#8216; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
#org $AdjustRight<br />
applymovement 0xFF $MoveLeft<br />
$MoveLeft ; #Binary 0&#215;56 0&#215;02 0&#215;06 0&#215;03<br />
return</p>
<p>#org $AdjustLeft<br />
applymovement 0xFF $FaceRight<br />
&#8216; This move set goes: Alert Up0 Right0<br />
$FaceRight ; #Binary 0&#215;56 0&#215;01 0&#215;03<br />
return</p>
<p>&#8216; 跟随部分脚本<br />
&#8216; &#8212;&#8212;&#8212;&#8212;&#8212;-<br />
#org $Followme<br />
message $HeyWait<br />
$HeyWait 1 = Brendan: Hey Wait!\p<br />
boxset 6</p>
<p>compare 0&#215;4400 1<br />
if 0&#215;1 gosub $AdjustLeft<br />
compare 0&#215;4400 2<br />
if 0&#215;1 gosub $AdjustRight</p>
<p>applymovement 3 $BrendanWalk1<br />
$BrendanWalk1 1 ; #Binary 0&#215;08 0&#215;08 0&#215;08 0&#215;08 0&#215;02 0xfe<br />
pausemove 0</p>
<p>Message $Parting<br />
$Parting 1 = Before you leave I have something\pThat might Help you later!<br />
boxset 6</p>
<p>applymovement 0&#215;3 $Brendanwalk2<br />
applymovement 0xff $StepRight<br />
applymovement 0xff $Brendanwalk2<br />
$BrendanWalk2 1 ; #Binary 0&#215;05 0&#215;09 0&#215;09 0&#215;09 0&#215;05 0&#215;02 0&#215;07 0&#215;07 0&#215;07 0xfe<br />
pause 0&#215;110</p>
<p>applymovement 3 $StepRight<br />
$StepRight 1 ;#Binary  0&#215;07 0xfe<br />
pausemove 0</p>
<p>message $Rummage<br />
$Rummage 1 = Brendan Rummages in the box<br />
boxset 6</p>
<p>applymovement 3 $FaceLeft<br />
$FaceLeft 1 ; #Binary 0&#215;02 0xfe<br />
pausemove 0</p>
<p>message $UltraBall<br />
$UltraBall 1 = Here it is!\nThis is an Ultra Ball!\pIt&#8217;s one of the most powerful balls\lin existance and will catch just about\pAny pokemon. Use it wisely.<br />
boxset 6<br />
giveitem 0&#215;2 1<br />
release<br />
end</p>
<p>如果你已经完全明白上面脚本的意义,那么恭喜,你已经完全掌握了移动的命令!</p>
<p>5. 道馆中的情形<br />
嘛&#8230;经过前面的学习,脚本命令的基本形式大家都应该相当了解了,本章的内容主要是教会你一些命令,没有什么难度.</p>
<p>5.1 地图中的人物<br />
其实在前面的内容中我们已经学习过一些关于地图上人物的知识,比如如何让人物消失.<br />
而在本部分中,我们将制作一只在道馆外转悠的野生精灵:<br />
1.当你和它对话时,它会叫一声<br />
2.如果该道馆的徽章你已经取得,那么你会立即进入一场野生战斗<br />
- 当然,打败或者捕捉、逃走的话,它就会消失.</p>
<p>1.精灵的叫声<br />
游戏中有专门的命令负责在地图上、对话中让精灵的叫声出现,那就是Cry.来看例子:<br />
#org $StartWild<br />
lock<br />
faceplayer<br />
cry 5<br />
message $charCry<br />
$charcry 1 = Charmeleon:Raarg!<br />
boxset 6<br />
cry命令只有一个参数,就是精灵的编号.<br />
在我们的例子中,我们所使用的是Charmeleon这只精灵,它的编号就是5.<br />
当然,在和它战斗之前,我们必须确认主角是否得到了该道馆的徽章,以下是一份徽章资料:<br />
0&#215;807 &#8211; First Badge &#8211; Stone Badge<br />
0&#215;808 &#8211; Second Badge &#8211; Knuckle Badge<br />
0&#215;809 &#8211; Third Badge &#8211; Dyamo Badge<br />
0x80A &#8211; Fourth Badge &#8211; Heat Badge<br />
0x80B &#8211; Fifth Badge &#8211; Balance Badge<br />
0x80C &#8211; Sixth Badge &#8211; Feather Badge<br />
0x80D &#8211; Seventh Badge &#8211; Mind Badge<br />
0x80E &#8211; Eighth Badge &#8211; Rainbow Badge<br />
从上向下,依此是从第一至最后一个道馆的徽章,具体名称我就不再翻译了.<br />
相信大家能够看得出来,是否拥有徽章,是用标识的形式表示的,因而我们只需要这样:<br />
checkflag 0&#215;808<br />
if 0&#215;1 goto $WildBatt<br />
release<br />
end<br />
以上即可检测是否拥有第二个徽章.<br />
下面进入战斗部分</p>
<p>5.2 与野生精灵战斗<br />
来看一个极其简单的脚本:<br />
#org $Wildbatt<br />
lock<br />
wildbattle 5 20 1<br />
不错,命令wildbattle就是触发野生精灵战斗的命令,它携带了三个参数,分别是&lt;精灵&gt;&lt;等级&gt;&lt;模式&gt;.前两个参数没什么好说的,都是10进制的合法数字即可,而最后的模式,则表示战斗进行的场地类型:<br />
0 = 草丛<br />
1 = 水中<br />
2 = 山地<br />
3 = 沙漠<br />
不过这个参数在不同版本的游戏中是不同的.<br />
另外就是,如果在战斗中你失败了,那么会在就近的PC中复活,这一步在写脚本时是不必考虑的,唯一需要注意的则是release和lock的位置.<br />
3为了告诉游戏我们已经和此精灵战斗过了,我们需要再设立一个标识在此之后,我们必须刷新屏幕,使那只精灵消失:<br />
#org $StartWild<br />
lock<br />
faceplayer<br />
cry 5<br />
message $charCry<br />
$charcry 1 = Charmeleon:Raarg!<br />
boxset 6<br />
checkflag 0&#215;808<br />
if 0&#215;1 goto $WildBatt<br />
release<br />
end</p>
<p>#org $Wildbatt<br />
lock<br />
wildbattle 5 20 1<br />
release<br />
setflag 0&#215;500<br />
fadescreen 0<br />
end<br />
这里fadescreen 0就是刷新屏幕,具体的用法暂时不必管它.</p>
<p>5.3 寻找训练师<br />
为了清楚的说明和训练师战斗的命令,我们需要三个例子:<br />
1. 简单的对战训练师.<br />
2. 2VS2的战斗.<br />
3. 和道馆首领的战斗.<br />
L:在原英文教程当中,作者还用到了Advanced Battle和Elitemap的附带程序advancebattleevo作为参照演示,本文略去.<br />
现在来看我们的命令:<br />
Trainerbattle &lt;模式&gt; &lt;训练师&gt; &lt;挑战语&gt; &lt;结束语&gt; &lt;附加选项&gt;<br />
以下是模式参数的可选值:<br />
0 &#8211; 普通战斗<br />
1 &#8211; 与馆主的战斗<br />
2 &#8211; 再次双人战斗<br />
3 &#8211; 与馆主的再挑战<br />
4 &#8211; 双人战斗<br />
5 &#8211; 普通的再挑战<br />
L:上面参数部分本人还未实践,但总觉得2和4的位置原作者写反了</p>
<p>5.4 基本的训练师战斗<br />
#org $Trainer1<br />
lock<br />
faceplayer<br />
trainerbattle 0 395 $MadChall $MadDefeat<br />
$MadChall 1 = Madeline: I am mighty&#8230; I hope!<br />
$MadDefeat 1 = Madeline: Oh poor Numel!!!!<br />
message $MadTalk<br />
$MadTalk 1 = I thought having a fire pokemon\iwould help make me stronger.\pI Guess I was wrong.<br />
boxset 6<br />
release<br />
end</p>
<p>现在来看看上面这段脚本的意义,最重要的就是trainerbattle各参数的解释:<br />
0是表示普通对战,395则是训练师的编号,$MadChall $MadDefeat两个变量分别储存了开始挑战时和挑战结束时训练师所说的话.</p>
<p>5.5 双人战斗<br />
现在我们就要用到参数&lt;附加选项&gt;了,我们这样写:<br />
trainerbattle 4 258 $AMChall $AMDefeat $AMNoBattle<br />
$AMChall 1 = Anna: The others say we&#8217;re not tough\lenough for this Gym.\pMeg: Well Show Em!<br />
$AMDefeat 1 = Anna: I guess they were right!\pMeg: Dont worry, We&#8217;ll improve.<br />
$AMNoBattle 1 = Meg:On no.\pAnna: You can&#8217;t battle us with\ljust one pokemon!<br />
那么$AMNoBattle作为附加选项的作用是什么呢?如果你能够看懂英语就会知道,当双人战没有被触发而是变为单人战时,$AMNoBattle就是结束语.<br />
完整脚本如下:<br />
#org $Trainer2<br />
lock<br />
faceplayer<br />
trainerbattle 4 258 $AMChall $AMDefeat $AMNoBattle<br />
$AMChall 1 = Anna: The others say we&#8217;re not tough\lenough for this Gym.\pMeg: Well Show Em!<br />
$AMDefeat 1 = Anna: I guess they were right!\pMeg: Dont worry, We&#8217;ll improve.<br />
$AMNoBattle 1 = Meg:On no.\pAnna: You can&#8217;t battle us with\ljust one pokemon!<br />
message $AMTalk<br />
$AMTalk 1 = Anna: You just wait and see!<br />
boxset 6<br />
release<br />
end</p>
<p>5.6.道馆馆主<br />
作为剧情的一部分,道馆馆主的战斗和一般的训练师有所不同:<br />
#org $Trainer1<br />
lock<br />
faceplayer<br />
trainerbattle 1 114 $BernChall $BernDefeat $BernCode<br />
$BernChall 1 = Bernie: I am might&#8230; I hope!<br />
$BernDefeat 1 = Bernie: Oh poor Numel!!!!<br />
message $BernTalk<br />
$BernTalk 1 = Wow.. Colour be Burned!<br />
boxset 6<br />
release<br />
end<br />
在这种一般的模式之后,还要加上这样的 部分:<br />
#org $BernCode<br />
message $Congrats<br />
$Congrats 1 = BERNIE: Your a pretty good trainer!\pAs leader of this Gym it is now my Duty to give you the Knuckle Badge.<br />
boxset 6</p>
<p>setflag 0&#215;808<br />
jingle<br />
message $GotBadge<br />
$Gotbadge 1 = You recieved the Knuckle Badge!\pBERNIE: That badge will allow you to control\lall pokemon above level X\nAnd will also let your pokemon perform\lTASK outside of battle.\pWhile I&#8217;m at it you can have this!<br />
boxset 6</p>
<p>giveitem 0x5f 1<br />
message $FireStone<br />
$FireStone 1 = That is a Firestone.\nIt will evolve some Fire type pokemon.\pAlso, There&#8217;s a really strong pokemon outside.\nI couldn&#8217;t catch it cause my pokemon\lweren&#8217;t strong enough but you\ncan go for it if you want!<br />
boxset 6<br />
end<br />
瞧,附加选项$BernCode替代了以上那么一大段脚本.<br />
现在该联系之前的脚本了:</p>
<p>5.7 再次相遇的战斗<br />
在游戏当中,除非剧情需要,否则训练师是不会和你再次战斗的.同时还要确保并不是每次见面都会触发战斗,于是我们需要用到compare命令.<br />
当trainerbattle命令执行后,如果compare命令的配套命令LASTRESULT变成1,那么再战斗就成为了可能.结合上面的脚本,我们这样写:<br />
trainerbattle 0 395 $MadChall $MadDefeat<br />
compare LASTRESULT 1<br />
if B_TRUE goto $ReBattle<br />
最后$ReBattle的脚本会和一般的战斗脚本相同,这里就不再缀述了.</p>
<p>5.8 训练师的可视范围<br />
有时候训练师如果很早就看到你并走过来,那么就会挡住道路,于是我们就必须调整训练师的可视范围.训练师的可视范围并不是在脚本当中完成的,而是需要在Advancedmap的人物&#8221;View Range&#8221;属性当中改变的,它接受的数字单位为:步.</p>
<p>&nbsp;</p>
<p>本文涉及的文件下载</p>
<p><a href="?file_id=items.txt">items.txt</a></p>
<p><a href="?file_id=pkmadv.exe">pkmadv.exe</a></p>
<p><a href="?file_id=poketscript.exe">poketscript.exe</a></p>
<p><a href="?file_id=pokemon.txt">pokemon.txt</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/867.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pokescript 详细图文教程（一）</title>
		<link>http://www.poketb.com/874.html</link>
		<comments>http://www.poketb.com/874.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 16:06:19 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[脚本教程]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=874</guid>
		<description><![CDATA[Pokescript 详细图文教程 本文版权归liuyanghejerry及口袋技术盒子共有，转载请先询问！ 不知道大家有没有玩过类似于ShinyGold的改版游戏呢?玩过的人可能就要惊叹于作者对游戏剧情的修改幅度了.那么这样的一款作品又是怎样做成的,其过程究竟有多难呢?今天我就来带领大家走进剧情修改的神秘殿堂,Follow Me! 一、准备知识 1.基础知识 亲自尝试过修改游戏的人可能知道,GBA上的游戏采用的是16进制的方式来储存游戏数据的.16进制比10进制多出了6个&#8221;数字&#8221;,它们分别是:A、B、C、D、E、F,这些数字加上0、1、2、3、4、5、6、7、8、9,就是16进制的直观表达了,其中0最小,而F最大.我们在修改游戏时不需要对16进制进行深入的了解,但必须记住:16进制的数据在ROM中遵循的规则是高位排高数,低位排低数.另外,为了区分两种进制,我们通常以&#8221;0xFF&#8221;或者&#8221;&#38;HFF&#8221;的形式来表示一个16进制的数据. 我们所进行的游戏修改,其原理一共有两个,一是依靠BMP这种图片存储格式来识别游戏中未被加密的图片,以替换成我们想要的图;而另一个则是在破解了《口袋妖怪》游戏的部分数据含义的前提下进行的,比如我们在知道了A1=0的前提下才得以用A1替换其它数据以让0显示出来.这两种原理其本质相同,但使用的方法并不相同.在游戏汉化中,二者都被用上了.而在我们游戏修改当中,前者用来改地图和人物形象,后者就用来改剧情,这比对ROM数据的理解要求比汉化还要严,因为不是只知道码表就可以的. 说到这大家可能都有点害怕了,其实不用紧张,外国的达人已经破解了绝大部分游戏信息,并制作了一些工具来极大的简化游戏修改,使得我们不需要埋头于大量的火星符号中拼凑,我们所需要做的,就是学会工具的使用方法,以自己的想象力来创造自己的剧情. 因为是外国人开发的工具,所以只支持美版的游戏修改,请大家用时一定注意!  2.所需软件及安装、使用 下面就该请出我们的主角Pokescript了. Pokescript是外国人Irish Witch编的一个小程序,它能根据破解出的游戏指令对照表,把玩家写的指令编译成游戏可以识别的16进制数据.当然,这并不是唯一的一款编译器,著名的EliteMap中同样附带了名为Scripted的工具,其功能更加强大.不过Pokescript的语言更简单易学,所以我们就从它开始吧! 那么,第一步就是安装Pokescript了.Pokescript下载：poketscript.exe Pokescript的安装极其简单,几乎就是一路Next.其安装默认路径为C:/pokewitch. 安装完Pokescript之后我们需要安装一个库文件,其中包含了众多版本游戏的对应指令表,它的名字就是PkmAdv. PkmAdv的下载与Pokescript在一个地方,我提供给大家的既有自解压版也有RAR版,大家可以自由选择.安装时请保持它们在相同的文件夹内. 到这是不是就OK了呢?对于外国玩家来说的确如此,但对于我们来说还要多出一步:设置计算机的语言区域选项.  就像NB一样,Pokescript也属于非unicode程序,直接使用的话会出现乱码.与NB不同的是,Pokescript是必须含参运行的,而我们又不知道它的参数是什么,所以只能按照下面的步骤设置计算机了. 首先进入控制面板。 打开语言与区域的选项。 按照下图的样子变更你的设置。注意，一共有3处需要修改。（我不知道前两个是否必要，但是后一个是必须的！） 设置完毕后系统会提示重启，这时用不着犹豫了，重启吧！ 重启之后所有中文软件都无法使用，各位最好自觉的关闭，避免不必要的错误。 现在来看看测试成功的图片。 嗯……终于可以正常说话了…… 另外需要注意到是，在修改设置的系统中，任何软件在运行时，其路径绝不能包含中文，类似于C:/我的软件/..是不允许的！ 除了Pokescript,我们还需要一样地图编辑软件,这里我推荐Advance Map,它的最新版本是1.92,大家可以在我的博客上下载到含带中文语言包的版本(不过英文计算机环境下会乱码).该软件无须安装,解压运行即可.不过由于之前计算机被设置为英文,所以解压的路径中一定不要有中文. 最后我们要在互联网上找一份原版的美版ROM,笔者这里以火红为例,其它版本也可.(救助队不行) 好了,现在准备工作就算完成了,下面跟着我的第一个脚本来看看软件的工作流程吧! 3.软件是如何工作的 设置停当后,打开Windows自带的记事本(notepad.exe),原封不动的写下如下的文字: #org $start lock faceplayer message &#8230; <a href="http://www.poketb.com/874.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;">Pokescript 详细图文教程</span></span><br />
<span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"><span style="color: red;">本文版权归<strong><span style="color: #ff0000;">liuyanghejerry</span></strong>及口袋技术盒子共有，转载请先询问！<br />
</span>不知道大家有没有玩过类似于ShinyGold的改版游戏呢?玩过的人可能就要惊叹于作者对游戏剧情的修改幅度了.那么这样的一款作品又是怎样做成的,其过程究竟有多难呢?今天我就来带领大家走进剧情修改的神秘殿堂,Follow Me!<br />
</span></span></p>
<p align="left"><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;">一、准备知识<br />
1.基础知识<br />
亲自尝试过修改游戏的人可能知道,GBA上的游戏采用的是16进制的方式来储存游戏数据的.16进制比10进制多出了6个&#8221;数字&#8221;,它们分别是:A、B、C、D、E、F,这些数字加上0、1、2、3、4、5、6、7、8、9,就是16进制的直观表达了,其中0最小,而F最大.我们在修改游戏时不需要对16进制进行深入的了解,但必须记住:16进制的数据在ROM中遵循的规则是高位排高数,低位排低数.另外,为了区分两种进制,我们通常以&#8221;0xFF&#8221;或者&#8221;&amp;HFF&#8221;的形式来表示一个16进制的数据.<br />
我们所进行的游戏修改,其原理一共有两个,一是依靠BMP这种图片存储格式来识别游戏中未被加密的图片,以替换成我们想要的图;而另一个则是在破解了《口袋妖怪》游戏的部分数据含义的前提下进行的,比如我们在知道了A1=0的前提下才得以用A1替换其它数据以让0显示出来.这两种原理其本质相同,但使用的方法并不相同.在游戏汉化中,二者都被用上了.而在我们游戏修改当中,前者用来改地图和人物形象,后者就用来改剧情,这比对ROM数据的理解要求比汉化还要严,因为不是只知道码表就可以的.<br />
说到这大家可能都有点害怕了,其实不用紧张,外国的达人已经破解了绝大部分游戏信息,并制作了一些工具来极大的简化游戏修改,使得我们不需要埋头于大量的火星符号中拼凑,我们所需要做的,就是学会工具的使用方法,以自己的想象力来创造自己的剧情.<br />
因为是外国人开发的工具,所以只支持美版的游戏修改,请大家用时一定注意!</span></span></p>
<p align="left"><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"> 2.所需软件及安装、使用<br />
下面就该请出我们的主角Pokescript了.<br />
Pokescript是外国人Irish Witch编的一个小程序,它能根据破解出的游戏指令对照表,把玩家写的指令编译成游戏可以识别的16进制数据.当然,这并不是唯一的一款编译器,著名的EliteMap中同样附带了名为Scripted的工具,其功能更加强大.不过Pokescript的语言更简单易学,所以我们就从它开始吧!<br />
那么,第一步就是安装Pokescript了.Pokescript下载：<a href="?file_id=poketscript.exe">poketscript.exe</a><br />
Pokescript的安装极其简单,几乎就是一路Next.其安装默认路径为C:/pokewitch.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160701pkz.bmp" alt="" border="0" /></span></span></p>
<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"> <img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160703RnC.bmp" alt="" border="0" /><br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160704Yrv.bmp" alt="" border="0" /></span></span></p>
<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"></span></span></p>
<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;">安装完Pokescript之后我们需要安装一个库文件,其中包含了众多版本游戏的对应指令表,它的名字就是PkmAdv.<br />
PkmAdv的下载与Pokescript在一个地方,我提供给大家的既有自解压版也有RAR版,大家可以自由选择.安装时请保持它们在相同的文件夹内.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160705MKn.bmp" alt="" border="0" /><br />
到这是不是就OK了呢?对于外国玩家来说的确如此,但对于我们来说还要多出一步:设置计算机的语言区域选项.</span></span></p>
<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"> 就像NB一样,Pokescript也属于非unicode程序,直接使用的话会出现乱码.与NB不同的是,Pokescript是必须含参运行的,而我们又不知道它的参数是什么,所以只能按照下面的步骤设置计算机了.<br />
首先进入控制面板。<br />
打开语言与区域的选项。<br />
按照下图的样子变更你的设置。注意，一共有3处需要修改。（我不知道前两个是否必要，但是<span style="color: #ff0000;">后一个是必须的</span>！）<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160706g7u.bmp" alt="" border="0" /><br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/1607073I3.bmp" alt="" border="0" /></span></span></p>
<p><span style="font-family: 楷体_GB2312;"><span style="font-size: medium;"> <span style="color: #ff0000;">设置完毕后系统会提示重启</span>，这时用不着犹豫了，重启吧！<br />
重启之后所有中文软件都无法使用，各位最好自觉的关闭，避免不必要的错误。<br />
现在来看看测试成功的图片。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160707lru.bmp" alt="" border="0" /><br />
嗯……终于可以正常说话了……<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160708vVh.bmp" alt="" border="0" /></span></span></p>
<p>另外需要注意到是，在修改设置的系统中，任何软件在运行时，其路径绝不能包含中文，类似于C:/我的软件/..是<span style="color: #ff0000;">不允许</span>的！</p>
<p>除了Pokescript,我们还需要一样地图编辑软件,这里我推荐Advance Map,它的最新版本是1.92,大家可以在我的博客上下载到含带中文语言包的版本(不过英文计算机环境下会乱码).该软件无须安装,解压运行即可.不过由于之前计算机被设置为英文,所以解压的路径中一定不要有中文.</p>
<p>最后我们要在互联网上找一份<span style="color: red;">原版的美版ROM</span>,笔者这里以火红为例,其它版本也可.(救助队不行)<br />
好了,现在准备工作就算完成了,下面跟着我的第一个脚本来看看软件的工作流程吧!<br />
3.软件是如何工作的</p>
<p><span class="Apple-style-span" style="font-family: 楷体_GB2312; font-size: medium;">设置停当后,打开Windows自带的记事本(notepad.exe),原封不动的写下如下的文字:</span></p>
<blockquote><p>#org $start<br />
lock<br />
faceplayer<br />
message $1<br />
boxset 6<br />
release<br />
end<br />
#org $1<br />
$1 1 =Hi.nWelcome to poketb.com!</p></blockquote>
<p><span class="Apple-style-span" style="font-family: 楷体_GB2312; font-size: medium;"><img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160735B3Y.bmp" alt="" border="0" /></span></p>
<p>之后选择&#8221;另存为&#8221;,在下拉菜单中选择&#8221;所有格式&#8221;然后取名为1.rbc.注意哦,是*.rbc的样子.另外保存路径中同样禁止中文出现,下文也是一样的.</p>
<p><img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160736f4g.bmp" alt="" border="0" /><br />
保存过之后,在文件上按鼠标右键,选择图中的&#8221;complie script&#8221;<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160737rnS.bmp" alt="" border="0" /></p>
<p>这时会有一个窗口弹出来,瀑布一样的出来文字,最后弹出一个小窗口,如图:<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160738vku.bmp" alt="" border="0" /><br />
现在按住键盘上的Ctrl或者shift,选中两个选项,然后点那个书一样的按钮,选择ROM(这里是火红的美版):<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160739Rf0.bmp" alt="" border="0" /><br />
这时会弹出一个如图的搜索框,直接按手电的那个按钮,选择返回数字中的第一组,再按下底下的&#8221;assign&#8221;按钮.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160740rz5.bmp" alt="" border="0" /><br />
回到之前的窗口,点击&#8221;file&#8221;菜单中的&#8221;Burn&#8221;,程序就开始工作了.不到一秒,程序就输出了日志,这时千万不要关闭程序.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160740gb0.bmp" alt="" border="0" /><br />
现在脚本已经写进ROM了,但是我们还没有告诉游戏哪里用我们的脚本.一般的,脚本都是给地图中的NPC的,所以这会就要用到Advance Map了.<br />
打开Advance Map并载入已经写入脚本的ROM,在左边的树状图中展开&#8221;by header&#8221;并双击地图(3,0),很熟悉吧?这里就是初始的城镇了.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160741nb6.bmp" alt="" border="0" /><br />
为了不干扰脚本工作,我们挑选一个没有剧情关联的NPC,比如右下角的那个胖子.(如果你的Advance Map没有显示出人物模型,那么就在设置中勾选&#8221;show spirits&#8221;)<br />
我们可以看到,右边的属性中有offset一项,更改它为$800000.那么800000这个数字是怎么来的呢?还记得日志吗?现在赶快瞧瞧:原来800000对应的正是$1.<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160742ujF.bmp" alt="" border="0" /><br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160743eOm.bmp" alt="" width="794" border="0" /><br />
保存之后进入游戏和那个胖子说话:<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/160744AY7.bmp" alt="" border="0" /><br />
看看他说的话,再看看脚本的内容,你有什么发现呢?<br />
好了,本次的内容就说到这里.以上的步骤都至关重要,大家一定要记住.当然,大家不要看着步骤单调就没有兴趣了,更不要因为&#8221;高深&#8221;的技术术语而退缩了,下次我将教大家如何让NPC给你想要的道具、精灵等等,再见咯~~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/874.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>终于解决了脚本器的乱码问题！！！（Pokescript可以使用了）</title>
		<link>http://www.poketb.com/868.html</link>
		<comments>http://www.poketb.com/868.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 15:51:30 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[其它教程]]></category>
		<category><![CDATA[Apploc]]></category>
		<category><![CDATA[PokeScript]]></category>
		<category><![CDATA[乱码]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[语言]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=868</guid>
		<description><![CDATA[……我一定是在暑假粗心了，导致这么简单的一个问题难住了我N久…… 不知道大家有没有尝试过Pokescript来修改游戏，如果有的话，那么您修改的ROM在测试的时候对话部分一定是乱码或者空白，不过，这段历史从今天开始要改变了。 其实问题没有难到要用Microsoft AppLocale这种软件，准确的说，因为软件是要含参运行，所以不知道参数，你没法用这个家伙来运行脚本编译器。 现在废话结束，开始讲述。 首先进入控制面板。 打开语言与区域的选项。 按照下图的样子变更你的设置。注意，一共有3处需要修改。（我不知道前两个是否必要，但是后一个是必须的！） 设置完毕后系统会提示重启，这时用不着犹豫了，重启吧！ 重启之后所有中文软件都无法使用，各位最好自觉的关闭，避免不必要的错误。 现在来看看测试成功的图片。 嗯……终于可以正常说话了…… 最后提示一点：为了Pokescript一个软件可能不值得您把系统的语言改来改去，所以建议您专门建立一个用户来进行改版工作。 另外，在修改设置的系统中，任何软件在运行时，其路径绝不能包含中文，类似于C:/我的软件/..是不允许的！]]></description>
			<content:encoded><![CDATA[<p>……我一定是在暑假粗心了，导致这么简单的一个问题难住了我N久……</p>
<p>不知道大家有没有尝试过Pokescript来修改游戏，如果有的话，那么您修改的ROM在测试的时候对话部分一定是乱码或者空白，不过，这段历史从今天开始要改变了。</p>
<p>其实问题没有难到要用Microsoft AppLocale这种软件，准确的说，因为软件是要含参运行，所以不知道参数，你没法用这个家伙来运行脚本编译器。</p>
<p>现在废话结束，开始讲述。<br />
首先进入控制面板。<br />
打开语言与区域的选项。<br />
按照下图的样子变更你的设置。注意，一共有3处需要修改。（我不知道前两个是否必要，但是后一个是必须的！）<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/15513261J.bmp" alt="" width="796" border="0" /><br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/1551339aH.bmp" alt="" border="0" /></p>
<p>设置完毕后系统会提示重启，这时用不着犹豫了，重启吧！</p>
<p>重启之后所有中文软件都无法使用，各位最好自觉的关闭，避免不必要的错误。<br />
现在来看看测试成功的图片。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/155133h5J.bmp" alt="" border="0" /><br />
嗯……终于可以正常说话了……<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/1551345Q2.bmp" alt="" border="0" /></p>
<p>最后提示一点：为了Pokescript一个软件可能不值得您把系统的语言改来改去，所以建议您专门建立一个用户来进行改版工作。<br />
另外，在修改设置的系统中，任何软件在运行时，其路径绝不能包含中文，类似于C:/我的软件/..是不允许的！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/868.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让我来教你改口袋图鉴吧</title>
		<link>http://www.poketb.com/858.html</link>
		<comments>http://www.poketb.com/858.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 15:08:51 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[汇编教程]]></category>
		<category><![CDATA[ROM]]></category>
		<category><![CDATA[图鉴]]></category>
		<category><![CDATA[改版]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=858</guid>
		<description><![CDATA[感谢会员 liuyanghejerry 的投递 嘛……一直很XX是吧？外国的那些个工具都只能编辑美版的ROM，汉化版甚至日文版都得干瞪眼，于是抱着试一试的心情，我开始解析了日版以及中文版的图鉴内容。 还好，图鉴的内容还算明朗。 【火叶版】 首先是，我在网上找到的一个日版/汉化版图鉴内容地址：0x40E2D0 这个地址应该是幻之皮卡丘得出的，不过一下午都没看见他上线，于是暂时不清楚怎么得来的。 不过真正的图鉴数据似乎不是从那里开始的。 来看下图： 文字标的不是很清楚，我再解释下吧。 第一个橘色的标签所在的偏移量就是网上流传的那个， 第二个红色的标签标识出的是PM的种类，举个例子“种子型口袋妖怪”,这个“种子型”就是这里所指的内容。（比较恶心的是，汉化版把这个部分统统改成了0000，于是每只精灵我们都在图鉴里看不到相关的说法了） 第三个海蓝色标签所标识出的是PM的身高。要改它需要了解下它的规则。假设一只PM的身高是2.9（单位就是ROM原定的），首先给它扩大10倍变成29，然后再转成16进制：（0x）1D。填入ROM的这个位置即可～ 第四个淡紫色的标签所标识的是PM的体重。它的规则更加简单一些，仅仅是10进制-16进制的变化而已。 第五个亮蓝色的标签所标识的是PM的简介文本指针。顺着它就可以找到文本。如果把这里的指针改为指向我们自制的文本，就能换简介了。文本的文字编码就是码表里的，不过记住结尾要加上FF作为终止符。 第六个浅绿色的标签所表示的是在人与精灵比大小画面中精灵的缩放倍数，具体是怎样的编译规则我还不太清楚，不过大家可以试着改改看。 第七个深绿色的标签所表示的是在人与精灵比大小画面中精灵的绝对位置，可以让精灵从地面上飘起来。具体编译规则未知。 第八个紫色的标签所标识出的是在人与精灵比大小画面中人物的缩放倍数。具体编译规则未知。 最后的FEFF表示该精灵的情况结束，后面就是下一只精灵了。 美版的相关情况： 颜色对应的意思和上面的解释是基本一样的，但是这里我说一下区别： 1、精灵的种类（红色标签）比日版所占的要多出3个字节（可以明显的看到） 2、咖啡色标签是一个没有用的指针，为什么会出现这个呢？我个人推测是因为火叶基于宝石版的缘故（宝石版图鉴说明有第二页）。 下面来看宝石版的相关情况，以红宝石为例： 【日版】 标签意义与上面完全相同 【美版】 标签意义与上面完全相同 最后，绿宝石也迎刃而解了，数据模式一点没变…… 【日版】 【美版】 【DP绿宝石】 标签的含义一点没有变化……]]></description>
			<content:encoded><![CDATA[<p>感谢会员 liuyanghejerry 的投递</p>
<p>嘛……一直很XX是吧？外国的那些个工具都只能编辑美版的ROM，汉化版甚至日文版都得干瞪眼，于是抱着试一试的心情，我开始解析了日版以及中文版的图鉴内容。</p>
<p>还好，图鉴的内容还算明朗。</p>
<p>【火叶版】</p>
<p>首先是，我在网上找到的一个日版/汉化版图鉴内容地址：0x40E2D0</p>
<p>这个地址应该是幻之皮卡丘得出的，不过一下午都没看见他上线，于是暂时不清楚怎么得来的。</p>
<p>不过真正的图鉴数据似乎不是从那里开始的。</p>
<p>来看下图：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150852Q4j.bmp" alt="" border="0" /></p>
<p>文字标的不是很清楚，我再解释下吧。</p>
<p>第一个橘色的标签所在的偏移量就是网上流传的那个，</p>
<p>第二个红色的标签标识出的是PM的种类，举个例子“种子型口袋妖怪”,这个“种子型”就是这里所指的内容。（比较恶心的是，汉化版把这个部分统统改成了0000，于是每只精灵我们都在图鉴里看不到相关的说法了）</p>
<p>第三个海蓝色标签所标识出的是PM的身高。要改它需要了解下它的规则。假设一只PM的身高是2.9（单位就是ROM原定的），首先给它扩大10倍变成29，然后再转成16进制：（0x）1D。填入ROM的这个位置即可～</p>
<p>第四个淡紫色的标签所标识的是PM的体重。它的规则更加简单一些，仅仅是10进制-16进制的变化而已。</p>
<p>第五个亮蓝色的标签所标识的是PM的简介文本指针。顺着它就可以找到文本。如果把这里的指针改为指向我们自制的文本，就能换简介了。文本的文字编码就是码表里的，不过记住结尾要加上FF作为终止符。</p>
<p>第六个浅绿色的标签所表示的是在人与精灵比大小画面中精灵的缩放倍数，具体是怎样的编译规则我还不太清楚，不过大家可以试着改改看。</p>
<p>第七个深绿色的标签所表示的是在人与精灵比大小画面中精灵的绝对位置，可以让精灵从地面上飘起来。具体编译规则未知。</p>
<p>第八个紫色的标签所标识出的是在人与精灵比大小画面中人物的缩放倍数。具体编译规则未知。</p>
<p>最后的FEFF表示该精灵的情况结束，后面就是下一只精灵了。</p>
<p>美版的相关情况：</p>
<p><img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150853iWj.bmp" alt="" border="0" /></p>
<p>颜色对应的意思和上面的解释是基本一样的，但是这里我说一下区别：</p>
<p>1、精灵的种类（红色标签）比日版所占的要多出3个字节（可以明显的看到）<br />
2、咖啡色标签是一个没有用的指针，为什么会出现这个呢？我个人推测是因为火叶基于宝石版的缘故（宝石版图鉴说明有第二页）。</p>
<p>下面来看宝石版的相关情况，以红宝石为例：<br />
【日版】<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150854vFB.bmp" alt="" border="0" /></p>
<p>标签意义与上面完全相同</p>
<p>【美版】<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150855x7n.bmp" alt="" border="0" /></p>
<p>标签意义与上面完全相同</p>
<p>最后，绿宝石也迎刃而解了，数据模式一点没变……</p>
<p>【日版】<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150856LeZ.bmp" alt="" border="0" /></p>
<p>【美版】<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150856EUg.bmp" alt="" border="0" /></p>
<p>【DP绿宝石】<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/150857zHu.bmp" alt="" border="0" /></p>
<p>标签的含义一点没有变化……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/858.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配合UNLZ，彻底推倒ROM中的压缩图片（含带调色板教程）</title>
		<link>http://www.poketb.com/828.html</link>
		<comments>http://www.poketb.com/828.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 14:39:39 +0000</pubDate>
		<dc:creator>口袋技术盒子</dc:creator>
				<category><![CDATA[图片教程]]></category>
		<category><![CDATA[ROM]]></category>
		<category><![CDATA[UNLZ]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[压缩]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[调色板]]></category>

		<guid isPermaLink="false">http://www.poketb.com/?p=828</guid>
		<description><![CDATA[感谢会员liuyanghejerry的投递~ 在上一篇图片教程当中，我介绍了如何修改针对tile查看器能够看到的图片，但这种方法同时还是存在缺陷的。 第一，虽然找到了图片，但由于没有调色板，仅仅只能修改外貌而无法对付颜色； 第二，ROM中有不少图片是经过LZ77进行压缩的，仅仅使用TILE查看器是不可能找到的。 那么今天我们就来挨个解决这两个问题吧。 首先来解决第一个。 如何修改未被压缩的调色板 所需工具： -VBA-我用的是VBA1.80英文版，大家对应到汉化版即可。（为什么？因为我总觉得汉化版有BUG，以前遇到过，有阴影） -CT2-这是一款很爽的ROM综合查看器，全名Crystal Tile 2，大家自己百度下载吧。 -WinHex-我很喜欢的一款HEX编辑工具。这是一款专业级工具，在HEX方面提供的功能相当强大，欢迎大家从UE走向WINHEX，呵呵。 *本例将以如何修改火红美版当中对话框颜色为例，讲解如何修改调色板* 首先，用VBA载入你的ROM，并且让画面停留在你所要修改图片的地方。 现在我们打开工具当中的图块查看器： 游戏中一般使用的都是16色图，而整个调色板区域却是256色的，所以我们的图通常只占用一部分而已。为了搞清楚占用的到底是哪一行，我们在这个图块查看器里确认一下，步骤我都写在图上了。 下面打开调色板查看器： 通过在图块查看器里的观察，我们可以知道，我们要找的调色板在最后一行（为什么？因为那个调到最后的时候图片正常）。 首先保存下左边的调色板（这是背景调色板，右边那个是物件调色板，是活物[能动弹的那种，比如大地图人物]用的） 存成图中指定的那种类型： 接下来我们继续回到调色板查看器。我们选中最后一行调色板中的第一个颜色，看到地址那里会有一个地址出现，记住它。 现在再打开内存查看器，转到那个地址： 转到之后点击另存为，从我们获得的地址开始存起，保存大概20个字节即可。 这里是内存中的调色板，因为我们之前说了，是未被压缩的，因而实际上ROM中它们同样是这样存放的。 那么下一步，便是用WinHex打开刚刚保存出来的内存数据，全选，在菜单中选择：编辑-复制-16进制数值。再用WinHex打开我们的ROM，菜单：搜索-搜索16进制数值。 经过搜索，我们很快便会定位在一个地址上，如下： 把得到的地址记下来。 现在打开APE，载入ROM，选择按地址搜索，在地址框键入地址，选择载入，如下： 这样，我们便可以自由的修改调色板了。 （修改时要先点选上面的copy按钮，复制到下面修改，然后再按&#8221;replace&#8221;覆盖上去。在低下时双击颜色即可编辑） 回到ROM，果然，发生了我们想要的变化： 那么大家可能会问了，CT2究竟起什么作用呢？ 实际上，用CT2可以直接在ROM里带着调色板编辑图块，具体怎么用，呵呵，大家自己钻研钻研吧…… 那么，现在我们来解决第二个问题， 【其后的部分将很依赖于您是否阅读了之前的内容】 如何修改经过LZ77压缩的图片 LZ77是一种GBA游戏ROM中常用的压缩方法，这种方法能够有效的减少图片、调色板等信息在ROM中的储存空间，起到了很好的压缩作用。 但对于改版而言，这种压缩无异于加密。 UNLZ_GBA这款工具其实就是专门解压缩LZ77压缩后的图片的工具。但是由于口袋ROM中调色板比较分散，而UNLZ_GBA本身又有些BUG，使得仅仅通过UNLZ是不能很好的做出我们想要的图的。 &#8230; <a href="http://www.poketb.com/828.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>感谢会员liuyanghejerry的投递~</p>
<p>在<a title="教你在ROM中找到游戏的任意图片" href="http://www.poketb.com/815.html" target="_blank">上一篇图片教程</a>当中，我介绍了如何修改针对tile查看器能够看到的图片，但这种方法同时还是存在缺陷的。<br />
第一，虽然找到了图片，但由于没有调色板，仅仅只能修改外貌而无法对付颜色；<br />
第二，ROM中有不少图片是经过LZ77进行压缩的，仅仅使用TILE查看器是不可能找到的。</p>
<p>那么今天我们就来挨个解决这两个问题吧。</p>
<p>首先来解决第一个。</p>
<p><span style="font-size: medium;"><span style="color: blue;"><strong>如何修改未被压缩的调色板</strong></span></span></p>
<p>所需工具：<br />
-VBA-我用的是VBA1.80英文版，大家对应到汉化版即可。（为什么？因为我总觉得汉化版有BUG，以前遇到过，有阴影）<br />
-CT2-这是一款很爽的ROM综合查看器，全名Crystal Tile 2，大家自己百度下载吧。<br />
-WinHex-我很喜欢的一款HEX编辑工具。这是一款专业级工具，在HEX方面提供的功能相当强大，欢迎大家从UE走向WINHEX，呵呵。<br />
<span style="color: red;">*本例将以如何修改火红美版当中对话框颜色为例，讲解如何修改调色板*</span><br />
首先，用VBA载入你的ROM，并且让画面停留在你所要修改图片的地方。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143940rlA.png" alt="" border="0" /></p>
<p>现在我们打开工具当中的图块查看器：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143940sgx.png" alt="" border="0" /></p>
<p>游戏中一般使用的都是16色图，而整个调色板区域却是256色的，所以我们的图通常只占用一部分而已。为了搞清楚占用的到底是哪一行，我们在这个图块查看器里确认一下，步骤我都写在图上了。</p>
<p>下面打开调色板查看器：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143940COj.png" alt="" border="0" /></p>
<p>通过在图块查看器里的观察，我们可以知道，我们要找的调色板在最后一行（为什么？因为那个调到最后的时候图片正常）。<br />
首先保存下左边的调色板（这是背景调色板，右边那个是物件调色板，是活物[能动弹的那种，比如大地图人物]用的）<br />
存成图中指定的那种类型：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143941NKz.png" alt="" border="0" /></p>
<p>接下来我们继续回到调色板查看器。我们选中最后一行调色板中的第一个颜色，看到地址那里会有一个地址出现，记住它。</p>
<p>现在再打开内存查看器，转到那个地址：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143941QtA.png" alt="" border="0" /></p>
<p>转到之后点击另存为，从我们获得的地址开始存起，保存大概20个字节即可。</p>
<p>这里是内存中的调色板，因为我们之前说了，是未被压缩的，因而实际上ROM中它们同样是这样存放的。</p>
<p>那么下一步，便是用WinHex打开刚刚保存出来的内存数据，全选，在菜单中选择：编辑-复制-16进制数值。再用WinHex打开我们的ROM，菜单：搜索-搜索16进制数值。<br />
经过搜索，我们很快便会定位在一个地址上，如下：</p>
<p><img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143942Yke.png" alt="" width="796" border="0" /></p>
<p>把得到的地址记下来。</p>
<p>现在打开APE，载入ROM，选择按地址搜索，在地址框键入地址，选择载入，如下：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143943dxy.png" alt="" border="0" /></p>
<p>这样，我们便可以自由的修改调色板了。<br />
（修改时要先点选上面的copy按钮，复制到下面修改，然后再按&#8221;replace&#8221;覆盖上去。在低下时双击颜色即可编辑）<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143944FHp.png" alt="" border="0" /></p>
<p>回到ROM，果然，发生了我们想要的变化：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143944MN9.png" alt="" border="0" /></p>
<p>那么大家可能会问了，CT2究竟起什么作用呢？<br />
实际上，用CT2可以直接在ROM里带着调色板编辑图块，具体怎么用，呵呵，大家自己钻研钻研吧……</p>
<p>那么，现在我们来解决第二个问题，<br />
【其后的部分将很依赖于您是否阅读了之前的内容】<br />
<span style="font-size: medium;"><span style="color: blue;"><strong>如何修改经过LZ77压缩的图片</strong></span></span><br />
<strong></strong></p>
<p>LZ77是一种GBA游戏ROM中常用的压缩方法，这种方法能够有效的减少图片、调色板等信息在ROM中的储存空间，起到了很好的压缩作用。</p>
<p>但对于改版而言，这种压缩无异于加密。</p>
<p>UNLZ_GBA这款工具其实就是专门解压缩LZ77压缩后的图片的工具。但是由于口袋ROM中调色板比较分散，而UNLZ_GBA本身又有些BUG，使得仅仅通过UNLZ是不能很好的做出我们想要的图的。</p>
<p>所需工具：</p>
<p>-UNLZ_GBA[HackMew Hacked]- EliteMap包里带着一个，但我倾向于使用HackMew修改过的版本，这个版本在工具区置顶工具箱中即可找到。后文简称UNLZ。<br />
-VBA- 不说啥了，模拟器。<br />
-老妖的LZ77加/解压缩工具- 同样在工具区置顶工具箱中可找到。<br />
-WinHex-很专业的HEX工具。<br />
-APE-调色板的傻瓜化工具。</p>
<p><span style="color: red;">本例将以修改战斗中的文本框为例，讲述如何使用UNLZ+APE完美修改LZ77压缩图片。</span><br />
首先必须清楚一点，那就是我们要改的图片确实经过了LZ77压缩。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143944kgz.png" alt="" border="0" /><br />
怎么验证呢？其实道理很浅显——用上篇教程（<a href="http://poketb.com/bbs/thread-13410-1-1.html" target="_blank">http://poketb.com/bbs/thread-13410-1-1.html</a>）当中的方法找不到的图片，就是LZ77压缩过的图片了……<br />
UNLZ几乎可以找到所有的LZ77压缩图片，所以只要从头开始，挨个看，绝对能看到你要改的那个……<br />
当然，注意了，UNLZ要调到黑白模式。（为什么呢？因为在彩色模式下，UNLZ会尝试使用一些调色板，而这些调色板很可能会让原本有内容的图片变成漆黑一片）</p>
<p>凭借运气，我找到了那个战斗文本框在UNLZ中的位置，如图：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143945Zgr.png" alt="" border="0" /><br />
现在要做的很简单，就是把图导出为PNG，然后在上面做一番修整。当然了，不要修的出格了，要保证图片里面的文本框还是差不多那么大。<br />
导出的时候注意了，我们要绝对的黑白图，不要带着任何调色板出来。你用其它图片查看器打开导出的图片，一定要是黑白的。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143945ucm.png" alt="" border="0" /><br />
因为我对那个文本框本身没啥看法，所以就不改形状了，只当是改过了……<br />
现在我们导入。<br />
导入的时候要睁大眼睛了，不要将调色板导入进去，仅仅勾选修复指针、导入图像和那个提示重定向的勾。<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/14394646P.png" alt="" border="0" /><br />
这里关键终于到了，该去改调色板了。<br />
这种图片的调色板通常和图片一样，是经过LZ77压缩的，我们如何查找、修改呢？<br />
首先，明确一个概念：ROM里压缩的东西，在GBA内存当中一定会解压成原始数据。<br />
那么我们现在打开内存查看器，来到调色板所在的内存区（如何做的？请看前面文章）：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/1439463Za.png" alt="" border="0" /><br />
我们导出调色板。注意了，因为没有专门了解过LZ77压缩，所以我只是导出了需要用到的那一行调色板而已，也就是长度达到FF左右的数据（从0&#215;05000000到0x050000FF）。（但经观察，即便你多压缩一段东西，前面的压缩过的不会变，还是那样，只是后面续了一段而已……）<br />
现在拿出老妖的那个工具，选择内置算法，将我们导出的内存数据进行压缩。<br />
压缩过后，理论上来说，和ROM里压缩过的就差不多了（为什么说差不多？你自己试试，然后再看看就知道了）。<br />
现在再打开WinHex，在ROM里搜索这段压缩后的代码。<br />
但，一般地，要去掉压缩生成的头，并且仅搜索其中的一小段。如图：<br />
<img src="http://www.poketb.com/wp-content/uploads/auto_save_image/2011/08/143947uHR.png" alt="" width="796" border="0" /><br />
搜索到唯一结果时，你拿到的便是压缩后的调色板地址。</p>
<p>这个地址一般也不怎么好处理，所以再度拿出APE来～方法和前面一样滴<br />
APE这工具有不少毛病，其中有这么三个：<br />
1、你必须精准的将搜索地址输入为某行调色板起始地址，否则可能会搜到假的、错的<br />
2、即便是对于压缩调色板，也不是一定就要勾选压缩那个勾——确认你不会错过任何有用的<br />
3、绝对不要期望“按调色板搜索”能找到什么，我试了，什么都找不到- -</p>
<p>那么如何处理，或者说搜到的可能性更大呢？<br />
1、多试试不同的调色板起始地址，哪怕多偏移一点<br />
2、压缩那个选项勾或不勾都试试<br />
3、替我想到一个更好的工具？<br />
搜到正确的调色板后，恭喜，你可以改了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.poketb.com/828.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

