幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2384|回复: 9

[NS] [原创]NS简单卡片战斗脚本-三属性

[复制链接]

17

主题

179

帖子

2084

积分

⑥精研

积分
2084
发表于 2006-8-16 16:21:54 | 显示全部楼层 |阅读模式
这些天每天做一点,终于圆满了。虽然N次没有通过学校C语言考试,但幸运的是NS比C语言简单。
因为没有事前研究学习,不断修改程序中用错指令而出现的BUG实在是让我非常Orz
在此感谢热心教导我使用文字加法以及安排桌面按钮的CountD大人……

这是一个非常简陋的脚本,在此基础上可以慢慢丰富。

机器目前有中毒嫌疑,就不打包图片了,这些图片很简单,随手画一套放到pic文件夹即可
背景图800X600的一张:battle.jpg
纸牌图100X150的十五张:
heal10.jpg~heal50.jpg
ma10.jpg~ma50.jpg
phys10.jpg~phys50.jpg
(每套图片按钮的文件名数字部分都是10、20、30、40、50)

纸牌战斗的关键课题是:随机生成牌面、按钮的设置 以及 伤害循环计算

随机生成牌面的重点是:利用rnd对类型、面值各自随机分配,参见*setcard
将类型和面值直接对应到图片地址使用了文字变数加法。

按钮的重点是:输出当前属性-生成新牌面-记录新属性,参见*sendcard1~7

伤害循环计算部分没什么难点,因为敌人的纸牌用户不可见,所以就使用了临时抽出一张用一张的方式。

注:此程序中添加了浮动变量%451,但是为了测试双方数值输出是否正常而关闭
程序中添加的文字显示部分是为了测试时监视战斗状况,留有半角rp的安全隐患。

程序代码:

;mode800
*define
defsub setcard
defsub sendcard1
defsub sendcard2
defsub sendcard3
defsub sendcard4
defsub sendcard5
defsub sendcard6
defsub sendcard7

game
;==============================================
;###此程序中使用的变量注解-可能不全###

;%0 按钮专用变量
;%100 类型抽签用(%101备用)
;%102记载抽到的类型
;%103面值抽签用
;%104记载抽到的面值

;$100图片地址前缀
;$101牌的面值转为文字
;$102生成的图片地址

;%111-417桌面上七张纸牌的面值
;$111-417桌面上七张纸牌的类型
;%141我方当前出牌面值
;$141我方当前出牌类型
;$142我方上一次出牌类型
;$144敌方上一次出牌类型
;%126我方连锁数目
;%136敌方连锁数目

;%121,%131记录我方和敌方的初始HP值

;%151增加的纸牌随机浮动值(0~9)

;需要事先给定的:
;%122我方HP
;%123我方物理防御
;%124我方魔法防御
;%132敌方HP
;%133敌方物理防御
;%134敌方魔法防御

;==============================================
*setcard
rnd %100,10                ;在11个数中生成随机数。
if %100<1 mov %102,3            ;1/11的概率是类型3,回复类型
if %100<=5 && %100>0 mov %102,2        ;5/11的概率是魔法
if %100>5 mov %102,1            ;5/11的概率是物理

if %102=1 rnd %103,4:mov $100,"phys"    ;物理类型下随机生成面值5种并且指定纸牌文字类型为phys
if %102=2 rnd %103,4:mov $100,"ma"    ;参考上一条,文字类型为ma
if %102=3 rnd %103,4:mov $100,"heal"    ;文字类型为heal

if %103=0 mov %104,10:mov $101,"10"    ;纸牌的面值为10,在图片文件名中对应的数字部分为10
if %103=1 mov %104,20:mov $101,"20"
if %103=2 mov %104,30:mov $101,"30"
if %103=3 mov %104,40:mov $101,"40"
if %103=4 mov %104,50:mov $101,"50"
mov $102,":c;pic\"
add $102,$100
add $102,$101
add $102,".jpg"                ;文字变量加法,计算图片的最终路径
return

*sendcard1                ;使用此按钮
mov $141,$111                ;输出类型到战斗当前牌$141
mov %141,%111                ;输出面值到战斗当前牌%141
setcard                    ;重置卡片
lsp 1,$102,35,415
mov $111,$100
mov %111,%104                ;重新记录此位置的卡片参数
return

*sendcard2
mov $141,$112               
mov %141,%112               
setcard
lsp 2,$102,140,415
mov $112,$100
mov %112,%104            
return                    

*sendcard3
mov $141,$113               
mov %141,%113
setcard
lsp 3,$102,245,415
mov $113,$100
mov %113,%104
return   

*sendcard4
mov $141,$114            
mov %141,%114            
setcard
lsp 4,$102,350,415
mov $114,$100
mov %114,%104        
return   

*sendcard5
mov $141,$115               
mov %141,%115               
setcard
lsp 5,$102,455,415
mov $115,$100
mov %115,%104        
return   

*sendcard6
mov $141,$116            
mov %141,%116            
setcard
lsp 6,$102,560,415
mov $116,$100
mov %116,%104            
return   

*sendcard7
mov $141,$117               
mov %141,%117               
setcard
lsp 7,$102,665,415
mov $117,$100
mov %117,%104            
return   


;============================
*start

;下面是战斗开始前给定的数值
mov %122,200    ;我方HP
mov %132,200    ;敌方HP
mov %123,0    ;我方物理防御
mov %124,0    ;我方魔法防御
mov %133,0    ;敌方物理防御
mov %134,0    ;敌方魔法防御

*battle
bg ":c;pic\battle.jpg",10,500
setcard
lsp 1,$102,35,415
mov $111,$100
mov %111,%104
setcard
lsp 2,$102,140,415
mov $112,$100
mov %112,%104
setcard
lsp 3,$102,245,415
mov $113,$100
mov %113,%104
setcard
lsp 4,$102,350,415
mov $114,$100
mov%114,%104
setcard
lsp 5,$102,455,415
mov $115,$100
mov%115,%104
setcard
lsp 6,$102,560,415
mov $116,$100
mov%116,%104
setcard
lsp 7,$102,665,415
mov $117,$100
mov%117,%104
;发牌
btndef""
spbtn 1,1
spbtn 2,2
spbtn 3,3
spbtn 4,4
spbtn 5,5
spbtn 6,6
spbtn 7,7    ;转化对象1~7为按钮1~7

mov %121,%122    ;将初始HP记录到%121作参考,%122用来做战斗加减计算
mov %131,%132    ;%131为敌方HP初始值参考,%132用来计算
mov $142,"none"    ;我方使用的前一张纸牌类型
mov $144,"none"    ;敌方使用的前一张纸牌类型
mov %126,0    ;我方连锁数目
mov %136,0    ;敌方连锁数目

*myturn        ;我方的行动
if %122<=0 goto *fail    ;如果此时我方HP没有了,跳出到战斗失败,否则向下继续
btnwait2 %0
if %0<=0 goto *myturn
if %0=1 sendcard1
if %0=2 sendcard2
if %0=3 sendcard3
if %0=4 sendcard4
if %0=5 sendcard5
if %0=6 sendcard6
if %0=7 sendcard7

;我方已经从按钮的对应指令获得了当前卡片类型$141和面值%141
类型是$141面值是%141@

;rnd %151,9                ;计算附加浮动值(OFF)

if $141="phys" goto *physattack1    ;进入各自属性标签
if $141="ma" goto *maattack1
if $141="heal" goto *healbody1

*physattack1                ;我方的物理攻击
if $141=$142 inc %126            ;如果和上次类型相同,连续次数+1
if $141!=$142 mov $142,$141:mov %126,1    ;如果和上次类型不同,则读入新的类型,连续次数归0
mov %125,%141                ;读取面值
if %126=5 mul %125,3            ;连锁时攻击加倍
if %126=10 mul %125,6
add %125,%151                ;增加浮动值到伤害量
sub %125,%133                ;伤害量中扣去敌物理防御
if %125<0 mov %125,0            ;伤害低于防御值,则伤害等于0
sub %132,%125                ;计算敌血量
给敌人造成了%125物理伤害@
goto *enemyturn

*maattack1                ;我方的魔法攻击
if $141=$142 inc %126            
if $141!=$142 mov $142,$141:mov %126,1   
mov %125,%141               
if %126=5 mul %125,3   
if %126=10 mul %125,6
add %125,%151               
sub %125,%134                ;伤害量中扣去敌魔法防御
if %125<0 mov %125,0            
sub %132,%125
给敌人造成了%125魔法伤害@
goto *enemyturn

*healbody1
if $141=$142 inc %126
if $141!=$142 mov $142,$141:mov %126,1
mov %125,%141
if %126=5 mul %125,3
if %126=10 mul %125,6
add %125,%151                ;增加浮动值
add %122,%125                ;计算我方血量
if %122>%121 mov %122,%121        ;血量控制在初始值以下
自我治疗了%125点@
goto *enemyturn

*enemyturn                ;敌人的行动回合
if %132>0 setcard            ;如果敌的HP高于0,则敌方运行setcard获得卡片
if %132<=0 goto *win            ;如果敌人HP小于等于0,则跳到我方胜利

;敌人HP高于0,攻击开始,敌人抽出要使用的卡片,当前类型为$100,卡片面值为%104
;rnd %151,9                ;计算浮动量(已关闭)
mov $143,$100                ;抽到的牌的属性给当前牌
敌的卡片类型是$143面值是%104@
if $143="phys" goto *physattack2    ;进入属性战斗标签
if $143="ma" goto *maattack2
if $143="heal" goto *healbody2

*physattack2
if $143=$144 inc %136            ;如果和上次类型相同,连续次数+1
if $143!=$144 mov $144,$143:mov %136,1    ;如果和上次类型不同,连续次数归原点
mov %135,%104                ;读取面值
if %136=5 mul %135,3            ;连锁到5次时攻击力3倍
if %136=10 mul %135,6            ;连锁到10次时攻击力6倍
add %135,%151                ;增加附加值
sub %135,%123                ;伤害量中扣去物理防御
if %135<0 mov %135,0            ;伤害达不到我方防御时,伤害为0
sub %122,%135                ;计算我方剩余HP
受到敌人%135物理伤害\
goto *myturn

*maattack2
if $143=$144 inc %136
if $143!=$144 mov $144,$143:mov %136,1
mov %135,%104
if %136=5 mul %135,3
if %136=10 mul %135,6
add %135,%151
sub %135,%124
if %135<0 mov %135,0
sub %122,%135
受到敌人%135魔法伤害\
goto *myturn               

*healbody2
if $143=$144 inc %136
if $143!=$144 mov $144,$143:mov %136,1
mov %135,%104
if %136=5 mov mul %135,3
if %136=10 mul %135,6
add %135,%151
add %132,%135
if %132>%131 mov %132,%131        ;血量上限控制在初始值
敌人治疗了自己%135点\
goto *myturn


*fail
战斗失败@
goto *end
*win
战斗胜利@

*end
end
http://tiannamaker.blog.163.com 新换BLOG,勤快装修中
回复

使用道具 举报

60

主题

2331

帖子

120万

积分

荣誉群

SY强身,YY强国

积分
1209887
发表于 2006-8-17 16:51:19 | 显示全部楼层
观摩学习……
一直想实现的卡片战斗啊TOT

然后PS一下:貌似中毒影响不到图片吧……

突然想起来……HIT的算法和合击……(完全是想实现APO的战斗|||||||)
这样下来要用到好多变量啊OTL
(\\__/) (O.o ) (> < ) This is Bunny. 我也大学了,时间过得真快啊。
回复 支持 反对

使用道具 举报

17

主题

179

帖子

2084

积分

⑥精研

积分
2084
 楼主| 发表于 2006-8-17 18:31:00 | 显示全部楼层
有些老蠕虫会附着在图片上,不太常见但还是有。昨天晚上一查还真中标了,叫sxs.exe的木马病毒,不在图片上,在每个硬盘符下面,搞了半天手动修改注册表才删掉(这个病毒的唯一功能是让你不能查看隐藏文件Orz)。

反正这个“裸”的程序没有任何特效,放什么图上去都是一样难看的

我方的连续攻击计算还是比较省事,这个程序里有算,就是记录上次的类型,然后看看新来的类型是不是一样的,如果一样连续数+1,不一样就记录新类型并把连续数改为1。
然后连续数到达一定数值的时候就会发生合体,攻击力翻倍,也可以在这个时候导入相应的角色动作。

不过要想实现敌人的智能连续攻击就比较麻烦了,要给他发相应的牌(现在程序敌人的AI是0),让它按以上一次的类型为优先级参考选择出什么牌,如果没有同类型的再出别的牌(逻辑上倒也不是很难,就是使用变数的数量会比较多)

圣书有个特点是我方的两条血分开算的(记不太清楚了),可能也是让敌人随机选择攻击某个对象。这样我方garde牌的作用是把敌人的下一轮攻击中强行转接到自己身上,并且作为保护奖励攻击数值大幅削减。
合体和保护的时候应该是加入了图片,看着比较有效果

要想做成圣书那样的完成品的话,估计程序的内容会成倍地膨胀。
不过有了骨头,再来加肉的话前途还是很光明的。

变量多啊,写着写着自己就迷糊了。引用错了那是常事……
最后整理的时候研究为什么攻击数值如此不正常的时候迷惑了很久
中途还犯下数次企图用mov命令连续赋值的错误。
[s:5]

其实我大学作毕业设计的时候老师就给我们一个不知道叫什么的avg引擎,也是日本人写的。那个引擎能用的指令很少,因为它对画面的框架是限定死的,只能导入BMP文件,只能指定人物图片上的纯绿色为透明色,而且在叠加多个上层图片的时候会有bug。
相比之下现在的引擎真是灵活啊,NS也是,吉里吉里也是……

其实我本来是个美工
连我也能编出程序的引擎真是太神奇了
[s:5]
http://tiannamaker.blog.163.com 新换BLOG,勤快装修中
回复 支持 反对

使用道具 举报

60

主题

2331

帖子

120万

积分

荣誉群

SY强身,YY强国

积分
1209887
发表于 2006-8-18 07:33:04 | 显示全部楼层
引用第2楼tiannamaker2006-08-17 18:31发表的“”:
不过要想实现敌人的智能连续攻击就比较麻烦了,要给他发相应的牌(现在程序敌人的AI是0),让它按以上一次的类型为优先级参考选择出什么牌,如果没有同类型的再出别的牌(逻辑上倒也不是很难,就是使用变数的数量会比较多)

敌人的攻击……如果有个计算公式当然最好~
如果是两、三个人一起K BOSS,BOSS很容易就会被KO的,因为要实现我方的角色合击貌似需要我方所有角色一起出卡然后BOSS选择其中某个进行攻击(当然如果把BOSS的HP设置成主角的10倍想要GAMEOVER也不是没可能)……
感觉上还是根据属性写个公式比较好一点 [s:6] 您打俺吧俺只是想做同人……
不过大人说的很有道理撒~基本结构出来了,向里面填内容也方便的多。
PS ←这只是无限菜鸟……
变量觉得乱了就EXCEL列张表,其实OFFICE有的时候挺有用的= =
(\\__/) (O.o ) (> < ) This is Bunny. 我也大学了,时间过得真快啊。
回复 支持 反对

使用道具 举报

17

主题

179

帖子

2084

积分

⑥精研

积分
2084
 楼主| 发表于 2006-8-18 14:02:31 | 显示全部楼层
二打一的话对方的血比较多那也是正常的,不然一下就推倒没意思了。一般来说初始测试用的战斗难度低,做好之后再调节成难度高的。
话说圣书我就玩了一圈,还是两年多前的事情了……细节基本上都想不起来了,我昨天以为你说的合击就是个图片过场呢……
[s:7]
好像是一次选两张牌,自己一张同伴一张吧
那样的话自己方面多做一次按钮选择,而且要把生成新牌和攻击值计算往后挪
话说一次选两张牌要有按钮特效,不然看不到自己选了什么是很郁闷的

圣书的牌面属性比较多,某个人具有某个属性的话他的属性对应防御力就高,这个不复杂,每个人的属性是固定的,防御力应该也是固定的,这里增加属性类型是个比较机械的工作。
难点在圣书会按照属性将随机发出的牌的属性比例进行偏移。敌人是一个人还好说一一点,考虑到主角选定和不同的人出战的话,我方具有双属性,*setcard部分会加入庞大的变量套算,以决定rnd命令之后的分配问题。
其实偏移的出现和人物属性多是结果和原因的关系,界面上放牌的地方就那么几个,属性一多,大家的比例又一样的话,手里相同牌面的牌很少,连击的难度就加大了嘛。

我也是大菜鸟,我写完生成卡片之后,才发现自己连铺设按钮到桌面的指令该用哪个都不知道
[s:5]
http://tiannamaker.blog.163.com 新换BLOG,勤快装修中
回复 支持 反对

使用道具 举报

60

主题

2331

帖子

120万

积分

荣誉群

SY强身,YY强国

积分
1209887
发表于 2006-8-18 17:03:48 | 显示全部楼层
引用第4楼tiannamaker2006-08-18 14:02发表的“”:
二打一的话对方的血比较多那也是正常的,不然一下就推倒没意思了。一般来说初始测试用的战斗难度低,做好之后再调节成难度高的。
话说圣书我就玩了一圈,还是两年多前的事情了……细节基本上都想不起来了,我昨天以为你说的合击就是个图片过场呢……
[s:7]
好像是一次选两张牌,自己一张同伴一张吧
那样的话自己方面多做一次按钮选择,而且要把生成新牌和攻击值计算往后挪
.......


按钮特效没啥问题,倒是那个RND之后的分配........光是用想的就觉得好冷.......
然后再加上GUARD合击加好感之类(不过这个倒不是很麻烦)..........想华丽不容易啊~
看来战斗系统要专门用一只TXT.......

我前面说的是BOSS的攻击专门用一只计算公式啦^^
然后决定用100个变量专门做战斗........

最后~按钮?
LSP啊..........大人说的是这个意思么?
←我说过这只很白~
(\\__/) (O.o ) (> < ) This is Bunny. 我也大学了,时间过得真快啊。
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2006-8-19 16:58:56 | 显示全部楼层
[s:5] 圣书的卡片……曾经有想实现的愿望……后来懒了……
[s:5] 其实很多东西不用多写,用defsub写一次就可以重复用了。
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

24

主题

193

帖子

2239

积分

⑥精研

偶尔做次标题党

积分
2239
发表于 2006-8-20 01:24:42 | 显示全部楼层
我无话可说…
其实要实现卡片战斗可以修改游戏王的CGI,连编网络模块的工夫都省了。
人类只不过是由构成世界的最基本元素构成的构成世界的最基本元素之一而已……
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2006-8-20 18:16:33 | 显示全部楼层
楼上的在说啥……= =|||和NS有啥关系……
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

60

主题

2331

帖子

120万

积分

荣誉群

SY强身,YY强国

积分
1209887
发表于 2006-8-20 19:36:18 | 显示全部楼层
用YGO的CGI……OTL,那是网络............
以前也用过拉……不过此卡片战斗非彼卡片战斗也……
因为如果用NS做卡片可以无限量添加的卡片战斗……光是找个这样的美工就折腾S人啊||||||
(\\__/) (O.o ) (> < ) This is Bunny. 我也大学了,时间过得真快啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-25 22:38 , Processed in 0.027975 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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