Project1

标题: 突然发现,RGSS3默认脚本也会卖萌? [打印本页]

作者: taroxd    时间: 2014-5-23 19:55
标题: 突然发现,RGSS3默认脚本也会卖萌?
本帖最后由 taroxd 于 2014-5-23 20:54 编辑




两段脚本均位于 Game_Actor 内……
经检验,英文版也是一样……看来不是汉化卖萌
希望没有火星

题外话,把exp这么设定成这么一个hash,除了转职之外似乎也没什么好处的说……
作者: 怪蜀黍    时间: 2014-5-23 20:10
那明显是写重复了,删了第一个去
作者: 2673627593    时间: 2014-5-23 20:33
既然写了就应该有用吧。
作者: moy    时间: 2014-5-23 20:45
这个故事告诉我们,再有经验有时也免不了无用功
作者: 咕噜    时间: 2014-5-24 18:00
{:8_444:}那就再重复一段(*PIAJI
作者: fux2    时间: 2014-5-24 18:17
hash的效率要高一些,在va环境下没研究,但是xp环境下效率 table>hash>array
在大量循环处理这些数据的时候体现出来的效果尤为明显
作者: taroxd    时间: 2014-5-24 18:58
本帖最后由 taroxd 于 2014-5-24 19:01 编辑
fux2 发表于 2014-5-24 18:17
hash的效率要高一些,在va环境下没研究,但是xp环境下效率 table>hash>array
在大量循环处理这些数据的时候 ...


虽然我想说的是默认脚本用hash而不是直接用整数,不过说到这个,我就来无聊测测效率了

Ruby2.0 环境下,array效率远高于hash

我的测试结果:

RUBY 代码复制
  1. require 'Benchmark'
  2.  
  3. big = 10000000
  4. array = (0...big).to_a
  5. hash = {}
  6. big.times {|i| hash[i] = i }
  7.  
  8. Benchmark.bmbm do |x|
  9.   x.report('array') {big.times{|i| array[i]}}
  10.   x.report('hash')  {big.times{|i| hash[i]}}
  11. end


输出:
  1. Rehearsal -----------------------------------------
  2. array   0.624000   0.000000   0.624000 (  0.636037)
  3. hash    4.649000   0.000000   4.649000 (  4.663266)
  4. -------------------------------- total: 5.273000sec

  5.             user     system      total        real
  6. array   0.640000   0.000000   0.640000 (  0.641037)
  7. hash    4.727000   0.000000   4.727000 (  4.730271)
复制代码
吐槽:为什么论坛代码里array是高亮的啊
作者: maliut    时间: 2014-5-24 19:14
因为很重要所以写了两次……
作者: 无脑之人    时间: 2014-5-24 19:57
hash怎么散列也没有数组快啊= =另外这么设计有利于提高兼容性吧,至于写两遍……大概就是很重要咯233
作者: taroxd    时间: 2014-5-24 19:59
无脑之人 发表于 2014-5-24 19:57
hash怎么散列也没有数组快啊= =另外这么设计有利于提高兼容性吧,至于写两遍……大概就是很重要咯233 ...

我怎么觉得这么设计除了为了转职还是为了转职
作者: chd114    时间: 2014-5-25 15:48
防止误删···
作者: 喵呜喵5    时间: 2014-5-25 15:56
借楼问一下,result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }写两遍是做什么用的,我一直没有理解清楚……
  1.   def convert_escape_characters(text)
  2.     result = text.to_s.clone
  3.     result.gsub!(/\\/)            { "\e" }
  4.     result.gsub!(/\e\e/)          { "\\" }
  5.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  6.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  7.     result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
  8.     result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
  9.     result.gsub!(/\eG/i)          { Vocab::currency_unit }
  10.     result
  11.   end
复制代码

作者: taroxd    时间: 2014-5-25 15:58
本帖最后由 taroxd 于 2014-5-25 15:59 编辑
喵呜喵5 发表于 2014-5-25 15:56
借楼问一下,result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }写两遍是做什么用的,我一直没有 ...


应该是和exp一样,因为很重要所以要写两遍……
作者: 喵呜喵5    时间: 2014-5-25 16:02
taroxd 发表于 2014-5-25 15:58
应该是和exp一样,因为很重要所以要写两遍……

再借楼问一下,Scene_Debug里面那句被注释掉的代码是什么情况……
作者: taroxd    时间: 2014-5-25 16:07
喵呜喵5 发表于 2014-5-25 16:02
再借楼问一下,Scene_Debug里面那句被注释掉的代码是什么情况……


因为很重要所以要用绿色(雾
应该是不要注释掉的吧
作者: taroxd    时间: 2014-5-25 16:12
本帖最后由 taroxd 于 2014-5-25 16:18 编辑
喵呜喵5 发表于 2014-5-25 16:02
再借楼问一下,Scene_Debug里面那句被注释掉的代码是什么情况……


我还在想,默认的那堆module为什么不用module_function方法(之后自己的类include一下多方便,还打那么多self),
Cache的@cache为什么不直接在模块定义时初始化,
还有Game_System#japanese? 这个方法是干啥用的,
为什么不给Game_Switches、Game_Variables、Game_SelfSwitches弄个父类……

然后
Window_DebugRight#update_variable_mode方法的第一行    return unless $game_variables[current_id].is_a?(Numeric)
看来默认脚本本来就有$game_variables被我们恶整的觉悟啊~
作者: IamI    时间: 2014-5-25 18:48
exp是为了可读性吧,毕竟Actor太长。
当然更有可能是两个人写的拼在一起以后合成了。
变量写两遍是为了处理\v[\v[x]]这样的情况。
关于Cache,模块哪有构造函数,不要闹……
Switch为什么没有父类?因为是从XP和VX一路直接拷贝过来的。
VX Ace发行有日语和英语两个版本。
作者: taroxd    时间: 2014-5-25 18:52
IamI 发表于 2014-5-25 18:48
exp是为了可读性吧,毕竟Actor太长。
当然更有可能是两个人写的拼在一起以后合成了。
变量写两遍是为了处理 ...


3. 为什么不直接递归到底?
RUBY 代码复制
  1. nil while result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }


4. 首先,模块可以定义initialize,然后,我指的不是这个
举例:
RUBY 代码复制
  1. module Cache
  2.   [url=home.php?mod=space&uid=341345]@Cache[/url] = {}
  3.   module_function
  4.   # def...
  5. end


还有我说的是 Game_System#japanese?  这个方法没有什么实际作用  
作者: fux2    时间: 2014-5-25 18:54
喵呜喵5 发表于 2014-5-25 15:56
借楼问一下,result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }写两遍是做什么用的,我一直没有 ...

变量引用变量2333
作者: moy    时间: 2014-5-25 19:02
taroxd 发表于 2014-5-25 18:52
3. 为什么不直接递归到底? nil while result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] } [/p ...

japanese?只是提供个方法?然后告诉你“哼,你们这些破解汉化的,看到没,这是日本软件!”
不嵌套到底是因为……
  1. \V[\V[\V[\V[\V[1]]]]]
复制代码
谁TM这么用谁就是有病。滚去用脚本← ←

作者: taroxd    时间: 2014-5-25 19:09
本帖最后由 taroxd 于 2014-5-25 19:11 编辑
moy 发表于 2014-5-25 19:02
japanese?只是提供个方法?然后告诉你“哼,你们这些破解汉化的,看到没,这是日本软件!”
不嵌套到底是 ...


真·有病
  1. \V[\V[1]\V[2]]
复制代码
然后咱破解汉化的应该这么玩
RUBY 代码复制
  1. def chinese?
  2.   return true
  3. end
  4. alias japanese? chinese?

作者: DeathKing    时间: 2014-5-26 00:10
本帖最后由 DeathKing 于 2014-5-26 07:28 编辑
taroxd 发表于 2014-5-25 15:58
应该是和exp一样,因为很重要所以要写两遍……

  是的,为什么不使用while来处理,直至处理完毕呢?于是,不要怕,大刀阔斧地改吧!于是我们立马注释掉了#232和#233,添加上我们的代码:



  正当我们心满意足地欣赏我们的杰作时,你突然想到下面的自指会让我们陷入无穷尽的循环中。



  你轻蔑地说:“啧!哪里有这么蛋疼的人,写得出这么蛋疼的指令?”而当你冷静下来,你会觉得,即时是嵌套两层,也是非常少见了,嵌套多层更是比“使用奇怪的自指”罕有。

  一方面,我们希望让系统的复杂度保持足够的低,换句话说,我们不太希望”变量存放的地址是另一个变量的地址,而另一个变量里面存放的是另一个变量的地址“这种type ***之类的数据存在。这类功能有更简洁、明了的表达方式,不用让我们的思维兜圈子。这样来说,默认脚本提供了一次嵌套,已经能囊括99%的情况了。

  至于Hash和Array的效率问题。Array的IO操作都能在O(1)时间内完成,这是由于Array可以通过索引快速计算出元素的地址。而Hash依赖于哈希函数hash()(或者称为key())的定义,如果有碰撞,hash还得处理碰撞,如拉链法就得额外增加一个链表遍历的开销,开放寻执法得额外增加一个开放寻址的开销。

  Hash与Array的相比,优势是很明显的:Array只能以整数(索引)为Key,而Hash可以以任何对象为Key(原理上是将对象映射为整数)。另外,假设为了寻找字符串“target",使用数组无序存储,则需要花O(n)的时间去遍历Array,而是用Hash,可以将时间复杂度降至O(1)。

  RM最大的开销来自于图像的描绘,在Ruby层面上的计算开销是很少的。就RM数据的规模来说,Hash和Array对效率的影响并没有那么严重。根据实际情况和方便程度决定使用Hash还是Array即可。
作者: moy    时间: 2014-5-26 00:31
DeathKing 发表于 2014-5-26 00:10
  是的,为什么不使用while来处理,直至处理完毕呢?于是,不要怕,大刀阔斧地改吧!于是我们立马注释掉 ...

果断好评了
DK君怎么看待默认脚本里调用的一层套一层的方法?如果是你的话,你会希望这种分割的工作细分到多少层或是多细截止?
作者: DeathKing    时间: 2014-5-26 06:17
moy 发表于 2014-5-26 00:31
果断好评了
DK君怎么看待默认脚本里调用的一层套一层的方法?如果是你的话,你会希望这种分割的 ...

大概是哪个地方?

如果不是递归调用,方法调用的深度大概再3~5层应该就够了。这种情况下,逻辑已经被分得足够细了,没必要再细化。
作者: taroxd    时间: 2014-5-26 07:42
本帖最后由 taroxd 于 2014-5-26 07:43 编辑
DeathKing 发表于 2014-5-26 06:17
大概是哪个地方?

如果不是递归调用,方法调用的深度大概再3~5层应该就够了。这种情况下,逻辑已经被分 ...


比如说 apply_critical 这个方法,只有一次被调用,然后我记得调用它的方法也只有一次被调用。(我现在没有环境,有可能会记错~)
就是方法拆的很散吧。

我觉得这个风格很适合我们自定义脚本呢~ 也很适合子类覆盖。说实话我挺喜欢这个风格的
作者: moy    时间: 2014-5-26 14:28
taroxd 发表于 2014-5-26 07:42
比如说 apply_critical 这个方法,只有一次被调用,然后我记得调用它的方法也只有一次被调用。(我现在没 ...

=-=是啊,估计也是考虑到肯定有喜欢改暴击方式的人,所以把暴击的实现单独拉出来了。
我就看到人问暴击怎么改,想要根据技能加倍数或者其他方式。
我自己的是根据幸运敏捷有加成。便利呢~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1