设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 57|回复: 0

[转载发布] Advanced Map Encounters

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    前天 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    4471

    主题

    864

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    22949
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    28314

    灌水之王

    发表于 3 天前 | 显示全部楼层 |阅读模式
    This script allows you to assign something that always bothered me that was not in the RPG maker by default: Make on a map some enemy encounters more likely than others. There are other scripts that fix this, but I wanted to make one simple and as intuitive as possible, apart from putting some unique things on it.

    The map encounters still work basically as always, I simplified the encounter formula (now it's a bit more random when you will encounter them, but just as likely after all), but the important thing is that you can assign encounters by hand using an event controlling the steps necessary for that meeting. Allowing encounters or not also works the same, as does pressing CTRL in Debug mode.

    Author: Wecoc
    First Release: October 2016
    Last Version: November 2017

    Terms of use
    - Giving credits (Wecoc) is optional, but appreciated.
    - You can repost this code.
    - You can edit this code freely, and distribute the edits as well.
    - This code can be used on commercial games.

    Script

                    Ruby:        
    1. #==============================================================================
    2. # ** Advanced Map Encounters v1.2
    3. #------------------------------------------------------------------------------
    4. #  Author: Wecoc - No credits required
    5. #==============================================================================
    6. #==============================================================================
    7. # ** RPG encounter rates
    8. #==============================================================================
    9. module RPG
    10.   for Klass in [Actor, Item, Weapon, Armor, State]
    11.     class Klass
    12.       attr_accessor :encounter_rate
    13.       define_method(:encounter_rate) { @encounter_rate ||= 1.0}
    14.     end
    15.   end
    16. end
    17. #==============================================================================
    18. # ** Game_Actor
    19. #==============================================================================
    20. class Game_Actor < Game_Battler
    21.   def encounter_rate
    22.     result = $data_actors[@actor_id].encounter_rate
    23.     weapon = $data_weapons[@weapon_id]
    24.     armor1 = $data_armors[@armor1_id]
    25.     armor2 = $data_armors[@armor2_id]
    26.     armor3 = $data_armors[@armor3_id]
    27.     armor4 = $data_armors[@armor4_id]
    28.     result *= weapon.encounter_rate if weapon != nil
    29.     result *= armor1.encounter_rate if armor1 != nil
    30.     result *= armor2.encounter_rate if armor2 != nil
    31.     result *= armor3.encounter_rate if armor3 != nil
    32.     result *= armor4.encounter_rate if armor4 != nil
    33.     for state in @states
    34.       state = $data_states[state]
    35.       result *= state.encounter_rate if state != nil
    36.     end
    37.     return result
    38.   end
    39. end
    40. #==============================================================================
    41. # ** Game_Map
    42. #==============================================================================
    43. class Game_Map
    44.   attr_reader :encounters
    45.   #--------------------------------------------------------------------------
    46.   # * Setup
    47.   #--------------------------------------------------------------------------
    48.   alias adv_encounter_setup setup unless $@
    49.   def setup(map_id)
    50.     adv_encounter_setup(map_id)
    51.     @encounters = []
    52.     # Define the default map encounters
    53.     encounter_list = @map.encounter_list
    54.     encounter_steps = @map.encounter_step * encounter_list.size
    55.     for troop_id in encounter_list
    56.       set_encounter(troop_id, encounter_steps, nil)
    57.     end
    58.   end
    59.   #--------------------------------------------------------------------------
    60.   # * Clear default encounter list
    61.   #--------------------------------------------------------------------------
    62.   def encounter_list
    63.     return []
    64.   end
    65.   #--------------------------------------------------------------------------
    66.   # * Clear steps for default encounter
    67.   #--------------------------------------------------------------------------
    68.   def encounter_step
    69.     return 0
    70.   end
    71.   #--------------------------------------------------------------------------
    72.   # * Set new encounter
    73.   #--------------------------------------------------------------------------
    74.   def set_encounter(troop_id, steps, area=nil)
    75.     steps = [[1, steps].max, 999].min
    76.     @encounters.push([troop_id, 1.0 / steps, area])
    77.     @encounters.uniq!
    78.     @encounters.sort!{|b,a| b[1] - a[1]}
    79.   end
    80.   #--------------------------------------------------------------------------
    81.   # * Clear encounter
    82.   #--------------------------------------------------------------------------
    83.   def clear_encounter(troop_id, steps, area=nil)
    84.     steps = [[1, steps].max, 999].min
    85.     @encounters.delete!([troop_id, 1.0 / steps, area])
    86.   end
    87. end
    88. #==============================================================================
    89. # ** Game_Player
    90. #==============================================================================
    91. class Game_Player < Game_Character
    92.   #--------------------------------------------------------------------------
    93.   # * Increase steps
    94.   #--------------------------------------------------------------------------
    95.   alias adv_encounter_steps increase_steps unless $@
    96.   def increase_steps
    97.     adv_encounter_steps
    98.     return if $DEBUG && Input.press?(Input::CTRL)
    99.     return if $game_system.encounter_disabled == true
    100.     rate = 1.0
    101.     for actor in $game_party.actors
    102.       rate *= actor.encounter_rate
    103.     end
    104.     for i in 1...$data_items.size
    105.       if $game_party.item_number(i) > 0
    106.         $game_party.item_number(i).times do
    107.           rate *= $data_items[i].encounter_rate
    108.         end
    109.       end
    110.     end
    111.     return if rate == 0
    112.     $game_map.encounters.each do |encounter|
    113.       get_encounter_data(encounter, rate)
    114.       return if $game_temp.battle_calling
    115.     end
    116.   end
    117.   #--------------------------------------------------------------------------
    118.   # * Evaluate the info on each encounter
    119.   #--------------------------------------------------------------------------
    120.   def get_encounter_data(encounter, rate)
    121.     troop_id = encounter[0]
    122.     return if $data_troops[troop_id] == nil
    123.     ratio = encounter[1] * (1.0 / rate)
    124.     encounter_area = encounter[2]
    125.     if Game_Player.method_defined?(:area) && encounter_area != nil
    126.       next if self.area != encounter_area
    127.     end
    128.     if rand < ratio
    129.       # Empezar batalla
    130.       $game_temp.battle_calling = true
    131.       $game_temp.battle_troop_id = troop_id
    132.       $game_temp.battle_can_escape = true
    133.       $game_temp.battle_can_lose = false
    134.       $game_temp.battle_proc = nil
    135.     end
    136.   end
    137. end
    138. #==============================================================================
    139. # ** Game_Temp
    140. #==============================================================================
    141. class Game_Temp
    142.   attr_accessor :force_battleback
    143.   alias area_battleback_ini initialize unless $@
    144.   def initialize
    145.     area_battleback_ini
    146.     @force_battleback = false
    147.   end
    148. end
    149. #==============================================================================
    150. # ** Game_Map (Battleback Areas)
    151. #==============================================================================
    152. class Game_Map
    153.   
    154.   BATTLEBACK_AREAS = {} # {AREA ID => 'BATTLEBACK NAME'}
    155.   
    156.   def battleback_name
    157.     return @battleback_name if $game_temp.force_battleback == true
    158.     area = $game_player.area rescue 0
    159.     battleback_area = BATTLEBACK_AREAS[area]
    160.     return battleback_area if !battleback_area.nil?
    161.     return @battleback_name
    162.   end
    163. end
    复制代码



    Instructions
    To set an encounter from an event use:
    $game_map.set_encounter(Troop ID, Steps)(Steps must be between 1 and 999)

    If that encounter is already defined and you want to remove it, use:
    $game_map.clear_encounter(Troop ID, Steps)

    Spoiler: Area
    If you are using Area Support, you can assign encounters by area.
    $game_map.set_encounter(Troop ID, Steps, Area ID)

    You can also assign battlebacks by area.

    To do that, search this line:
    1. BATTLEBACK_AREAS = {}
    复制代码

    And set the battleback there by area ID, like this:
    1. BATTLEBACK_AREAS = {1 => '001-Grassland01'}
    复制代码

    Finally, you can control in-game if that's being considered or if you want to use the default battleback. To do that use:
    $game_temp.force_battleback = true / false
    Spoiler: Encounter rate
    You can set encounter rates on certain actors, items, weapons, protectors or states.

    $data_actors[ID].encounter_rate = 1.0
    $data_items[ID].encounter_rate = 1.0
    $data_weapons[ID].encounter_rate = 1.0
    $data_armors[ID].encounter_rate = 1.0
    $data_states[ID].encounter_rate = 1.0
    Spoiler: Encounter conditions
    This little Addon allows defining some advanced encounter conditions.

                    Ruby:        
    1. #==============================================================================
    2. # ** [XP] Encounter Conditions
    3. #------------------------------------------------------------------------------
    4. # Author: Wecoc (no credits required)
    5. # This script requires the script Advanced Map Encounters
    6. #==============================================================================
    7. class Game_Map
    8.   def set_encounter(troop_id, steps, area=nil, condition=nil)
    9.     steps = [[1, steps].max, 999].min
    10.     @encounters.push([troop_id, 1.0 / steps, area, condition])
    11.     @encounters.uniq!
    12.     @encounters.sort!{|b,a| b[1] - a[1]}
    13.   end
    14.   def clear_encounter(troop_id, steps, area=nil, condition=nil)
    15.     steps = [[1, steps].max, 999].min
    16.     @encounters.delete!([troop_id, 1.0 / steps, area, condition])
    17.   end
    18. end
    19. class Game_Player
    20.   alias condition_encounter_data get_encounter_data unless $@
    21.   def get_encounter_data(encounter, rate)
    22.     if encounter[3] != nil
    23.       return if eval(encounter[3]) == false
    24.     end
    25.     condition_encounter_data(encounter, rate)
    26.   end
    27. end
    复制代码


    It works as before, but with a new optional argument on the callers:
    $game_map.set_encounter(Troop ID, Steps, Area, Condition)

    Example:
    1. $game_map.set_encounter(1, 20, nil, "$game_switches[1] == true")
    复制代码


    本贴来自国际rpgmaker官方论坛作者:Wecoc处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/advanced-map-encounters.139675/
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-14 17:57 , Processed in 0.087557 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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