查看: 1068|回复: 48

[有事请教] 三个问题

[复制链接]
梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
发表于 2026-5-13 09:42:13 | 显示全部楼层 |阅读模式

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

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

×
1,敌人召唤
BOSS可以无限召唤小兵,不用敌人出现,因为死了就没了,重新复活不符合召唤的定义,而且可以召唤任意列表里的怪物

2,直接增加攻击力

带上饰品直接增加N点攻击力,默认只能增加百分比,而且是状态法

3,空中楼阁

做一个空中浮现人物半身像,若隐若现,图片半透明好像效果不太好,一个半身浮现在云层,要有如梦似幻的感觉
退隐....
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-5-13 11:56:49 | 显示全部楼层
召唤敌人/随机种类的敌人 并不难, 用中途出现就可以做, 随机种类的也一样, 只是中途出现之前把对应位置的敌人替换成另一个即可

"无限召唤", 除非你敌人死后会留下尸体, 否则一样可以用"隐藏-全恢复-中途出现" 的方法"把死掉的敌人当做新的再次召唤", 不过这样做不会增加对应经验和战利品就是了, 笑

要真正的无限召唤有点麻烦, 主要是因为"需要一个坐标来摆放敌人", 毕竟敌人的坐标是在数据库敌群里设置好的, 如果想要"无中生有", 那你要先制定召唤位置的坐标规则

解决了坐标问题, 还有系统默认"敌人上限为8个", 有些处理会定死在8个上限, 想要无限, 那还要把这些限制取消了, 否则超过8个的敌人可能不会行动, 至于在哪里解除限制, 那要看你用了多少脚本喽,笑


49.gif
像咱这种, 只要地图有空格就可以召唤, 因为可以直接获取坐标

50_compress.gif
默认战斗, 召唤就只能放在已经设置好的坐标上了, 即使我也有把战场分格子, 但是数量肯定也不如战棋多, 笑, 考虑到牵扯的地方不少,我并没有突破8个限制(而且会留下尸体, 所以也不会重复召唤)


点评

这个是蜂窝, 挨打就会召唤一只蜜蜂, 轮到行动又会召唤一只  发表于 2026-5-13 15:45
战利品是有点难了,万一召唤来的是上古魔王,杀死了没有战利品,亏大了  发表于 2026-5-13 12:53
难怪数字哥不发表作品,全是干货,不知道他得到你多少真传,这个树妖还有表情  发表于 2026-5-13 12:49
8个就够了,无限召唤也就是个噱头,我是说可以召唤怪物列表里的任意怪才是重点  发表于 2026-5-13 12:47
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-5-13 12:14:12 | 显示全部楼层
2, 一样到数据库里改参数就行了,  在 game actor 这个脚本里, 找到 def base_atk  ,然后把里面的内容改成
a = weapon != nil ? weapon.atk : 0    #这个0你可能有改动过, 像"空手也会有攻击力"这类的会修改这个0
a += 10086 if @armor4_id == 10086  #想用饰品判断就这样写, 想用状态就 state?(10086) 当然也可以一起用, 也可以后面再加其他判断
reteurn a

当然, 这个是初级修改, 设置是定死的, 想开放型设置, 就要考虑用其他手段获得额外参数了, XP的数据库没有备注栏, 这点灵活性不足(不用数据库解君愁, 笑)

未标题-1.jpg
例如, 像我之前说的词条法, 笑

3, 想要效果好就去用事件踏步循环一个动态图片就行了呗

如果想在战斗界面表演, 那就用状态动画(位置为画面)就行了, 你不是用了多重状态动画脚本了么

点评

状态也不行,死活不行啊  发表于 2026-5-13 18:56
如果你改那个0让空手也有攻击力, 那就证明位置没错, 去核对装备ID是否一致吧  发表于 2026-5-13 18:55
饰品是4,但没用,已经找最下面的修改了,也加了reteurn a 你还多打了一个e,也没用啊,烦躁啊,倒是空手有攻击力倒是有用了。  发表于 2026-5-13 18:51
另外,如果无效,那可能是你有其他地方覆盖了,毕竟这里是热门修改点, 笑, 全局搜索 def base_atk 找到最下面的那个去改  发表于 2026-5-13 18:39
a += 10086 if @armor1_id == 10086 , 第一个10086是增加的攻击力数值,第二个是饰品ID  发表于 2026-5-13 18:34
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-5-13 16:03:43 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2026-5-13 16:17 编辑

class Interpreter
  def 召唤(*val)
    return true if (a = $game_troop.enemies.find{|i| i.hidden}).nil?
    b = val[rand(val.size)] ;a.transform(b) ;a.hidden = false
    a.recover_all ;return false
  end
end

把这个脚本塞到main前,  然后敌人召唤技能附带公共事件,  事件内容
条件分歧: 脚本: 召唤(1,2,3,4,5,6)
  显示文章: 召唤失败
end

这样, 敌人使用召唤技能的时候, 就会从 ID1,2,3,4,5,6 里随机抽取 (也可以  1,1,1,1,2,2,3,4,5 这样写就可以增加召唤1号敌人的概率)

另外如果使用这个技能的时候 , 队伍里没有"中途出现"的敌人, 会使用失败, 失败要怎么表演, 就在条件分歧里写就行了


如果想要死掉的敌人也可以"让位来召唤"

那在上面的公共事件的条件分歧上面, 加上脚本: $game_troop.enemies.each{|i| i.hidden = true if i.dead?}   #一行写不下就从 |i| 后面换行

点评

我的Interpreter被我替换过了,和你的召唤不兼容,我发在7楼了,应该是冲突了  发表于 2026-5-13 18:10
你有没有群啊,这里不方便截图  发表于 2026-5-13 17:57
插进去出错了 ,第三行什么什么的  发表于 2026-5-13 17:55
没坑了不就召唤失败了  发表于 2026-5-13 17:54
为啥还有召唤失败的情况,理论上有一个坑就可以召唤出来一个  发表于 2026-5-13 17:49
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-5-13 16:43:32 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2026-5-13 16:46 编辑

大招前的表演, 像这种吧

未标题-1.jpg 51_compress.gif

[pre lang="ruby"]module RPG
  class Sprite < ::Sprite
    def animation_process_timing(timing, hit)
      if (timing.condition == 0) or
         (timing.condition == 1 and hit == true) or
         (timing.condition == 2 and hit == false)
        if timing.se.name != ""
          se = timing.se
          if se.name == "skill_show"
            a = timing.flash_color.red.to_i + timing.flash_color.green.to_i +
            timing.flash_color.blue.to_i + timing.flash_color.alpha.to_i +
            timing.flash_duration
            skill_show(a) ; return
          end
          Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
        end
        case timing.flash_scope
        when 1
          self.flash(timing.flash_color, timing.flash_duration * 2)
        when 2
          if self.viewport != nil
            self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
          end
        when 3
          self.flash(nil, timing.flash_duration * 2)
        end
      end
    end
    def skill_show(ani_id)
      a = RPG::Sprite.new ;
      loop do
        Graphics.update ; a.update
        break if !a.effect?
      end
      a.dispose
    end
  end
end[/pre]

把这个脚本塞到main前,  然后, 在技能动画设置里, 第一帧调用一个名为 "skill_show" 的SE ,这样就可以插入一个动画 (此时这个SE并不会发生作用) ,等动画结束后才会继续播放技能动画

该SE的闪烁设置,RGBA和时间, 这5个数字全部相加起来就是调用的动画ID, 在这个插入动画里你去表演大招前摇吧

点评

是的,就是这种,不过是像海上有一轮月轮,月亮下半部分是隐约,应该是渐变为半透明到看不到,不过月亮换成人物半身而已,多谢大佬的脚本  发表于 2026-5-13 17:39
回复

使用道具 举报

梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
 楼主| 发表于 2026-5-13 18:02:56 | 显示全部楼层
1.jpg


就像这种感觉,人物是浮现在海面上的,下半身是逐渐看不到的,然后念一段咒语,这个用你那个脚本,是要先画动画的吗,
然后再播放这个动画

点评

当然要怎么表演自己去做呗  发表于 2026-5-13 18:24
退隐....
回复

使用道具 举报

梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
 楼主| 发表于 2026-5-13 18:08:11 | 显示全部楼层
[pre lang="ruby"]#==============================================================================
# ■ Interpreter (分割定义 7)
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 和 Game_Event 类的内部使用。
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # ● 增减敌人的 HP
  #--------------------------------------------------------------------------
  def command_331
    # 获取操作值
    value = operate_value(@parameters[1], @parameters[2], @parameters[3])
    # 处理循环
    iterate_enemy(@parameters[0]) do |enemy|
      # HP 不为 0 的情况下
      if enemy.hp > 0
        # 更改 HP (如果不允许战斗不能的状态就设置为 1)
        if @parameters[4] == false and enemy.hp + value <= 0
          enemy.hp = 1
        else
          enemy.hp += value
        end
      end
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 增减敌人的 SP
  #--------------------------------------------------------------------------
  def command_332
    # 获取操作值
    value = operate_value(@parameters[1], @parameters[2], @parameters[3])
    # 处理循环
    iterate_enemy(@parameters[0]) do |enemy|
      # 更改 SP
      enemy.sp += value
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改敌人的状态
  #--------------------------------------------------------------------------
  def command_333
    # 处理循环
    iterate_enemy(@parameters[0]) do |enemy|
      # 状态选项 [当作 HP 为 0 的状态] 有效的情况下
      if $data_states[@parameters[2]].zero_hp
        # 清除不死身标志
        enemy.immortal = false
      end
      # 更改状态
      if @parameters[1] == 0
        enemy.add_state(@parameters[2])
      else
        enemy.remove_state(@parameters[2])
      end
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 敌人的全回复
  #--------------------------------------------------------------------------
  def command_334
    # 处理循环
    iterate_enemy(@parameters[0]) do |enemy|


      # 全回复
      enemy.recover_all
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 敌人出现
  #--------------------------------------------------------------------------
  def command_335
    # 获取敌人
    enemy = $game_troop.enemies[@parameters[0]]
    # 清除隐藏标志
    if enemy != nil
      enemy.hidden = false
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 敌人变身
  #--------------------------------------------------------------------------
  def command_336
    # 获取敌人
    enemy = $game_troop.enemies[@parameters[0]]
    # 变身处理
    if enemy != nil
      enemy.transform(@parameters[1])
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 显示动画
  #--------------------------------------------------------------------------
  def command_337
    # 处理循环
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      # 战斗者存在的情况下
      if battler.exist?
        # 设置动画 ID
        battler.animation_id = @parameters[2]
      end
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 伤害处理
  #--------------------------------------------------------------------------
  def command_338
    # 获取操作值
    value = operate_value(0, @parameters[2], @parameters[3])
    # 处理循环
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      # 战斗者存在的情况下
      if battler.exist?
        # 更改 HP
        battler.hp -= value
        # 如果在战斗中
        if $game_temp.in_battle
          # 设置伤害
          battler.damage = value
          battler.damage_pop = true
         
           # 挨打的时候蓄气
          if battler.is_a?(Game_Actor)
            battler.tp += [battler.damage*300/battler.maxhp , 0].max
            battler.tp = [battler.tp,500].min
          end
         
        end
      end
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 强制行动
  #--------------------------------------------------------------------------
  def command_339
    # 忽视是否在战斗中
    unless $game_temp.in_battle
      return true
    end
    # 忽视回合数为 0
    if $game_temp.battle_turn == 0
      return true
    end
    # 处理循环 (为了方便、不需要存在复数)
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      # 战斗者存在的情况下
      if battler.exist?
        # 设置行动
        battler.current_action.kind = @parameters[2]
        if battler.current_action.kind == 0
          battler.current_action.basic = @parameters[3]
        else
          battler.current_action.skill_id = @parameters[3]
        end
        # 设置行动对像
        if @parameters[4] == -2
          if battler.is_a?(Game_Enemy)
            battler.current_action.decide_last_target_for_enemy
          else
            battler.current_action.decide_last_target_for_actor
          end
        elsif @parameters[4] == -1
          if battler.is_a?(Game_Enemy)
            battler.current_action.decide_random_target_for_enemy
          else
            battler.current_action.decide_random_target_for_actor
          end
        elsif @parameters[4] >= 0
          battler.current_action.target_index = @parameters[4]
        end
        # 设置强制标志
        battler.current_action.forcing = true
        # 行动有效并且是 [立即执行] 的情况下
        if battler.current_action.valid? and @parameters[5] == 1
          # 设置强制对像的战斗者
          $game_temp.forcing_battler = battler
          # 推进索引
          @index += 1
          # 结束
          return false
        end
      end
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 战斗中断
  #--------------------------------------------------------------------------
  def command_340
    # 设置战斗中断标志
    $game_temp.battle_abort = true
    # 推进索引
    @index += 1
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 调用菜单画面
  #--------------------------------------------------------------------------
  def command_351
    # 设置战斗中断标志
    $game_temp.battle_abort = true
    # 设置调用菜单标志
    $game_temp.menu_calling = true
    # 推进索引
    @index += 1
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 调用存档画面
  #--------------------------------------------------------------------------
  def command_352
    # 设置战斗中断标志
    $game_temp.battle_abort = true
    # 设置调用存档标志
    $game_temp.save_calling = true
    # 推进索引
    @index += 1
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 游戏结束
  #--------------------------------------------------------------------------
  def command_353
    # 设置游戏结束标志
    $game_temp.gameover = true
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 返回标题画面
  #--------------------------------------------------------------------------
  def command_354
    # 设置返回标题画面标志
    $game_temp.to_title = true
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 脚本
  #--------------------------------------------------------------------------
  def command_355
    # script 设置第一行
    script = @list[@index].parameters[0] + "\n"
    # 循环
    loop do
      # 下一个事件指令在脚本 2 行以上的情况下
      if @list[@index+1].code == 655
        # 添加到 script 2 行以后
        script += @list[@index+1].parameters[0] + "\n"
      # 事件指令不在脚本 2 行以上的情况下
      else
        # 中断循环
        break
      end
      # 推进索引
      @index += 1
    end
    # 评价
    result = eval(script)
    # 返回值为 false 的情况下
    if result == false
      # 结束
      return false
    end
    # 继续
    return true
  end
end
[/pre]


我的Interpreter被我替换过了,不知道什么作用,很久了忘了,和你这个召唤脚本冲突了可能,你帮我整合一下,召唤那个脚本整合进来,好吗?

点评

就是这么做的,不行哎,出错了,基本的操作还是会的,不可能那么小白了,应该是系统冲突了  发表于 2026-5-13 19:09
基本脚本使用规则都不会, 那就别玩XP了, 去用MZ吧, 默认特效和插件更方便, 笑  发表于 2026-5-13 18:43
找到main这个脚本, 右键, 插入, 在出现的空白脚本里, 把那段复制过去, 保存  发表于 2026-5-13 18:41
不行啊,受不了了,放哪都不行啊,我脚本几乎不会啊  发表于 2026-5-13 18:34
  放到return true 下面是吗 语法不太懂 两个end 上面  发表于 2026-5-13 18:30
退隐....
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2026-5-13 19:04:02 | 显示全部楼层
未标题-3.jpg 未标题-2.jpg

如果连这种修改都搞不定, 那你也别想着什么脑洞特效了

点评

试了拿掉几个和攻击有关的脚本,都不行,你说的对,试错总是不会错的,那我还是慢慢研究下吧,难是很难的,比我的修行还算容易点  发表于 2026-5-17 16:41
谁都是从什么都不会开始的,勤备份,然后放手大胆的尝试就行,不迈出这一步永远不会,现在有AI辅助,学习成本低很多啦  发表于 2026-5-17 14:55
它改动了很多我看不懂的写法,和原版语法不一样的,所以不知道怎么改,位置都找不到,总之这方面没有天赋就是一个瓶颈,是我无法处理的所在。  发表于 2026-5-15 20:29
已经是我一生的注脚,无妨,我已经不在乎了,攻击效果就是魔法盾,吸蓝吸血,之类的,要改动你所谓的几个热门点,但我确实没找到,因为它改动  发表于 2026-5-15 20:27
但我已经有心无力,我知道我的短板是导致我无法成为大佬,这我很早就知道,我干什么都是中等偏上,达不到高手,玩坦克也是战场老兵评价,已经  发表于 2026-5-15 20:24
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部