Class: Mob
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Mob
- Defined in:
- app/models/mob.rb
Overview
This class describes a mob.
Defined Under Namespace
Classes: BattleEffectInv
Constant Summary
- MAX_PRIORITY =
Maximum priority of battle method.
5
Instance Attribute Summary (collapse)
-
- (Object) attacker
Returns the value of attribute attacker.
-
- (Object) battle_effect_invs
Returns the value of attribute battle_effect_invs.
-
- (Object) enemy_mobs
Returns the value of attribute enemy_mobs.
-
- (Object) friend_mobs
Returns the value of attribute friend_mobs.
-
- (Object) hate
Returns the value of attribute hate.
-
- (Object) job_type_strategy
Returns the value of attribute job_type_strategy.
-
- (Object) ss_dex
Returns the value of attribute ss_dex.
-
- (Object) trial_mob_id
Returns the value of attribute trial_mob_id.
-
- (Object) vpos
Returns the value of attribute vpos.
Instance Method Summary (collapse)
-
- (Object) add_effect(caused_mob, method)
Add battle effect.
-
- (Object) add_skill_exp(skill, exp)
Add exp for used skill in battle.
-
- (Object) add_weapon_exp(exp)
Add exp for used weapon in battle.
-
- (Object) armor
Return equipped armor.
-
- (Boolean) asexual?
Return true if this mob is asexual.
-
- (Object) battle_action
Return random battle action.
-
- (Integer) battle_range
Return battle range.
-
- (Boolean) damaged_friend_mobs_in_battle_range?(range)
Return true if the nearest damaged friend mob is in battle range.
-
- (Boolean) dead?
Return true if this mob is dead.
-
- (Boolean) demoralized?
Return true if current hp is less than retreat_hp_rate.
-
- (Boolean) enemy_mobs_in_battle_range?(range)
Return true if the nearest enemy mob is in battle range.
-
- (String) equipped_items_txt
Return the item list which belongs to this mob.
-
- (Boolean) female?
Return true if this mob is female.
-
- (Boolean) forward_job?
Return true if forward job.
-
- (Boolean) friend_mobs_in_battle_range?(range)
Return true if the nearest friend mob is in battle range.
-
- (String) gender_sym_txt
Return the description of gender symbol.
-
- (Integer) max_hp
Return maximum hp.
-
- (Integer) max_sp
Return maximum sp.
-
- (String) name_with_job
Return name with job name.
-
- (Boolean) on_front_line?
Return true if this mob is facing enemy.
-
- (Object) retreat_from_battle
Set out-ranged vpos.
-
- (Boolean) retreated_from_battle?
Return true if this mob has already retreated.
-
- (Array) skills
Return all the skills.
-
- (Array) target_damaged_friend_mobs(range, num)
Return target friend mobs which are damaged in battle range.
-
- (Array) target_enemy_mobs(range, num)
Return target enemy mobs in battle range.
-
- (Array) target_random_friend_mobs(range, num)
Return target friend mobs which are selected randomly in battle range.
-
- (Object) vpos_move
Vertical move.
-
- (Object) weapon
Return equipped weapon.
Instance Attribute Details
- (Object) attacker
Returns the value of attribute attacker
48 49 50 |
# File 'app/models/mob.rb', line 48 def attacker @attacker end |
- (Object) battle_effect_invs
Returns the value of attribute battle_effect_invs
47 48 49 |
# File 'app/models/mob.rb', line 47 def battle_effect_invs @battle_effect_invs end |
- (Object) enemy_mobs
Returns the value of attribute enemy_mobs
42 43 44 |
# File 'app/models/mob.rb', line 42 def enemy_mobs @enemy_mobs end |
- (Object) friend_mobs
Returns the value of attribute friend_mobs
43 44 45 |
# File 'app/models/mob.rb', line 43 def friend_mobs @friend_mobs end |
- (Object) hate
Returns the value of attribute hate
46 47 48 |
# File 'app/models/mob.rb', line 46 def hate @hate end |
- (Object) job_type_strategy
Returns the value of attribute job_type_strategy
40 41 42 |
# File 'app/models/mob.rb', line 40 def job_type_strategy @job_type_strategy end |
- (Object) ss_dex
Returns the value of attribute ss_dex
44 45 46 |
# File 'app/models/mob.rb', line 44 def ss_dex @ss_dex end |
- (Object) trial_mob_id
Returns the value of attribute trial_mob_id
41 42 43 |
# File 'app/models/mob.rb', line 41 def trial_mob_id @trial_mob_id end |
- (Object) vpos
Returns the value of attribute vpos
45 46 47 |
# File 'app/models/mob.rb', line 45 def vpos @vpos end |
Instance Method Details
- (Object) add_effect(caused_mob, method)
By DoT or HoT
Add battle effect.
395 396 397 398 399 400 401 |
# File 'app/models/mob.rb', line 395 def add_effect(caused_mob, method) @battle_effect_invs = Array.new if @battle_effect_invs.blank? @battle_effect_invs.each do |battle_effect_inv| return if battle_effect_inv.method == method end @battle_effect_invs << BattleEffectInv.new(caused_mob, method, method.duration) end |
- (Object) add_skill_exp(skill, exp)
Add exp for used skill in battle.
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 |
# File 'app/models/mob.rb', line 375 def add_skill_exp(skill, exp) return if not skills.include?(skill) if skill_exp_invs.blank? or skill_exp_invs.find_by_owner_id(skill.id).blank? skill_exp = SkillExpInv.new skill_exp.mob_id = id skill_exp.owner_id = skill.id skill_exp.level = 1 skill_exp.exp = exp skill_exp.save else skill_exp = skill_exp_invs.find_by_owner_id(skill.id) skill_exp.exp += exp skill_exp.save end end |
- (Object) add_weapon_exp(exp)
Add exp for used weapon in battle.
357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
# File 'app/models/mob.rb', line 357 def add_weapon_exp(exp) if item_info_exp_invs.blank? or item_info_exp_invs.find_by_owner_id(weapon.item_info_id).blank? weapon_exp = ItemInfoExpInv.new weapon_exp.mob_id = id weapon_exp.owner_id = weapon.item_info_id weapon_exp.level = 1 weapon_exp.exp = exp weapon_exp.save else weapon_exp = item_info_exp_invs.find_by_owner_id(weapon.item_info_id) weapon_exp.exp += exp weapon_exp.save end end |
- (Object) armor
Return equipped armor.
126 127 128 129 130 131 |
# File 'app/models/mob.rb', line 126 def armor items.each do |item| return item if item.item_info.type_symbol == :armor.to_s end return nil end |
- (Boolean) asexual?
Return true if this mob is asexual.
68 69 70 71 |
# File 'app/models/mob.rb', line 68 def asexual? return true if gender_sym.to_sym == Params::GENDER_ASEXUAL return false end |
- (Object) battle_action
Return random battle action.
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 |
# File 'app/models/mob.rb', line 266 def battle_action 1.upto(MAX_PRIORITY) do |priority| prioritized_methods = Marshal.load(Marshal.dump(@job_type_strategy.battle(:normal).methods_by_priority(priority))) unless prioritized_methods.blank? battle_method = prioritized_methods.delete_at(rand(prioritized_methods.length)) if battle_method.battle_type == :weapon return nil if weapon.blank? if enemy_mobs_in_battle_range?(weapon.range) battle_method.method = weapon return battle_method end elsif battle_method.battle_type == :skill if battle_method.type_symbol == :dd or battle_method.type_symbol == :dot or battle_method.type_symbol == :debuff skills.shuffle.each do |skill| if (skill.type_symbol == :dd.to_s or skill.type_symbol == :dot.to_s or skill.type_symbol == :debuff.to_s) and enemy_mobs_in_battle_range?(skill.range) and skill.sp_cost <= sp battle_method.method = skill return battle_method end end elsif battle_method.type_symbol == :hd or battle_method.type_symbol == :hot skills.shuffle.each do |skill| if (skill.type_symbol == :hd.to_s or skill.type_symbol == :hot.to_s) and damaged_friend_mobs_in_battle_range?(skill.range) and skill.sp_cost <= sp battle_method.method = skill return battle_method end end elsif battle_method.type_symbol == :buff or battle_method.type_symbol == :other skills.shuffle.each do |skill| if (skill.type_symbol == :buff.to_s or skill.type_symbol == :other.to_s) and friend_mobs_in_battle_range?(skill.range) and skill.sp_cost <= sp battle_method.method = skill return battle_method end end end end end end return nil end |
- (Integer) battle_range
Return battle range.
160 161 162 163 164 165 166 167 168 169 |
# File 'app/models/mob.rb', line 160 def battle_range range = 1 skills.each do |skill| range = skill.range if range < skill.range and (skill.type_symbol == :dd.to_s or skill.type_symbol == :dot.to_s) end items.each do |item| range = item.item_info.range if range < item.item_info.range and item.item_info.type_symbol == :weapon.to_s end return range end |
- (Boolean) damaged_friend_mobs_in_battle_range?(range)
Return true if the nearest damaged friend mob is in battle range.
235 236 237 238 |
# File 'app/models/mob.rb', line 235 def damaged_friend_mobs_in_battle_range?(range) return true unless damaged_friend_mobs_in_battle_range(range).blank? return false end |
- (Boolean) dead?
Return true if this mob is dead.
259 260 261 262 |
# File 'app/models/mob.rb', line 259 def dead? return true if hp == 0 return false end |
- (Boolean) demoralized?
Return true if current hp is less than retreat_hp_rate.
95 96 97 98 |
# File 'app/models/mob.rb', line 95 def demoralized? return true if hp < max_hp * @job_type_strategy.retreat_hp_rate return false end |
- (Boolean) enemy_mobs_in_battle_range?(range)
Return true if the nearest enemy mob is in battle range.
221 222 223 224 |
# File 'app/models/mob.rb', line 221 def enemy_mobs_in_battle_range?(range) return true unless enemy_mobs_in_battle_range(range).blank? return false end |
- (String) equipped_items_txt
Return the item list which belongs to this mob.
135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'app/models/mob.rb', line 135 def equipped_items_txt return I18n.t('activerecord.attributes.nothing') if items.blank? items_txt = '' items.each do |item| if not item.blank? items_txt += item.name items_txt += ',' end end items_txt.chop! if items_txt.last == ',' return items_txt end |
- (Boolean) female?
Return true if this mob is female.
61 62 63 64 |
# File 'app/models/mob.rb', line 61 def female? return true if gender_sym.to_sym == Params::GENDER_FEMALE return false end |
- (Boolean) forward_job?
Tank and Close range attacker.
Return true if forward job.
174 175 176 177 |
# File 'app/models/mob.rb', line 174 def forward_job? return true if job.type_symbol == :tank.to_s or job.type_symbol == :attacker_c.to_s return false end |
- (Boolean) friend_mobs_in_battle_range?(range)
Return true if the nearest friend mob is in battle range.
228 229 230 231 |
# File 'app/models/mob.rb', line 228 def friend_mobs_in_battle_range?(range) return true unless friend_mobs_in_battle_range(range).blank? return false end |
- (String) gender_sym_txt
Return the description of gender symbol.
75 76 77 |
# File 'app/models/mob.rb', line 75 def gender_sym_txt return I18n.t('activerecord.attributes.gender.' + gender_sym) end |
- (Integer) max_hp
maximum hp is calculated from CON status.
Return maximum hp.
82 83 84 |
# File 'app/models/mob.rb', line 82 def max_hp return con * Params::MOB_MAX_HP_MULTIPLIER end |
- (Integer) max_sp
maximum sp is calculated from INT status.
Return maximum sp.
89 90 91 |
# File 'app/models/mob.rb', line 89 def max_sp return int * Params::MOB_MAX_SP_MULTIPLIER end |
- (String) name_with_job
Return name with job name.
55 56 57 |
# File 'app/models/mob.rb', line 55 def name_with_job return name + "(" + job.name + ")" end |
- (Boolean) on_front_line?
Return true if this mob is facing enemy.
207 208 209 210 211 212 213 214 215 216 217 |
# File 'app/models/mob.rb', line 207 def on_front_line? front_line_vpos = Params::BATTLE_START_DEF_VPOS @enemy_mobs.each do |enemy_mob| unless enemy_mob.dead? distance_from_enemy = (enemy_mob.vpos - @vpos).abs front_line_vpos = distance_from_enemy if distance_from_enemy < front_line_vpos end end return false if front_line_vpos > 1 return true end |
- (Object) retreat_from_battle
Set out-ranged vpos.
241 242 243 244 245 246 247 |
# File 'app/models/mob.rb', line 241 def retreat_from_battle if @attacker @vpos = Params::BATTLE_START_ATK_VPOS + 1 else @vpos = Params::BATTLE_START_DEF_VPOS - 1 end end |
- (Boolean) retreated_from_battle?
Return true if this mob has already retreated.
251 252 253 254 255 |
# File 'app/models/mob.rb', line 251 def retreated_from_battle? return false if @vpos.nil? return true if @vpos < Params::BATTLE_START_ATK_VPOS or Params::BATTLE_START_DEF_VPOS < @vpos return false end |
- (Array) skills
Return all the skills.
150 151 152 153 154 155 156 |
# File 'app/models/mob.rb', line 150 def skills all_skills = Array.new all_skills += job.skills unless job.skills.blank? all_skills << specie.skill unless specie.skill.blank? all_skills << specie.family.skill unless specie.family.skill.blank? return all_skills end |
- (Array) target_damaged_friend_mobs(range, num)
returned mobs are sorted by hp.
Return target friend mobs which are damaged in battle range.
325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
# File 'app/models/mob.rb', line 325 def target_damaged_friend_mobs(range, num) return [self] if range == 0 sorted_damaged_friend_mobs_in_battle_range = damaged_friend_mobs_in_battle_range(range).sort{|a,b| a.hp <=> a.hp } if sorted_damaged_friend_mobs_in_battle_range.length <= num return sorted_damaged_friend_mobs_in_battle_range else sorted_damaged_friend_mobs_in_battle_range.slice(0..(num - 1)) end end |
- (Array) target_enemy_mobs(range, num)
returned mobs are sorted by hate.
Return target enemy mobs in battle range.
310 311 312 313 314 315 316 317 318 319 320 |
# File 'app/models/mob.rb', line 310 def target_enemy_mobs(range, num) sorted_enemy_mobs_in_battle_range = enemy_mobs_in_battle_range(range).sort{|a,b| b.hate <=> a.hate } if sorted_enemy_mobs_in_battle_range.length <= num return sorted_enemy_mobs_in_battle_range else sorted_enemy_mobs_in_battle_range.slice(0..(num - 1)) end end |
- (Array) target_random_friend_mobs(range, num)
Return target friend mobs which are selected randomly in battle range.
342 343 344 345 346 347 348 349 350 351 352 353 |
# File 'app/models/mob.rb', line 342 def target_random_friend_mobs(range, num) return [self] if range == 0 friend_mobs_in_battle_range = friend_mobs_in_battle_range(range) if friend_mobs_in_battle_range.length <= num return friend_mobs_in_battle_range.shuffle else return friend_mobs_in_battle_range.shuffle.slice(0..(num - 1)) end end |
- (Object) vpos_move
moving logic depends on job.
Vertical move.
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'app/models/mob.rb', line 181 def vpos_move if @attacker if demoralized? @vpos -= 1 elsif not forward_job? and on_front_line? @vpos -= 1 if Params::BATTLE_START_ATK_VPOS <= @vpos - 1 elsif job_type_strategy.vpos - @vpos < 0 @vpos -= 1 if Params::BATTLE_START_ATK_VPOS <= @vpos - 1 elsif job_type_strategy.vpos - @vpos > 0 @vpos += 1 unless on_front_line? end else if demoralized? @vpos += 1 elsif not forward_job? and on_front_line? @vpos += 1 if @vpos + 1 <= Params::BATTLE_START_ATK_VPOS + 1 elsif (Params::BATTLE_START_DEF_VPOS - job_type_strategy.vpos + 1) - @vpos > 0 @vpos += 1 if @vpos + 1 <= Params::BATTLE_START_ATK_VPOS + 1 elsif (Params::BATTLE_START_DEF_VPOS - job_type_strategy.vpos + 1) - @vpos < 0 @vpos -= 1 unless on_front_line? end end end |
- (Object) weapon
Return equipped weapon.
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'app/models/mob.rb', line 102 def weapon items.each do |item| return item if item.item_info.type_symbol == :weapon.to_s end natural_item = Item.new specie.family.item_infos.each do |item_info| if item_info.type_symbol == :natural_weapon.to_s natural_item.mob_id = id natural_item.houdd_user_id= houdd_user_id natural_item.item_info_id= item_info.id natural_item.dp = item_info.max_dp natural_item.quality = 0 natural_item.built_point = item_info.rq_prod_point natural_item.active_flg = true return natural_item end end return nil end |