Project1

标题: 我們所處的是個一體兩面的世界! [打印本页]

作者: 禾西    时间: 2008-3-15 22:15
标题: 我們所處的是個一體兩面的世界!
本帖最后由 后知后觉 于 2009-12-29 16:23 编辑

那個,在提問區回答問題的時候順手做出來了。作用是把身上的所有物品,金錢,步數都分開爲n部分,最後也可以合幷起來。

  1. class Game_Party
  2.   attr_reader :world_id
  3.   VID = 0
  4.   #--------------------------------------------------------------------------
  5.   # ● 初始化对像
  6.   #--------------------------------------------------------------------------
  7.   alias ori_ini initialize
  8.   def initialize
  9.     @worlds = Array.new(2){[0,0,{},{},{}]}
  10.     @world_id = 1
  11.     ori_ini
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   # ● 世界之轉換 (n)
  15.   #     n        : 世界ID
  16.   #--------------------------------------------------------------------------
  17.   def world_transfer(n, sources = nil)
  18.     #------------------------------------------------------------------------
  19.     # ● 記錄現在所處的世界ID於變量當中
  20.     #------------------------------------------------------------------------
  21.     $game_varibles[VID] = n unless VID.zero?
  22.     #------------------------------------------------------------------------
  23.     # ● 記錄現在所處的世界的數據
  24.     #------------------------------------------------------------------------
  25.     @worlds[@world_id] = [@gold, @steps, @items, @weapons, @armors]
  26.     #------------------------------------------------------------------------
  27.     # ● 如果新世界沒有數據就創造新世界
  28.     #------------------------------------------------------------------------
  29.     world_create(n, sources) if (@worlds[n].nil? or sources != nil)
  30.     #------------------------------------------------------------------------
  31.     # ● 如果進入0世界就改寫0世界
  32.     #------------------------------------------------------------------------
  33.     world_create(n) if n.zero?
  34.     #------------------------------------------------------------------------
  35.     # ● 轉換世界ID
  36.     #------------------------------------------------------------------------
  37.     @world_id = n
  38.     #------------------------------------------------------------------------
  39.     # ● 讀取上次離開時的數據記錄
  40.     #------------------------------------------------------------------------
  41.     record = @worlds[@world_id]
  42.     #------------------------------------------------------------------------
  43.     # ● 轉換數據
  44.     #------------------------------------------------------------------------
  45.     @gold    = record[0]
  46.     @steps   = record[1]
  47.     @items   = record[2]
  48.     @weapons = record[3]
  49.     @armors  = record[4]
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 世界之創造與合幷 (n, sources)
  53.   #     n        : 新世界ID
  54.   #     sources  : 新世界的來源
  55.   #--------------------------------------------------------------------------
  56.   def world_create(n, sources = nil)
  57.     return if @worlds[n] != nil and (n != 0)
  58.     #------------------------------------------------------------------------
  59.     # ● 如果世界數量不足需求
  60.     #        則創造足够數量的新世界
  61.     #------------------------------------------------------------------------
  62.     @worlds[n] ||=[0,0,{},{},{}]
  63.     return if (sources.nil? and n > 0)
  64.     #------------------------------------------------------------------------
  65.     # ● 取得來源世界
  66.     #------------------------------------------------------------------------
  67.     data = []
  68.     sources.each {|x| data.push( @worlds[x] )} unless sources.nil?
  69.     data = @worlds if n.zero?
  70.     #------------------------------------------------------------------------
  71.     # ● 合幷來源數據
  72.     #------------------------------------------------------------------------
  73.     data.each do |each_world|
  74.       #------------------------------------------------------------------------
  75.       # ● 合幷金錢與步數
  76.       #------------------------------------------------------------------------
  77.       @worlds[n][0] =[[@worlds[n][0] + each_world[0], 0].max, 9999999].min
  78.       @worlds[n][1] =[[@worlds[n][1] + each_world[1], 0].max, 9999999].min
  79.       #------------------------------------------------------------------------
  80.       # ● 合幷物品與裝備
  81.       #------------------------------------------------------------------------
  82.       [2,3,4].each do |kind|
  83.         each_world[kind].each do |item_id, plus|
  84.           if @worlds[n][kind][item_id].nil?
  85.             basic = 0
  86.           else
  87.             basic= @worlds[n][kind][item_id]
  88.           end
  89.           next if (basic == 99)
  90.           @worlds[n][kind][item_id] = [[basic + plus, 0].max, 99].min
  91.         end
  92.       end
  93.     end
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 世界之複製 (n, m)
  97.   #     n          : 複製世界
  98.   #     m          : 原本世界
  99.   #--------------------------------------------------------------------------
  100.   def world_duplicate(n, m)
  101.     world_create(n, [m])
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 世界之分割 (n, fragment)
  105.   #     n          : 被分割的世界ID
  106.   #     fragment   : 分割後産生的碎片世界
  107.   #     fragment[0]: 偏愛世界
  108.   #--------------------------------------------------------------------------
  109.   def world_partition(n, fragment)
  110.     #------------------------------------------------------------------------
  111.     # ● 如果分割世界沒有數據就創造新世界
  112.     #------------------------------------------------------------------------
  113.     world_create(n) if @worlds[n].nil?
  114.     #------------------------------------------------------------------------
  115.     # ● 記錄偏愛世界
  116.     #------------------------------------------------------------------------
  117.     bias = fragment[0]
  118.     #------------------------------------------------------------------------
  119.     # ● 重新排列
  120.     #------------------------------------------------------------------------
  121.     fragment.sort!
  122.     biggest = fragment[(fragment.size - 1)]
  123.     size = fragment.size
  124.     #------------------------------------------------------------------------
  125.     # ● 如果碎片世界不足則創造
  126.     #------------------------------------------------------------------------
  127.     world_create(biggest) if @worlds[biggest].nil?
  128.     #------------------------------------------------------------------------
  129.     # ● 讀取現今世界數據
  130.     #------------------------------------------------------------------------
  131.     present = [@gold, @steps, @items, @weapons, @armors]
  132.     #------------------------------------------------------------------------
  133.     # ● 平均分割現今世界
  134.     #------------------------------------------------------------------------
  135.     fragment.each do |each_world|
  136.       #------------------------------------------------------------------------
  137.       # ● 平均分割金錢與步數
  138.       #------------------------------------------------------------------------
  139.       @worlds[each_world][0] = [[@worlds[each_world][0] + (present[0] / size).to_i ].max, 9999999].min
  140.       @worlds[each_world][1] = [[@worlds[each_world][1] + (present[1] / size).to_i ].max, 9999999].min
  141.       #------------------------------------------------------------------------
  142.       # ● 偏愛世界取得特殊補貼
  143.       #------------------------------------------------------------------------
  144.       if each_world == bias
  145.         @worlds[each_world][0] = [[@worlds[each_world][0] + (present[0] % size) ].max, 9999999].min
  146.         @worlds[each_world][1] = [[@worlds[each_world][1] + (present[1] % size) ].max, 9999999].min
  147.       end
  148.       #------------------------------------------------------------------------
  149.       # ● 平均物品與裝備
  150.       #------------------------------------------------------------------------
  151.       [2,3,4].each do |kind|
  152.         present[kind].each do |item_id, plus|
  153.           next if plus.nil?
  154.           basic = @worlds[each_world][kind][item_id]
  155.           next if (basic == 99)
  156.           @worlds[each_world][kind][item_id] = [[basic + (plus / size).to_i, 0].max, 99].min
  157.           #------------------------------------------------------------------------
  158.           # ● 偏愛世界取得特殊補貼
  159.           #------------------------------------------------------------------------
  160.           if each_world == bias
  161.             basic = @worlds[each_world][kind][item_id]
  162.             @worlds[each_world][kind][item_id] = [[basic + (plus % size), 0].max, 99].min
  163.           end
  164.         end
  165.       end
  166.     end
  167.   end
  168.   #--------------------------------------------------------------------------
  169.   # ● 世界之轉嫁 (n, victims,destroy)
  170.   #     n        : 轉換的世界ID
  171.   #     victims  : 轉嫁的世界數組
  172.   #     destroy  : 是否毀滅當前世界?
  173.   #--------------------------------------------------------------------------
  174.   def world_shift(n, victims, destroy = false)
  175.     return if n == @world_id
  176.     #------------------------------------------------------------------------
  177.     # ● 記載當前數據及之前數據
  178.     #------------------------------------------------------------------------
  179.     now = @world_id
  180.     bias = victims[0]
  181.     size = victims.size
  182.     present = [@gold, @steps, @items, @weapons, @armors]
  183.     past = @worlds[@world_id]
  184.     #--------------------------------------------------------------------------
  185.     # ● 取得消耗值 discrepancy
  186.     #--------------------------------------------------------------------------
  187.     discrepancy = [0,0,{},{},{}]
  188.     discrepancy[0] = (present[0] - @worlds[@world_id][0])
  189.     discrepancy[1] = (present[1] - @worlds[@world_id][1])
  190.     [2,3,4].each do |kind|
  191.       present[kind].each do |item_id, value|
  192.         basic = @worlds[@world_id][kind][value]
  193.         discrepancy[kind] = value - (basic.nil? ? 0 : basic)
  194.       end
  195.     end
  196.     #--------------------------------------------------------------------------
  197.     # ● 轉嫁消耗 shift discrepancy
  198.     #--------------------------------------------------------------------------
  199.     victims.each do |each_world|
  200.       @worlds[each_world][0] = [[@worlds[each_world][0] + (discrepancy[0]/size).to_i, 0].max, 9999999].min
  201.       @worlds[each_world][1] = [[@worlds[each_world][1] + (discrepancy[1]/size).to_i, 0].max, 9999999].min
  202.       if each_world == bias
  203.         @worlds[each_world][0] = [[@worlds[each_world][0] + (discrepancy[0]%size), 0].max, 9999999].min
  204.         @worlds[each_world][1] = [[@worlds[each_world][1] + (discrepancy[1]%size), 0].max, 9999999].min
  205.       end
  206.       [2,3,4].each do |kind|
  207.         discrepancy.each do |itme_id, value|
  208.           next if value.nil?
  209.           basic = @worlds[each_world][kind][itme_id]
  210.           correction = (value / size).to_i
  211.           @worlds[each_world][kind][itme_id] = basic.nil? ? correction : [[basic + correction, 0].max, 99].min
  212.           @worlds[each_world][kind][itme_id] = [[basic + (correction%size), 0].max, 99].min if each_world == bias

  213.         end
  214.       end
  215.     end
  216.     #--------------------------------------------------------------------------
  217.     # ● 世界轉換
  218.     #--------------------------------------------------------------------------
  219.     world_transfer(n)
  220.     #--------------------------------------------------------------------------
  221.     # ● 現世界摧毀
  222.     #--------------------------------------------------------------------------
  223.     @worlds[now] = nil if destroy == true
  224.   end
  225. end
复制代码
Q1:世界的轉換調用方法是?
A.在事件的腳本選項中加入:
  1. $game_party.world_transfer(n)
复制代码
n是世界的ID,1就是第一個世界,2就是第二個世界……


Q2:如何合幷不同的世界
A1.合幷兩個世界
  1. $game_party.world_create(n,[n1,n2])
复制代码
n是合幷後創造出的新世界,n1,n2是需要合幷的世界

A2.合幷所有世界
  1. $game_party.world_transfer(0)
复制代码
召喚0之世界,所有東西闔一

A3.合幷加自動轉跳
  1. $game_party.world_transfer(n,[n1,n2])
复制代码
Q3:如何重新分割世界?
A.在事件的腳本選項中加入:
  1. $game_party.world_partition(n, ArrayFragment)
复制代码
n 是將要轉換到的世界。
fragment是分割出來的世界數組,數量將會是:
((分割世界的數值)/碎片數目)

當不能被整除的時候,排列第一的碎片世界會取得多出來餘數

Q4.返回來源世界的語句呢?
A.
  1. $game_party.world_shift(n, victims)
复制代码
n 是轉換到的世界,victims是需要承擔當前世界所産生的改變的世界數組。
此語句當中含有第三個隱藏參數destroy
當爲true時,當前世界在轉嫁變化完成以後被摧毀。

Q5:範例在哪里?
A;沒有,這麽簡單的修改就不要範例了。

Q6:有沒有衝突?
A:衝突?衝突?我只是重命名了個initialize都衝突?|||

Q7:可以取得現在處於的世界ID嗎?
A:可以幷有兩種辦法。
1.調用
$game_party.world_id

2.修改:
VID = 0

   然後在第?號變量當中直接讀取。

Q8:如果出錯怎麼辦?
回帖告訴作者。

PS。感謝神思,沉影不器,水晶凌,wy29等等~

修正記錄:
1.修改「合幷不能」錯誤於 April, 30 2008
作者: asperta    时间: 2008-3-15 22:31
不错! 正需要这个,支持一下楼主!
作者: 水晶凌    时间: 2008-3-15 23:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2008-3-16 00:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水晶凌    时间: 2008-3-16 00:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2008-3-16 01:52
真是特殊的脚本……

也就是说进入另一个世界后所有的数据全部改变成新的?
如果已经去过那个世界,就提取上次的数据?
作者: 禾西    时间: 2008-3-16 06:07
To:水晶凌
謝水晶……一時沒有留意 囧rz(複製粘貼用太多)
To:沉影不器
就是這麽廢柴的腳本……
To:越前リョーマ
被你看穿了{/hx}
作者: 禾西    时间: 2008-3-16 06:46
根據沉影所說的「好複雜」修改了代碼……
158行急跌到88行,再少好像就不行了?
作者: enghao_lim    时间: 2008-3-16 07:28
直接修改Window Item就行了,例如附带某属性的物品如果不在第二个世界,那就不显示,向反也一样。步数,金钱更简单,花两个变量就行了。这样加起来,改动的脚本应该不到20句吧,而且省事些。{/cy}
作者: 禾西    时间: 2008-3-16 07:32
LS……
那個,按照你說的同一樣東西怎麼分開兩半
作者: 神思    时间: 2008-3-16 07:46
-v-优化一下..
无限个世界........
  1. #==============================================================================
  2. # ■ Game_Party
  3. #------------------------------------------------------------------------------
  4. #  处理同伴的类。包含金钱以及物品的信息。本类的实例
  5. # 请参考 $game_party。
  6. #==============================================================================
  7. class Game_Party
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义别名方法
  10.   #--------------------------------------------------------------------------
  11.   alias game_party_initialize           initialize
  12.   #--------------------------------------------------------------------------
  13.   # ● 世界数量
  14.   #--------------------------------------------------------------------------
  15.   WorldSize = 999
  16.   #--------------------------------------------------------------------------
  17.   # ● 定义实例变量
  18.   #--------------------------------------------------------------------------
  19.   attr_accessor :world_id
  20.   #--------------------------------------------------------------------------
  21.   # ● 初始化对像
  22.   #--------------------------------------------------------------------------
  23.   def initialize(world_size=WorldSize)
  24.     game_party_initialize()
  25.     @gold = Array.new(world_size, 0)
  26.     @steps = Array.new(world_size, 0)
  27.     @items = Array.new(world_size){ Hash.new() }
  28.     @weapons = Array.new(world_size){ Hash.new() }
  29.     @armors = Array.new(world_size){ Hash.new() }
  30.     @world_id = 0
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 获取金钱
  34.   #--------------------------------------------------------------------------
  35.   def gold ; return @gold[@world_id] ; end
  36.   #--------------------------------------------------------------------------
  37.   # ● 获取步数
  38.   #--------------------------------------------------------------------------
  39.   def steps ; return @steps[@world_id] ; end
  40.   #--------------------------------------------------------------------------
  41.   # ● 获取物品
  42.   #--------------------------------------------------------------------------
  43.   def items ; return @items[@world_id] ; end
  44.   #--------------------------------------------------------------------------
  45.   # ● 获取武器
  46.   #--------------------------------------------------------------------------
  47.   def weapons ; return @weapons[@world_id] ; end
  48.   #--------------------------------------------------------------------------
  49.   # ● 获取防具
  50.   #--------------------------------------------------------------------------
  51.   def armors ; return @armors[@world_id] ; end
  52.   #--------------------------------------------------------------------------
  53.   # ● 增加金钱 (减少)
  54.   #     n : 金额
  55.   #--------------------------------------------------------------------------
  56.   def gain_gold(n)
  57.     @gold[@world_id] = [@gold[@world_id] + n, 9999999].min
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 增加步数
  61.   #--------------------------------------------------------------------------
  62.   def increase_steps
  63.     @steps[@world_id] = [@steps[@world_id] + 1, 9999999].min
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 增加物品 (减少)
  67.   #     item_id : 物品 ID
  68.   #     n       : 个数
  69.   #--------------------------------------------------------------------------
  70.   def gain_item(item_id, n)
  71.     # 更新 hash 的个数数据
  72.     if item_id > 0
  73.       item = self.items
  74.       item[item_id] = [[item_number(item_id) + n, 0].max, 99].min
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 增加武器 (减少)
  79.   #     weapon_id : 武器 ID
  80.   #     n         : 个数
  81.   #--------------------------------------------------------------------------
  82.   def gain_weapon(weapon_id, n)
  83.     # 更新 hash 的个数数据
  84.     if weapon_id > 0
  85.       weapon = self.weapons
  86.       weapon[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
  87.     end
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 增加防具 (减少)
  91.   #     armor_id : 防具 ID
  92.   #     n        : 个数
  93.   #--------------------------------------------------------------------------
  94.   def gain_armor(armor_id, n)
  95.     # 更新 hash 的个数数据
  96.     if armor_id > 0
  97.       armor = self.armors
  98.       armor[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
  99.     end
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ● 获取物品的所持数
  103.   #     item_id : 物品 ID
  104.   #--------------------------------------------------------------------------
  105.   def item_number(item_id)
  106.     # 如果 hash 个数数值不存在就返回 0
  107.     return self.items.include?(item_id) ? self.items[item_id] : 0
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 获取武器所持数
  111.   #     weapon_id : 武器 ID
  112.   #--------------------------------------------------------------------------
  113.   def weapon_number(weapon_id)
  114.     # 如果 hash 个数数值不存在就返回 0
  115.     return self.weapons.include?(weapon_id) ? self.weapons[weapon_id] : 0
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 获取防具所持数
  119.   #     armor_id : 防具 ID
  120.   #--------------------------------------------------------------------------
  121.   def armor_number(armor_id)
  122.     # 如果 hash 个数数值不存在就返回 0
  123.     return self.armors.include?(armor_id) ? self.armors[armor_id] : 0
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 世界之轉換 (n)
  127.   #     n        : 世界ID
  128.   #--------------------------------------------------------------------------
  129.   def world_change(n)
  130.     @world_id = n
  131.   end
  132. end
复制代码

作者: 风雪优游    时间: 2008-3-17 00:05
很有创意...实用的话就把...世界无限大化了
作者: 越前リョーマ    时间: 2008-3-17 00:11
其实也可以当作是进入其他附属游戏的档,
然后进入时这边自动存一下,然后读那边的档……
[LINE]1,#dddddd[/LINE]
世界是由无数个平行世界组成的……
虽然目前还觉得不大可能……
作者: 沉影不器    时间: 2008-3-17 00:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 鑫森淼焱垚    时间: 2008-3-17 00:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2008-3-17 05:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-17 07:20
以下引用沉影不器于2008-3-16 16:25:22的发言:

脚本行数越来越少咧...有没说明怎么合并?

把一些重複的,不闔邏輯的語句删除。
以下引用鑫森淼焱垚于2008-3-16 16:34:30的发言:

小柯永远能把脚本想出其他的用法



说起来,如果做双线剧情,也可以用吧
比如高考狂想曲,我一直觉得本来两边还是敌对状态的时候物品通用很别扭--
嗯,同问,如何合并某两个世界呢

召喚「0」世界,所有的世界的物品都會合幷在一齊。

PS。其實可以再度優化的,可是禾西對於Hash表不熟悉,找不到合幷hash表的方法……
如果可以有這樣的語法:

a = {1=>2,3=>5,8=>54}
b = {1=>9,3=>99,10=>1}
c = a?b?????
c = {1=>11,3=>99,8=>54,10=>}

這樣這個腳本的行數大概會再度急跌……
作者: 神思    时间: 2008-3-17 07:39
没有可以自己写啊`..
class Hash
  def +(hash)
    return {} unless hash.is_a?(Hash)
    new_hash = self.dup
    hash.each do |key, value|
      next unless value.is_a?(Numeric)
      if new_hash[key] != nil
        new_hash[key] += value
      else
        new_hash[key] = value
      end
    end
    return new_hash
  end
end
a = {1=>2, 2=>3}
b = {1=>2, 2=>3, 3=>9}
a += b
p a # {1=>4, 2=>6, 3=>9}
作者: 禾西    时间: 2008-3-17 08:29
剛剛寫了……==|||
行數果然急速下跌到47行……
然後腦袋邏輯爆炸……
要是早看到神思的回復就好了,不用自己寫。
(大囧|||)

作者: 圣痕    时间: 2008-3-17 10:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2008-3-17 17:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-17 18:02
你的初始化方法似乎比我的好(我是先開闢數組空間并賦值)

我沒有修改hash底層方法,因爲那樣子好像會引發數量超標的問題。
a = {1=>67}
b = {1=>55}
c = a.add(b) #=> 1=>122

轉換世界時候「附加」數量會引起數值錯誤吧?爲甚麼不直接替換?
作者: 沉影不器    时间: 2008-3-17 18:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-17 18:18
當初主要寫那麽多是因爲想不到怎麼記錄全部世界加起來的數據
(不想寫hash的相加方法,因爲一直覺得會數量超標)

順手把您的那句return判斷偷了,優化速度
作者: 水晶凌    时间: 2008-3-18 06:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-18 08:47
把以前用過的version移到這裏來
version 0.5
  1. class Game_Party
  2.   attr_accessor :world_id
  3.   VID = 0
  4.   #--------------------------------------------------------------------------
  5.   # ● 初始化对像
  6.   #--------------------------------------------------------------------------
  7.   alias ori_ini initialize
  8.   def initialize
  9.     #------------------------------------------------------------------------
  10.     # ● 世界數量 Array.new(n+1){[0,0,{},{},{}]}
  11.     #------------------------------------------------------------------------
  12.     @worlds = Array.new(99){[0,0,{},{},{}]}
  13.     @contraband = [nil,nil,{},{},{}]
  14.     @world_id = 1
  15.     ori_ini
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 世界之轉換 (n, source)
  19.   #     n        : 世界ID
  20.   #--------------------------------------------------------------------------
  21.   def world_transfer(n, sources = nil)
  22.     return if n == @world_id
  23.     $game_varibles[VID] = n unless VID.zero?
  24.     @worlds[@world_id] = [@gold, @steps, @items, @weapons, @armors]
  25.     @world_id = n
  26.     if sources != nil or n.zero?
  27.       if sources != nil
  28.         a = []
  29.         sources.each {|x| a.push(@worlds[x])}
  30.       elsif n.zero?
  31.         a = @worlds
  32.       end
  33.       a.each do |j|
  34.         break unless @worlds[@world_id][1].zero?
  35.         @worlds[@world_id][0] =[[@worlds[@world_id][0] + j[0], 0].max, 9999999].min
  36.         @worlds[@world_id][1] =[[@worlds[@world_id][1] + j[1], 0].max, 9999999].min
  37.         [2,3,4].each do |i|
  38.           j[i].each do |a,b|
  39.             unless @contraband[i][@world_id].nil?
  40.               next if @contraband[i][@world_id].include?(a)
  41.             end
  42.             next if @worlds[@world_id][i][a] == 99
  43.             @worlds[@world_id][i][a] = @worlds[@world_id][i][a].nil? ? b : [[@worlds[@world_id][i][a] + b, 0].max, 99].min
  44.           end
  45.         end
  46.       end
  47.     end
  48.     record = @worlds[@world_id]
  49.     @gold = record[0]
  50.     @steps = record[1]
  51.     @items = record[2]
  52.     @weapons = record[3]
  53.     @armors = record[4]
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 世界之轉嫁 (n, fragment)
  57.   #     n        : 轉換的世界ID
  58.   #--------------------------------------------------------------------------
  59.   def world_shift(n, fragment)
  60.     return if n == @world_id
  61.     $game_varibles[VID] = n unless VID.zero?
  62.     bias = fragment[0]
  63.     present = [@gold, @steps, @items, @weapons, @armors]
  64.     past = @worlds[@world_id]
  65.     discrepancy = [0,0,{},{},{}]
  66.     discrepancy[0] = (present[0] - @worlds[@world_id][0])
  67.     discrepancy[1] = (present[1] - @worlds[@world_id][1])
  68.     [2,3,4].each do |i|
  69.       present[i].each do |a, b|
  70.         c = @worlds[@world_id][i][a]
  71.         discrepancy[i] = b - (c.nil? ? 0 : c)
  72.       end
  73.     end
  74.     fragment.each do |j|
  75.       @worlds[j][0] = [[@worlds[j][0] + (discrepancy[0]/fragment.size).to_i, 0].max, 9999999].min
  76.       @worlds[j][0] = [[@worlds[j][0] + (discrepancy[0]%fragment.size), 0].max, 9999999].min if j == bias
  77.       @worlds[j][1] = [[@worlds[j][1] + (discrepancy[1]/fragment.size).to_i, 0].max, 9999999].min
  78.       @worlds[j][1] = [[@worlds[j][1] + (discrepancy[1]%fragment.size), 0].max, 9999999].min if j == bias
  79.       [2,3,4].each do |k|
  80.         discrepancy.each do |d, e|
  81.           next if @worlds[j][k][d] == 99
  82.           @worlds[j][k][d] = @worlds[j][k][d].nil? ? (e/fragment.size).to_i : [[@worlds[j][k][d] + (e/fragment.size).to_i, 0].max, 99].min
  83.           @worlds[j][k][d] = [[@worlds[j][k][d] + (e%fragment.size), 0].max, 99].min if j == bias
  84.         end
  85.       end
  86.     end
  87.     @worlds[@world_id] = [0, 0, {}, {}, {}]
  88.     @world_id = n
  89.     record = @worlds[@world_id]
  90.     @gold = record[0]
  91.     @steps = record[1]
  92.     @items = record[2]
  93.     @weapons = record[3]
  94.     @armors = record[4]
  95.   end
  96. end
复制代码

version 0.3
  1. class Game_Party
  2.   attr_accessor :world_id
  3.   VID = 0
  4.   #--------------------------------------------------------------------------
  5.   # ● 初始化对像
  6.   #--------------------------------------------------------------------------
  7.   alias ori_ini initialize
  8.   def initialize
  9.     @worlds = Array.new(2){[0,0,{},{},{}]}
  10.     @contraband = [nil,nil,{},{},{}]
  11.     @world_id = 1
  12.     ori_ini
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 世界之轉換 (n, source)
  16.   #     n        : 世界ID
  17.   #--------------------------------------------------------------------------
  18.   def world_transfer(n, sources = nil)
  19.     return if n == @world_id
  20.     $game_varibles[VID] = n unless VID.zero?
  21.     @worlds[@world_id] = [@gold, @steps, @items, @weapons, @armors]
  22.     @world_id = n
  23.     if @worlds[@world_id].nil?
  24.       (n - @worlds.size + 1).times do
  25.         @worlds << [0,0,{},{},{}]
  26.       end
  27.     end
  28.     if sources != nil or n.zero?
  29.       if sources != nil
  30.         a = []
  31.         sources.each {|x| a.push(@worlds[x])}
  32.       elsif n.zero?
  33.         a = @worlds
  34.       end
  35.       a.each do |j|
  36.         break unless @worlds[@world_id][1].zero?
  37.         @worlds[@world_id][0] =[[@worlds[@world_id][0] + j[0], 0].max, 9999999].min
  38.         @worlds[@world_id][1] =[[@worlds[@world_id][1] + j[1], 0].max, 9999999].min
  39.         [2,3,4].each do |i|
  40.           j[i].each do |a,b|
  41.             unless @contraband[i][@world_id].nil?
  42.               next if @contraband[i][@world_id].include?(a)
  43.             end
  44.             next if @worlds[@world_id][i][a] == 99
  45.             @worlds[@world_id][i][a] = @worlds[@world_id][i][a].nil? ? b : [[@worlds[@world_id][i][a] + b, 0].max, 99].min
  46.           end
  47.         end
  48.       end
  49.     end
  50.     record = @worlds[@world_id]
  51.     @gold = record[0]
  52.     @steps = record[1]
  53.     @items = record[2]
  54.     @weapons = record[3]
  55.     @armors = record[4]
  56.   end
复制代码


作者: 水晶凌    时间: 2008-3-18 17:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-18 17:44
1.我不想打破RM的默認系統。突破數量非我所願,因爲會出現很多問題。不過你可以修改裏面的數字從而突破物品數量限制。

其他,按要求更新了 world_partition 方法
不過……有沒有錯誤就不知道了 囧rz
(邏輯完全壞掉……這個腳本自己快看不懂了)

至於separate打錯就不理了。
作者: 水晶凌    时间: 2008-3-18 20:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-18 20:19
1.
主要是大量[[?,0].max].min語句弄到亂七八糟……囧rz
如果允許數量超標的話,當然語句會容易很多。
2.
原本與現在其實值的是用來分割的世界

原来:值得是最初建立時候記錄的數據
现在:就是現在的數據

兩者的差决定量物品與金錢的消耗與增加量。這些「量」分別由分割後的世界各自承擔。
也就是回答你這個問題:
多个世界合并后物品使用了一些,然后又回到某个世界,物品消耗算哪个世界的?!

禾西不擅長中文,表達意思大概有時會一塌糊塗……
(當然在英語也大概差不多……==|||)

$game_varibles[VID]其實就是記錄了你「現在」所處的世界Id,只有一個而已。

3.因爲原本很簡單……所以範例就免了。現在的話我會嘗試做一個範例(但是貌似很無聊很無聊)

4.吞噬太多創意(神思的,沉影的……)
所以……就這樣了|||

作者: wy29    时间: 2008-3-18 21:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-19 06:20
PS:出門前更新一下。
其實each也幷沒有甚麽不好,處理大數據(搜索hash)時功能很強大。當初决定用a,j,k之類的是因爲懶……新版本就改好了。注釋也增加了很多。
複製世界可喲用world_create來控制。把sources 設定爲一個世界就可以了。今晚再補上簡單的語句吧!

作者: 水晶凌    时间: 2008-3-19 17:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-19 17:28
0.直接叫禾西就好……
1.不好意思。是直接占用的……,如果爲0就不會占用(當然也不能使用)。
至於其他變量啊,是不會産生任何影響的。
2.本來打算把零世界做爲平行世界的,但是後來又删掉了代碼。注釋沒有删除。
3.同上,注釋沒有删除。所謂的偏愛世界就是獲得最多物品的那個而已……
4.分割世界不等於返回世界。
這裏的分割是指平均分割
那個返回世界的語句還沒有寫,有些思路還沒有理清。
5.可讀性
6.感謝お水晶凌さま一直以來的意見。<(_ _)>
作者: 禾西    时间: 2008-3-19 18:00
不是不是。因爲wy29說話一開始設定99個空白世界太過浪費,所以一開始只有生成了兩個世界:
0世界 & 1世界
世界會在需要使用時自動生成。
(除了合幷,合幷不存在的世界會産生錯誤。)
你誤會了,一開始那個時候的「VID」值的是你將要調用來記錄當前所處世界ID的變量號碼。
全部稱呼是Variable ID
世界ID其實是記錄在 $game_party.world_id 當中。只不過每次轉換世界的時候順便也把VID號變量改寫而已。
如果你想記錄在第101號變量,那麽設置VID爲101就可以了。不會對其他變量産生任何影響的,放心。

PS:神思的腳本沒有甚麽需要修改的
作者: 水晶凌    时间: 2008-3-19 18:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-19 18:36
當前所處世界,不是一個變量就足够了嗎?==a
那個好多個世界的記錄是記載在@worlds當中啊。

一開始只有生成了兩個世界:0世界 & 1世界;这里的0世界是指总的世界吗?

對的。
作者: 水晶凌    时间: 2008-3-19 18:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-3-19 19:50
是的。
[LINE]1,#dddddd[/LINE]
水帖一張 囧rz
作者: 火炎焱燚    时间: 2008-3-20 03:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风雪优游    时间: 2008-3-21 20:39
话说很想发,但是不好发....恩,当成教程来发吧,晚上发布.....
作者: 零度·幻    时间: 2008-3-22 05:33
这个我来发把...电脑刚恢复...测试下

作者: 禾西    时间: 2008-3-22 05:49
如果可以……順手把「領隊更換系統」那個也發了吧。現在站上的那個有bug。
作者: 零度·幻    时间: 2008-3-22 05:57
发布完毕 VIP+4
地址 http://rpg.blue/web/shownews.asp?id=1027


以下引用禾西于2008-3-21 21:49:11的发言:

如果可以……順手把「領隊更換系統」那個也發了吧。現在站上的那個有bug。

PS 请给出更新帖地址..- -||

作者: 禾西    时间: 2008-3-22 06:01
http://rpg.blue/viewthread.php?t ... 3%2D21+21%3A58%3A41


我想問的是技術通用度評級是甚麽東西?
爲甚麼這個只是alias了initialize才兩星,當初寫魔石系統改寫了菜單、gain_weapon等等都有三星??

==a|||
作者: 零度·幻    时间: 2008-3-22 06:04
以下引用禾西于2008-3-21 22:01:33的发言:

http://rpg.blue/viewthread.php?tid=80913&ntime=2008%2D3%2D21+21%3A58%3A41


我想問的是技術通用度評級是甚麽東西?
爲甚麼這個只是alias了initialize才兩星,當初寫魔石系統改寫了菜單、gain_weapon等等都有三星??

==a|||

适用人群占论坛的百分比....当然有一定的感情色彩...只是认为不怎么常用.
如果您认为这样不妥的话 我可以修改的
作者: 禾西    时间: 2008-3-22 06:06
不是……我只是以爲那個是可能發生衝突的評價。
(下次到主站上偷腳本不要再被那個誤導……囧rz)
作者: 星☆龙    时间: 2008-4-30 09:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-4-30 15:17
修改完成。多謝報告~^ ^
現在可以安全使用了!
[LINE]1,#dddddd[/LINE]
這麽巨大的bug都沒有人發現,禾西真的疑問多少人用過這個腳本|||
OTZ
作者: 星☆龙    时间: 2008-5-1 07:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2008-5-2 18:05
唔....夭折游戏《梦之旅》中的设定!!!{/qiang}
作者: 凌冰    时间: 2008-5-3 20:57
以下引用亿万星辰于2008-5-2 10:05:59的发言:

唔....夭折游戏《梦之旅》中的设定!!!

遇到偶像,跪拜
作者: 水晶凌    时间: 2009-6-12 08:00
提示: 作者被禁止或删除 内容自动屏蔽




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