查看: 3272|回复: 7

[原创发布] 【VA】地形效果系统

[复制链接]
梦石
0
星屑
5901
在线时间
1145 小时
注册时间
2013-7-8
回帖
1850

极短23参与

发表于 2022-8-30 12:52:53 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 我是大仙 于 2022-8-30 12:56 编辑

该脚本用来实现在不同的地形环境下战斗会产生不同的地形效果。
如图所示:
intro1.png


使用方法

直接举例:
首先预留一个变量为设定地形信息所用,这个可以直接在脚本中设置,脚本中有备注。
如果你想设计一个“草原效果”,先在“数据库-技能”中随便选一个技能位置(譬如15号技能),在它的备注中写入:
@p[内容]
@r[内容][内容]
@s[内容]

@p[]的[]中的内容指的是:要显示地形介绍的图片的文件名,其保存在游戏内“Pictures”文件夹下。例如要显示草原的地形介绍图,那么你自制一个草原介绍图,然后这个图片的文件名叫“grassland”,那么这里就写入@p[grassland]

@r[][]的[][]中,前一个[]写入“a”、“w”或者“e”。“a”代表地形效果对全体单位生效(敌我双方),“w”代表仅对我方单位生效,“e”代表仅对敌人生效。后一个[]中的内容为数字,代表生效的人数,譬如@r[w][2]代表“对我方随机的两名单位生效”,如果你想对全体单位生效只需要把后一个[]的内容写得大于我方单位人数就行了,比如@r[a][8],因为我方团队中最多有四个人,敌群人数最多有七个(VA默认)所以就实现了“对所有单位生效”。如果写入“0”则没有意义。

@s[]的[]中的内容指的是:状态ID,通常情况下,效果是由给单位添加状态实现的,这里是指定状态的ID,譬如@s[5],那就是给某些单位添加5号状态。

举例:
@p[sonwfield]
@r[w][1]
@s[8]
在战斗开始时候显示“snowfield”,然后给我方随机的一个单位添加8号状态。
这就是工作原理。

设置地形有两种方法,一种是直接指定,另一种是选择区域指定。
直接指定:直接指定就是在设置战斗前,把预留的用来指定地形信息的变量的值设定为对应效果的技能ID,譬如1号变量用来指定信息,15号技能的备注里有设置的地形效果,那就在事件操作中令1号变量的值为15,想改变地形效果只需要改变1号变量的值即可。

区域指定:在该脚本编辑页面中,有备注的两个数组用来设定区域地形效果,请保证两个数组内的元素的数量一样,数组内“区域编号”和“地形效果”一一对应。
在地图设定中,如果有设定在某个区块遇敌的事件,那么当到那个区块的时候就会触发对应的遇敌效果。

样品展示
样品内的图像为自制,其用到的素材来源于百度百科,仅供参考,请千万不要将这些图片用于你的游戏中。
intro1.jpg
intro2.jpg
intro3.jpg
intro4.jpg
intro.jpg
intro5.jpg


特殊的地形使用方法:
如果你想增加额外的不只是通过添加状态来实现的效果,可以在对应技能备注里写上@sp[内容],这里的“内容”为数字,分别对应个性化的特殊效果,这里可以用脚本编辑,样品中之举例性地展示了一个。



脚本内容
[pre lang="ruby"]#==============================================================================
# ■ Terrain_Function
#------------------------------------------------------------------------------
#  地形效果:在不同的地形,获得不同的战斗加成,此加成主要由给单位添加状态实现。
#   也有一些特殊的地形效果,通过脚本实现。
#------------------------------------------------------------------------------
#   使用方法:在“数据库”的“技能”里预留几个需要产生地形效果的技能编辑框。
#   需要使用通常方式实现地形效果时,在对应地形效果的技能的备注里输入:
#   @p[]    在这里,[]中的内容为需要显示的图片的文件名
#
#   @r[][]  在这里,第一个[]中的内容为效果范围:“a”表示对敌我双方生效“w”表示对
#   我方单位生效,“e”表示对敌方单位生效。
#   第二个[]中的内容是随机生效的单位数量。
#   例如:@r[w][2]表示对我方随机的两个存活单位生效
#   
#   @s[]    在这里,[]中的内容为需要添加状态的ID编号。
#
#   直接指定战斗的场合,需要在战斗前把设储存地形信息变量的值设置为对应地形的技能ID。
#   区块内随机遇敌的场合,区块编号和遇敌变量的数组内元素个数要保持一致。
#
#------------------------------------------------------------------------------
#   本脚本适用于RPG Maker Vx Ace
#   使用可以注明出处或者不注明
#------------------------------------------------------------------------------
#   我是大仙
#   2022.8.29
#
#==============================================================================


module TerrainFunction
  #是否启用地形效果
  UseFunction = true
  #储存地形信息的变量编号:
  TerrainVariables = 1
  #是否在启用地形效果时显示介绍地形效果的图片
  TerrainDisplay = true
  #显示地形信息的图片编号:
  PictrueCode = 1
  #所有地形效果的技能ID:
  #AllFunction = [15,16,17,18]#此处,你可以添加技能ID,来实现对应地形效果
  
  #全部有地形效果的区块
  Square = [1,2,3,4]
  #对应区块的效果
  SquareFunction = [15,16,17,18]
end


#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
#==============================================================================

class Game_Battler < Game_BattlerBase
  
  #--------------------------------------------------------------------------
  # ● 强制附加状态
  #--------------------------------------------------------------------------
  def force_add_state(state_id)
    #if state_addable?(state_id)
      add_new_state(state_id) unless state?(state_id)
      reset_state_counts(state_id)
      @result.added_states.push(state_id).uniq!
    #end
  end
end
#==============================================================================
# ■ Game_Unit
#------------------------------------------------------------------------------
class Game_Unit
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :in_battle                 # 战斗中的标志
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    @in_battle = false
    @r = ""
    @num = 0
    @s = 0
    @sp = 0
  end
  #--------------------------------------------------------------------------
  # ● 战斗开始时启用特别效果
  #--------------------------------------------------------------------------  
  def call_special_function  
    display_pictures if TerrainFunction::TerrainDisplay
    apply_function
    apply_special_function
  end
  #--------------------------------------------------------------------------
  # ● 以下均用于显示地形效果的图片
  #--------------------------------------------------------------------------   
  def display_pictures  
    picture
    show_picture
  end  
  
  def picture
    $game_troop.screen.pictures[TerrainFunction::PictrueCode]
  end
   
  def show_picture
    $game_troop.screen.pictures[TerrainFunction::PictrueCode].show(terrain_name, 0,
      0, 0, 100, 100, 255, 0)
  end
   
  def picture_erase  
    picture.erase
  end  
  
  def get_terrain
    $data_skills[$game_variables[TerrainFunction::TerrainVariables]]
  end
  
  def terrain_name
    if /@n\[(\w+?)\]/i =~ get_terrain.note
      return $1
    end
  end
  #--------------------------------------------------------------------------
  # ● 应用效果
  #--------------------------------------------------------------------------
  def judge
    if get_terrain.note =~ /@r\[(\w+?)\]\[(\d+?)\]/i
      @r = $1
      @num = $2.to_i
    end
  end
  def judge_state
    if /@s\[(\d+?)\]/i =~ get_terrain.note
      return @s = $1.to_i
    end
  end
  def judge_special
    if /@sp\[(\d+?)\]/i =~ get_terrain.note
      @sp = $1.to_i
    end
  end
  def apply_function
    judge
      if @r == "a"
        judge_state
        apply_all
      elsif @r == "w"
        judge_state
        apply_we
      elsif @r == "e"
        judge_state
        apply_enemies
      else
        return
      end
  end
  
  def apply_all
    apply_we
    judge
    apply_enemies
  end
  
  def apply_we
    if @num != 0
    @num = $game_party.alive_members.length if @num > $game_party.alive_members.length
    has_num = []
    $game_party.alive_members.each do |actor|
      has_num.push(actor.index)
    end
      while @num > 0
        @num -= 1
        ra = has_num.length
        nnl = rand(ra)
        ran_dom = has_num[nnl]
        $game_party.alive_members[ran_dom].force_add_state(@s)
        has_num.delete_at(nnl)
      end
    end
   
  end

  def apply_enemies
    if @num != 0
    @num = $game_troop.alive_members.length if @num > $game_troop.alive_members.length
    has_num = []
    $game_troop.alive_members.each do |enemy|
      has_num.push(enemy.index)
    end
      while @num > 0
        @num -= 1
        ra = has_num.length
        nnl = rand(ra)
        ran_dom = has_num[nnl]
        $game_troop.alive_members[ran_dom].force_add_state(@s)
        has_num.delete_at(nnl)
      end
    end
  
  end
  
  #--------------------------------------------------------------------------
  # ● 应用特别的效果
  #--------------------------------------------------------------------------
  def apply_special_function
    judge_special
    if @sp == 1
      $game_party.alive_members.each do |magician|
        magician.mp = magician.mmp if magician.class_id > 6  
      end
    else
      return
    end
  end

end

#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  处理玩家人物的类。拥有事件启动的判定、地图的卷动等功能。
#   本类的实例请参考 $game_player 。
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 执行遇敌处理
  #--------------------------------------------------------------------------
  def encounter
    return false if $game_map.interpreter.running?
    return false if $game_system.encounter_disabled
    return false if @encounter_count > 0
    make_encounter_count
    set_terrain_function
    troop_id = make_encounter_troop_id
    return false unless $data_troops[troop_id]
    BattleManager.setup(troop_id)
    BattleManager.on_encounter
    return true
  end
  
  #--------------------------------------------------------------------------
  # ● 检测所处的地形标志
  #--------------------------------------------------------------------------
  def terrain_tag_select
    x = @x
    y = @y
    return $game_map.region_id(x, y)
  end
  #--------------------------------------------------------------------------
  # ● 设置对应的地形效果
  #--------------------------------------------------------------------------
  def set_terrain_function
    ncc = terrain_tag_select - 1
    value = TerrainFunction::SquareFunction[ncc]
    $game_variables[TerrainFunction::TerrainVariables] = value
  end
end


#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  战斗画面
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 指令“战斗”
  #--------------------------------------------------------------------------
  def command_fight
    next_command
    picture_erase
  end
  #--------------------------------------------------------------------------
  # ● 指令“撤退”
  #--------------------------------------------------------------------------
  def command_escape
    picture_erase
    turn_start unless BattleManager.process_escape
  end
  
  
  def picture_erase
    $game_troop.picture_erase
  end
end

#--------------------------------------------------------------------------
# ● BattleManager
#--------------------------------------------------------------------------
module BattleManager
  #--------------------------------------------------------------------------
  # ● 战斗开始
  #--------------------------------------------------------------------------
  def self.battle_start
    $game_system.battle_count += 1
    $game_party.on_battle_start
    $game_troop.on_battle_start
    $game_party.call_special_function if TerrainFunction::UseFunction
    $game_troop.enemy_names.each do |name|
      $game_message.add(sprintf(Vocab::Emerge, name))
    end
    if @preemptive
      $game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
    elsif @surprise
      $game_message.add(sprintf(Vocab::Surprise, $game_party.name))
    end
    wait_for_message
  end
end[/pre]


如果这个脚本没有BUG的话,我会把它移植到RMMZ上去。


范例:链接:https://pan.baidu.com/s/1xKFnPI6UjywaeDPb1gQWIA
提取码:meme

评分

参与人数 3星屑 +50 赞 +3 收起 理由
xhei101 + 1 我很赞同
寂静的夜里 + 50 + 1 支持原创
alexncf125 + 1 塞糖

查看全部评分

梦石
2
星屑
13779
在线时间
2319 小时
注册时间
2011-6-4
回帖
586
发表于 2022-8-30 14:11:34 | 显示全部楼层
发动星球改造

点评

康啵!魔宫的贿赂。  发表于 2022-8-30 15:18
回复

使用道具 举报

职业の水客

梦石
2
星屑
16983
在线时间
7496 小时
注册时间
2010-6-16
回帖
3463

极短27评委MZ评测员极短26评委开拓者

发表于 2022-8-30 16:38:51 | 显示全部楼层
移植的话能否支持一下MV
游戏开发工具集,一站式AI生图+图片完美像素化及相关处理网站。
群爆炸重建后状态:论坛老人最多(只剩下了活跃的老人),技术力很强(依旧不变)的编程灌水群:901540785
专门讨论RM相关的Q群:56875149
PS:第一个群不是专门讨论RM的,第二个才是哦。
PS2:接受MV/MZ插件定制(QQ763992443)
回复

使用道具 举报

梦石
0
星屑
5901
在线时间
1145 小时
注册时间
2013-7-8
回帖
1850

极短23参与

 楼主| 发表于 2022-8-30 19:49:31 | 显示全部楼层
寂静的夜里 发表于 2022-8-30 16:38
移植的话能否支持一下MV


我没有用过MV,不知道MV的相关部分是怎么样命名的,如果在脚本中修改的部分中,MZ和MV的变量名或者方法名等用的是一致的,应该就可以兼容。
MV和MZ好像都是用JavaScript编写插件的,说不定MV可以直接用这个MZ的脚本。
回复

使用道具 举报

梦石
0
星屑
26087
在线时间
1595 小时
注册时间
2016-1-6
回帖
3441

超评测参与极短28参与极短27参与极短26参与极短25参与

发表于 2022-8-31 00:12:35 | 显示全部楼层
本帖最后由 plain666 于 2022-8-31 00:15 编辑

功能真强大啊,有一种东道主的感觉。

点评

功能真强大啊,有一种东道主的感觉。  发表于 2022-8-31 00:13
回复

使用道具 举报

梦石
0
星屑
250
在线时间
35 小时
注册时间
2022-6-10
回帖
3
发表于 2022-10-31 18:55:47 | 显示全部楼层
感觉就像宝可梦里边的场地技能(青草场地薄雾场地……),值得一用
大学社团同人部合作RPG作品制作中……
自制游戏目前暂时搁置中,《亚瑟的巡礼》有意从头开始重新制作中,敬请期待。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部