铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 54|回复: 1

仙剑的脚本

[复制链接]
发表于 2009-6-25 17:08 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
仙剑的脚本主要似乎是战斗控制的。当然在当时没有脚本语言,也是类似金庸的16进制构成的脚本。

@ffff: 显示对话 MessageID
' ':单引号对中的内容以红色显示   1A
- -: 减号对中的内容以青色文本显示 8D
" ":双引号对中的内容以黄色显示   2D
(:表情,汗滴
):表情,爱心
~n:对话自动中断,不须按空格。n为文字显示完毕后,等待的时间
$n:文字显示速度,n越大,显示越慢(影响之后的所有文字显示,直至遇另一个$n或重新游戏而改变)
自动脚本无
@0000: 停止执行
独占脚本特别注意:0000处的整条0000指令,其作用为立刻停止执行;其他任何处的整条0000指令,副作用为将调用指令修改为0008脚本要修改到的地址。
这就有一个问题,许多脚本都是不成功就跳转到0000的;结果顺便就把脚本流定在0000处,从此无效了。七大毒蛊就是吃了这个亏。暂定名0000bug。
任何涉及跳转的独占脚本——不包括战斗脚本,它们的战时控制流是拔出来另算的——理论上都受此bug影响。
自动脚本均为立刻自动执行。
@0001: 停止执行,将调用地址替换为下一条命令
自动脚本无;实现了一下试试,发现根本就无需有也能处理。
@0002: 停止执行,将调用地址替换为 ScriptID Int16 ;NewScript Count(continues after Count replacements are made, 0=always replace)
@0003: 跳转 ScriptID Int16 ;Script Count
自动脚本处理到跳转的第一条 独占脚本有实现,但还好没有跳到0000的,建议非战斗独占脚本在原引擎下不要这么用。
@0004: 调用 ScriptID ObjectID;Script 调用者 未指定则为当前对象 脚本重入
自动脚本处理完整个调用
@0005: 清屏 Int16 Int16 Boolean ;写屏方式? 延迟 若当前不在地图层,还原到地图层;否则重新生成画面,若参3非0,还要事先更新角色信息
自动脚本无
@0006: 几率继续 Int16 ScriptID
自动脚本处理到跳转处(若跳转)
两个实现均0000bug免疫,作了特殊处理
@0007: 开战 EnemyTeamID ScriptID ScriptID ;EnemyTeam DefeatScript EscapeScript
自动脚本无
@0008: 将调用地址替换为下一条命令
自动脚本无
@0009: 空闲N循环 Int16 Boolean Boolean;Time 是否触发事件 是否更新进主角步伐表格。
独占脚本利用这N循环执行自动脚本;自动脚本则N循环啥都不干。
@000a: 选是则跳转 ScriptID
自动脚本无
0000bug候选,但无0000调用

@000b: 本对象向西行
@000c: 本对象向北行
@000d: 本对象向东行
@000e: 本对象向南行
@000f: 本对象转向 DirectionID Int16 ;Direction Frame 方向为负时跳过方向的设置
@0010: 本对象走到 Int16 Int16 Int16 ; XBlock YBlock HalfBlock, no edge check 速度3
@0011: 本对象互斥慢速走到 Int16 Int16 Int16 ; XBlock YBlock HalfBlock, no edge check 速度2
以上2指令不到目的地不执行下一条,重复执行本条,但本次执行终止。
@0012: 相对移动对象 ObjectID Int16 Int16;
@0013: 绝对移动对象 ObjectID Int16 Int16;
@0014: 本对象置帧 Int16
@0015: 设置队员方向和帧 DirectionID Int16 TeamMemberID ;Direction Frame# TeamMember
@0016: 设置对象动作 ObjectID DirectionID Int16 ; Object #WalkingFramesPerDirection CurrentFrame
ObjectID==0->啥都不干,<0->当前对象,在当前图内图内设置,不在绝对设置。
@0017: 设置部位属性 BodyPartID AttributeID Int16
@0018: 装备 BodyPartID WordID
@0019: 增加属性 AttributeID Int16 CharacterID ; 这里若ID<=0,则为当前对象
@001a: 设置属性 AttributeID Int16 CharacterID;属性 数值(战时情况下修改战像和合体法术直接修改战时数据结构) 人员/0->战时
@001b: HP回复 Boolean Int16
@001c: MP回复 Boolean Int16
@001d: HPMP回复 Boolean Int16 Int16 ;ApplyToAll HPMP MP(if specified, arg2 becomes HP)
EXE中arg3根本未实现,只能HMP同增。
@001e: 增加金钱 Int16 ScriptID ;Amount InsufficientMoneyScript
@001f: 获得道具 WordID Int16 ;Item Quantity 0同1
@0020: 用去道具 WordID Int16 ScriptID ;Item Quantity InsufficientScript
包括装备中道具,若实在不够,按队伍序往下拆。
@0021: 伤敌 Boolean Int16
@0022: 我方复活 Boolean Int16 ;ApplyToAll 复活清空毒、状态,状态残余回合数>999则不变
@0023: 卸下装备 Int16 BodyPartID ;队伍第x人 BodyArmorPart (0 = all)
@0024: 设置对象自动脚本 ObjectID ScriptID ; 参见脚本16
@0025: 设置对象触发脚本 ObjectID ScriptID ; 同上
@0026: 启动店铺 ShopID ;
@0027: 启动当铺 ;
@0028: 对敌下毒 Boolean WordID ;ApplyToAll Poison 巫抗随机判断
似乎蛊术没有对应的蛊物副作用?毒脚本重入
@0029: 对我下毒 Boolean WordID ;ApplyToAll Poison 毒抗随机判断.
此处我方毒抗相当于敌方巫抗.那敌方毒抗捏?……毒脚本重入
@002a: 敌方毒愈 Boolean WordID ;ApplyToAll Poison
@002b: 我方毒愈 Boolean WordID ;ApplyToAll Poison
@002c: 我方弱毒治愈 Boolean Int16 ;ApplyToAll PoisonLevel
@002d: 设置我方状态 ConditionID Int16;          Condition Rounds
傀儡状态特殊设置——检测死未。不良状态若尚未终结就不设置;良好状态则设置到当前与欲设者之长者。
@002e: 设置敌方状态 ConditionID Int16 ScriptID ;Condition Rounds FailureScript
貌似只有不良状态;有巫抗随机判定。
@002f: 我方消除状态 ConditionID
@0030: 属性百分比增长 AttributeID Int16 Int16;Attribute PercentageChange Character
若参三指定,则为队中该人。存储在额外位置。
@0031: 本队员改变形象 BattleSpriteID
仅改变参数,重绘由例行函数执行。
0032: 战时/平时分派 ScriptID ScriptID ; LOST SCRIPT!!!
调用时为战时执行前者,平时执行后者。
@0033: 灵壶收妖 ScriptID ;FailureScript
@0034: 灵壶炼丹 ScriptID ;InsufficientEnergyScript
清空……经验值?……写错地方了吧?
@0035: 震动屏幕 Int16 Int16 ;Time Grade?
前者震荡次数(奇数时震屏,许多函数都会调用,所以具体代表时间不明),后者为震荡行数。
@0036: 设置动画 MovieID
@0037: 播放动画帧 Int16 Int16 Int16 ;StartFrame StopFrame(0=play all) Speed
@0038: 土遁 ScriptID ;FailureScript
离开迷宫脚本是重入的;失败的话则直接把下一个执行的脚本设为失败脚本。凡失败/不足脚本均如此。
@0039: 吸收HP Int16 ;Amount 可敌对我亦可我对敌。敌无HP上限。
@003a: 非BOSS战逃跑 ScriptID ;FailureScript
@003b: 中间显示 Int16 ; 字体颜色
@003c: 上部显示 FaceID Int16 Int16 ; 人物 字体颜色 IsPlayingMovie 若无人物,字靠左;有的话往右挪。若3=ffff(动画),先备份屏幕。
@003d: 下部显示 FaceID Int16 Int16 ; 人物 字体颜色 IsPlayingMovie 同上
@003e: 框架显示 Int16 ; 字体颜色
@003f: 乘物低速驶到 Int16 Int16 Int16 ; XYH;调用方式同10,11;随驾驶者移动视角;检测事件触发;不到目的地本脚本不停止执行。
@0040: 设置对象触发方式 ObjectID TriggerMethodID ;Object TriggerMethod 参见脚本16
@0041: 术法无效 ; 仙术前序脚本失败,不再执行下去
@0042: 我方使用法术 WordID Int16 Int16 ;仙术 基本伤害 敌人序号(若为0或>5则为隐含,若<0则任选)
@0043: 背景音乐 MusicID Int16 ; 音乐号 次数
@0044: 乘物中速行至 Int16 Int16 Int16 ; 参见3f。
@0045: 设置战斗音乐 MusicID ;Music
@0046: 设置队员块位置 Int16 Int16 Int16 ; XBlock YBlock HalfBlock 设置了一大堆相关数据结构……
@0047: 播放音效 Int16
0048: 音效相关... ; LOST SCRIPT!!!问题是没弄明白干吗……
@0049: 设置对象状态 ObjectID StatusID ; 2=hero cannot walk over 参见16
@004a: 设置战场环境 PictureID ;BattleField
@004b: 我方逃跑后僵直 Int16 ; 默认……10毫秒
@004c: 本对象追向主角 Int16 Int16 Int16 ;警戒范围默认8 追及速度默认4 Boolean
不进入警戒范围时,敌进行与我坐标不同的方向的随机运动。复杂,未看完
@004d: 等待击键
@004e: 调入最后存档
@004f: 全屏泛红 Int16 ; 若<=0全屏像素&=0xf|=0x10即泛红;若>0当前半球色彩全部覆盖为x--x+24色彩。
@0050: 淡出 Boolean; 快速
@0051: 淡入 Boolean; 快速
@0052: 本对象匿迹 Int16 ;VanishTime
@0053: 下次切换调色板变成日间
@0054: 下次切换调色板变成夜间
@0055: 习得仙术 WordID CharacterID ;0则当前队员 不作显示
@0056: 丧失仙术 WordID CharacterID ;0则当前队员
@0057: 多倍MP设为基本伤害 WordID Int16 ; 仙术 倍数 0则为8
@0058: 物品不够则跳转 WordID Int16 ScriptID ;Item Quantity 0则1 Script
0000bug候选,但无0000调用
@0059: 转到场景 SceneID
凡是这类复杂指令——可能触发大量脚本重入者,都是设置好下次循环再调入的标志。根据敌人追逐回合,游戏主循环大概是10hz。
@005a: 本队员血减半 ; 仅用于无影毒
@005b: 该敌人受限血减半 UInt16 ; 减血上限
@005c: 我方隐形 Int16 ;Rounds 至少一回合
@005d: 若该队员未中此毒则跳转 WordID ScriptID
0000bug候选,但无0000调用
@005e: 若该敌人未中此毒则跳转 WordID ScriptID
0000bug出现过
@005f: 我方阵亡
@0060: 敌方阵亡
@0061: 若该队员未中毒则跳转 ScriptID
0000bug候选,但无0000调用
@0062: 敌人停止追逐感应 Int16 ;Time
@0063: 敌人追逐感应倍增 Int16 ;Time
@0064: 若该敌HP高于该比例则跳转 Int16 ScriptID ; Percent至少是1% Script
0000bug候选,但无0000调用
@0065: 设置队员形象 TeamMemberID SpriteID Boolean ;TeamMember Sprite Immediate 若不在战斗中,判断这个参数以决定是否立刻设置。
@0066: 投掷武器 WordID Int16 ;模拟法术 BaseDamage 武*int(rnd(4))+基本伤害存入arg2,然后执行模拟法术。
@0067: 敌方使用法术 WordID Int16 ; 法 施术频率 敌只有一个法术位,每次该脚本改变之。频率同,默认100%。
ffff为啥都不干,0为普攻。
@0068: 目标若为我方则跳转 ScriptID
0000bug出现过
@0069: 敌人逃跑 Boolean ;ApplyToAll 100%成功
@006a: 偷窃 Int16 ; 成功概率 若是钱(0),每次只能偷到当前值/(2+rnd(1));物品则只能偷到一个。
@006b: 吹开敌人 Int16 ;Amount
@006c: 对象一步走到 ObjectID Int16 Int16 ; Object XOffset YOffset, 使用NPC走动函数
@006d: 设置场景脚本 SceneID ScriptID ScriptID ;SceneID EnterScript LeaveScript
@006e: 主角一步走到 Int16 Int16 Int16 ;XOffset YOffset 图层?
@006f: 与指定对象同步指定状态 ObjectID StatusID; 同步状态;两扇门之间。
@0070: 主角走到 Int16 Int16 Int16 ;XBlock YBlock HalfBlock 速度2
其后因不小心删掉了原文件,所以对实现的评点丢掉了。
@0071: 画面晃动 Int16 Int16 ; 晃动层次 步进        小到0,大到256消失
0072: 更换对象形象 ObjectID Int16 Boolean;(0则当前) mgo号 是否重建mgo映像 LOST SCRIPT!!!
@0073: 泛金消散 Int16 Int16 ; 每次消散耗时 消散次数
@0074: 我方有损耗则跳转 ScriptID ; 实现上混淆了队员与成员
0000bug候选,但无0000调用
@0075: 组队 CharacterID CharacterID CharacterID
@0076: 显示图片 PictureID Int16 ;Picture 等待时间
@0077: 停止音乐 Int Boolean ; fade?(求测***) 是0则停止CD
@0078: 战后返回地图
@0079: 若队中有主角则跳转 WordID ScriptID ;TeamMemberRoleID Script
0000bug候选,但无0000调用
@007a: 主角稍快走到 Int16 Int16 Int16 ;X Y Half 速度4
@007b: 主角迅速走到 Int16 Int16 Int16 ;X Y Half 速度8
@007c: 本对象互斥走到 Int16 Int16 Int16 ; XBlock YBlock HalfBlock, no edge check 速度4
@007d: 对象移动到 ObjectID Int16 Int16 ; Object XOffset YOffset
@007e: 设置对象所在层 ObjectID Int16 ; Object Layer
@007f: 移动视线 Int16 Int16 Int16 ; X Y Times 若=ffff则XY为绝对块,>0则XY为相对像素,本身为循环次数。
@0080: 日夜切换 Boolean ;(false=低速, true=高速)
@0081: 若活动对象不在目视指定范围内则跳转 ObjectID Int16 ScriptID ; Object 工作距离.*32+10像素vs.dist(当前目视位置,对象位置) Script 要求对象状态在1以上。
0000bug候选,但无0000调用
@0082: 本对象跑到 Int16 Int16 Int16 ;XBlock YBlock HalfBlock
@0083: 若对象不在指定范围内则跳转 ObjectID Int16 ScriptID ;ObjectSprite MaxOffset FailureScript
0000bug候选,调用方式不存在此问题
@0084: 放置对象 ObjectID TriggerMethodID ScriptID ;Object TriggerMethod FailureScript若无则不进行障碍检测
@0085: 等待 Int16
@0086: 若装备着的该道具少于指定数量则跳转 WordID Int16 ScriptID ; InventoryItem 装备数 Script
0000bug候选,但无0000调用
@0087: 本对象原地漫步
@0088: 耗费钱数设为基本伤害 WordID ; 法术 默认用5000/2.5,不够用剩下的钱/2.5设
@0089: 结束战斗 BattleResultID;
@008a: 下一战自动战斗
@008b: 更换调色板 PaletteID ;
@008c: 向指定色彩淡入 Int16 Int16 Boolean ;颜色号.这之后的三个颜色将覆盖整个调色板. 每次淡入等待时间 是则反转淡入
淡入0x3F次。
@008d: 修行提升 Int16 ; 升级数据随机。
@008e: 还原屏幕 ; 可以清掉所有文字对话框等等
@008f: 金钱减半
@0090: 设置RPG元素脚本 WordID ScriptID Int16;EnemyName 脚本 脚本类型
@0091: 若调用之敌在队中不唯一则跳转 scriptID;
0000bug候选,但无0000调用
@0092: 觉醒 CharacterID ;其实就是一个施法动作。
@0093: 淡入淡出 Int16;速度;正数时淡入,负数时淡出
@0094: 若对象为指定状态则跳转 ObjectID StatusID ScriptID
0000bug候选,但无0000调用
@0095: 若在该场景则跳转 SceneID ScriptID
0000bug候选,但无0000调用
@0096: 决死行
@0097: 乘物高速行至 Int16 Int16 Int16 ;速度8
@0098: 跟随人等 SpriteID SpriteID
@0099: 改变场景对应地图 SceneID Int16;场景号 地图号 若场景号<0,即为当前场景。
@009a: 设置对象序列状态 ObjectID ObjectID StatusID ;ObjFirst ObjLast ActivationState
@009b: 淡入到当前图景 Int16 PictureID Int16 ; 方式:0重绘1直接2淡入 ffff则生成 若淡入为分割
@009c: 若敌方分身失败则跳转 Int16 ScriptID; 分身数量0=1 失败脚本 HP+参1等分(HP>1方可),只有只剩下该敌人自己时方可分身
0000bug免疫,作了特殊处理
009d: 若敌方复活失败则跳转 Int16 ScriptID ; 0则全部复活,否则1个 不许超过Team中规定的个数。LOST SCRIPT!!!
0000bug免疫,作了特殊处理
@009e: 若敌方召唤失败则跳转 WordID Int16 ScriptID;EnemyType<=0召唤同类 Number至少召唤一个 不许超过Team中规定的个数。
0000bug免疫,作了特殊处理
@009f: 敌方变身 WordID
@00a0: 退出游戏
@00a1: 更新我方位置及步伐 ; 主要用在程序行走方面,以免后来者找不着北……
@00a2: 以下N句随机跳转 Int16;
@00a3: 播放CD音轨 CDID MusicID Boolean;音轨号 等价RIX/MIDI号 未知
@00a4: 卷动图片 PictureID SpriteID Int16 ;Picture <=0不调入 Speed
@00a5: 淡入图片 PictureID SpriteID Int16 ;
@00a6: 以当前屏幕为底

继承98版新增:
00a7: 物品说明

移植版新增:
00a8: 设置相对跳转基地址 UInt16 ;
对高于0xFFFF的脚本,用这条自行设定跳转基地址,原有脚本跳转类均处理为相对跳转。
约定:对高于0xFFFF的脚本段必须在最后一条指令前将基地址设置为0以保证原脚本正常工作。

[发帖际遇]: weyl在海边沙滩上捡到一支圣火令,当废铜卖了,获得银两9.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-6-27 12:07 | 显示全部楼层
@ffff: 显示对话 MessageID
' ':单引号对中的内容以红色显示   1A
- -: 减号对中的内容以青色文本显示 8D
" ":双引号对中的内容以黄色显示   2D
(:表情,汗滴
):表情,爱心
~n:对话自动中断,不须按空格。n为文字显示完毕后,等待的时间
$n:文字显示速度,n越大,显示越慢(影响之后的所有文字显示,直至遇另一个$n或重新游戏而改变)
自动脚本无




怎么那么像某大师写得某对话指令

[发帖际遇]: KG挺身而出,阻止萧峰打“段正淳”,成功挽救阿朱,得到奖励银两2.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2026-8-17 04:19

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表