Ace 스크립트

1개이상의 악세사리 슬롯 혹은 더많은 장비 슬롯이 필요할때 사용하면 좋을듯 ^^


Custom Equipment.png



=begin
Custom Equipment Slots Script
by Fomar0153
Version 1.1
----------------------
Notes
----------------------
No requirements
Allows you to customise what equipment characters can equip
e
.g. add new slots or increase the number of accessories.
----------------------
Instructions
----------------------
You will need to edit the script in two locations both are near
the top of the script look
for:
Slots[7] = "Spell Tomes"
return [0,0,2,3,4,4,4,7] if dual_wield?
and follow the instructions where they are.
----------------------
Changle Log
----------------------
1.0 -> 1.1 : Fixed a bug that caused a crash when equipping a weapon.
----------------------
Known bugs
----------------------
None
=end
#--------------------------------------------------------------------------
# ● New Module Extra_Slots
#--------------------------------------------------------------------------
module Extra_Slots

 
Slots = []
 
# Edit here to add new slot types
 
# Slots[armour_type_id] = "name"
 
# I know it is named in the database but I don't believe you can access
 
# that name through Vocab
 
Slots[7] = "Spell Tomes"

end

class Game_Actor < Game_Battler
 
#--------------------------------------------------------------------------
 
# ● Rewrites equip_slots
 
#--------------------------------------------------------------------------
 
# Edit here to change what slots are available to your characters
 
# 0 - Weapon
 
# 1 - Shield
 
# 2 - Head
 
# 3 - Body
 
# 4 - Accessory
 
# 5+ a custom slot
 
def equip_slots
   
return [0,0,2,3,4,4,4,7] if dual_wield?
   
return [0,1,2,3,4,4,4,7]
 
end
 
#--------------------------------------------------------------------------
 
# ● Rewrites change_equip
 
#--------------------------------------------------------------------------
 
def change_equip(slot_id, item)
   
return unless trade_item_with_party(item, equips[slot_id])
   
if item == nil
     
return if item && equip_slots[slot_id] != item.etype_id
   
else
     
if item.is_a?(RPG::Armor)
       
if Extra_Slots::Slots[item.atype_id] == nil
         
return if item && equip_slots[slot_id] != item.etype_id
       
else
         
return if item && equip_slots[slot_id] != item.atype_id
       
end
     
else
       
return if item && equip_slots[slot_id] != item.etype_id
     
end
   
end
   
@equips[slot_id].object = item
    refresh
 
end
 
#--------------------------------------------------------------------------
 
# ● Rewrites release_unequippable_items
 
#--------------------------------------------------------------------------
 
def release_unequippable_items(item_gain = true)
   
@equips.each_with_index do |item, i|
     
if !equippable?(item.object) || item.object.etype_id != equip_slots[i]
       
if item.is_armor?
         
unless Extra_Slots::Slots[equip_slots[i]] == nil
           
unless item.object.atype_id == equip_slots[i]
              trade_item_with_party
(nil, item.object) if item_gain
              item
.object = nil
           
end
         
else
            trade_item_with_party
(nil, item.object) if item_gain
            item
.object = nil
         
end
       
else
          trade_item_with_party
(nil, item.object) if item_gain
          item
.object = nil
       
end
     
end
   
end
 
end
end

class Window_EquipSlot < Window_Selectable
 
#--------------------------------------------------------------------------
 
# ● Rewrites slot_name
 
#--------------------------------------------------------------------------
 
def slot_name(index)
   
if @actor.equip_slots[index] >= 5
     
Extra_Slots::Slots[@actor.equip_slots[index]]
   
else
     
@actor ? Vocab::etype(@actor.equip_slots[index]) : ""
   
end
 
end
end

class Window_EquipItem < Window_ItemList
 
#--------------------------------------------------------------------------
 
# ● Rewrites include?
 
#--------------------------------------------------------------------------
 
def include?(item)
   
return true if item == nil
   
return false unless item.is_a?(RPG::EquipItem)
   
return false if @slot_id < 0
   
if item.is_a?(RPG::Armor)
     
if Extra_Slots::Slots[item.atype_id] == nil
       
return false if item.etype_id != @actor.equip_slots[@slot_id]
     
else
       
return false if item.atype_id != @actor.equip_slots[@slot_id]
     
end
   
else
     
return false if item.etype_id != @actor.equip_slots[@slot_id]
   
end
   
return @actor.equippable?(item)
 
end
end

class Scene_Equip < Scene_MenuBase
 
#--------------------------------------------------------------------------
 
# ● Aliases create_slot_window
 
#--------------------------------------------------------------------------
 
alias custom_slots_create_slot_window create_slot_window
 
def create_slot_window
    custom_slots_create_slot_window
   
@slot_window.create_contents
   
@slot_window.refresh
 
end
 
#--------------------------------------------------------------------------
 
# ● Aliases on_actor_change
 
#--------------------------------------------------------------------------
 
alias custom_slots_on_actor_change on_actor_change
 
def on_actor_change
    custom_slots_on_actor_change
   
@slot_window.create_contents
   
@slot_window.refresh
 
end
end

Who's 아방스

profile
Atachment
첨부 '1'
  • ?
    Bluesky(新) 2012.01.31 11:20

    사용 방법을 잘 모르겠네요. 그래도 있으면 유용할듯..^^

  • ?
    아이미르 2012.02.04 20:55

    module Extra_Slots 에서 Slots[armour_type_id] = "name"를 기입해서 추가 슬롯의 이름을 정합니다. ACE에서는 방어구마다 타입을 설정할 수 있는 데요 여기 armour_type_id가 방어구 타입의 번호입니다.

     

    제 경우 위의 글을 고대로 복사해서 넣었는데 슬롯의 이름이 안뜨길래 왜 이런가... 한동안 고민했는데 생각해보니 디폴트는 7인데 기본프로젝트는 방어구 타입이 6번까지인가 밖에 설정되어 있지 않더라고요.

     

    그 다음에는 def equip_slots에서 적당히 필요한 슬롯을 설정해주면 됩니다.

    0은 무기, 1은 방패, 2는 투구, 3은 갑옷, 4는 장신구, 그담에는 위에 설정한 방어구타입id입니다. 여기서 꽤나 헷갈렸죠...

    즉, 방어구 타입 id를 추가슬롯으로 설정할때 무조건 5이상을 설정해야 되는 겁니다...

     

    return [0,0,2,3,4,5,5,5,5] if dual_wield? 에서 dual_wield?는 액터가 이도류상태인지 판별하는 겁니다.

  • ?
    Bluesky(新) 2012.02.06 08:47

    음냐.. 카페 안오시더니 여기서 설명해주시네요. ㅋ.

    감사합니다.

  • ?
    PML이에요 2012.02.08 10:38

    추가한 장비의 장비 가능 유무를 세분화 시킬 수 없는건가요

    예를 들어 Slots[5] = "신발" 일때, 

    철편 신발이라는 장비 타입5의 장비를 만들고

    이걸 전사는 낄 수 있고 마법사는 못끼게 만들수 있는가

    이런 겁니다.

  • ?
    아이미르 2012.02.08 14:08

    그건 데이터베이스 직업란에서 직접 하는 겁니다... 데이터 베이스 - 직업 - 특징란에 보면 방어구 타입 장비 설정하는 부분이 있습니다.

    전사는 "방어구 타입 장비 - 신발"을 등록해주고 마법사 직업은 등록을 안해주면 전사는 장비할 수 있고 마법사는 장비할 수 없습니다. 

     

    원래 ACE에서는 방어구에 대해 방어구 타입과 장비 타입을 설정하게 되어 있습니다. 직업란에 방어구 타입 장비를 설정해두면

    해당 방어구의 장비 타입에 따라 장비 위치가 결정되는 데 이 스크립트에 사용되는 방어구 타입은 새로 생긴 장비 슬롯에 장착되게 되는 겁니다.

     

    데이터 베이스 - 용어에서 방어구타입 5번째를 신발로 등록하고 "부츠" 란 방어구를 방어구 타입 신발로 설정해두면 그 밑에 장비타입을

    방패로 하든 갑옷으로 하든 이 스크립트를 쓰면 새로 늘어난 신발 슬롯에만 장착되는 겁니다.

  • ?
    아이미르 2012.02.08 22:01

    아... 방금 실험해봤는데 정정해야될 부분이 있네요. 장비타입을 방패로 하면 양손무기 판정이랑 뒤섞여서 장착이 안될수 있으니 몸통이나 투구 같은 걸로 해야겠습니다.

  • ?
    PML이에요 2012.02.09 09:51

    아아- 제가 질문을 좀 어설프게 했군요, 죄송합니다.

    타입을 신발로 설정 후에, 신발에다 가죽 신발 / 마녀의 신발 / 철편 신발을 만들었을때

    가죽 신발은 공용 장비, 마녀의 신발은 마법사 전용, 철편 신발은 전사 전용으로 만들 수 있고 물어봤어야했는데...

     

    슬롯을 늘리지 않은 이상은 불가능 하지 않은가...? 싶어서 질문을 드려본거였습니다.

    어설픈 질문에 다시한번 사과드립니다;

  • ?
    아이미르 2012.02.09 17:01

    음, 이 스크립트에서 바로 그런 기능을 지원하지는 않습니다. 다만 약간 수정하면 가능하게 할 수 있지요.

     

    아래는 수정한 스크립트 입니다.

     

    ----------------------------------------------------------------------------------------------------------------------------------------

    module RPG
      #============================================================================
      # ■ 장비 위치 설정
      #============================================================================
      class RPG::EquipItem < RPG::BaseItem
        attr_accessor :eq_space
       
        def eq_space
          return @note =~ /<위치=(\d+)\s*>/  ? $1.to_i : 0
        end
       
      end
    end

     

     #--------------------------------------------------------------------------
     # ● New Module Extra_Slots
     #--------------------------------------------------------------------------
     
     module Extra_Slots 
     
       Slots = [] 
       # Edit here to add new slot types 
       # Slots[armour_type_id] = "name" 
       # I know it is named in the database but I don't believe you can access 
       # that name through Vocab 
      
       Slots[7] = "신발"
      
     end
     
     class Game_Actor < Game_Battler
       #--------------------------------------------------------------------------
       # ● Rewrites equip_slots 
       #-------------------------------------------------------------------------- 
       # Edit here to change what slots are available to your characters 
       # 0 - Weapon 
       # 1 - Shield 
       # 2 - Head 
       # 3 - Body 
       # 4 - Accessory 
       # 5+ a custom slot 
       def equip_slots   
         return [0,0,2,3,4,7] if dual_wield?   
         return [0,1,2,3,4,7] 
       end
      
       #-------------------------------------------------------------------------- 
       # ● Rewrites change_equip 
       #-------------------------------------------------------------------------- 
       def change_equip(slot_id, item)   
         return unless trade_item_with_party(item, equips[slot_id])   
         if item == nil     
           return if item && equip_slots[slot_id] != item.etype_id   
         else     
           if item.is_a?(RPG::Armor)       
             if Extra_Slots::Slots[item.eq_space] == nil         
               return if item && equip_slots[slot_id] != item.etype_id       
             else         
               return if item && equip_slots[slot_id] != item.eq_space      
             end     
           else       
             return if item && equip_slots[slot_id] != item.etype_id     
           end   
         end   
         @equips[slot_id].object = item   
         refresh 
       end 
      
       #-------------------------------------------------------------------------- 
       # ● Rewrites release_unequippable_items 
       #-------------------------------------------------------------------------- 
       def release_unequippable_items(item_gain = true)   
         @equips.each_with_index do |item, i|     
           if !equippable?(item.object) || item.object.etype_id != equip_slots[i]       
             if item.is_armor?         
               unless Extra_Slots::Slots[equip_slots[i]] == nil           
                 unless item.object.eq_space == equip_slots[i]             
                   trade_item_with_party(nil, item.object) if item_gain             
                   item.object = nil           
                 end         
               else           
                 trade_item_with_party(nil, item.object) if item_gain           
                 item.object = nil         
               end       
             else         
               trade_item_with_party(nil, item.object) if item_gain         
               item.object = nil       
             end     
           end   
         end 
       end
     end
     
     class Window_EquipSlot < Window_Selectable 
       #-------------------------------------------------------------------------- 
       # ● Rewrites slot_name 
       #-------------------------------------------------------------------------- 
       def slot_name(index)   
         if @actor.equip_slots[index] >= 5     
           sprintf("%s%d",Extra_Slots::Slots[@actor.equip_slots[index]], index-4)   
         else     
           @actor ? Vocab::etype(@actor.equip_slots[index]) : ""   
         end 
       end
     end
     
     class Window_EquipItem < Window_ItemList 
       #-------------------------------------------------------------------------- 
       # ● Rewrites include? 
       #-------------------------------------------------------------------------- 
       def include?(item)   
         return true if item == nil   
         return false unless item.is_a?(RPG::EquipItem)   
         return false if @slot_id < 0   
         if item.is_a?(RPG::Armor)     
           if Extra_Slots::Slots[item.eq_space] == nil       
             return false if item.etype_id != @actor.equip_slots[@slot_id]     
           else       
             return false if item.eq_space != @actor.equip_slots[@slot_id]     
           end   
         else     
           return false if item.etype_id != @actor.equip_slots[@slot_id]   
         end   
         return @actor.equippable?(item) 
       end
     end
     
     class Scene_Equip < Scene_MenuBase 
       #-------------------------------------------------------------------------- 
       # ● Aliases create_slot_window 
       #-------------------------------------------------------------------------- 
       alias custom_slots_create_slot_window create_slot_window 
       def create_slot_window   
         custom_slots_create_slot_window   
         @slot_window.create_contents   
         @slot_window.refresh 
       end 
      
       #-------------------------------------------------------------------------- 
       # ● Aliases on_actor_change 
       #-------------------------------------------------------------------------- 
       alias custom_slots_on_actor_change on_actor_change 
       def on_actor_change   
         custom_slots_on_actor_change   
         @slot_window.create_contents   
         @slot_window.refresh 
       end
     end

     

    ----------------------------------------------------------------------------------------------------------------

     

    사용법은 추가 슬롯에 들어갈 아이템에 대해 메모란에 <위치=n>을 기입해 주셔야 합니다.

    그 경우 스크립트 내부에 Slots[n]="슬롯이름"에 대해서 기입한 아이템들을 장착 가능합니다.

     

    그 다음에는 방어구 타입을 공용 신발, 마법사 전용 신발, 전사 전용 신발로 세 개 추가해준 다음

    전사 직업에는 공용과 전사전용을 등록해주고, 마법사 직업에는 공용과 마법사 전용을 등록해주면 됩니다.

     

    만일 슬롯 이름에서 숫자가 좀 보기 않좋다.. 하면

    def slot_name(index)에서

    sprintf("%s%d",Extra_Slots::Slots[@actor.equip_slots[index]], index-4)를

    sprintf("%s",Extra_Slots::Slots[@actor.equip_slots[index]]) 이렇게 바꿔주면 이름에서 숫자가 빠집니다.

  • ?
    PML이에요 2012.02.10 08:48

    와우, 완벽합니다! 감사합니다!

    딱 제가 원하는 형태로 해주셨네요.

    정말 감사드립니다.

  • ?
    돼지와함께영광을 2014.05.17 15:55
    이 스크립트 적용해 보니 오류 뜨는 데요
  • ?
    시옷청룡 2012.02.25 23:27

    감사요^6

  • profile
    Assault_Meteoric_Star 2012.04.26 11:39
    스크립트가 일자로퍼지니 이걸 어찌쓰면좋을꼬...
  • profile
    하늘바라KSND 2012.04.27 22:42
    컴의 문제가 아닐까요.
  • ?
    걍나댄다 2012.07.24 14:35
    저도 그렇게되요 ㅋ
  • profile
    하늘바라KSND 2012.07.31 18:04
    그렇다면 엔터신공을!
  • profile
    프롬 2012.06.16 16:39
    꽤나 유용한 자료인 만큼 잘 받아가겠습니다.
  • ?
    불청객 2012.09.23 09:21
    최강 장비를 누르면 추가된 슬롯에 들어가는 장비들이 없어지는 버그가...
  • profile
    메모라이즈 2012.11.16 00:22
    어어... 저거 설마. 스크린샷의 저 책 말입니다.
    혹시 네크로노미콘(사령비법, 죽은자의 법률) 입니까?!
    어쩌다 저런 사악한 마도서가 VX ACE 세계에....?
  • profile
    아방스 2012.11.28 17:45
    ^^;;;;;;;;

    그렇게 사악한가요?
  • ?
    린네 2013.05.01 15:20
    근데 이거 스크립트 중 어디에 넣어야되는지요..
  • ?
    쿨쿨팬더 2013.12.08 18:47
    이거 장비 메모란에 뭐라쳐야 적용되나요?
  • ?
    쿨쿨팬더님 축하합니다.^^ 2013.12.08 18:47
    포인트 팡팡!에 당첨되셨습니다.
    쿨쿨팬더님은 19포인트를 보너스로 받으셨습니다.
  • profile
    Pogling 2014.02.12 23:59
    이 스크립트는 최고로 멋지네요!
  • profile
    Pogling 2014.02.13 00:19
    하악!! etype이 뭔지, a타입이 뭔지 한참해맷네요!
  • ?
    파송송뇌진탕 2014.03.01 18:06
    스크립트 적용후 장비 탭에 들어가서 해당 칸을 누르면

    Script 'Game_Actor' line 199: NoMethodError occurred.
    undefined method 'object=' for nil:NilClass

    라고 뜹니다.
    어떻게 해야 제대로 작동할까요?
  • ?
    파송송뇌진탕 2014.03.01 18:19
    아, 처음부터 다시해야 작동되는군요.
    혹시 저와같은 현상 겪으신분 있을까봐 댓글 남겨둡니다.
  • ?
    gkssdfsdf 2018.11.10 23:39
    이걸 xp에도 쓸수 있게 개조할수 없을까요?