Project1

标题: 三个问题 [打印本页]

作者: y967    时间: 2026-5-13 09:42
标题: 三个问题
1,敌人召唤
BOSS可以无限召唤小兵,不用敌人出现,因为死了就没了,重新复活不符合召唤的定义,而且可以召唤任意列表里的怪物

2,直接增加攻击力

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

3,空中楼阁

做一个空中浮现人物半身像,若隐若现,图片半透明好像效果不太好,一个半身浮现在云层,要有如梦似幻的感觉
作者: 灯笼菜刀王    时间: 2026-5-13 11:56
召唤敌人/随机种类的敌人 并不难, 用中途出现就可以做, 随机种类的也一样, 只是中途出现之前把对应位置的敌人替换成另一个即可

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

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

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



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


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



作者: 灯笼菜刀王    时间: 2026-5-13 12:14
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的数据库没有备注栏, 这点灵活性不足(不用数据库解君愁, 笑)


例如, 像我之前说的词条法, 笑

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

如果想在战斗界面表演, 那就用状态动画(位置为画面)就行了, 你不是用了多重状态动画脚本了么
作者: 灯笼菜刀王    时间: 2026-5-13 16:03
本帖最后由 灯笼菜刀王 于 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| 后面换行
作者: 灯笼菜刀王    时间: 2026-5-13 16:43
本帖最后由 灯笼菜刀王 于 2026-5-13 16:46 编辑

大招前的表演, 像这种吧



RUBY 代码复制
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def animation_process_timing(timing, hit)
  4.       if (timing.condition == 0) or
  5.          (timing.condition == 1 and hit == true) or
  6.          (timing.condition == 2 and hit == false)
  7.         if timing.se.name != ""
  8.           se = timing.se
  9.           if se.name == "skill_show"
  10.             a = timing.flash_color.red.to_i + timing.flash_color.green.to_i +
  11.             timing.flash_color.blue.to_i + timing.flash_color.alpha.to_i +
  12.             timing.flash_duration
  13.             skill_show(a) ; return
  14.           end
  15.           Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  16.         end
  17.         case timing.flash_scope
  18.         when 1
  19.           self.flash(timing.flash_color, timing.flash_duration * 2)
  20.         when 2
  21.           if self.viewport != nil
  22.             self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  23.           end
  24.         when 3
  25.           self.flash(nil, timing.flash_duration * 2)
  26.         end
  27.       end
  28.     end
  29.     def skill_show(ani_id)
  30.       a = RPG::Sprite.new ;
  31.       loop do
  32.         Graphics.update ; a.update
  33.         break if !a.effect?
  34.       end
  35.       a.dispose
  36.     end
  37.   end
  38. end


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

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



就像这种感觉,人物是浮现在海面上的,下半身是逐渐看不到的,然后念一段咒语,这个用你那个脚本,是要先画动画的吗,
然后再播放这个动画
作者: y967    时间: 2026-5-13 18:08
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Interpreter (分割定义 7)
  3. #------------------------------------------------------------------------------
  4. #  执行事件命令的解释器。本类在 Game_System 类
  5. # 和 Game_Event 类的内部使用。
  6. #==============================================================================
  7.  
  8. class Interpreter
  9.   #--------------------------------------------------------------------------
  10.   # ● 增减敌人的 HP
  11.   #--------------------------------------------------------------------------
  12.   def command_331
  13.     # 获取操作值
  14.     value = operate_value(@parameters[1], @parameters[2], @parameters[3])
  15.     # 处理循环
  16.     iterate_enemy(@parameters[0]) do |enemy|
  17.       # HP 不为 0 的情况下
  18.       if enemy.hp > 0
  19.         # 更改 HP (如果不允许战斗不能的状态就设置为 1)
  20.         if @parameters[4] == false and enemy.hp + value <= 0
  21.           enemy.hp = 1
  22.         else
  23.           enemy.hp += value
  24.         end
  25.       end
  26.     end
  27.     # 继续
  28.     return true
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 增减敌人的 SP
  32.   #--------------------------------------------------------------------------
  33.   def command_332
  34.     # 获取操作值
  35.     value = operate_value(@parameters[1], @parameters[2], @parameters[3])
  36.     # 处理循环
  37.     iterate_enemy(@parameters[0]) do |enemy|
  38.       # 更改 SP
  39.       enemy.sp += value
  40.     end
  41.     # 继续
  42.     return true
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 更改敌人的状态
  46.   #--------------------------------------------------------------------------
  47.   def command_333
  48.     # 处理循环
  49.     iterate_enemy(@parameters[0]) do |enemy|
  50.       # 状态选项 [当作 HP 为 0 的状态] 有效的情况下
  51.       if $data_states[@parameters[2]].zero_hp
  52.         # 清除不死身标志
  53.         enemy.immortal = false
  54.       end
  55.       # 更改状态
  56.       if @parameters[1] == 0
  57.         enemy.add_state(@parameters[2])
  58.       else
  59.         enemy.remove_state(@parameters[2])
  60.       end
  61.     end
  62.     # 继续
  63.     return true
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 敌人的全回复
  67.   #--------------------------------------------------------------------------
  68.   def command_334
  69.     # 处理循环
  70.     iterate_enemy(@parameters[0]) do |enemy|
  71.  
  72.  
  73.       # 全回复
  74.       enemy.recover_all
  75.     end
  76.     # 继续
  77.     return true
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 敌人出现
  81.   #--------------------------------------------------------------------------
  82.   def command_335
  83.     # 获取敌人
  84.     enemy = $game_troop.enemies[@parameters[0]]
  85.     # 清除隐藏标志
  86.     if enemy != nil
  87.       enemy.hidden = false
  88.     end
  89.     # 继续
  90.     return true
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● 敌人变身
  94.   #--------------------------------------------------------------------------
  95.   def command_336
  96.     # 获取敌人
  97.     enemy = $game_troop.enemies[@parameters[0]]
  98.     # 变身处理
  99.     if enemy != nil
  100.       enemy.transform(@parameters[1])
  101.     end
  102.     # 继续
  103.     return true
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 显示动画
  107.   #--------------------------------------------------------------------------
  108.   def command_337
  109.     # 处理循环
  110.     iterate_battler(@parameters[0], @parameters[1]) do |battler|
  111.       # 战斗者存在的情况下
  112.       if battler.exist?
  113.         # 设置动画 ID
  114.         battler.animation_id = @parameters[2]
  115.       end
  116.     end
  117.     # 继续
  118.     return true
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ● 伤害处理
  122.   #--------------------------------------------------------------------------
  123.   def command_338
  124.     # 获取操作值
  125.     value = operate_value(0, @parameters[2], @parameters[3])
  126.     # 处理循环
  127.     iterate_battler(@parameters[0], @parameters[1]) do |battler|
  128.       # 战斗者存在的情况下
  129.       if battler.exist?
  130.         # 更改 HP
  131.         battler.hp -= value
  132.         # 如果在战斗中
  133.         if $game_temp.in_battle
  134.           # 设置伤害
  135.           battler.damage = value
  136.           battler.damage_pop = true
  137.  
  138.            # 挨打的时候蓄气
  139.           if battler.is_a?(Game_Actor)
  140.             battler.tp += [battler.damage*300/battler.maxhp , 0].max
  141.             battler.tp = [battler.tp,500].min
  142.           end
  143.  
  144.         end
  145.       end
  146.     end
  147.     # 继续
  148.     return true
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● 强制行动
  152.   #--------------------------------------------------------------------------
  153.   def command_339
  154.     # 忽视是否在战斗中
  155.     unless $game_temp.in_battle
  156.       return true
  157.     end
  158.     # 忽视回合数为 0
  159.     if $game_temp.battle_turn == 0
  160.       return true
  161.     end
  162.     # 处理循环 (为了方便、不需要存在复数)
  163.     iterate_battler(@parameters[0], @parameters[1]) do |battler|
  164.       # 战斗者存在的情况下
  165.       if battler.exist?
  166.         # 设置行动
  167.         battler.current_action.kind = @parameters[2]
  168.         if battler.current_action.kind == 0
  169.           battler.current_action.basic = @parameters[3]
  170.         else
  171.           battler.current_action.skill_id = @parameters[3]
  172.         end
  173.         # 设置行动对像
  174.         if @parameters[4] == -2
  175.           if battler.is_a?(Game_Enemy)
  176.             battler.current_action.decide_last_target_for_enemy
  177.           else
  178.             battler.current_action.decide_last_target_for_actor
  179.           end
  180.         elsif @parameters[4] == -1
  181.           if battler.is_a?(Game_Enemy)
  182.             battler.current_action.decide_random_target_for_enemy
  183.           else
  184.             battler.current_action.decide_random_target_for_actor
  185.           end
  186.         elsif @parameters[4] >= 0
  187.           battler.current_action.target_index = @parameters[4]
  188.         end
  189.         # 设置强制标志
  190.         battler.current_action.forcing = true
  191.         # 行动有效并且是 [立即执行] 的情况下
  192.         if battler.current_action.valid? and @parameters[5] == 1
  193.           # 设置强制对像的战斗者
  194.           $game_temp.forcing_battler = battler
  195.           # 推进索引
  196.           @index += 1
  197.           # 结束
  198.           return false
  199.         end
  200.       end
  201.     end
  202.     # 继续
  203.     return true
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 战斗中断
  207.   #--------------------------------------------------------------------------
  208.   def command_340
  209.     # 设置战斗中断标志
  210.     $game_temp.battle_abort = true
  211.     # 推进索引
  212.     @index += 1
  213.     # 结束
  214.     return false
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ● 调用菜单画面
  218.   #--------------------------------------------------------------------------
  219.   def command_351
  220.     # 设置战斗中断标志
  221.     $game_temp.battle_abort = true
  222.     # 设置调用菜单标志
  223.     $game_temp.menu_calling = true
  224.     # 推进索引
  225.     @index += 1
  226.     # 结束
  227.     return false
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● 调用存档画面
  231.   #--------------------------------------------------------------------------
  232.   def command_352
  233.     # 设置战斗中断标志
  234.     $game_temp.battle_abort = true
  235.     # 设置调用存档标志
  236.     $game_temp.save_calling = true
  237.     # 推进索引
  238.     @index += 1
  239.     # 结束
  240.     return false
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 游戏结束
  244.   #--------------------------------------------------------------------------
  245.   def command_353
  246.     # 设置游戏结束标志
  247.     $game_temp.gameover = true
  248.     # 结束
  249.     return false
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 返回标题画面
  253.   #--------------------------------------------------------------------------
  254.   def command_354
  255.     # 设置返回标题画面标志
  256.     $game_temp.to_title = true
  257.     # 结束
  258.     return false
  259.   end
  260.   #--------------------------------------------------------------------------
  261.   # ● 脚本
  262.   #--------------------------------------------------------------------------
  263.   def command_355
  264.     # script 设置第一行
  265.     script = @list[@index].parameters[0] + "\n"
  266.     # 循环
  267.     loop do
  268.       # 下一个事件指令在脚本 2 行以上的情况下
  269.       if @list[@index+1].code == 655
  270.         # 添加到 script 2 行以后
  271.         script += @list[@index+1].parameters[0] + "\n"
  272.       # 事件指令不在脚本 2 行以上的情况下
  273.       else
  274.         # 中断循环
  275.         break
  276.       end
  277.       # 推进索引
  278.       @index += 1
  279.     end
  280.     # 评价
  281.     result = eval(script)
  282.     # 返回值为 false 的情况下
  283.     if result == false
  284.       # 结束
  285.       return false
  286.     end
  287.     # 继续
  288.     return true
  289.   end
  290. end



我的Interpreter被我替换过了,不知道什么作用,很久了忘了,和你这个召唤脚本冲突了可能,你帮我整合一下,召唤那个脚本整合进来,好吗?
作者: 灯笼菜刀王    时间: 2026-5-13 19:04


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




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