幻想森林

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

[讨论][NScripter]《日西月东》等回想系统基本思路:各位,

[复制链接]

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2005-8-19 19:14:10 | 显示全部楼层 |阅读模式
记得刚接触那几段代码的时候,被那堆复杂的指令给蒙晕了(一半左右我不认识)……[em06]以致之后的N月里坚决不敢接触LOOKBACK系统。如今终于鼓起勇气抱着排除万难的心态……

却发现……我,上当了。

这个所谓的回想系统,基本思路:

用一个数字变量(%now_log)记录目前显示的文章是第几句,接着将这段文章代入对应的某一号文字变量($%now_log)存储起来。

当显示回顾的时候,则是将这些变量的每一个“切”成同等长度的字符串(最后一行不够则加空格),然后依照变量顺序显示出来。虽然稍微复杂了一点,但是不是多么了不起的思路。

问题则是,NS的变量是有限的。因而在过去的N月里我一直致力于寻找一个存储全部过去对话的办法。(失败……唯一思路是对话另外开一个TXT文件专门用于回想。然后用某个命令提取相应行数)

最后发现……高桥这人……他……他……[em06]他根本就不想!

《日西月东》等的回想系统,一共只能回想80句左右的对话内容。(需要对%now_log进行循环清空)至于他加入的那些名字的回想啊,声音的回想啊,有这么个基本思路,根本就不成问题。因为其回想内容实在是有限得可怜。

以上……打击……过两天再做详细研究然后补完……
http://www.nvlmaker.net/
回复

使用道具 举报

125

主题

288

帖子

1387

积分

⑥精研

积分
1387
发表于 2005-8-19 20:11:42 | 显示全部楼层
首先向高桥致以最崇高的寒意[em04][em04]
我确确实实以为那个$log变量是无限长度的……(实际上也做得到)
在C++里通过malloc()函数来取得一个连续的内存空间,当空间不足时便可申请更长的空间并将原来的数据直接WriteProcessMemory()过去
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

 楼主| 发表于 2005-8-19 20:18:10 | 显示全部楼层
[em04]他似乎并没有把$LOG当作一个无限长度的变量来用...是用了$401到$481的一个区间存储那些变量...
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

5

主题

43

帖子

1428

积分

⑥精研

活·潑·可·愛

积分
1428
发表于 2005-8-21 19:10:13 | 显示全部楼层
在西日東月裏面最複雜的系統並不是劇情回顧系統而是cgmode
還有就是save和load的系統了……因爲有一個Plus的qsave。
shortcut和flag也很值得研究……
至於回顧確實就只有*kaisou這樣一個事件而以
西日東月的強悍之処在於其完善的系統構成
無論*text還是*select都有一套完整的sub系統。而且名字變更和數据記錄也有獨到的地方……
不過其kaisou系統還是有缺陷的……如果用@來斷句就會出現重復記錄,所以只能用\\來斷句。
大概高橋自己也想不出來更合適的解決辦法才讓西日東月的對話框只能顯示兩行句子。
以上。
回复 支持 反对

使用道具 举报

5

主题

43

帖子

1428

积分

⑥精研

活·潑·可·愛

积分
1428
发表于 2005-8-21 19:17:49 | 显示全部楼层
而且我個人對其*kaisuo做了解搆,把voiceplay部分去掉了(太嚴肅了……不知道怎麽處理,似乎是和開始的voiceplay時間直接挂鈎的……至今沒有深入研究其獨特的voiceplay的sub事件……)正式版裏面只要是語音……都可以在kaisou事件中進行語音回放…………
我果然很懶……
在other side 1.00版出來以後再深入研究好了……30多張cg的草稿目前還是空白……[真的能在10月推出正式版麽……算上toz美工也只有三人的other side ……[em04][em04]……抓狂中……]
如何做出帶計時的紙牌作戰系統至今都只是一個謎……
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

 楼主| 发表于 2005-8-21 21:05:19 | 显示全部楼层
个人觉得CGMODE没有什么好研究的...因为完全只是变量数值判断组成的图片显示而已.哪怕写个100页也不过是图片集.QSAVE的功能也就是不调出SAVE界面的自动存档而已.这两个都没什么了不起的.
回想系统的复杂在于它已经牵涉到比较多的循环.当然如果照抄一遍是很容易,VOICEPLAY部分去掉就更简单.但是自己要做出更特别的效果,绝对是不容易的.
另外实际的回想系统是分成两部分的.一部分是在textgosub里面,每显示一句对话就进行记录.另外一部分才是带着界面的回想.
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

5

主题

43

帖子

1428

积分

⑥精研

活·潑·可·愛

积分
1428
发表于 2005-8-22 03:30:27 | 显示全部楼层
個人對西日東月回顧系統的不完全理解

*log
首先得從這個標簽開始
其中名字的文字變量是$name2,在回顧頁面裏面,名字和正文也是分開顯示的。

;名字,將名字的文字變量賦值給$text_log這個變量,然後從中提取字數若字數不足14個字節多餘的部分就用空格補足。
[p.s.以西日東月的本體爲主,名字最長沒有超過5個漢字,算上那兩個古怪的括號即7個]
mov $text_log,$name2
len %0,$text_log
if %0<14 mov %1,14:sub %1,%0:div %1,2:for %2=1 to %1:add $text_log,\" \":next

;聲音[我個人沒有管這個東西]
if $voice2=\"\"  add $text_log,\"      \"
if $voice2<>\"\" add $text_log,$voice2

;把所有的文本顯示歸入$text_log變量
add $text_log,$log

add %now_log,1
add %log_count,1


;當now_log的紀錄到達481的時候,將當前記錄歸回401
if %now_log=481 mov %now_log,401
mov $%now_log,$text_log

return

*kaisou

resettimer
erasetextwindow 1
for %0=9 to 25:vsp %0,0:next   
if %from=2 for %0=28 to 33:cell %0,0:vsp %0,0:next
repaint
textoff
;這個上面的内容我就不廢話了,很容易理解,以上

;本文長度調整(半角字符總數在170的時候就用對應的全角空格補足)
if %log_count>80 mov %log_count,80
mov %1,400:add %1,%log_count

for %10=401 to 480
len %2,$%10:mov %3,170:sub %3,%2:div %3,2
for %4=1 to %3:add $%10,\" \":next

next

waittimer 100

;基本元素的讀取
lsp 94,\":a;kai_back.jpg\",0,0
lsp 93,\":a/2,0,3;kai_game.jpg\",639,481
lsp 91,\":a/2,0,3;kai_rew.jpg\",568,38
lsp 92,\":a/2,0,3;kai_fwd.jpg\",568,530
lsp 59,\":a/2,0,3;kai_voice.jpg\",40,518
lsp 60,\":a/2,0,3;kai_voice.jpg\",40,454
lsp 61,\":a/2,0,3;kai_voice.jpg\",40,389
lsp 62,\":a/2,0,3;kai_voice.jpg\",40,325
lsp 63,\":a/2,0,3;kai_voice.jpg\",40,261
lsp 64,\":a/2,0,3;kai_voice.jpg\",40,197
lsp 65,\":a/2,0,3;kai_voice.jpg\",40,132
lsp 66,\":a/2,0,3;kai_voice.jpg\",40,68


mov %kaisou_page,1
mov %kaisou_initial,1

*kaisou_pagerefresh


;名字引入
mov %11,%now_log;
mov %0,%kaisou_page
sub %0,1
mul %0,8
sub %11,%0
if %11<401 add %11,80
mov $10,\":s/18,17,-1,0;#FFFFFF\"


mov %1,%11
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 51,$0,30,500
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 52,$0,30,436
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 53,$0,30,371
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 54,$0,30,307
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 55,$0,30,243
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 56,$0,30,179
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 57,$0,30,114
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1,0,14:add $0,$1:lsp 58,$0,30,50

;文本引入
;這裡是從26開始引入的……那麽14-26之間的空當被什麽東西填充了呢?很迷……
mov %1,%11
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 67,$0,145,500
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 68,$0,145,518
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 69,$0,145,536
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 70,$0,145,436
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 71,$0,145,454
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 72,$0,145,472
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 73,$0,145,371
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 74,$0,145,389
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 75,$0,145,407
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 76,$0,145,307
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 77,$0,145,325
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 78,$0,145,343
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 79,$0,145,243
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 80,$0,145,261
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 81,$0,145,279
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 82,$0,145,179
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 83,$0,145,197
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 84,$0,145,215
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 85,$0,145,114
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 86,$0,145,132
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 87,$0,145,150
sub %1,1:if %1<401 mov %1,480
mov $0,$10:mid $1,$%1, 26,48:add $0,$1:lsp 88,$0,145,50
mov $0,$10:mid $1,$%1, 74,48:add $0,$1:lsp 89,$0,145,68
mov $0,$10:mid $1,$%1,122,48:add $0,$1:lsp 90,$0,145,86
for %0=67 to 90:vsp %0,1:next

;聲音引入
mov %11,%now_log
mov %0,%kaisou_page
sub %0,1
mul %0,8
sub %11,%0
if %11<401 add %11,80

mov %1,%11
vsp 59,0:mid $0,$%1,14,2:if $0<>\" \" vsp 59,1
sub %1,1:if %1<401 mov %1,480
vsp 60,0:mid $0,$%1,14,2:if $0<>\" \" vsp 60,1
sub %1,1:if %1<401 mov %1,480
vsp 61,0:mid $0,$%1,14,2:if $0<>\" \" vsp 61,1
sub %1,1:if %1<401 mov %1,480
vsp 62,0:mid $0,$%1,14,2:if $0<>\" \" vsp 62,1
sub %1,1:if %1<401 mov %1,480
vsp 63,0:mid $0,$%1,14,2:if $0<>\" \" vsp 63,1
sub %1,1:if %1<401 mov %1,480
vsp 64,0:mid $0,$%1,14,2:if $0<>\" \" vsp 64,1
sub %1,1:if %1<401 mov %1,480
vsp 65,0:mid $0,$%1,14,2:if $0<>\" \" vsp 65,1
sub %1,1:if %1<401 mov %1,480
vsp 66,0:mid $0,$%1,14,2:if $0<>\" \" vsp 66,1

p.s.這個Kaisou系統是按段落劃分的[每一個段落就是一個now_log紀錄

每進行一句話的時候,就會將當前對話記錄到now_log裏面,然後利用log_count進行計數,超過80的時候歸回80

名字顯示用到了14個字節,然後文本顯示用到了24*3*2=144個字節,共計用到了158個字節,然,從其劃分字段可以看出14-26之間有12個字節的空檔,加起來就是170個字節[也就是劃分每一段所用到的數量……不過12個字節的空檔……很迷……]

正如countd說的,記錄範圍在401到480之間。

cgmode我還沒來得及看……最近快被圖像製作弄瘋了,哭……個人想到的也就是每一張cg出現的時候加入一個變數判定,然後到mode模式下如果cg01=1的時候就顯示cg否則就是黑框……感覺上貌似也不是太困難的樣子……至於save,西日東月的save真的很完善阿……縮略圖,日期,……不過貌似也都是堆代碼就可以搞定……然……讀取的時候畫面不能漸變出現[西日東月也是簡單的做了一個黑屏過渡,然後瞬閃……果然ns也是有一定局限性的……]

至於是如何將now_log和具體顯示相整合的,我個人並不十分清楚。[em01][em01]

大致上我的理解也極有可能存在相對嚴重的偏差……

至於回顧只能顯示80段的問題……個人認爲80段文字也就足夠了……一般玩家在看回顧的時候也就只會看各1,2句來方便做選擇……應該沒有人會把回顧當作小説來看……

人物還有5張……cg還有30張……

天空……好纖細…… = =

[此贴子已经被作者于2005-8-22 4:14:09编辑过]
回复 支持 反对

使用道具 举报

125

主题

288

帖子

1387

积分

⑥精研

积分
1387
发表于 2005-8-22 06:31:24 | 显示全部楼层
LOOKBACKMODE、CGMODE、LOADING FADE IN/OUT……
这些我全部都做好的了
大家觉得是让用户自己动手CUSTOM一个好呢,还是由引擎作者来完成它比较好?
找时间更新一下EADV的说明书,LB系、CG系和SAVE系的部分指令应该公开了
回复 支持 反对

使用道具 举报

12

主题

225

帖子

2396

积分

开发组

三心二意魔人

积分
2396
发表于 2005-8-22 11:04:51 | 显示全部楼层
简单的cgmode的话也用不着一一的和变量挂钩吧?不是有fchk(判断某一文件是否被调用过)这个命令么?定义区加上filelog(生成一个调用记录日志文件),cgmode里用if fchk ……什么什么的,就能判断出某张图是否被显示过,然后该怎么着怎么着……
不过感觉用变量也挺方便……不知哪种更好……也不知filelog和fchk能不能用在音乐文件上……没试过……
读取时的渐变不能用loadsub解决么?貌似可以搞得很华丽啊……
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

 楼主| 发表于 2005-8-22 21:16:14 | 显示全部楼层
我试过loadsub命令,似乎是没用...= =|||
因为是先执行loadsub,然后才开始读取游戏的...所以渐变效果变成先出现渐变效果,然后瞬间显示图片...= =|||
至于用变量还是用filelog属于个人习惯问题吧……
缩略图和日期倒简单...因为汉化版的问题我在《黄昏的叙事诗》里根据分歧手写过所有的日期和时间相关变数,而不是直接用提取来的变量代入的(部分变量数值会出现乱码),也不过花了大概半天左右……
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 03:21 , Processed in 0.013523 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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