查看: 1870|回复: 2

[已经解决] 如何使未参战队员代替已死亡队员?

[复制链接]
梦石
0
星屑
1065
在线时间
235 小时
注册时间
2016-2-3
回帖
140

开拓者

发表于 2016-5-4 21:48:30 | 显示全部楼层 |阅读模式

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

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

×
测试游戏过程中发现:当队友人数超过四人时,战斗时队友死亡却无法被未参战队员替换,甚至于四人死亡后直接游戏结束(再次吐槽va的基础设定),会使游戏真实性颇失。加之翻了翻前人帖子找到一个已加密的东西,可我破不了...因而再次求助各位。。。
(@Vortur 我看出来你似乎很能找脚本,这个任务还得劳烦你一下)

评分

参与人数 1星屑 +3 收起 理由
Vortur + 3 塞糖

查看全部评分

究极半吊子
《重生学校》同人作:https://rpg.blue/thread-493882-1-1.html
梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2016-5-5 08:15:32 | 显示全部楼层
本帖最后由 Vortur 于 2016-5-5 08:24 编辑

承蒙谬赞,但是在下真的没有什么所谓的脚本阅历。还是→ tseyik  ←才是真正意义上的懂脚本

对于【队友死亡,结束游戏】的判定,在下是因为之前做某游戏时脚本不兼容,故才查找到几个地方,现在只记了个大概:

全局查找【Scene_Gameover】,就能找到所有【判定游戏结束】的脚本,然后修改“if $game_party.all_dead?”这个判定;但是有两个问题:

1.  具体怎么写在下不会

2.  在下记忆里应该是【使用物品】、【战斗画面】和另外一个地方共三处判定“是否要进入【结束画面】”的,但是今天仅查到BattleManager、Game_Interpreter、Scene_Base;这三个分别是 战斗过程的管理器、事件指令的解释器 和 所有场景的父类;跟印象里不一样


  def all_dead?
    super && ($game_party.in_battle || members.size > 0)
  end

这句话是game_party.all_dead?;里面的符号只能读懂一部分,剩下的不懂,整句什么意思也不懂。在下只有一个【常用符号参照表】
表1
%
求余
**
乘方
::
调用常量
+
赋值
==
相等于
!=
不相等于
<=
小于等于
>=
大于等于
&&
and
||
or
!
not

像是这种是什么意思?
:equip




----------
?
条件运算符,必须与“:”一起。
:       
条件运算符,必须与“?”一起。

表达式1 ? 表达式2 : 表达式3
  依照表达式1的计算结果,选择要返回表达式2或表达式3。
  相当于:
  if 表达式1 then 表达式2 else 表达式3 end
----------
1        真时值
2        假时值
如果变量节操是真的的话,那么就把3赋值给a。
a=3 if jiecao == true同a=3 if jiecao

if !tiaojian
   do_something
end
同
unless tiaojian 除非。。。否则就做。。。
   do_something
end
----------

#数组
jiecao = [54,6,9,10]

#调用变量
msgbox jiecao[0]

@变量只在该class内部生效,
基于默认脚本列表,
@wait_count这个变量在【Interpreter】类里有
在【Game_Character】类里也有,在【Scene_Battle】里也有,
3个变量在3个类里用法类似,但是用处不一样。

·【Interpreter】:
这个类可以视为工程里的事件编辑(和执行)器,
事件编辑器里面的各项指令都是对应到这个类里面的方法来的,
这里面的@wait_count是事件的【等待】功能设定的帧数,
整个游戏只有一个。
这个变量可以在事件编辑里面的【脚本】功能里使用(也许还可以在变量赋值里面的【脚本】里使用?)。
其他地方不能使用。

·【Game_Character】:
这是游戏里所有 事件、角色等等“行走图”属性的对象的类,
也就是说,【设置移动路线】里面选好操作对象之后,整个【设置移动路线】窗口里面的指令都在这个类里对应着方法。
这里面的@wait_count指的是【设置移动路线】里面的【等待】功能设定的帧数,
可以在【设置移动路线】里面的【脚本】功能里调用和赋值。
一个【Game_Character】实例对象(角色或者事件)内部有一个这个变量。

·【Scene_Battle】:
这个没有太大的必要解释了,单纯在战斗中作为某些指令的等待事件用的,
一般事件指令不会用到这个

评分

参与人数 1星屑 +100 收起 理由
丿梁丶小柒 + 100 我很赞同

查看全部评分

【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复

使用道具 举报

梦石
0
星屑
1461
在线时间
815 小时
注册时间
2013-8-3
回帖
355
发表于 2016-5-5 08:55:25 | 显示全部楼层
这个脚本或许能帮到你。
点击这里[pre lang="ruby"]$imported = {} if $imported.nil?

$imported["Sub_Party"] = true

#==============================================================================

# 全灭后待机成员参战 v1.2

#------------------------------------------------------------------------------

#    2015.05.31 by 企鹅达达

#    2015.06.03 修正事件扣血时不更换队员的bug

#    2015.06.04 防止整队类脚本对为加入队伍的成员调用draw_actor_simple_status等出错

#==============================================================================

#       如题,这个脚本的功能就是让非战斗人员按照序号编成小队,全灭后一个小队一个

#   小队上场战斗。嗯,感觉不是很好用,反正是自用的╮(╯_╰)╭

#       用这个脚本建议把濒死设置成战斗后解除,这样可以避免某些小队战斗

#   时空了一些死掉的队员。

#       顺带一提这脚本和战斗中整队、战斗中添加成员(比如召唤)类型的脚本天生不对头,

#   如果因为这些原因报错,本人也无能为力了 ← ←

#==============================================================================


#参战时显示的信息,可以使用转义符,%s取代角色名。

#    JION_MESSAGE = "\ec[6]%s\ec[0] 参战!"


#如果不想要这个信息,可以设置为 nil

#    JION_MESSAGE = nil


JION_MESSAGE = "%s 参战!"


# 在菜单里显示的名字,SUB_PARTY_NAME里没有的话会用下面的SUB_PARTY_DEFAULT_NAME


SUB_PARTY_SHOW_IN_MENU = true


SUB_PARTY_NAME = [" "," ",]


SUB_PARTY_DEFAULT_NAME = "候补小队"



#==============================================================================

# ■ Game_Battler

#------------------------------------------------------------------------------

#  处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。

#==============================================================================


class Game_Battler < Game_BattlerBase

  attr_accessor :battle_formation_order          #队伍顺序标记

  #--------------------------------------------------------------------------

  # ● 保存队伍顺序

  #--------------------------------------------------------------------------

  def save_battle_formation_order

    @battle_formation_order = index

  end

  #--------------------------------------------------------------------------

  # ● 行动结束

  #--------------------------------------------------------------------------

  alias sub_party_on_action_end on_action_end

  def on_action_end

    sub_party_on_action_end

    while $game_party.all_dead?

      break if $game_party.sub_party_now >= $game_party.sub_party_max

      $game_party.sub_party_jion_battle

    end

  end

end

#==============================================================================

# ■ Game_Party

#------------------------------------------------------------------------------

#  管理队伍的类。保存有金钱及物品的信息。本类的实例请参考 $game_party 。

#==============================================================================

class Game_Party < Game_Unit

  attr_accessor :sub_party_now          #参战分队编号

  attr_accessor :sub_party_max          #参战分队最大编号

  #--------------------------------------------------------------------------

  # ● 战斗开始处理

  #--------------------------------------------------------------------------

  def sub_party_jion_battle

    @sub_party_now += 1

    max_battle_members.times do |i|

      next if all_members[ max_battle_members * @sub_party_now + i ].nil?

      next if all_members[ max_battle_members * @sub_party_now + i ].dead?

      swap_order( i, max_battle_members * @sub_party_now + i)

      if JION_MESSAGE

#       BattleManager.log_window.add_text(sprintf(JION_MESSAGE, $game_party.all_members.name))

#       BattleManager.log_window.abs_wait(90)

        $game_message.add(sprintf(JION_MESSAGE, $game_party.all_members.name))

        BattleManager.wait_for_message

      end

    end

  end

  #--------------------------------------------------------------------------

  # ● 队伍顺序恢复

  #--------------------------------------------------------------------------

  def sub_party_reset_order

    @actors.sort! {|a, b|$game_actors[a].battle_formation_order <=> $game_actors.battle_formation_order }
  end

  #--------------------------------------------------------------------------

  # ● 保存队伍顺序

  #--------------------------------------------------------------------------

  def sub_party_save_order

    all_members.each do |member|

      member.save_battle_formation_order

    end

  end

  #--------------------------------------------------------------------------

  # ● 初始化参战分队信息,顺带让第一个有成活队员的分队上阵。

  #--------------------------------------------------------------------------

  def make_sub_party

    @sub_party_now = 0

    @sub_party_max = all_members.size / max_battle_members
    @sub_party_max -= 1 if all_members.size == max_battle_members * @sub_party_max

    while battle_members.select {|member|member.alive?}.empty?

      break if @sub_party_now >= @sub_party_max

      sub_party_jion_battle

    end

  end

  #--------------------------------------------------------------------------

  # ● 战斗开始处理

  #--------------------------------------------------------------------------

  alias sub_party_on_battle_start on_battle_start

  def on_battle_start

    sub_party_save_order

    make_sub_party

    sub_party_on_battle_start

  end

  #--------------------------------------------------------------------------

  # ● 战斗结束处理

  #--------------------------------------------------------------------------

  alias sub_party_on_battle_end on_battle_end

  def on_battle_end

    sub_party_reset_order

    sub_party_on_battle_end

  end

end

#==============================================================================

# ■ Game_Interpreter

#------------------------------------------------------------------------------

#  事件指令的解释器。

#   本类在 Game_Map、Game_Troop、Game_Event 类的内部使用。

#==============================================================================


class Game_Interpreter

  #--------------------------------------------------------------------------

  # ● 增减 HP                   v 1.1更新

  #--------------------------------------------------------------------------

  def command_311

    value = operate_value(@params[2], @params[3], @params[4])

    iterate_actor_var(@params[0], @params[1]) do |actor|

      next if actor.dead?

      actor.change_hp(value, @params[5])

      actor.perform_collapse_effect if actor.dead?

    end

    ##############################################

    if SceneManager.scene_is?(Scene_Battle)

      while $game_party.all_dead?

        break if $game_party.sub_party_now >= $game_party.sub_party_max

        $game_party.sub_party_jion_battle

      end

    end

    ##############################################

    SceneManager.goto(Scene_Gameover) if $game_party.all_dead?

  end

  #--------------------------------------------------------------------------

  # ● 更改状态                   v 1.1更新

  #--------------------------------------------------------------------------

  alias sub_party_command_313 command_313

  def command_313

   sub_party_command_313

    ##############################################

    if SceneManager.scene_is?(Scene_Battle)

      while $game_party.all_dead?

        break if $game_party.sub_party_now >= $game_party.sub_party_max

        $game_party.sub_party_jion_battle

      end

    end

    ##############################################

  end

end

if SUB_PARTY_SHOW_IN_MENU

#==============================================================================

# ■ Window_Base

#------------------------------------------------------------------------------

#  游戏中所有窗口的父类

#==============================================================================

class Window_Base < Window

  #--------------------------------------------------------------------------

  # ● 绘制分队名

  #--------------------------------------------------------------------------

  def draw_actor_sub_party(actor, x, y, width = 112)

    return if actor.index.nil?                           #   v1.2修改

    change_color(system_color)

    sub_party_index = actor.index / $game_party.max_battle_members

    text = SUB_PARTY_NAME[sub_party_index].nil? ? SUB_PARTY_DEFAULT_NAME : SUB_PARTY_NAME[sub_party_index]

    draw_text(x, y, width, line_height, text)

    change_color(normal_color)

  end

  #--------------------------------------------------------------------------

  # ● 绘制简单的状态

  #--------------------------------------------------------------------------

  alias sub_party_draw_actor_simple_status draw_actor_simple_status

  def draw_actor_simple_status(actor, x, y)

    sub_party_draw_actor_simple_status(actor, x, y)

    draw_actor_sub_party(actor, x-108, y+56)

  end

end


#encoding:utf-8

#==============================================================================

# ■ Window_Status

#------------------------------------------------------------------------------

#  显示队伍成员状态的窗口

#==============================================================================


class Window_Status < Window_Selectable

  #--------------------------------------------------------------------------

  # ● 绘制基本区域

  #--------------------------------------------------------------------------

  alias sub_party_draw_basic_info draw_basic_info

  def draw_basic_info(x, y)

    sub_party_draw_basic_info(x, y)

    draw_actor_sub_party(@actor, x -132, y+72, 100)

  end

end


end # if SUB_PARTY_SHOW_IN_MENU
[/pre]

点评

效果虽然跟我的设想有些差距,不过完全可以接受非常感谢!  发表于 2016-5-5 11:53

评分

参与人数 1梦石 +1 收起 理由
丿梁丶小柒 + 1 认可答案

查看全部评分


【同人游戏】勇者斗恶龙TG
欢迎加入游戏测试群333599798
如有需私聊请加QQ:516425000
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部