Jump to content
Rpg²S Forum

*Advanced Armor System


Valentino
 Share

Recommended Posts

Advanced Armor System

Descrizione

 

Questo script aggiunge delle funzionalità alle armature quali il prevenire un colpo critico oppure l'assorbire un elemento al posto di ridurne semplicemente l'effetto.

 

Autore

Avon Valentino (Io)

 

Allegati

 

 

#Advanced Armor System creato da Valentino Avon
#Se usate questo script, creditatemi :)
ARMATURE_PREVIENI_CRITICO = [33]
#ID delle armature che non permettono il subire un colpo critico.
ARMATURA_ASSORBE_ELEMENTO = [34,35]
#ID delle armature che al posto di difendere da un elemento lo assorbono.
#Il danno sarà assorbito per metà.
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
# This class handles the actor. It's used within the Game_Actors class
# ($game_actors) and refers to the Game_Party class ($game_party).
#==============================================================================
class Game_Actor < Game_Battler
	#--------------------------------------------------------------------------
	# * Public Instance Variables
	#--------------------------------------------------------------------------
	attr_reader :name # name
	attr_reader :character_name # character file name
	attr_reader :character_hue # character hue
	attr_reader :class_id # class ID
	attr_reader :weapon_id # weapon ID
	attr_reader :armor1_id # shield ID
	attr_reader :armor2_id # helmet ID
	attr_reader :armor3_id # body armor ID
	attr_reader :armor4_id # accessory ID
	attr_reader :level # level
	attr_reader :exp # EXP
	attr_reader :skills # skills
	attr_accessor :assorbe
	attr_accessor :dimezza
	#--------------------------------------------------------------------------
	# * Object Initialization
	# actor_id : actor ID
	#--------------------------------------------------------------------------
	def initialize(actor_id)
		super()
		setup(actor_id)
		@assorbe = false
		@dimezza = false
	end
	def previeni_critico?
		for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
			armor = $data_armors[i]
			if armor != nil
				if ARMATURE_PREVIENI_CRITICO.include?(armor.id)
					return true
				end
			end
		end
		return false
	end
	#--------------------------------------------------------------------------
	# * Setup
	# actor_id : actor ID
	#--------------------------------------------------------------------------
	def setup(actor_id)
		actor = $data_actors[actor_id]
		@actor_id = actor_id
		@name = actor.name
		@character_name = actor.character_name
		@character_hue = actor.character_hue
		@battler_name = actor.battler_name
		@battler_hue = actor.battler_hue
		@class_id = actor.class_id
		@weapon_id = actor.weapon_id
		@armor1_id = actor.armor1_id
		@armor2_id = actor.armor2_id
		@armor3_id = actor.armor3_id
		@armor4_id = actor.armor4_id
		@level = actor.initial_level
		@exp_list = Array.new(101)
		make_exp_list
		@exp = @exp_list[@level]
		@skills = []
		@hp = maxhp
		@sp = maxsp
		@states = []
		@states_turn = {}
		@maxhp_plus = 0
		@maxsp_plus = 0
		@str_plus = 0
		@dex_plus = 0
		@agi_plus = 0
		@int_plus = 0
		# Learn skill
		for i in 1..@level
			for j in $data_classes[@class_id].learnings
				if j.level == i
					learn_skill(j.skill_id)
				end
			end
		end
		# Update auto state
		update_auto_state(nil, $data_armors[@armor1_id])
		update_auto_state(nil, $data_armors[@armor2_id])
		update_auto_state(nil, $data_armors[@armor3_id])
		update_auto_state(nil, $data_armors[@armor4_id])
	end
	#--------------------------------------------------------------------------
	# * Get Element Revision Value
	# element_id : element ID
	#--------------------------------------------------------------------------
	def element_rate(element_id)
		# Get values corresponding to element effectiveness
		table = [0,200,150,100,50,0,-100]
		result = table[$data_classes[@class_id].element_ranks[element_id]]
		# If this element is protected by armor, then it's reduced by half
		for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
			armor = $data_armors[i]
			if armor != nil and armor.guard_element_set.include?(element_id) and ARMATURA_ASSORBE_ELEMENTO.include?(armor.id)
				self.assorbe = true
				#result /= -2
			end
		end
		for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
			armor = $data_armors[i]
			if armor != nil and armor.guard_element_set.include?(element_id)
				self.dimezza = true unless self.assorbe
				#result /= 2
			end
		end
		# If this element is protected by states, then it's reduced by half
		for i in @states
			if $data_states[i].guard_element_set.include?(element_id)
				result /= 2
			end
		end
		# End Method
		return result
	end
end
#==============================================================================
# ** Game_Battler (part 3)
#------------------------------------------------------------------------------
# This class deals with battlers. It's used as a superclass for the Game_Actor
# and Game_Enemy classes.
#==============================================================================
class Game_Battler
	#--------------------------------------------------------------------------
	# * Applying Normal Attack Effects
	# attacker : battler
	#--------------------------------------------------------------------------
	def attack_effect(attacker)
		# Clear critical flag
		self.critical = false
		# First hit detection
		hit_result = (rand(100) < attacker.hit)
		# If hit occurs
		if hit_result == true
			# Calculate basic damage
			atk = [attacker.atk - self.pdef / 2, 0].max
			self.damage = atk * (20 + attacker.str) / 20
			# Element correction
			self.damage *= elements_correct(attacker.element_set)
			#assorbe/dimezza
			self.damage /= 100
			if self.dimezza and self.is_a?(Game_Actor)
				self.damage /= 2
				self.dimezza = false
			end
			if self.assorbe and self.is_a?(Game_Actor)
				self.damage /= -2
				self.assorbe = false
			end
			# If damage value is strictly positive
			if self.damage > 0
				#-------------------- Previene Critico
				if attacker.is_a?(Game_Enemy)
					if self.previeni_critico? == false
						self.critical = rand(100) < 4 * atk_critcal / self.agi
					end
				end
				if attacker.is_a?(Game_Actor)
					self.critical = rand(100) < 4 * atk_critcal / self.agi
				end
				self.damage *= 2 if self.critical and attacker.is_a?(Game_Actor)
				if self.critical and attacker.is_a?(Game_Enemy)
					if self.previeni_critico? == false
						self.damage *= 2
					end
				end
				#----------------------- Previene Critico
				# Guard correction
				if self.guarding?
					self.damage /= 2
				end
			end
			# Dispersion
			if self.damage.abs > 0
				amp = [self.damage.abs * 15 / 100, 1].max
				self.damage += rand(amp+1) + rand(amp+1) - amp
			end
			# Second hit detection
			eva = 8 * self.agi / attacker.dex + self.eva
			hit = self.damage < 0 ? 100 : 100 - eva
			hit = self.cant_evade? ? 100 : hit
			hit_result = (rand(100) < hit)
		end
		# If hit occurs
		if hit_result == true
			# State Removed by Shock
			remove_states_shock
			# Substract damage from HP
			self.hp -= self.damage
			# State change
			@state_changed = false
			states_plus(attacker.plus_state_set)
			states_minus(attacker.minus_state_set)
			# When missing
		else
			# Set damage to "Miss"
			self.damage = "Miss"
			# Clear critical flag
			self.critical = false
		end
		# End Method
		return true
	end
	#--------------------------------------------------------------------------
	# * Apply Skill Effects
	# user : the one using skills (battler)
	# skill : skill
	#--------------------------------------------------------------------------
	def skill_effect(user, skill)
		# Clear critical flag
		self.critical = false
		# If skill scope is for ally with 1 or more HP, and your own HP = 0,
		# or skill scope is for ally with 0, and your own HP = 1 or more
		if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
			((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
			# End Method
			return false
		end
		# Clear effective flag
		effective = false
		# Set effective flag if common ID is effective
		effective |= skill.common_event_id > 0
		# First hit detection
		hit = skill.hit
		if skill.atk_f > 0
			hit *= user.hit / 100
		end
		hit_result = (rand(100) < hit)
		# Set effective flag if skill is uncertain
		effective |= hit < 100
		# If hit occurs
		if hit_result == true
			# Calculate power
			power = skill.power + user.atk * skill.atk_f / 100
			if power > 0
				power -= self.pdef * skill.pdef_f / 200
				power -= self.mdef * skill.mdef_f / 200
				power = [power, 0].max
			end
			# Calculate rate
			rate = 20
			rate += (user.str * skill.str_f / 100)
			rate += (user.dex * skill.dex_f / 100)
			rate += (user.agi * skill.agi_f / 100)
			rate += (user.int * skill.int_f / 100)
			# Calculate basic damage
			self.damage = power * rate / 20
			# Element correction
			self.damage *= elements_correct(skill.element_set)
			#----assorbe/dimezza
			if self.is_a?(Game_Actor)
				if self.dimezza
					self.damage /= 2
					self.dimezza = false
				end
				if self.assorbe
					self.damage /= -2
					self.assorbe = false
				end
			end
			#----assorbe/dimezza
			self.damage /= 100
			# If damage value is strictly positive
			if self.damage > 0
				# Guard correction
				if self.guarding?
					self.damage /= 2
				end
			end
			# Dispersion
			if skill.variance > 0 and self.damage.abs > 0
				amp = [self.damage.abs * skill.variance / 100, 1].max
				self.damage += rand(amp+1) + rand(amp+1) - amp
			end
			# Second hit detection
			eva = 8 * self.agi / user.dex + self.eva
			hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
			hit = self.cant_evade? ? 100 : hit
			hit_result = (rand(100) < hit)
			# Set effective flag if skill is uncertain
			effective |= hit < 100
		end
		# If hit occurs
		if hit_result == true
			# If physical attack has power other than 0
			if skill.power != 0 and skill.atk_f > 0
				# State Removed by Shock
				remove_states_shock
				# Set to effective flag
				effective = true
			end
			# Substract damage from HP
			last_hp = self.hp
			self.hp -= self.damage
			effective |= self.hp != last_hp
			# State change
			@state_changed = false
			effective |= states_plus(skill.plus_state_set)
			effective |= states_minus(skill.minus_state_set)
			# If power is 0
			if skill.power == 0
				# Set damage to an empty string
				self.damage = ""
				# If state is unchanged
				unless @state_changed
					# Set damage to "Miss"
					self.damage = "Miss"
				end
			end
			# If miss occurs
		else
			# Set damage to "Miss"
			self.damage = "Miss"
		end
		# If not in battle
		unless $game_temp.in_battle
			# Set damage to nil
			self.damage = nil
		end
		# End Method
		return effective
	end
end

 

 

 

Demo Link

http://www.mediafire.com/?sgttwasxut4gilh

Script Link

http://www.mediafire.com/?2r83p7zq8orreai


Istruzioni per l'uso

 

Sono tutte inserite all'interno dello script... Ma non dovrebbe essere una difficile configurazione. Se usate questo script creditatemi! :wink:

 

Bugs e Conflitti Noti


Potrebbe andare in conflitto con dei battle system diversi dal default ma non dovrebbe essere difficile renderlo compatibile.

 

Altri Dettagli


Script semplice ma magari può essere utile a qualcuno...

Edited by Dilos
Script monoriga sistemato.
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...