DOWNLOAD DEMO:
Demo – Version 1.6 >
(Script requires graphic from /Graphics/System/ and /Graphics/Battlers/ folders of the demo)
SCRIPT:
#------------------------------------------------------------------------------- # Galv's Actor Duel Mini Game #------------------------------------------------------------------------------- # For: RPGMAKER VX ACE # Version 1.6 #------------------------------------------------------------------------------- # 2016-05-02 - Version 1.6 - typo in script documentions for add_fskill # 2013-09-11 - Version 1.5 - fixed <fse: > tag for skills. Ooops! # 2013-07-13 - Version 1.4 - fixed a bug with changing music script call # 2013-07-11 - Version 1.3 - added compatibility with victor's animated battler # - added tag for actor to play victory pose once # 2013-07-11 - Version 1.2 - fixed (hopefully) a crash with AI battle. Updated # AI to use skills more often. # 2013-07-10 - Version 1.1 - added state icons, button combo moves, working # - regen, poisons, buffs, projectile attacks. # 2013-07-08 - Version 1.0 - release #------------------------------------------------------------------------------- # Holder's animated battler spritesheets can be found here: # http://animatedbattlers.wordpress.com/ #------------------------------------------------------------------------------- # This script adds a scene where you can face two actors against each other in # a mini-game duel that plays similar to a fighting game. # You can do Player1 VS AI or Player1 VS Player2 (on same computer) # # The actors use their statistics and hp in the duel. They can move, jump, # block, attack and use button combo skills that you create using notetags # on skills. Normal attack damage formula is taken from skill 1 by default. # # Actors have stamina that regenerates during the fight. Each attack uses a # certain amount of stamina and the fighter cannot attack or use a skill if he # doesn't have enough left. # # Fighters can be affected by buffs and states, however a few things have no # effect in an actor duel such as blinds or stuns. Poisons, regen, parameter # boosting stats do work. # #------------------------------------------------------------------------------- # BASIC INSTRUCTIONS #------------------------------------------------------------------------------- # 1. Get holder style battlers (http://animatedbattlers.wordpress.com/) # 2. Import battlers into /Graphics/Battlers folder # 3. Copy /Graphics/Battlers/FightSkills.png from the demo into your project # 4. Copy /Graphics/System/kombat_bar.png from the demo into your project # 5. Put this script below Materials and above main. # 6. Read all instructions and settings # 7. Remember to start a NEW GAME instead of loading a save file that was made # prior to adding this script #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # SCRIPT CALLS #------------------------------------------------------------------------------- # # set_fighters(id1,id2) # Starts a kombat between actors with id1 & id2 # # set_fbacks("back1","back2") # Change battlebacks for next kombat. "back1" # # is from /Graphics/Battlebacks1/ and "back2" # # is from /Graphics/Battlebacks2/ # # set_fmusic("MusicName") # Change the kombat music # # set_fmode(x) # 0 = P1 vs AI 1 = P1 vs P2 (Default 0) # # add_fskill(a_id,s_id,[btns]) # a_id = actor id... s_id = skill id # # [btns] is the button combo array which can # # include: :l :r :u :d # # (See explanation below) # #------------------------------------------------------------------------------- # btn info # ----------------------------- # :l Left key for whomever is on the left. 'away from enemy' key. # :r Right key for whomever is on the left. 'toward the enemy' key. # :u Up key # :d Down key # # EXAMPLE OF SCRIPT CALL TO ADD A SKILL: # add_fskill(1,80,[:l,:l,:r]) # This will give actor 1 a button combo: # # Left, Left, Right, Attack (while on left) # # (Right, Right, Left, Attack while on right) # # Which will activate skill 80 # #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Note tag for ACTORS required #------------------------------------------------------------------------------- # # <fimage: imagename> # The name of the holder-style spritesheet # # image from /Graphics/Battlers/ # #------------------------------------------------------------------------------- # Note tag for ACTORS to override Defaults #------------------------------------------------------------------------------- # # <fatks: x,x,x,x> # The rows in the spritesheet to use for the # # actor's normal attacks. Default is COMBO below # # <fse miss: sename> # SE to use for attacking and missing # # <fhit: x> # Animation played when hitting enemy with attack # # <frange: x> # How close need to be to make contact with attack # # <fviconeanim> # This notetag will mean the actor's victory pose # # will only play once instead of repeat. # #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Note tag for SKILLS #------------------------------------------------------------------------------- # # <fpose: x> # The pose row used for actor when using this skill. # # Will default to row 7 if no tag added. # # <fcost: x> # Stamina required to use skill # # <fse: sename> # SE that plays when using the skill # # <fp: p,s,a,t,r> # Use this tag if the skill will be a projectile. # # p = pose row of SKILLIMAGE spritesheet # # s = speed projectile travels # # a = animation_id when projectile is created # # t = time before projectile disappears (60 per second) # # r = How close projectile needs to be to make contact # # Skill's 'scope' must be set to enemy for this to work # # # #------------------------------------------------------------------------------- # BUTTON COMBO NOTE # If a skill has scope of ally, the animation in the database skill is played # on the user. If not, the animation is played when the skill hits the enemy. #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # DEFAULT SPRITESHEET POSES (HOLDER SETUP) #------------------------------------------------------------------------------- # ROW POSE USED IN DEFAULT SCRIPT # # 0 Idle Yes # 1 Guard Yes # 2 Poor Status Yes # 3 Get hit Yes # 4 Normal Attack Yes # 5 Use Item # 6 Use Skill # 7 Use Magic Yes # 8 Move toward Yes # 9 Move back Yes # 10 Victory Yes # 11 Battle Start # 12 Dead Yes # 13 Spritesheet Info #------------------------------------------------------------------------------- ($imported ||= {})["Galv_ActorDuel"] = true module GALVFIGHT #------------------------------------------------------------------------------- # # ** SETTINGS # #------------------------------------------------------------------------------- FONT = "Arial" # Font used in script VICTOR_VAR = 1 # Variable used to store the winner's ID in. 0 if nobody wins. QUIT_SWITCH = 1 # Turn this swith ON to disable the quit menu. OFF to enable CMD_QUIT = "Quit Match" # To quit the fight CMD_CANCEL = "Cancel" # When cancelling the quit menu # Spritesheet COLS = 4 # Number of animation columns in spritesheet ROWS = 14 # Number of rows in spritesheet SIZE = 2 # Size of the battlers (2 = 2x zoom. 1 = normal) SKILLIMAGE = "FightSkills" # name of skill spritesheet in /Graphics/Battlers/ SKILLCOLS = 4 # Number of animation columns in skill spritesheet SKILLROWS = 14 # Number of rows in skill spritesheet # Actor Defaults COMBO = [4] # Array of spritesheet rows that cycle with attacks # eg. [4,5,6] will cycle rows 4,5 and 6 when attacking MISS_SE = "Wind7" # "SE_Name" for missing and attack sound HIT_ANIM = 115 # Animation played when hitting enemy. GUARD_ANIM = 116 # Animation played when guarded a hit RANGE = 45 # Distance from opponent before attack makes contact JUMP_POSE = 8 # Pose used when jumping SKILLSE = "Wind7" # "SE_Name" played when using a skill # Level Defaults MUSIC = "Battle6" # Default battle BGM VICTORY_ME = "Victory1" # Default victory ME BATTLEBACK1 = "Ship" # Default battleback 1 from /Graphics/Battlebacks1/ BATTLEBACK2 = "Ship" # Default battleback 2 from /Graphics/Battlebacks2/ P1_X = 100 # Starting X position of player 1 P2_X = 455 # Starting X position of player 2 Y = 310 # Grounded Y position # Fighting MAX_STAMINA = 500 # Stamina each fighter has STAMINA_COST = 100 # Amount of stamina out of 1000 that attacking uses REGEN_RATE = 1.3 # Speed that stamina regenerates GUARD_DAMAGE = 0.25 # Normal damage is multiplied by this when guarding. ATTACK_SKILL = 1 # Skill to use for basic attacks TURNTIMER = 150 # Number of frames before it counts as a new turn for # buffs and states # Text START1 = "Ready?" # Text that appears at the start START2 = "FIGHT!" NOWINNER = "MATCH OVER!" # Message when player quits from the match WINS = " WINS!" # Message that comes after winner's name #------------------------------------------------------------------------------- # CONTROLS - PLAYER 1 #------------------------------------------------------------------------------- P1_UP = :UP # Jump P1_DOWN = :DOWN # Block P1_LEFT = :LEFT # Move left P1_RIGHT = :RIGHT # Move right P1_ACTION = :C # (Spacebar key) Attack #------------------------------------------------------------------------------- # CONTROLS - PLAYER 2 #------------------------------------------------------------------------------- P2_UP = :R # (W key) Jump P2_DOWN = :Y # (S key) Block P2_LEFT = :X # (A key) Move Left P2_RIGHT = :Z # (D key) Move Right P2_ACTION = :CTRL # Attack #------------------------------------------------------------------------------- end #------------------------------------------------------------------------------- # # ** END SETTINGS # #------------------------------------------------------------------------------- #---------------# #---| GFIGHT_AI |----------------------------------------------------------- #---------------# module GFIGHT_AI def update_f2_ai update_ai_random update_ai_decision update_ai_action update_timer update_victorcheck end def p1; @f1; end def ai; @f2; end def update_ai_random if !ai_timer_running? @chance = (rand(10) + 1).to_i @schance = (rand(10) + 1).to_i end end def update_ai_decision if ai.in_range_x update_ai_in_range else update_ai_out_of_range end end def update_ai_in_range if p1.attacking? # IF PLAYER IS ATTACKING if ai.getting_hit? && @chance > 2 @ai_move = :down @ai_action = false @ai_timer = rand(50) + 10 if !ai_timer_running? else if @chance > 5 @ai_move = :down @ai_action = false @ai_timer = rand(50) + 10 if !ai_timer_running? elsif @chance > 2 ai_melee_action @ai_timer = rand(20) + 5 if !ai_timer_running? else @ai_move = random_move_in_range @ai_timer = rand(50) + 10 if !ai_timer_running? end end else # IF PLAYER IS NOT ATTACKING if @chance > 4 ai_melee_action @ai_timer = rand(20) + 10 if !ai_timer_running? elsif @chance > 2 @ai_move = :down @ai_action = false @ai_timer = rand(40) + 20 if !ai_timer_running? else @ai_move = random_move_in_range @ai_timer = rand(40) + 20 if !ai_timer_running? end end end def update_ai_out_of_range @ai_move = random_move_out_of_range @ai_action = false @ai_raction = true end def ai_jump if ai.fjumping? @ai_move = :none else @ai_move = :up ai.fight_pose = 0 end end def random_move_in_range if ai.fight_x <= 20 + 10 return @chance > 7 ? :right : :none elsif ai.fight_x >= Graphics.width - 20 - 10 return @chance > 7 ? :left : :none elsif @chance >= 8 return :right elsif @chance >= 5 return :left elsif @chance == 1 return ai.fjumping? ? :left : :up elsif @chance == 2 return ai.fjumping? ? :right : :up else return :none end end def random_move_out_of_range if ai.fight_x <= 20 + 10 @ai_timer = rand(30) + 10 if !ai_timer_running? return @chance > 4 ? :right : :none elsif ai.fight_x >= Graphics.width - 20 - 10 @ai_timer = rand(30) + 10 if !ai_timer_running? return @chance > 4 ? :left : :none elsif @chance >= 7 @ai_timer = rand(40) + 10 if !ai_timer_running? return ai_advance elsif @chance >= 4 @ai_timer = rand(40) + 10 if !ai_timer_running? return ai_retreat else @ai_timer = rand(30) + 10 if !ai_timer_running? return :none end end def ai_timer_running? @ai_timer > 0 end def update_ai_action ai.fight_move(@ai_move) ai_melee_action if @ai_action ai_range_action if @ai_raction end def ai_melee_action if @schance <= 2 bcs = get_ai_random_skill ai.fight_combo_skill(bcs) if bcs > 0 else ai.fight_action end end def ai_range_action if @schance <= 3 bcs = get_ai_projectile_skill ai.fight_combo_skill(bcs) if bcs > 0 end end def get_ai_projectile_skill ai.combo_skills.each { |combo| return combo[1] if $data_skills[combo[1]].fproj } return 0 end def get_ai_random_skill cskills = ai.combo_skills.to_a rskill = cskills.sample @ai_raction = false return 0 if rskill.nil? return rskill[1] <= 0 ? 0 : rskill[1] end def ai_make_attack if ai.fstamina < GALVFIGHT::STAMINA_COST @ai_move = :down else @ai_action = true @ai_move = random_move_in_range end end def ai_retreat return ai.fight_x > p1.fight_x ? :right : :left end def ai_advance return ai.fight_x < p1.fight_x ? :right : :left end def update_timer @ai_timer -= 1 end def update_victorcheck if p1.dead? @phase = 2 @victor = ai end end end # GFIGHT_AI #----------------------# #---| GAME_INTERPRETER |---------------------------------------------------- #----------------------# class Game_Interpreter def set_fighters(player1,player2) $game_system.save_bgm command_221 a = $game_actors[player1] b = $game_actors[player2] $game_system.fighters = [a,b] SceneManager.call(Scene_ActorDuel) wait(1) command_222 $game_system.replay_bgm end def set_fbacks(back1,back2) $game_system.fbacks = [back1,back2] end def set_fmusic(music) $game_system.fmusic[0] = music end def set_fmode(mode) $game_system.fmode = mode end def add_skill(a_id,s_id,btns) $game_actors[a_id].combo_skills[btns] = s_id end def add_fskill(a_id,s_id,btns) $game_actors[a_id].combo_skills[btns] = s_id end end #------------------# #---| RPG BASEITEM |-------------------------------------------------------- #------------------# class RPG::BaseItem def f_atks if @f_atks.nil? if @note =~ /<fatks:[ ](.*)>/i @f_atks = $1.to_s.split(",").map {|i| i.to_i} else @f_atks = GALVFIGHT::COMBO end end @f_atks end end # RPG::Item class RPG::Skill def fpose if @fpose.nil? if @note =~ /<fpose:[ ](.*)>/i @fpose = $1.to_i else @fpose = 7 end end @fpose end def fcost if @fcost.nil? if @note =~ /<fcost:[ ](.*)>/i @fcost = $1.to_i else @fcost = GALVFIGHT::STAMINA_COST end end @fcost end def fproj if @fproj.nil? if @note =~ /<fp:[ ](.*)>/i @fproj = $1.to_s.split(",").map {|i| i.to_i} else @fproj = nil end end @fproj end def fse if @fse.nil? if @note =~ /<fse:[ ](.*)>/i @fse = $1.to_s else @fse = GALVFIGHT::SKILLSE end end @fse end end # RPG::Skill #----------------# #---| GAME_ACTOR |---------------------------------------------------------- #----------------# class Game_Actor < Game_Battler attr_reader :fhit_anim attr_reader :frange attr_accessor :fight_x attr_accessor :fight_y attr_accessor :fight_pose attr_accessor :fight_sprite attr_accessor :fight_speed attr_accessor :fight_mspeed attr_accessor :fstamina attr_accessor :combo_skills attr_accessor :fprojectiles attr_accessor :fvicpose alias galv_fight_gagb_setup setup def setup(actor_id) galv_fight_gagb_setup(actor_id) init_fight_vars @fight_sprite = actor.note =~ /<fimage: (.*)>/i ? $1 : "" @combo = actor.f_atks @combo_skills = {} @fse_miss = actor.note =~ /<fse miss: (.*)>/i ? $1 : GALVFIGHT::MISS_SE @fhit_anim = actor.note =~ /<fhit: (.*)>/i ? $1.to_i : GALVFIGHT::HIT_ANIM @frange = actor.note =~ /<frange: (.*)>/i ? $1.to_i : GALVFIGHT::RANGE @fvicpose = actor.note =~ /<fviconeanim>/i ? true : false # true = one play end def init_fight_vars @fight_x = 0 @fight_y = GALVFIGHT::Y @fight_pose = 0 @fight_speed = 0.to_f @fight_mspeed = 4 @attack_timer = 0 @skill_timer = 0 @takehit_timer = 0 @jump = 0 @fstamina = GALVFIGHT::MAX_STAMINA @btn_combo = [] @btn_timer = 0 @fprojectiles = [] end def fight_move(direction) case direction when :up fight_jump fight_slowing when :down fight_guard fight_slowing when :left if !attacking? if @fight_x < fight_target.fight_x @fight_pose = 9 else @fight_pose = 8 end end return @fight_speed = 0 if fight_left_limit @fight_speed -= 0.4 @fight_speed = -@fight_mspeed if @fight_speed <= -@fight_mspeed when :right if !attacking? if @fight_x < fight_target.fight_x @fight_pose = 8 else @fight_pose = 9 end end return @fight_speed = 0 if fight_right_limit @fight_speed += 0.4 @fight_speed = @fight_mspeed if @fight_speed >= @fight_mspeed when :none if !attacking? @fight_pose = fjumping? ? GALVFIGHT::JUMP_POSE : fight_idle_pose end fight_slowing end end def fight_right_limit; @fight_x >= Graphics.width - 20; end def fight_left_limit; @fight_x <= 20; end def fight_idle_pose hp < mhp * 0.25 ? 2 : 0 end def fight_slowing if moving_right? return @fight_speed = 0 if @fight_x >= Graphics.width - 20 @fight_speed -= [0 + @fight_speed,0.3].min elsif moving_left? return @fight_speed = 0 if @fight_x <= 20 @fight_speed += [0 - @fight_speed,0.3].min end end def fight_action return if attacking? || guarding? || getting_hit? bcs = get_combo_skill if bcs.nil? fight_normal_attack else fight_combo_skill(bcs) end end def get_combo_skill @combo_skills.each { |combo| if @btn_combo.reverse[0..(combo[0].size - 1)] == combo[0].reverse return combo[1] end } return nil end def fight_normal_attack return if @fstamina < GALVFIGHT::STAMINA_COST @fskill_used = nil @fstamina -= GALVFIGHT::STAMINA_COST se = @fse_miss vol = 80 + rand(20) pit = 100 + rand(50) RPG::SE.new(se,vol,pit).play @combo = @combo.rotate @fight_pose = @combo[0] @attack_timer = 22 end def fight_combo_skill(skill) sk = $data_skills[skill] return if @fstamina < sk.fcost #fight_normal_attack if @fstamina < sk.fcost return if attacking? @fstamina -= sk.fcost se = sk.fse vol = 80 + rand(20) pit = 100 + rand(50) RPG::SE.new(se,vol,pit).play if sk.fproj # Create Projectile Here @fprojectiles << FightProjectile.new(sk,self) self.animation_id = sk.fproj[2] @skill_timer = 22 elsif sk.scope >= 7 self.animation_id = sk.animation_id self.fight_item_apply(self, sk) @skill_timer = 22 else @fskill_used = sk @attack_timer = 22 end @fight_pose = sk.fpose end def fight_item_apply(user, item) @result.clear @result.used = item_test(user, item) @result.missed = (@result.used && rand >= item_hit(user, item)) @result.evaded = (!@result.missed && rand < item_eva(user, item)) if @result.hit? @result.critical = (rand < item_cri(user, item)) damage = fight_damage_value(self, $data_skills[item.id]) fight_target.do_damage(guarding?,item.id,damage) item.effects.each {|effect| item_effect_apply(user, item, effect) } item_user_effect(user, item) end end def fight_guard return if attacking? @fight_pose = 1 end def fight_jump return if fjumping? || in_air? @jump = -10 - GALVFIGHT::SIZE / 2 end def fjumping?; @jump < 0; end def in_air?; @fight_y < GALVFIGHT::Y; end def attacking?; @attack_timer > 0 || @skill_timer > 0; end def guarding?; @fight_pose == 1; end def getting_hit?; @takehit_timer > 0; end def moving_right?; @fight_speed > 0; end def moving_left?; @fight_speed < 0; end def away(amount) if fight_x < fight_target.fight_x return amount else return -amount end end def move_pose(direction) return 1 if @fight_x < fight_target.fight_x end def update_fight @takehit_timer -= 1 update_fight_movement update_gravity return @fight_pose = 12 if dead? return @fight_pose = 3 if getting_hit? && !guarding? update_btn_combo update_stamina update_hit @attack_timer -= 1 @skill_timer -= 1 end def update_stamina @fstamina += GALVFIGHT::REGEN_RATE if @fstamina < GALVFIGHT::MAX_STAMINA end def update_fight_movement if moving_right? @fight_x += [@fight_speed,@fight_mspeed].min elsif moving_left? @fight_x += [@fight_speed,-@fight_mspeed].max end end def update_gravity if fjumping? || in_air? @fight_y += @jump + $game_system.gravity @jump += 0.2 else @fight_y = GALVFIGHT::Y @jump = 0 end end def fight_target if $game_system.fighters[0].id == @actor_id return $game_system.fighters[1] else return $game_system.fighters[0] end end def update_hit if @attack_timer == 8 if make_contact? if fight_target.guarding? fight_target.animation_id = GALVFIGHT::GUARD_ANIM s = @fskill_used ? @fskill_used : $data_skills[GALVFIGHT::ATTACK_SKILL] damage = fight_damage_value(self,s) do_damage(true,s.id,damage) @fskill_used = nil else if @fskill_used anim = @fskill_used.animation_id s = @fskill_used else anim = @fhit_anim s = $data_skills[GALVFIGHT::ATTACK_SKILL] end fight_target.animation_id = anim damage = fight_damage_value(self,s) do_damage(false,GALVFIGHT::ATTACK_SKILL,damage) @fskill_used = nil end end end end def proj_hit(skill) if fight_target.guarding? fight_target.animation_id = GALVFIGHT::GUARD_ANIM else fight_target.animation_id = skill.animation_id end fight_target.fight_item_apply(self,skill) end def do_damage(guard,s_id,damage,proj = false) if guard damage *= GALVFIGHT::GUARD_DAMAGE if damage > 0 fight_target.fight_speed += away(2) * GALVFIGHT::SIZE @fight_speed += fight_target.away(2) * GALVFIGHT::SIZE if proj end else fight_target.fight_speed += away(4) * GALVFIGHT::SIZE if damage > 0 end fight_target.fight_damage(damage) end def fight_damage_value(user, item) value = item.damage.eval(user, self, $game_variables) value *= item_element_rate(user, item) value *= pdr if item.physical? value *= mdr if item.magical? value *= rec if item.damage.recover? value = apply_variance(value, item.damage.variance) return value end def fight_damage(damage) change_hp(-damage.to_i,true) if SceneManager.scene.phase == 1 @attack_timer = 0 @skill_timer = 0 if damage > 0 @takehit_timer = 18 remove_states_by_damage end end def reach; @frange * GALVFIGHT::SIZE; end def range; (fight_target.fight_x - @fight_x).abs; end def in_range_x; (fight_target.fight_x - @fight_x).abs < reach; end def in_range_y; ((fight_target.fight_y - @fight_y).abs) * 1.2 < reach ;end def near_range_x; ((fight_target.fight_x - @fight_x).abs) / 1.5 < reach; end def make_contact? return true if in_range_x && in_range_y end def reset_fight erase_state(death_state_id) @hp = 1 if @hp <= 0 init_fight_vars end def end_match @fight_pose = 0 if !dead? end def sta_rate @fstamina.to_f / GALVFIGHT::MAX_STAMINA end def update_btn_combo @btn_combo = [] if @btn_timer == 0 @btn_timer -= 1 end def add_combo(direction) @btn_timer = 20 @btn_combo << direction end end # Game_Actor < Game_Battler #-----------------# #---| GAME_SYSTEM |--------------------------------------------------------- #-----------------# class Game_System attr_accessor :fighters attr_accessor :fmode attr_accessor :gravity attr_accessor :fbacks attr_accessor :fmusic alias galv_fight_gs_initialize initialize def initialize galv_fight_gs_initialize @gravity = 5 @fbacks = [GALVFIGHT::BATTLEBACK1,GALVFIGHT::BATTLEBACK2] @fmusic = [GALVFIGHT::MUSIC,GALVFIGHT::VICTORY_ME] @fmode = 0 # 0 is Player vs AI 1 is Player vs Player end end # Game_System #---------------------# #---| SCENE_ACTORDUEL |----------------------------------------------------- #---------------------# class Scene_ActorDuel < Scene_Base attr_accessor :spriteset attr_reader :phase include GFIGHT_AI def start super init_fvariables determine_fighters create_spriteset create_windows end def init_fvariables $game_variables[GALVFIGHT::VICTOR_VAR] = 0 @phase = 0 @ai_move = :none @ai_action = false @ai_timer = 0 @bufftimer = 0 RPG::BGM.new($game_system.fmusic[0],100,100).play end def determine_fighters @f1,@f2 = $game_system.fighters @f1.fight_x = GALVFIGHT::P1_X @f2.fight_x = GALVFIGHT::P2_X end def create_spriteset @spriteset = Spriteset_ActorDuel.new end def create_windows @hp_window = Window_FightHealth.new @info_window = Window_Fight.new @command_window = Window_FightCommand.new @command_window.deactivate.hide @command_window.set_handler(:ok, method(:on_ok)) @command_window.set_handler(:cancel, method(:on_cancel)) end def on_ok @phase = 2 @command_window.hide.deactivate @f1.end_match @f2.end_match end def on_cancel @command_window.hide.deactivate end #--------| UPDATE def update super update_graphics case @phase when 0 update_begin when 1 return if @command_window.active update_fighter1 update_fighter2 update_other when 2 update_common(@f2) update_common(@f1) @f1.fight_speed = 0 @f2.fight_speed = 0 update_end end end def update_begin return while @info_window.active @phase = 1 end def update_end RPG::ME.new($game_system.fmusic[1],100,100).play if !@end_timer @end_timer ||= 60 @victor.fight_pose = 10 if @victor @end_timer -= 1 return if @end_timer > 0 @info_window.victory(@victor) if @end_timer == 0 return while @info_window.active $game_system.fighters.each { |actor| actor.reset_fight } $game_variables[GALVFIGHT::VICTOR_VAR] = @victor ? @victor.id : 0 SceneManager.return end def update_graphics @spriteset.update end def update_other if Input.trigger?(:B) && !$game_switches[GALVFIGHT::QUIT_SWITCH] @command_window.show.activate end if @bufftimer >= GALVFIGHT::TURNTIMER @f1.on_turn_end @f2.on_turn_end @f1.remove_buffs_auto @f2.remove_buffs_auto @bufftimer = 0 end @bufftimer += 1 end def update_fighter1 update_f1_movement update_f1_action update_common(@f1) end def update_f1_movement if Input.press?(GALVFIGHT::P1_DOWN) @f1.fight_move(:down) @f1.add_combo(:d) if Input.trigger?(GALVFIGHT::P1_DOWN) elsif Input.trigger?(GALVFIGHT::P1_UP) @f1.fight_move(:up) @f1.add_combo(:u) elsif Input.press?(GALVFIGHT::P1_LEFT) @f1.fight_move(:left) @f1.add_combo(get_back_dir(@f1)) if Input.trigger?(GALVFIGHT::P1_LEFT) elsif Input.press?(GALVFIGHT::P1_RIGHT) @f1.fight_move(:right) @f1.add_combo(get_forward_dir(@f1)) if Input.trigger?(GALVFIGHT::P1_RIGHT) else @f1.fight_move(:none) end end def get_back_dir(player) return player.fight_x < player.fight_target.fight_x ? :l : :r end def get_forward_dir(player) return player.fight_x < player.fight_target.fight_x ? :r : :l end def update_f1_action @f1.fight_action if Input.trigger?(GALVFIGHT::P1_ACTION) && !@f1.attacking? && !@f1.guarding? if @f2.dead? @phase = 2 @victor = @f1 end end def update_fighter2 if $game_system.fmode == 1 update_f2_movement update_f2_action else update_f2_ai end update_common(@f2) end def update_f2_movement if Input.press?(GALVFIGHT::P2_DOWN) @f2.fight_move(:down) @f2.add_combo(:d) if Input.trigger?(GALVFIGHT::P2_DOWN) elsif Input.trigger?(GALVFIGHT::P2_UP) @f2.fight_move(:up) @f2.add_combo(:u) elsif Input.press?(GALVFIGHT::P2_LEFT) @f2.fight_move(:left) @f2.add_combo(get_back_dir(@f2)) if Input.trigger?(GALVFIGHT::P2_LEFT) elsif Input.press?(GALVFIGHT::P2_RIGHT) @f2.fight_move(:right) @f2.add_combo(get_forward_dir(@f2)) if Input.trigger?(GALVFIGHT::P2_RIGHT) else @f2.fight_move(:none) end end def update_f2_action @f2.fight_action if Input.trigger?(GALVFIGHT::P2_ACTION) && !@f2.attacking? && !@f2.guarding? if @f1.dead? @phase = 2 @victor = @f2 end end def update_common(fighter) fighter.update_fight end #--------| DESTROY def dispose_spriteset @spriteset.dispose end def terminate super dispose_spriteset @f1.on_battle_end @f2.on_battle_end end end # Scene_Kombat < Scene_Base #-------------------------# #---| SPRITESET_ACTORDUEL |------------------------------------------------- #-------------------------# class Spriteset_ActorDuel attr_accessor :viewport3 def initialize create_viewports create_battleback1 create_battleback2 create_fighters create_face1 create_face2 create_bars update end #-------- | CREATE STUFF def create_viewports @viewport1 = Viewport.new @viewport2 = Viewport.new @viewport3 = Viewport.new @viewport1.z = 20 @viewport2.z = 50 @viewport3.z = 150 end def create_battleback1 return if !$game_system.fbacks[0] @back1_sprite = Sprite.new(@viewport1) @back1_sprite.bitmap = Cache.battleback1($game_system.fbacks[0]) @back1_sprite.z = -1 center_sprite(@back1_sprite) end def create_battleback2 return if !$game_system.fbacks[1] @back2_sprite = Sprite.new(@viewport1) @back2_sprite.bitmap = Cache.battleback2($game_system.fbacks[1]) @back2_sprite.z = 0 center_sprite(@back2_sprite) end def create_fighters @fighters = [] @shadows = [] $game_system.fighters.each { |f| @shadows << Sprite_FightShadow.new(@viewport2,f) @fighters << Sprite_Fighter.new(@viewport2,f) } end def create_face1 face_index = $game_system.fighters[0].face_index @face1 = Sprite.new(@viewport2) @face1.bitmap = Cache.face($game_system.fighters[0].face_name) rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96) @face1.src_rect.set(rect) end def create_face2 face_index = $game_system.fighters[1].face_index @face2 = Sprite.new(@viewport2) @face2.bitmap = Cache.face($game_system.fighters[1].face_name) rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96) @face2.src_rect.set(rect) @face2.x = Graphics.width - 96 @face2.mirror = true end def create_bars @bar1 = Sprite.new(@viewport3) @bar1.bitmap = Cache.system("kombat_bar") rescue Cache.system("") @bar2 = Sprite.new(@viewport3) @bar2.bitmap = Cache.system("kombat_bar") rescue Cache.system("") @bar2.x = Graphics.width - @bar2.bitmap.width @bar2.mirror = true end #-------- | UPDATE STUFF def update @fighters.each { |s| s.update } @shadows.each { |s| s.update } @viewport1.update @viewport2.update @viewport3.update update_projectiles end def update_projectiles $game_system.fighters.each { |f| f.fprojectiles.each_with_index { |p,i| if p.finished? p.dispose if !p.nil? p = nil else p.update end } f.fprojectiles.compact! } end #-------- | DESTROY STUFF def dispose dispose_viewports dispose_fighters dispose_background dispose_faces dispose_projectiles end def dispose_viewports @viewport1.dispose @viewport2.dispose @viewport3.dispose end def dispose_fighters @fighters.each { |s| s.dispose } @shadows.each { |s| s.dispose } @bar1.dispose @bar2.dispose end def dispose_background @back1_sprite.dispose if @back1_sprite @back2_sprite.dispose if @back2_sprite end def dispose_faces @face1.dispose @face2.dispose end def dispose_projectiles $game_system.fighters.each { |f| f.fprojectiles.each { |p| p.dispose } } end def center_sprite(sprite) sprite.ox = sprite.bitmap.width / 2 sprite.oy = sprite.bitmap.height / 2 sprite.x = Graphics.width / 2 sprite.y = Graphics.height / 2 end end # Spriteset_ActorDuel #-------------------# #---| SPRITE_FIGHTER |------------------------------------------------------- #-------------------# class Sprite_Fighter < Sprite_Battler def initialize(viewport, battler = nil) super(viewport,battler) init_fvariables end def init_fvariables @pattern = 0 @speed_timer = 0 @pose = 0 if $game_system.fighters[0].id == @battler.id player = 0; opponent = 1 else player = 1; opponent = 0 end @player = $game_system.fighters[player] @opponent = $game_system.fighters[opponent] end def update if @battler.fight_sprite update_bitmap update_pose update_src_rect update_anim update_position update_facing end super end def update_bitmap new_bitmap = Cache.battler(@battler.fight_sprite, @battler.battler_hue) if bitmap != new_bitmap self.bitmap = new_bitmap spritesheet_normal init_visibility self.zoom_x = GALVFIGHT::SIZE self.zoom_y = GALVFIGHT::SIZE end end def spritesheet_normal @cw = bitmap.width / GALVFIGHT::COLS @ch = bitmap.height / GALVFIGHT::ROWS self.ox = @cw / 2 self.oy = @ch end def update_pose if @pose != @battler.fight_pose @pattern = 0 @pose = @battler.fight_pose end end def update_src_rect if @pattern >= GALVFIGHT::COLS if @battler.fight_pose == 10 && @battler.fvicpose @pattern = GALVFIGHT::COLS - 1 else @pattern = 0 end end sx = @pattern * @cw sy = @battler.fight_pose * @ch self.src_rect.set(sx, sy, @cw, @ch) end def update_origin;end def update_anim @speed_timer += 1 if @speed_timer > 6 @pattern += 1 @speed_timer = 0 end end def update_facing self.mirror = @player.fight_x > @opponent.fight_x ? false : true end def update_position self.x = @battler.fight_x self.y = @battler.fight_y end def make_animation_sprites @ani_sprites = [] if !@@ani_spr_checker.include?(@animation) 16.times do sprite = ::Sprite.new(viewport) sprite.visible = false @ani_sprites.push(sprite) end if @animation.position == 3 @@ani_spr_checker.push(@animation) end end @ani_duplicated = @@ani_checker.include?(@animation) if !@ani_duplicated && @animation.position == 3 @@ani_checker.push(@animation) end end end # Sprite_Fighter < Sprite_Battler #------------------# #---| SPRITE_SHADOW |-------------------------------------------------------- #------------------# class Sprite_FightShadow < Sprite def initialize(viewport, player) super(viewport) @player = player create_shadow end def dispose bitmap.dispose if bitmap super end def update super update_position end def create_shadow self.bitmap = Cache.system("Shadow") self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height self.z = 0 self.zoom_x = GALVFIGHT::SIZE self.zoom_y = GALVFIGHT::SIZE end def update_position self.x = @player.fight_x self.y = GALVFIGHT::Y end end # Sprite_FightShadow < Sprite #-----------------------# #---| WINDOW_FIGHTHEALTH |--------------------------------------------------- #-----------------------# class Window_FightHealth < Window_Base def initialize super(0, 0, Graphics.width, 140) self.opacity = 0 refresh end def player; $game_system.fighters; end def update super refresh end def refresh contents.clear contents.font.name = GALVFIGHT::FONT draw_player1 draw_player2 end def draw_player1 pl = player[0] draw_hp(pl, 100, 15, false) draw_stamina(pl, 100, 40, false) draw_text(100,0,100,line_height,pl.name,0) draw_actor_icons(pl, 100, 65, 240) end def draw_player2 pl = player[1] draw_hp(pl, contents.width - 224, 15, true) draw_stamina(pl, contents.width - 224, 40, true) draw_text(contents.width - 200,0,100,line_height,pl.name,2) draw_actor_icons(pl, contents.width - 224, 65, 240) end def draw_hp(actor, x, y, r) draw_gauge(x, y, 124, actor.hp_rate, hp_gauge_color1, hp_gauge_color2, r, 12) end def draw_stamina(actor, x, y, r) draw_gauge(x, y, 124, actor.sta_rate, mp_gauge_color1, mp_gauge_color2, r, 6) end def draw_gauge(x, y, width, rate, color1, color2, reverse, height) fill_w = (width * rate).to_i gauge_y = y + line_height - 8 contents.fill_rect(x, gauge_y, width, height, gauge_back_color) if reverse contents.gradient_fill_rect(x + width - fill_w, gauge_y, fill_w, height, color1, color2) else contents.gradient_fill_rect(x, gauge_y, fill_w, height, color1, color2) end end end # Window_FightHealth < Window_Base #-----------------# #---| WINDOW_FIGHT |--------------------------------------------------------- #-----------------# class Window_Fight < Window_Base attr_accessor :phase attr_accessor :victor def initialize super(0, 0, Graphics.width, Graphics.height) self.opacity = 0 @phase = 0 @timer = 0 end def update case @phase when 0 contents.clear contents.font.name = GALVFIGHT::FONT contents.font.size += 1 draw_text(0,0,width,height,GALVFIGHT::START1,1) when 2 contents.clear contents.font.name = GALVFIGHT::FONT contents.font.size = 80 draw_text(0,0,width,height,GALVFIGHT::START2,1) when 3 contents.clear deactivate when 4 contents.clear contents.font.size = 60 if @victor contents.font.name = GALVFIGHT::FONT txt = @victor.name.upcase + GALVFIGHT::WINS draw_text(0,0,width,height,txt,1) else contents.font.name = GALVFIGHT::FONT draw_text(0,0,width,height,GALVFIGHT::NOWINNER,1) end when 5 contents.clear deactivate end @timer += 1 @phase = 1 if @timer == 40 @phase = 2 if @timer == 100 @phase = 3 if @timer == 130 @phase = 5 if @timer == 300 end def victory(victor) @victor = victor @phase = 4 @timer = 150 activate end end # Window_Fight < Window_Base #------------------------# #---| WINDOW_FIGHTCOMMAND |-------------------------------------------------- #------------------------# class Window_FightCommand < Window_Command def initialize super(Graphics.width / 2 - window_width / 2, Graphics.height / 2 - 80) end def window_width; return 160; end def visible_line_number; return 2; end def make_command_list add_command(GALVFIGHT::CMD_QUIT, :quit, true) add_command(GALVFIGHT::CMD_CANCEL, :cancel, true) end def update; super; end def select_last; select(0); end end # Window_FightCommand < Window_Command #---------------------------# #---| SPRITE_FIGHTPROJECTILE |----------------------------------------------- #---------------------------# class FightProjectile < Sprite_Base attr_accessor :skill def initialize(skill, owner) @owner = owner @target = owner.fight_target @skill = skill super(SceneManager.scene.spriteset.viewport3) init_fvariables create_bitmap end def init_fvariables self.x = @owner.fight_x self.y = @owner.fight_y self.opacity = 0 @pattern = 0 @pose = @skill.fproj[0] @speed_timer = 0 @range_limit = @skill.fproj[3] @range = 0 @reach = @skill.fproj[4] end def update update_src_rect update_anim update_position update_hit super end def create_bitmap self.bitmap = Cache.battler(GALVFIGHT::SKILLIMAGE, 0) @cw = bitmap.width / GALVFIGHT::SKILLCOLS @ch = bitmap.height / GALVFIGHT::SKILLROWS self.ox = @cw / 2 self.oy = @ch self.mirror = @owner.fight_x > @target.fight_x ? false : true end def update_src_rect if @pattern >= GALVFIGHT::SKILLCOLS @pattern = 0 end sx = @pattern * @cw sy = @pose * @ch self.src_rect.set(sx, sy, @cw, @ch) end def update_anim @speed_timer += 1 if @speed_timer > 6 @pattern += 1 @speed_timer = 0 end end def update_position self.x += self.mirror ? @skill.fproj[1] : -@skill.fproj[1] self.opacity += 20 @range += 1 end def make_animation_sprites @ani_sprites = [] if !@@ani_spr_checker.include?(@animation) 16.times do sprite = ::Sprite.new(viewport) sprite.visible = false @ani_sprites.push(sprite) end if @animation.position == 3 @@ani_spr_checker.push(@animation) end end @ani_duplicated = @@ani_checker.include?(@animation) if !@ani_duplicated && @animation.position == 3 @@ani_checker.push(@animation) end end def dispose; super; end def finished?; @range >= @range_limit; end def in_range_x; (@target.fight_x - self.x).abs < @reach; end def in_range_y; (@target.fight_y - self.y).abs < @reach + 60; end def make_contact?; return true if in_range_x && in_range_y; end def update_hit if make_contact? @owner.proj_hit(@skill) @range = @range_limit end end end # FightProjectile < Sprite_Base
Hello Galv,
I am using the high fantasy holder sheets, and the shadows of the sprites (which mean the actual hit box) is way ahead the sprite graphics, which means the hit collision is ahead its graphic, totally messing the fight. Is there a way to solve this?
I don’t know what they look like, but I will add something to allow an offset for spritesheets that would fix that in the next update
Thanks Galv, if you want i can make you a screenshot or a video. They look pretty nice, gives a feel of a mortal kombat game =).
Hmm, interested in seeing the sheets you are using. Unless I am mistaken it should be centered, so unless they are not centered in the spritesheet?
Sorry for the late reply Galv. Yeah it doesn’t happen only with your script, it happens also in symphony. They are a bit more to the left. You can test them by picking the latest free resources of PV games (the one who made the high gantasy series), or if you prefer i can pass only the sheets for you via PM in the official forum. Here’s the link: http://www.pioneervalleygames.com/free-resources.html
Ahh, I see. Their animated battlers are not centered. I’ll get to this one day, but pretty busy so not sure when.
Genius!
For some reason, I feel like 1.2’s AI is ALOT easier :P.
I didn’t spend much time on the AI. Feel free to write your own to make it harder.
Galv help!Since i have no knowledge in scripting!I try using “set_fmusic(“Duel minigame”) and it says the error exact quote:”Unable to find file: Audio/BGM/d” and if i change the music to “d” then it says:”Unable to find file: Audio/BGM/Duel minigame” can you please find me a solution?
And while we are at it i cant make it that when i get defeated it brings up the game over screen.
By default actors will not die from a duel, they go to 1 hp afterward. You could use eventing to make a game over if that’s what you want it to do but I might add in that option later to make it easier.
The music changing issue was a bug – I have fixed that now in version 1.4. Thanks for letting me know.
maybe you can add something like, get experience and gold when hero win battle
You can use eventing to do that.
Is there any way I can disable jumping?
Add this after the script in the script list:
class Game_Actor < Game_Battler
def fight_jump;end
end
Thank you so much for sharing this script Galv ^^
It worked perfectly until I tried putting it together with Mog adv battle HUD.
When I try to initiate the duel, I get an error message.
Script ‘MOG_Adv_Battle_hud’ line 772: TypeError occured.
nil can’t be coerced into Fixnum
I have also tried putting only these 2 scripts together in a fresh project
and the same error message still pops out
I’m wondering if there’s a way to fix this.
Thank you for any response in advance.
I don’t have time to look into compatibility problems right now, sorry.
Hi, Galv. I was wonder how I could add more fighters into the mini game? I downloaded a few of the battlers from the website listed above, and I can’t figure out how to actually add them into the game.
Download the demo and look at how it’s set up.
The battlers you download are in /Graphics/Battlers/ folder
I put the battlers in the folder, but when I set it up for the new characters to be usable, this happens.

I’m also not that good at reading script, so I couldn’t find where the characters were.
I’m not sure what is happening there – Is one character invisible?
Make sure the note tag is the same name as the battler image file.
Also run through this error checklist to try to find the problem:
https://galvs-scripts.com/errors-using-scripts/
The character on the left is completely invisible, What’s a note tag exactly? I’m not all that educated with scripting.
A note tag is a tag of code that goes in the notes field of certain things like actors, items, etc.
Download the demo and check out all the notes fields to see how it’s done and compare to the instructions. I don’t know how to help anymore than that, they are very comprehensive instructions :)
Oh, duh! Thank you so much!
I’ve been tweaking some abilities in the demo, trying to figure out how this script works, and I just couldn’t find a way to change the “fire” animation from the projectile…I’m not talking about when it hits (right now he fires a fire ball and when it hits ice appears (i wanted him to fire ice)), I mean the real projectile that travels…Is there a way to change it? Where can I set its animation?
Look for the ‘Note tag for SKILLS’ section in the script instructions.
# Use this tag if the skill will be a projectile.
# # p = pose row of SKILLIMAGE spritesheet
WOW, i feel stupid now…thanks, i must’ve misread that :!
I love this script and I’m running into a problem with it and another script. The problem seems really simple the other script I’m using is called Jets Animated Battles and where the problem is that I see is when I have he note tag for jets script it clashes with your duels though they use the same sprite sheets if one of them is tagged the other won’t work his causes yours to stop updating the animation changes and yours doesn’t affect his script at all :( but dueling with 2 chars ‘ice skating and just numbing into each other isn’t very appealing… so my question is is there a simple way I can either change something in your script which will coincide with his (I’ve already tried changing the fimage within the script to search for anim battler it seemed to have no effect but maybe i didn’t change enough) or is there a way to use events in game to change the note tags while playing so I can switch them out as needed?
I recommend asking in an rpgmaker forum as I don’t have time to look at the conflict.
Hey there Galv, is it possible to put a timer in battle? I’m plan on using this as my main battle system for my game.
I don’t have time for requests, sorry.
Also, is there a way where if player loses, bring the Game Over scene?
Do that using eventing after the battle. Download the demo to see examples of eventing conditions on who wins or loses.
There’s a problem with that however, the variable doesn’t distinguish Player 1 from Player 2/AI, so if Player 1 was to win it would still be Game Over.
The variable stores the Victor’s actor ID.
You need to input the actor ID’s to start the fight.
You can use conditional branches to check if the variable is equal to the id you entered.
Thank you. I was able to get it to work correctly. Much appreciated.
What is the License on this script, and if you need permission to use it commercially, may I?
Feel free to use it commercially. All I ask for this one is credit :)
Hey dude, how do I set it up so that it works like an arcade game? So there’s a prize when the player wins the AI battle but their health doesn’t deteriorate when they lose?
You’ll need to use eventing for that. Recommend asking in a forum if others can help if you can’t work it out :)
(unfortunately I’m too busy at the moment)
Nice job Galv, this script is amazing. I wanted to know if its possible to rearrage the position of life and stamina bars, If it is, i would like to know how. Thanks and keep up the good work!
That requires a change in the script :)
Unfortunately I am too busy for requests, I recommend asking in an rpgmaker forum
Galve, here I’am again to ask you a question, Is it possible to have and overlay picture in the battle ? I wanted to make a battle in a forest, and by moving, sometimes the characters would be hidden by the trees. If there is a way please, tell me how to do it. Thanks again!
Not without modifying the script. Unfortunately I don’t have time for requests :( Great idea, though
Hey galv. Awesome script. I’m using it to create a coliseum type game, but I am not completely familiar with the scripting part. Was wondering if there is a way to distinguish who would be fighting in the fights with variables.
Replace the ID of the actor in the fight with $game_variables[x] … the x being the number of the variable in-game you want to use to store the actor ID. To learn more about variables I recommend asking in a forum :)
I know how to use variables. Just didn’t know if they would work for your script. I have used a variety scripts to learn how to write scripts and understand how everything works. But I did have one more question in regards to this script. I am doing a game where there are CPU vs CPU and was wondering if there was a setting in the script that would allow that. I know its set up right now as 0-p1vscpu and 1-p1 vs p2
Unfortunately there’s no cpu vs cpu setup for the script
I’m having a hard time understanding the skills on the note tags. Could you possibly take a screenshot of the skill notes, so I can see for myself how this works lol. I love your script, you’re awesome thank you!
There is a link to a demo you can download at the top of this page, you can see how it works yourself there
I wanted to say thank you for your hard work on these awesome scripts!
You truly are my favorite scripter. Anyways, I couldn’t help but agree with Rain
I have the demo and even with the intructions I can’t seem to figure it out.
Here’s a example of the skills in the note tags:
add_fskill(7,26,[:l,:l,:r]) <— (character is the 7th actor in the game, and 26 meaning the Skill ID for heal)
What am I doing wrong? I mainly just want to know how to heal, and poison, like status effect moves.
I understand you’re busy, but if you or anyone on here that can help that would be so helpful! <3
Hi Galv, Is it possible to put a individual sprite for the projectile? so if it is posssible, please tell me how :v Thanks.
What do you mean individual sprite? All projectile sprites are taken from the skillimage spritesheet.
You need to use a notetag in a skill to define which row of that spritesheet the projectile will use
Sorry for late reply, you were right xD, may u odify the script for the following actions? jump/ jump foward/ jump backward and jump attack/ jump foward attack/ jump backward attack. I want to put different sprite for these actions, cancel projectile in the air. I really need this, and I’m willing to pay for a reasonable price. please contact me, Bye c:
modify***
Unfortunately I have way too much to do already for this. I will, however, when I have time be remaking this for RPG Maker MV and it will be much more advanced.
If you’re interested in helping support me and give me more time to work, I have a patreon set up for supporters :)
https://www.patreon.com/Galv
I can’t seem to get my projectile attack to work. I tried looking into the notetags in the demo, but I don’t really understand it.
All the information is there – don’t give up! Make sure to read the script help documentation.
I think I may have found the source of the problem. Originally when I tried testing the skills, I often close out of the game while in the middle of a battle when going back to RPG Maker. This morning, I decided to just randomly play around. I lost a battle. Instead of closing out of it, I continued on. Upon going back to the overworld, the game crashed and showed an error involving the “add_fskill” notetag. So basically, the main reason as to why the skill wasn’t working is because the event was set up so that the skill wasn’t added until after the battle. You’ll also notice that another problem has arose; the “add_fskill” notetag causes the game to crash. Here’s the error message given:
“Script ‘Game_Interpreter’ line 1411: NoMethodError occurred.
undefined method ‘add_fskill’ for #”
It seems there was a typo in the script command for add_fskill. It has been add_skill (as could be seen used in the demo). I updated to v.1.6 to fix that.
Upon attempting to sue the skill, I have this error:
“Script ” line 692: NoMethodError occurred.
undefined method ‘fcost’ for nil:NilClass”
I’m fairly certain that this is a script-based error.
Does this happen in the demo? I’ve had people create entire games from this script without issue… please compare what you have done with the demo and use the demo to try to recreate the issue.
The line the error references thinks there is no existing skill. Make sure your skill exists in the database with the ID you used and check the note tag for it
Ok, so apparently you’re supposed to put the notetags in a skill in the database. Originally, I put the notetags in the character itself. That took me a while to figure that out. Upon trying to use the skill, it’ll play the Hit Physical animation and its sound effect for some reason. The skill is completely empty of information except for the Name, Description, Notes, and the Damage section, but it still plays the hit animation. Also, it causes no damage and I don’t know how to adjust its power.
Please read the script instructions. The note tags for skills are under the heading “Note tag for SKILLS”.
Please also examine the demo and see how the skills are set up… I write instructions and make a demo for this reason :(
I’ve managed to get it to cause damage. I’m still having problems with the hit animation appearing for no reason. If I had more time, I would invest more into trying to fix these on my own, but school is taking up a bit too much time for me.
Never mind. Apparently, changing the A in the notetag to 0 fixed the animation problem that I’m talking about.
I’ve got MUGEN on my mind while working on this. MUGEN is a fighting game engine, you see. In your script, A is referred to as “animation_id.” When programming in MUGEN, animation_id refers to the number assigned to an animation to help identify it, so I thought it was referring to the sprite that I wanted to use for the projectile.
Sorry for asking so many questions. I have a tendency to do this sometimes.
Ok, so I’ve been having problems adding sound using the tag “. It works, but it plays the sounds with random different pitches each time. Is there any way to remove this?
I originally used the tag “” to circumnavigate the problem. I created animations with nothing in them except for sound, and assigned those animations to that tag; that’s how I got the sounds. Since the tag only applies for projectiles, I cannot use this workaround for melee attacks and would be forced to use the tag.
The tags would not show up in my comment probably due to the use of greater than/lesser than signs (Whatever you want to call them). The first tag mentioned was “fse:” and the second being “fp: p,s,a,t,r”
I’m sorry, but I am way too busy to make any changes to this script for you or to teach you how to use it.
The script comes as is – feel free to modify it yourself or to ask in a forum if others would modify it for you.
Gonna try posting one more time…I just wanted to know if there is a way to add a slight delay in the script. Preferrably this would happen once the screen fades in but before START1 (Get Ready text). The idea is to be able to play some sound effects during this time before the fight begins. I have no scripting knowledge and tried the graphics.wait command but it just freezes the game at start up instead of when the script is actually being used. I’m hoping it’s a matter of just adding in some delay command in the script and doesn’t require some major overhaul. Thanks, it’s amazing either way
Sorry, I am too busy to modify or do requests unfortunately
I figured. I guess it’s not as simple as just me throwing in a wait(60) somewhere in the script?
Probably not that simple, no :)
Hey Galv i only have one little issue, and can’t figure out how to fix it. If you jump, and move to the left or the right, the “run” animation is playing instead of the jump animation. (So you only have jump animation while not moving :( )
Is there a way to have jump animation only while in air? Kinda crazy to walk in the air. XD
Other than that i love this script thank you for that! :D
Sorry, I’m not making any changes to this script. Any improvements will be done in my MV version when I work on it.
This little mini game I thought to be rather kyuute (though I keep getting my butt kicked in vs. AI mode lol).
I noticed that for vs. 2P, using a game controller caused me to control both players, but not effectively.
Definitely not designed for gamepad support, sorry
Hi Galv,
are you currently working on MV version of this awesome script?
thanks
No sorry, I haven’t time to work on new plugins these days.
No worry, thanks for quick response :)
Hi! How can i trigger a Common Event when using a skill?
Or alternately, how can i create a character that uses bullets and he have to recharge after some attacks?
Can’t run common events inside the mini game, sorry
Thanks, is there a possibility that you will add this function?
And for the other question?
Sorry, no. I don’t do VX Ace scripts or updates anymore and didn’t implement an ammunition system into it.
Hi Galv! Love your scripts, but can I ask how do you add additional skills for the enemy instead of just having both sides shooting fire. For example: you are the fire type and the opponent is water type. Thanks!
You need to create the skills and graphics yourself. Check the script information at the top of the script.