=begin
Script Version:
1.08
Script Description:
This script is an add-on for Blizz abs, it allows weapons to "charge up"
when holding down the attack button, similar to many ABS games, when the
charge time is fulfilled then a skill will be released when the attack
button is release.
Script Instructions:
See module Skill_Charges for skill setup.
***Setting Images***
Background will be used as the background for the charging hud.
Charging is used as the bar that will fill up as the weapon charges.
Bar_Off_X is to center the X coordinate of the Charging bar on the background.
Bar_Off_Y same as above except for the Y coordinate.
Charging_Sprite is used to determine wether to use a character sprite or not
set to true or false.
Charging Sprites must be named as so.
ActorsName_charge_weapon_type(by default weapon type is 1 in blizz abs)
Weapon Types:
1.sword / axe / claws / unarmed / etc. (damages in close front)
2.spear / lance (damages only in front)
3.flail (distant weapon, does not damage close enemies, front)
4.boomerang (returning projectile weapon, front)
5.bow and arrow / gun / shuriken (non-returning projectile, NO consumption)
6.bow and arrow / gun (non-returning projectile, consumes AMMUNITION)
7.shuriken (non-returning projectile, consumes ITSELF)
***Sound Settings***
Sound_Effect, is the sound effect to play on charging completion.
Repeat_Sound, if set to true will replay the sound effect
while the button is held.
***Setting Skills for each weapon***
setup your skills as follows.
when [weapon_id] then return [skill_id]
Script Notes:
-Opening the menu will reset the timer upon exit.
-If using a bow and arrow(weapon that consumes items), it will consume the
lowest id item that the weapon can use for ammo(if you have any).
=Script Author=
Chaucer
=end
module Skill_Charges
#how many frames the timer will count before fully charged
Timer = 40
#Charging Background Sprite
Background = 'Charging_Background'
#Charging Bar
Charging = 'Charging'
#the offset(if needed) of the hud bar
Bar_Off_X = 4
Bar_Off_Y = 4
#wether or not the sprite name will consider the weapon type.
Weapon_Type = false
#Use a charging sprite, set to true of false.
Charge_Sprite = true
#Sprite Extension name
Name = '_charge'
#the sound effect to be played when skill is ready.
Sound_Effect = 'Charge_Ready'
#if sound effect should repeat
Repeat_Sound = true
#Setup for weapons.
def self.weapon_charge(weapon_id)
case weapon_id
#when weapon_id then return skill id
when 1 then return 1
when 2 then return 2
when 3 then return 3
when 4 then return 4
when 5 then return 5
when 6 then return 6
end
return 1
end
end
#==============================================================================
#--------------------------- Charge Skills ------------------------------------
#- Class Dealing with Charging Skills. -
#==============================================================================
class Charge_Skills
#------------------------------------------------------------------------------
#Initialize
#------------------------------------------------------------------------------
def initialize
#get variables needed
@delay = 60
@dummy = 60
@ox = Skill_Charges::Bar_Off_X
@oy = Skill_Charges::Bar_Off_Y
@player = $game_party.actors[0]
@counter = Skill_Charges::Timer
@player_weapon = @player.weapon_id
@sprites = Skill_Charges::Charge_Sprite
@charge_speed = BlizzABS::Config::SNEAK_SPEED
@player_speed = BlizzABS::Config::NORMAL_SPEED
@type = BlizzABS::Weapons.type(@player_weapon)
@original_sprite = $game_party.actors[0].character_name
end
#------------------------------------------------------------------------------
#Update
#------------------------------------------------------------------------------
def update
#update players info.
update_player
#update the delay timer.
update_delay
#update the charge timer.
update_timer
#update the hud.
update_hud
#update sound effect.
update_sound
#update players sprite.
update_sprite if @sprites
dispose
end
#------------------------------------------------------------------------------
#Update Player information
#------------------------------------------------------------------------------
def update_player
#when selecting a different character.
if $game_party.actors[0] != @player
#dispose of any previous charging sprites
@stunned = true
#change the player variable.
@player = $game_party.actors[0]
#change sprite variable.
@original_sprite = $game_party.actors[0].character_name
end
#when selecting a different weapon and player is the same.
if @player.weapon_id != @player_weapon
#update the players weapon variable.
@player_weapon = @player.weapon_id
#update the weapon type
@type = BlizzABS::Weapons.type(@player_weapon)
end
#checks if the player is charging an attack.
if @delay == 0
#changes speed to sneak speed.
$game_player.normal_speed = @charge_speed if $game_player.normal_speed != @charge_speed
#checks if the charging timer has finished and release attack button.
if @timer == @counter && !Input.press?(Input::Attack)
skill_id = Skill_Charges.weapon_charge(@player_weapon) if skill_id == nil
$game_player.character_name_org = @original_sprite if $game_player.character_name_org != @original_sprite
$game_player.use_skill($data_skills[skill_id], true)
end
end
end
#------------------------------------------------------------------------------
#Update Delay Timer information
#------------------------------------------------------------------------------
def update_delay
#checks if battler size is greater than zero
if $game_system.battlers_number > 0
#checks if the player can use attack.
if $game_player.attack_can_use?
#if player is holding the attack button
if Input.press?(Input::Attack)
#calls to check which states are stuns.
check_states if @stuns == nil
#checks if the player has one of those states.
@stuns.each do |n|
#if player's stunned reset delay timer.
if @player.states.include?(n)
@stunned = true
else
#otherwise, countdown the delay
@delay -= 1 if @delay != 0 unless @delay == 0
end
end
end
end
end
end
#------------------------------------------------------------------------------
# Checks the states database for stun states.
#------------------------------------------------------------------------------
def check_states
#checks the players states to see if he's stunned
@stuns = [] if @stuns == nil
if @stuns == []
for i in 1...$data_states.size
if $data_states[i].restriction == 4
@stuns.push($data_states[i].id)
end
end
end
end
#------------------------------------------------------------------------------
# Update the timer for charging.
#------------------------------------------------------------------------------
def update_timer
#if the delay has finished
if @delay == 0
#if still holding the attack button
if Input.press?(Input::Attack)
@timer = 0 if @timer == nil
@timer += 1 unless @timer == @counter
end
end
end
#------------------------------------------------------------------------------
# Updates the sound effect for charging.
#------------------------------------------------------------------------------
def update_sound
#if skill is charged up
if @timer == @counter
#set repeat timer.
if @repeat == nil
@repeat = 0
end
#if repeat sound
if Skill_Charges::Repeat_Sound
if @repeat == @counter
@repeat = nil
@play = nil
else
@repeat += 1
end
end
#setup sound
sound = Skill_Charges::Sound_Effect if sound == nil
#if the sound hasn't played
if @play == nil
#play the sound effect
Audio.se_play("Audio/SE/" + sound, $game_variables[8], 150)
@play = true
end
end
end
#------------------------------------------------------------------------------
# Updates the players sprite.
#------------------------------------------------------------------------------
def update_sprite
if @delay == 0
if @timer > 0
#reset the players sprite so it doesn't cause any issues.
$game_player.character_name_org = @original_sprite if @spr_refresh == nil
@spr_refresh = true
@ext = Skill_Charges::Name if @ext = nil
#if the sprite has been reset.
if @spr_refresh == true
#set the sprite to charging sprite.
if Skill_Charges::Weapon_Type
$game_player.character_name_org = @original_sprite + @ext + '_' + @type if
$game_player.character_name_org != @original_sprite + @ext + '_' + @type
else
$game_player.character_name_org = @original_sprite + @ext if
$game_player.character_name_org != @original_sprite + @ext
end
end
end
end
end
#------------------------------------------------------------------------------
#Update for the HUD.
#------------------------------------------------------------------------------
def update_hud
if @delay == 0
#if images are nil
#setup images and variables needed.
@background = RPG::Cache.picture(Skill_Charges::Background) if @background == nil
@bar = RPG::Cache.picture(Skill_Charges::Charging) if @bar == nil
@bw1,@bh1 = @background.width,@background.height if @bw1 == nil || @bh1 == nil
@bw2,@bh2 = @bar.width,@bar.height if @bw2 == nil || @bh2 == nil
rect1 = Rect.new(0,0,@bw1,@bh1) if rect1 == nil
rect2 = Rect.new(0,0,@bw2,@bh2) if rect2 == nil
@x = (@background.width / 2) if @x1 == nil
@y = (@background.height / 2) - 16 if @y1 == nil
#create sprites if not created.
if @bhud == nil
#create background
@bhud = Sprite.new
@bhud.bitmap = Bitmap.new(@bw1,@bh1)
@bhud.bitmap.blt(0, 0, @background, rect1)
@bhud.x = $game_player.screen_x - @x
@bhud.y = $game_player.screen_y - @y
@bhud.z = $game_player.screen_z
#if it is created
else
@bhud.x = $game_player.screen_x - @x
@bhud.y = $game_player.screen_y - @y
@bhud.z = $game_player.screen_z
end
#creates bar when needed
if @bhud2 == nil
@bhud2 = Sprite.new
#if already created
else
if @timer > 0 && @timer != @counter
w = @timer * @counter / @counter
@bhud2.bitmap = Bitmap.new(w,@bh2)
@bhud2.bitmap.blt(0, 0, @bar, rect2)
@bhud2.x = $game_player.screen_x - @x + @ox
@bhud2.y = $game_player.screen_y - @y + @oy
@bhud2.z = $game_player.screen_z + 1
end
@bhud2.x = $game_player.screen_x - @x + @ox
@bhud2.y = $game_player.screen_y - @y + @oy
@bhud2.z = $game_player.screen_z + 1
end
end
end
#------------------------------------------------------------------------------
#Dispose
#------------------------------------------------------------------------------
def dispose
#if stunned or no longer pressing attack.
if @stunned || !Input.press?(Input::Attack)
#reset all the old variables.
$game_player.character_name_org = @original_sprite if $game_player.character_name_org != @original_sprite
$game_player.normal_speed = @player_speed if $game_player.normal_speed == @charge_speed
@spr_refresh = nil if @spr_refresh != nil
@bhud2.bitmap.dispose if @bhud2 != nil
@stunned = false if @stunned == true
@bhud.bitmap.dispose if @bhud != nil
@bhud2.bitmap = nil if @bhud2 != nil
@delay = @dummy if @delay != @dummy
@bhud.bitmap = nil if @bhud != nil
skill_id = nil if skill_id != nil
@bhud2.dispose if @bhud2 != nil
@repeat = nil if @repeat != nil
@timer = nil if @timer != nil
@bhud2 = nil if @bhud2 != nil
@bhud.dispose if @bhud != nil
@bhud = nil if @bhud != nil
@play = nil if @play != nil
end
end
end
#==============================================================================
#-------------------------- Scene Map Alias -----------------------------------
#- Alias Scene Map to include Charge Skills. -
#==============================================================================
class Scene_Map
alias update_charge_later update
def charge_new
if @charging == nil
@charging = Charge_Skills.new
@charging.dispose
end
end
def update
update_charge_later
charge_new
@charging.update
end
end