RPGVX 스크립트
2009.05.29 07:33

에너미 아이템 변화 스크립트

조회 수 2437 추천 수 1 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

자작은 아니고 개조 스크립트입니다.


KGC의 몬스터 도감과도 병용됩니다.


사용시엔 가급적이면 사용보고 부탁드립니다.


 


################################################################################
#                                                                              #
# DEST21C : 에너미 아이템변화 시스템 스크립트 V1.0                             #
#                                                                              #
# 버그보고 및 리퀘스트 : dest21c@nate.com                                      #
#                                                                              #
################################################################################
=begin


@ 에너미를 해당 스킬로 해치웠을 때 특정 확률로
  아이템을 입수하는 스킬을 제작할 수 있습니다.
 
@ 본 스크립트는 KGC의 훔치기 스킬 스크립트를 개조하여 만든 것입니다.
  KGC의 이용규약상 개조 후 2차배포는 문제가 없으므로 배포합니다.
  다만 사용하실 경우 가능한 사용보고를 해 주시면 감사하겠습니다.


@ 주요기능
  1. 스킬에 특성을 주어 변화용 스킬로 만들 수 있음
  2. 적에게 특성을 주어 변화시 입수 아이템과 확률을 지정할 수 있음
  3. 장비에 특성을 주어 장비시 변화 확률 보정을 지정할 수 있음
 
@ 주의
  1. 메모란 기입시 퍼센트 문자는 반각 %입니다.
  2. 몬스터 도감과의 병용에서 드롭아이템, 훔치기, 변화의 아이템은
     총 3개 이후로는 불균형적으로 표시됩니다. 3항목 이내로 설정해 주십시오.
     (한 행은 여유가 있으므로 리퀘스트가 있을 시 한 항목을 4행분으로
      수정하는 것은 가능하므로 연락해 주십시오.)
  3. 몬스터 도감과의 병용화시 커스터마이즈 항목은 399행입니다.


=end
$imported = {} if $imported == nil
$imported["Morph"] = true


module DEST21C
  module ENEMY_MORPH
    module BASEITEM
      # 커스터마이즈 항목
      # KGC의 모듈을 참고하였습니다.
      # 도입방법
      # 장비 데이터베이스 메모란에
      # <변화보정 +n%> 혹은 <MORPHREV +n%> (마이너스도 가능합니다.)
      MORPH_REV = /<(?:MORPHREV|변화보정)s*([+-]d+)[%]?>/i
    end
    module ENEMY
      # 커스터마이즈 항목
      # KGC의 모듈을 참고하였습니다.
      # 도입방법
      # 에너미 데이터베이스의 메모란에
      # <변화 종류(IWA):ID 입수확률> 혹은 <MORPH 종류(IWA):ID 입수확률>
      MORPH_ENEMY = /<(?:MORPH|변화)s*([IWA]):(d+)s+(d+)([%])?>/i
    end
    module SKILL
      # 커스터마이즈 항목
      # KGC의 모듈을 참고하였습니다.
      # 도입방법
      # 스킬 데이터베이스의 메모란에
      # <변화> 혹은 <MORPH>
      MORPH_SKILL = /<(?:MORPH|변화)>/i
    end
  end
end


################################################################################


module Vocab
  # 커스터마이즈 항목
  # 설정되지 않아 변화불가능한 적일 때
  NoMorph = "변화시킬 수 없는 적이다."
  # 적을 해치웠으나 변화시키지 못했을 때
  CantMorph = "변화시키지 못했다!"
  # 적을 해치우지 못해 변화시키지 못했을 떄
  CantMorph2 = "변화시킬만큼 충분히 공격하지 못했다!"
  # 변화에 성공했을 때
  SucMorph = "%s을(를) %s(으)로 변화시켰다!"
end


################################################################################


class RPG::BaseItem
  # 변화 캐시의 생성
  def create_morph_cache
    @__morph_prob_plus = 0
    self.note.each_line { |line|
      case line
      when DEST21C::ENEMY_MORPH::BASEITEM::MORPH_REV
        @__morph_prob_plus += $1.to_i
      end
    }
  end
  # 변화성공률보정
  def morph_prob_plus
    create_morph_cache if @__morph_prob_plus == nil
    return @__morph_prob_plus
  end
end


################################################################################


class RPG::Skill < RPG::UsableItem
  # 변화 캐시의 생성
  def create_morph_cache
    super
    @__morph = false
    self.note.each_line { |line|
      case line
      when DEST21C::ENEMY_MORPH::SKILL::MORPH_SKILL
        @__morph = true
      end
    }
  end
  # 변화
  def morph?
    create_morph_cache if @__morph == nil
    return @__morph
  end
end


################################################################################


class RPG::Enemy
  # 변화 캐시의 생성
  def create_morph_cache
    @__morph_objects = []
    self.note.each_line { |line|
      case line
      when DEST21C::ENEMY_MORPH::ENEMY::MORPH_ENEMY
        # 변화시키는 오브젝트
        obj = RPG::Enemy::MorphObject.new
        case $1.upcase
        when "I"  # 아이템
          obj.kind = 1
          obj.item_id = $2.to_i
        when "W"  # 무기
          obj.kind = 2
          obj.weapon_id = $2.to_i
        when "A"  # 방어구
          obj.kind = 3
          obj.armor_id = $2.to_i
        else
          next
        end
        # 성공율
        if $4 != nil
          obj.success_prob = $3.to_i
        else
          obj.denominator = $3.to_i
        end
        @__morph_objects << obj
      end
    }
  end
  # 변화시키는 오브젝트
  def morph_objects
    create_morph_cache if @__morph_objects == nil
    return @__morph_objects
  end
end


################################################################################


class RPG::Enemy::MorphObject < RPG::Enemy::DropItem
  # 정수
  KIND_ITEM   = 1
  KIND_WEAPON = 2
  KIND_ARMOR  = 3
  # 공개 인스턴스 변수
  attr_accessor :success_prob             # 성공율
  # 오브젝트의 초기화
  def initialize
    super
    @success_prob = 0
  end
  # 동식판정
  def equal?(obj)
    return false unless obj.is_a?(RPG::Enemy::MorphObject)
    return false if self.success_prob != obj.success_prob
    return true
  end
  # 등식연산자
  def ==(obj)
    return self.equal?(obj)
  end
end


################################################################################


class Game_Battler
  # 공개 인스턴스 변수
  attr_accessor :morph_objects             # 변화시키는 오브젝트
  attr_accessor :morphen_object            # 전회에 변화시킨 오브젝트
  # 오브젝트 초기화
  alias dest21c_initialize_battler_morph initialize
  def initialize
    dest21c_initialize_battler_morph
    @morph_objects = []
    @morphen_object = nil
  end
  # 변화성공율 보정
  def morph_prob_plus
    return 0
  end
  # ● 스킬의 효과 적용
  #     user  : 스킬의 사용자
  #     skill : 스킬
  alias dest21c_skill_effect_morph skill_effect
  def skill_effect(user, skill)
    dest21c_skill_effect_morph(user, skill)
    make_obj_morph_result(user, skill)
  end
  # ○ 스킬 또는 아이템에 의한 변화 효과
  #     user : 스킬 또는 아이템의 사용자
  #     obj  : 스킬 또는 아이템
  #    결과는 @morphen_item에 대입된다.
  def make_obj_morph_result(user, obj)
    return unless obj.morph?                  # 변화효과없음
    return if @missed || @evaded ||@skipped  # 변화없음
    # 변화불가능한 적이다.
    if self.morph_objects.compact.empty?
      @morphen_object = :no_item
      return
    end
    @morphen_object = nil
    morphen_index = -1
    self.morph_objects.each_with_index { |mobj, i|
      next if mobj == nil
      # 변화성공판정
      if mobj.success_prob > 0
        # 확율판정
        next if mobj.success_prob + user.morph_prob_plus < rand(100)
      else
        # 분모지정
        if rand(mobj.denominator) != 0
          next if user.morph_prob_plus < rand(100)
        end
      end
      # 변화성공
      @morphen_object = mobj
      morphen_index = i
      if $imported["EnemyGuide"]
        # 도감용의 변화성공플래그를 ON
        # KGC 몬스터도감과 병용가(단 몬스터도감 스크립트를 수정해야 함
        self_id = (self.actor? ? self.id : self.enemy_id)
        KGC::Commands.set_enemy_object_morphen(self_id, morphen_index)
      end
      break
    }
  end
end


################################################################################


class Game_Actor < Game_Battler
  # 변화성공율보정치
  def morph_prob_plus
    n = 0
    equips.compact.each { |item| n += item.morph_prob_plus }
    return n
  end
end


################################################################################


class Game_Enemy < Game_Battler
  # ● 오브젝트의 초기화
  #     index    : 적 그룹의 인덱스
  #     enemy_id : 적 캐릭터 ID
  alias dest21c_initialize_enemy_morph initialize
  def initialize(index, enemy_id)
    dest21c_initialize_enemy_morph(index, enemy_id)
    @morph_objects = enemy.morph_objects.clone
  end
end


################################################################################


class Scene_Battle < Scene_Base
  # 전투행동의 실행 : 스킬
  alias dest21c_execute_action_skill_morph execute_action_skill
  def execute_action_skill
    skill = @active_battler.action.skill
    if skill.morph?
      execute_action_morph
      @status_window.refresh
    else
      dest21c_execute_action_skill_morph
    end
  end
  # 전투행동의 실행 : 변화
  def execute_action_morph
    skill = @active_battler.action.skill
    text = @active_battler.name + skill.message1
    @message_window.add_instant_text(text)
    unless skill.message2.empty?
      wait(10)
      @message_window.add_instant_text(skill.message2)
    end
    targets = @active_battler.action.make_targets
    display_animation(targets, skill.animation_id)
    @active_battler.mp -= @active_battler.calc_mp_cost(skill)
    $game_temp.common_event_id = skill.common_event_id
    for target in targets
      target.skill_effect(@active_battler, skill)
      display_morph_effects(target, skill)
    end
  end
  # ○ 변화시킨 결과의 표시
  #     target : 대상자
  #     obj    : 스킬 또는 아이템
  def display_morph_effects(target, obj = nil)
    unless target.skipped
      line_number = @message_window.line_number
      wait(5)
      if target.hp_damage != 0 || target.mp_damage != 0
        display_critical(target, obj)
        display_damage(target, obj)
      end
      display_state_changes(target, obj)
      display_morphe_object(target, obj)
      if line_number == @message_window.line_number
        display_failure(target, obj) unless target.states_active?
      end
      if line_number != @message_window.line_number
        wait(30)
      end
      @message_window.back_to(line_number)
    end
  end
  # ○ 변화시킨 오브젝트의 표시
  #     target : 대상자
  #     obj    : 스킬 또는 아이템
  def display_morphe_object(target, obj = nil)
    if target.hp > 0
      display_morph_failure2(target, obj)
      return
    end
    case target.morphen_object
    when nil       # 변화실패
      display_morph_failure(target, obj)
    when :no_item  # 변화불가능
      display_morph_no_item(target, obj)
    else
      display_morph_item(target, obj) # 변화한 아이템의 표시
      target.morphen_object = nil
    end
  end
  # ○ 변화실패1의 표시
  #     target : 대상자(액터)
  #     obj    : 스킬 또는 아이템
  def display_morph_failure(target, obj)
    @message_window.add_instant_text(Vocab::CantMorph)
    wait(45)
  end
  # ○ 변화실패2의 표시
  #     target : 대상자(액터)
  #     obj    : 스킬 또는 아이템
  def display_morph_failure2(target, obj)
    @message_window.add_instant_text(Vocab::CantMorph2)
    wait(45)
  end
  # ○ 변화불가능의 표시
  #     target : 대상자(액터)
  #     obj    : 스킬 또는 아이템
  def display_morph_no_item(target, obj)
    text = sprintf(Vocab::NoMorph)
    @message_window.add_instant_text(text)
    wait(45)
  end
  # ○ 아이템으로 변화시킨 경우의 표시
  #     target : 대상자(액터)
  #     obj    : 스킬 또는 아이템
  def display_morph_item(target, obj)
    # 변화시킨 아이템을 취득
    mobj = target.morphen_object
    case mobj.kind
    when RPG::Enemy::MorphObject::KIND_ITEM
      item = $data_items[mobj.item_id]
    when RPG::Enemy::MorphObject::KIND_WEAPON
      item = $data_weapons[mobj.weapon_id]
    when RPG::Enemy::MorphObject::KIND_ARMOR
      item = $data_armors[mobj.armor_id]
    else
      return
    end
    $game_party.gain_item(item, 1)


    text = sprintf(Vocab::SucMorph, target.name, item.name)
    @message_window.add_instant_text(text)
    wait(45)
  end
end


################################################################################
#                           KGC 몬스터도감과 병용화                            #
################################################################################


$data_states = load_data("Data/States.rvdata") if $data_states == nil
$data_system = load_data("Data/System.rvdata") if $data_system == nil


module DEST21C
  module MORPH_JOIN_A
    # 커스터마이즈 항목
    # 몬스터도감에 변화 항목을 표시할 것인가(예 : true / 아니오 : false)
    DISPLAY = true
    # 몬스터도감에 표시될 변화 항목의 제목
    MORPHINDEX = "변화"
    # 몬스터도감에 표시될 변화 항목의 확률이름
    MORPHPROB = "변화율"
  end
end


################################################################################


module KGC
  module Commands
  module_function
  # ○ 변화성공상태취득
  #     enemy_id  : 적 ID
  #     obj_index : 오브젝트 번호
  def enemy_object_morphen?(enemy_id, obj_index)
    if $game_system.enemy_object_morphen[enemy_id] == nil
      return false
    end
    result = $game_system.enemy_object_morphen[enemy_id] & (1 << obj_index)
    return (result != 0)
  end
  # ○ 변화성공상태설정
  #     enemy_id  : 적 ID
  #     obj_index : 오브젝트 번호
  #     enabled   : true..성공했음  false..미성공
  def set_enemy_object_morphen(enemy_id, obj_index, enabled = true)
    if $game_system.enemy_object_morphen[enemy_id] == nil
      $game_system.enemy_object_morphen[enemy_id] = 0
    end
    if enabled
      $game_system.enemy_object_morphen[enemy_id] |= (1 << obj_index)
    else
      $game_system.enemy_object_morphen[enemy_id] &= ~(1 << obj_index)
    end
  end
  # ○ 도감 리셋 (재정의)
  def reset_enemy_guide
    $game_system.enemy_encountered = []
    $game_system.enemy_defeated = []
    $game_system.enemy_item_dropped = []
    $game_system.enemy_object_stolen = []
    $game_system.enemy_object_morphen = []
  end
  # ○ 도감완성 (재정의)
  def complete_enemy_guide
    (1...$data_enemies.size).each { |i|
      set_enemy_encountered(i)
      set_enemy_defeated(i)
      enemy = $data_enemies[i]
      items = [enemy.drop_item1, enemy.drop_item2]
      if $imported["ExtraDropItem"]
        items += enemy.extra_drop_items
      end
      items.each_index { |j| set_enemy_item_dropped(i, j) }
      if $imported["Steal"]
        objs = enemy.steal_objects
        objs.each_index { |j| set_enemy_object_stolen(i, j) }
      end
      if $imported["Morph"]
        objs = enemy.morph_objects
        objs.each_index { |j| set_enemy_object_morphen(i, j) }
      end
    }
  end
  end
end


################################################################################


class Game_System
  attr_writer   :enemy_object_morphen      # 변화성공플래그
  # ○ 변화성공플래그를 취득
  def enemy_object_morphen
    @enemy_object_morphen = [] if @enemy_object_morphen == nil
    return @enemy_object_morphen
  end
end


################################################################################


class Window_EnemyGuideStatus < Window_Base
  # ○ 아이템용 페이지를 표시하는가 (재정의)
  def item_page_show?
    return true if KGC::EnemyGuide::SHOW_DROP_ITEM
    return true if $imported["Steal"] && KGC::EnemyGuide::SHOW_STEAL_OBJ
    return true if $imported["Morph"] && DEST21C::MORPH_JOIN_A::DISPLAY
    return false
  end
  # ○ 스테이터스 묘화 (재정의)
  def draw_status
    # Page 1
    dy = draw_basic_info(0, 0)
    dy = draw_parameter2(0, dy)
    dy = draw_element(0, dy, 2)
    dy = draw_state(0, dy, 2)
    draw_prize(0, dy)
    # Page 2 (아이템관련을 표시할 경우에만)
    if item_page_show?
      dx = width - 32
      dy = draw_basic_info(dx, 0)
      max_rows = (self.height - dy - 32) / WLH
      rows = max_rows / 3
      dy = draw_drop_item(dx, dy, rows)
      draw_steal_object(dx, dy, rows)
      draw_morph_item(dx, dy + WLH * rows, rows)
    end
    # Page 3
    dx = (width - 32) * (pages - 1)
    dy = draw_basic_info(dx, 0)
    draw_description(dx, dy)
  end
  # 변화 아이템의 묘화
  #   dx, dy : 묘화처 X, Y
  #   rows   : 행
  def draw_morph_item(dx, dy, rows)
    return by unless DEST21C::MORPH_JOIN_A::DISPLAY
    new_dy = dy + WLH * rows
    dw = (width - 32) / 2
    self.contents.font.color = system_color
    self.contents.draw_text(dx,      dy, 128, WLH,
      DEST21C::MORPH_JOIN_A::MORPHINDEX, 1)
    self.contents.draw_text(dx + dw, dy, 128, WLH,
      DEST21C::MORPH_JOIN_A::MORPHPROB, 2)
    return new_dy unless KGC::Commands.enemy_defeated?(enemy.id)
    # 리스트 작성
    morph_objects = enemy.morph_objects.clone
    if morph_objects.size >= rows
      morph_objects = morph_objects[0...(rows - 1)]
    end
    dy += WLH
    morph_objects.each_with_index { |obj, i|
      case obj.kind
      when 1
        item = $data_items[obj.item_id]
      when 2
        item = $data_weapons[obj.weapon_id]
      when 3
        item = $data_armors[obj.armor_id]
      end
      if KGC::Commands.enemy_object_morphen?(enemy.id, i)
        draw_item_name(item, dx, dy)
      else
        draw_masked_item_name(item, dx, dy)
      end
      # 성공율묘화
      if obj.success_prob > 0
        text = sprintf("%d%%", obj.success_prob)
      else
        text = "1/#{obj.denominator}"
      end
      self.contents.draw_text(dx + dw, dy, 128, WLH, text, 2)
      dy += WLH
    }
    return new_dy
  end
end


################################################################################

?
  • ?
    린쌍 2009.05.29 07:33
    자신을 너무 과소평과 하신단 말이야 이분은 ㅅ-;
    개조는 아무나 하시나;;;
    이러면서 아직도 초짜라고 하시니 나원...~

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수 추천 수
26 RPGVX 스크립트 3D 그래픽 파티클 스크립트 1 청담 2013.09.29 1171 0
25 RPGVX 스크립트 vx 전용 오토세이브<자동저장> 고진수 2011.08.31 2574 0
24 RPGVX 스크립트 vx 전용 오토세이브<자동저장> 고진수 2011.08.31 2764 0
23 RPGVX 스크립트 1인용메뉴 file A.M.S 2010.07.18 2486 0
22 RPGVX 스크립트 vx 한글이름입력 2 file 가가상 2010.05.21 2710 1
21 RPGVX 스크립트 vx 한글이름입력 1 file 가가상 2010.05.21 2720 1
20 RPGVX 스크립트 Window_Message_Plus v3.2 3 1 file 에존 2009.11.29 2403 1
19 RPGVX 스크립트 Window_Message_Plus v3.2 3 file 에존 2009.11.29 2604 1
18 RPGVX 스크립트 이벤트커맨드 스크립트 조건분기법 모음 1 Evangelista 2009.11.18 2223 2
17 RPGVX 스크립트 이벤트커맨드 스크립트 조건분기법 모음 1 Evangelista 2009.11.18 2495 2
16 RPGVX 스크립트 이벤트커맨드 스크립트 사용법 모음 2 Evangelista 2009.07.21 2481 2
15 RPGVX 스크립트 이벤트커맨드 스크립트 사용법 모음 2 Evangelista 2009.07.21 2613 2
» RPGVX 스크립트 에너미 아이템 변화 스크립트 1 Evangelista 2009.05.29 2437 1
13 RPGVX 스크립트 에너미 아이템 변화 스크립트 1 Evangelista 2009.05.29 2805 1
12 RPGVX 스크립트 액터선택지이벤트제작 간편화 스크립트 1 Evangelista 2009.04.30 2060 3
11 RPGVX 스크립트 액터선택지이벤트제작 간편화 스크립트 1 Evangelista 2009.04.30 2509 3
10 RPGVX 스크립트 이벤트커맨드 스크립트 관련 설명 3 Evangelista 2009.01.29 2133 3
9 RPGVX 스크립트 이벤트커맨드 스크립트 관련 설명 3 Evangelista 2009.01.29 2526 3
8 RPGVX 스크립트 현재 파티내 캐릭터를 선택지로 처리할 때 간편히 하자. file Evangelista 2009.01.01 1762 1
7 RPGVX 스크립트 현재 파티내 캐릭터를 선택지로 처리할 때 간편히 하자. file Evangelista 2009.01.01 2260 1
Board Pagination Prev 1 2 Next
/ 2






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)