• 3. 关于精灵赠送

    2008-02-03

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/liuyanghejerry-logs/14892522.html

    3. 关于精灵赠送
    相信这个章节应该是大家最期盼的了吧?精灵赠送在游戏中总是让人感到无比兴奋,现在我们就来进入这一环节.
    在本章节中,我们需要3个放置于地上或者桌子上的精灵球,但如何构造并不是我们现阶段要讨论的问题.
    来构想这样一个情景:
    1. 首先你激活了一个精灵球.
    2. 然后系统就会告诉你里面是个什么精灵,并询问你是否要.
    3. 如果你回答否,那么精灵球仍旧在那里放着
    4. 如果你回答是,那么这只精灵就属于你了,同时系统问你是否想给它起个昵称.
    5. 当然,如果你已经有了第一只精灵,那么系统会显示另外一段话来回绝你.
    以上的情景很熟悉吧?这就是火红/叶绿开始的情节,我们每个玩家都曾经历过,不过我们也应该注意到,以上的情节中存在着两个脚本.

    3.1 让精灵消失
    先不要误会,这里的"让精灵消失"并不是指让你已经拥有的精灵丢失,而是指你在得到精灵球中精灵的同时,地图上的那个精灵球也要消失的过程.这个过程远比得到精灵重要,同时,这种使得精灵球从地图上消失的技巧也可以用在NPC或者其它物品上.
    那么这如何做到呢?
    打开Advanced map,在EVENT页面选中任意一个人物,然后在右侧的边栏中找到People ID一项.还记得前面说的标识吗?这里的People ID就是系统内置的标识,如果我们要告诉系统这个事件已经发生过了,那么只要使用Setflag加上0x再加People ID就可以让人物消失了!这时系统会自动刷新屏幕.但是,必须在Setflag命令结束之后再加一个release命令,否则会发生意外!
    如果把以上的内容镶嵌到物品赠与的脚本中,就要参照这个格式:
    #ORG $begin
    lock
    faceplayer
    checkflag 0x200
    if B_true goto $done
    message $aidtalk
    boxset 6
    giveitem 0xD 1
    setflag 0x200
    release
    end

    3.2 给予精灵的情形处理
    现在一切都准备停当了,我们写下精灵给予的脚本:
    #org $StartChik
    checkflag 0x800
    if B_True goto $NoBall
    message $Chick
    $Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $PutBack
    以上的部分和物品赠与完全相同,不过现在我们要添加两条命令了:一条是Jingle,Jingle就是得到物品后的声音;而另一条命令我们来看下面:
    givepokemon 152 5 0
    jingle
    message $GotChick
    $GotChick 1 = You Recieved a Chikorita
    boxset 6
    对了,就是givepokemon命令,这个命令含有3个参数,它们依次为:编号、等级、携带物品,需要说明的是,编号参数和全国图鉴略有不同,它有一共411个值可供选择,至于为什么这里暂不解释;而物品的编号则需参照文末即将提供的一份文本列表,这和之前物品赠与的规则是一样的;而等级参数就写作10进制的数字就好,不过一定要靠谱.
    现在来看看接下来发生的事:


    3.3 给精灵起个昵称
    给精灵起昵称的过程并不复杂,我们像往常一样:
    message $NameChick
    $NameChick 1 = Would You like to give Chikorita a name?
    boxset 5
    compare LASTRESULT 1
    if b_False goto $GiveDex
    Namepokemon
    瞧,Namepokemon什么参数也没有!是的,Namepokemon命令只是触发了系统的命名功能,而具体的事情并不由我们来完成.但是为了告诉系统,我们已经命名,必须在其后写一个设立标识的语句,如下:
    #org $StartChik
    checkflag 0x800
    if B_True goto $NoBall
    message $Chick
    $Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $PutBack
    givepokemon 152 5 0
    jingle
    message $GotChick
    $GotChick 1 = You Recieved a Chikorita
    boxset 6
    message $NameChick
    $NameChick 1 = Would You like to give Chikorita a name?
    boxset 5
    compare LASTRESULT 1
    if b_False goto $GiveDex
    Namepokemon
    setflag 0x203
    goto $GiveDex
    最后的goto命令无条件的跳转到了下一个环节:


    3.4 让图鉴工作起来
    事实上无论你获得或者捕捉到什么精灵,图鉴总会立即更新,但如果你还没有图鉴呢?那么游戏会变得很奇怪并且容易出错.
    因此如果这是你改版的第一个脚本,我们得加上:
    setflag 0x800
    setflag 0x801
    事实上,标识0x800使菜单中出现"精灵"这一项,而标识0x801才是打开图鉴的标志,但是很显然,二者都不可缺少.因此完整的脚本如下:
    #org $StartChik
    checkflag 0x800
    if B_True goto $NoBall
    message $Chick
    $Chick 1 = Chikorita!\lThe Fire Bird.\pTake the Chikorita?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $PutBack
    givepokemon 152 5 0
    jingle
    message $GotChick
    $GotChick 1 = You Recieved a Chikorita
    boxset 6
    message $NameChick
    $NameChick 1 = Would You like to give Chikorita a name?
    boxset 5
    compare LASTRESULT 1
    if b_False goto $GiveDex
    Namepokemon
    setflag 0x203
    goto $GiveDex

    #org $StartShrew
    checkflag 0x800
    if B_True goto $NoBall
    message $Shrew
    $Shrew 1 = SandShrew!\lDesert Mole.\pTake the Sandshrew?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $PutBack
    givepokemon 27 5 0
    jingle
    message $GotChick
    $GotShrew 1 = You Recieved a Sandshrew
    boxset 6
    message $NameShrew
    $NameShrew 1 = Would You like to give Sandshrew a name?
    boxset 5
    compare LASTRESULT 1
    if b_False goto $GiveDex
    Namepokemon
    setflag 0x204
    goto $GiveDex

    #org $StartWing
    checkflag 0x800
    if B_True goto $NoBall
    message $Chick
    $Wing 1 = Wingull!\lThe Ocean Bird.\pTake the Wingull?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $PutBack
    givepokemon 152 5 0
    jingle
    message $GotGull
    $GotGull 1 = You Recieved a Wingull
    boxset 6
    message $NameGull
    $NameGull 1 = Would You like to give Wingull a name?
    boxset 5
    compare LASTRESULT 1
    if b_False goto $GiveDex
    Namepokemon
    setflag 0x205
    goto $GiveDex

    #org $GiveDex
    setflag 0x800
    setflag 0x801
    message $Pokedex
    $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!
    boxset 6
    jingle
    message $GotDex
    $Gotdex 1 = You got the Pokedex!
    boxset 6
    end

    #org $PutBack
    message $PutBack
    $PutBack 1 = You put the pokeball back.
    boxset 6
    end

    #org $NoBall
    message $Lastball
    $Lastball 1 = You already have your pokemon.\nDont be so greedy!
    boxset 6

    注意,以上的脚本是专为"选择初始精灵"而准备的,如果是其它情形,则脚本还可以更简单.
    L:大家仔细看脚本可以发现,其实激活图鉴是在获得精灵之后的,这显然不符合逻辑,有没有更好的写法呢?大家可以试试把goto $GiveDex提前,看看会出现什么结果.


    3.5 统计精灵
    统计精灵其实只是为了进行一次确认──确认在得到精灵时队伍是否已满.通常我们必须这么做,否则一旦向满队伍中增加精灵,数据就会溢出.
    countpokemon
    compare LASTRESULT 6
    if b_True goto $FullParty
    以上就是一个绝好的countpokemon命令例子.但countpokemon并不是只有这一处用武之地,它还可以:
    限制至少有一只精灵才能进入
    compare LASTRESULT 1
    if b_>> goto $EnterRoom
    限制至少有两只精灵才能战斗
    compare LASTRESULT 2
    if b_!= goto $DualBattle
    携带3只以上的精灵不能进入
    compare LASTRESULT 3
    if b_<= goto $EnterBattle
    还有很多其它用法.

    3.6 选择精灵
    选择精灵这个命令很少出现,唯一记忆清晰的就是在重命名的时候会用到,示例如下:
    #org $GivePoke
    message $ChangeName
    $WantPoke 1 = Hi! I'm the Name Rater\pI Rate pokemons name and\nallow people to change them.\pWould you like to rate the name of\lyour pokemon?
    boxset 5
    compare LASTRESULT 1
    if B_False goto $Later
    selectpokemon
    message $NamePoke
    $NamePoke 1 = Alright, what name shall we give it?
    boxset 6
    Namepokemon
    message $MuchBetter
    $MuchBetter 1 = You're right.\lThat's a much better name.
    boxset 6
    end

    #org $Later
    message $Banter
    $Banter 1 = Ok.\lLet me know if you change your mind?
    boxset 6
    end

    OK,关于精灵赠与部分的讲解到此就算结束了.

    分享到: