Ace 스크립트

임용 공부를 열심히 해야되는 데... 라면서 가끔씩 눈팅만 하던 아이미르임다... 아직 안죽었어요 oTz...

 

질답게에 시세 관련 글이 올라오기도 하고 저, 개인적으로 대항온도 즐겨 하고 해서

 

전부터 시세 관련 스크립트가 무척 갖고 싶었습니다.

 

하지만 이런저런 좌충우돌 시행착오를 겪고 나서 ... 적당히 제 기술력으로 한계점을 찍은 것 같아서

 

이렇게 올려봅니다...

 

에... 저처럼 스크립트에 입문 정도 하신 분이면 쓸만 할 겁니다... 단지... 원래 대항온 마냥 범위가 넓어지면

 

데이터양도 많아지는 게 정상인 만큼 예제는 용량이 얼마 안된다 해도 게임 만드시는 분은 용량이 미칠 듯이 폭주할지도

 

... 모르지요?!

 

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

 

수정했습니다. 제가 공부한다고 시간이 부족해서 테스트를 못했는 데 테스트 해보니 버그가 있더라고요;;;

질답게시판에 질문도 하고 해서 뜯어 고쳤습니다. 단지... 여러 부분에 걸쳐져 있어서 텍스트 파일이나 여기 붙여

넣으면 알아보기 힘들 거 같더라고요; 그래서 예제만 올립니다.

 

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

 

  예제 링크 입니다.  http://db.tt/wIWvfwWC

 

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

  

기능 1. 정해진 수량 만큼 구입가능하다.
기능 2. 원래 상점에서 판매하지 않는 품목도 상점에 판매하면 구입할 수 있다.
       단, 판매한 수량만큼 구입가능.
기능 3. 시세 기능. 품목마다 시세가 있어서 데이터베이스의 가격 * 시세(%) 가격으로
       매매가능. 단, 판매시는 디폴트 원래가의 90%가격으로 판매가능.
       설정항목의 SELL_RATIO를 수정하여 수정가능.
기능 4. 폭등, 폭락 설정가능. 디폴트로는 상점의 수량 50% 이상 구입하거나 10000G
       이상 구매하면 폭등. 디폴트 시세 변경점의 10배 시세 상승. 20000G 이상 판매하면 폭락.

       디폴트 시세 변경점의 10배 시세 하락.
       설정항목의 EVAL_BUY, EVAL_SELL을 수정하여 수정가능. 수량 50%는 스크립트 본문
       을 수정해야함.

기능 5. 품목과 단위 기능 추가. 품목은 종류를 판별하는 기능입니다. 설정은 아이템의 메모란에

      <품목 n>이라고 쓰면 n번 품목으로 등록됩니다. 기입하지 않거나 0번 품목은 기본적으로

       소모 아이템용입니다. 전투시 아이템란에는 0번 품목만 보입니다. 또한 폭등, 폭락 시 같은 상점

       내의 동일 품목도 똑같이 폭등, 폭락합니다.

         단위 기능은 아이템의 소지량을 제한하기 위한 기능입니다. 기본적으로 무기나 방어구를 제외한

       아이템만 설정가능하며 아이템의 메모란에 <단위 n>이라고 쓰면 n 단위로 설정됩니다. 기입하지 않

      으면 단위는 0으로 설정됩니다. 단위는 소지량의 제한을 위해 설정된 기능입니다. 설정항목에 초기

      화물소지 최대치를 설정할 수 있으며 이는 이벤트의 스크립트 란의 $game_party.max_item_num 수치를

     조절함으로써 조절할 수 있습니다. 메뉴를 열면 화물의 소지량과 최대치를 볼 수 있습니다. 단위가 0인

      아이템 ( 디폴트는 소모아이템 용) 은 최대 99개 까지 가질 수 있으며 그외의 장비류 - 무기, 방어구는

     최대 9개 까지 소지할 수 있습니다.

       현재 약간의 버그가 있으므로 예제의 왼쪽 아래 품목과 단위가 설정된 아이템을 이벤트의 아이템 추가

     기능을 어떻게 하면 버그를 피할 수 있는 지 참조하시기 바랍니다.
기능 5. 명령어 삽입. 이벤트의 스크립트란에 기입하면 O.K.
       $game_shop.reset_item(n) n번 상점 아이템 품목을 초기 수치로 전환한다.
       $game_shop.reset_weapon(n) n번 상점 무기 품목을 초기 수치로 전환한다.
       $game_shop.reset_armor(n) n번 상점 방어구 품목을 초기 수치로 전환한다.


       $game_shop.refill_item(n) n번 상점 아이템 품목을 입하한다. 

       $game_shop.refill_weapon(n) n번 상점 무기 품목을 입하한다.

       $game_shop.refill_armor(n) n번 상점 방어구 품목을 입하한다.

          원래 파는 물품을 채운다. 혹은 최초 구비하던 품목량보다 적은 물품을 초기 품목량만큼 채운다.

 

        $game_shop.supply_item(n, m) n번 상점 아이템 품목을 m개 입하한다.

        $game_shop.supply_weapon(n, m) n번 상점 무기 품목을 m개 입하한다.

        $game_shop.supply_armor(n, m) n번 상점 방어구 품목을 m개 입하한다.

           초기 구비 품목량을 m개 만큼 입하한다.

 

        $game_shop.plus_item(n, id, m) n번 상점 아이템 id 물품을 m개 입하한다.

        $game_shop.plus_weapon(n, id, m) n번 상점 무기 id 물품을 m개 입하한다.

        $game_shop.plus_armor(n, id, m) n번 상점 방어구 id 물품을 m개 입하한다.

           정해진 id의 물품을 n번 상점에 m개 입하한다.

 

       $game_shop. ratio_item(n, r) n번 상점 아이템 품목의 시세를 r%만큼 가감한다.

       $game_shop. ratio_weapon(n, r) n번 상점 무기 품목의 시세를 r%만큼 가감한다. 

       $game_shop. ratio_armor(n, r) n번 상점 방어구 품목의 시세를 r%만큼 가감한다.

          r% 가감은 *(1+r/100) 이 아니라 +r임을 명심하자.

 

       $game_shop.multiple_item(n, id, r) n번 상점 아이템 id 품목의 시세를 r% 가감한다. 

       $game_shop.multiple_weapon(n, id, r) n번 상점 무기 id 품목의 시세를 r% 가감한다.

       $game_shop.multiple_armor(n, id, r) n번 상점 방어구 id 품목의 시세를 r% 가감한다.

          정해진 id의 물품을 n번 상점에 r% 가감한다.

 

       $game_shop.calculate_ratio(n, t, id) n번 상점 t번 타입( 0 : 아이템, 1 : 무기, 2 : 방어구 ), id번 시세를 변동한다.

       $game_shop.calculate_supply(n, t, id) n번 상점 t번 타입( 0 : 아이템, 1 : 무기, 2 : 방어구 ), id번 수량을 변동한다.

       $game_shop.change_by_time(n) n번 상점 전 품목의 시세와 수량을 변동한다.

            설정항목의 CHANGE_NUM, CHANGE_RATIO에 따라 변동시 기본 수량, 기본시세가
       정해진다. 시세는 랜덤하게 변경되며 수량은 초기 수치에 가까워지게 변경된다. 나중에 판매해서 추가된

      수량은 점점 없어지며 초기 수치보다 적은 품목은 많아지고 많은 품목은 적어진다.


기능 6. 모든 품목의 수량, 시세는 세이브 파일에 같이 저장된다.

기능 7. 1분에 한번씩 전 상점에 대해 전품목 시세, 수량 변동 계산을 실행한다.


      

 

Who's 아이미르

?

허루쿠... 임용고시 공부해야되는데 이러고 있다....

 

알만툴의 중독성은 쩔어준다는;;;

  • profile
    하늘바라KSND 2012.06.30 00:39
    우오!!!~
    무려 시세라니!!!
    대단하시네요!
  • profile
    습작 2012.06.30 01:01

    0.


      단일파일에 시세관련 데이터를 저장하는 것은 문제가 있지 않을까요? A세이브 파일의 플레이와 B세이브 파일의 플레이가 동일하지 않을 진데 서로 같은 데이터를 시세 파일로 사용해버린다면, 문제가 되리라 생각되는군요. 그냥 게임 저장시 해당 데이터를 같이 저장해주는 방식으로 해주는 것이 좋지 않을까 생각됩니다.


      허걱님의 변수 저장 스크립트에서 별도의 파일을 생성하고 저장한 것은 세이브 파일과 관계없는 게임 자체 변수를 구현하기 위해서였습니다. 클리어 회차를 저장하는 경우를 예로 들 수가 있지요. 이런 용도의 데이터를 저장해둔 파일이기 때문에 해당 파일은 플레이 이력이 없는 경우일 경우(세이브 파일이 존재하지 않을 경우) 삭제하도록 처리하신 것이기도 합니다.(아이미르님께서 이해불가라고 하신 부분입니다.) 그렇기 때문에 허걱님께서도 GAME 변수 외의 나머지 변수들은 기존 세이브 파일에 같이 저장했습니다.(서로 연동이 되어버리면 안되기 때문입니다.)

     


    1.

     

      VX Ace에서 세이브시 데이터를 같이 저장해주는 내용에 대해서는 어쩌다보니 데이터 베이스 리미트 브레이커 스크립트 덕분에 고인(;;)이 되어버린 제 변수 확장 스크립트를 참고하시면 좋을 듯 하네요.


      http://avangs.info/study_rpg_vx_ace/407560



    2.


      아무쪼록 코딩하시느라 수고하셨습니다. 그럼 저는 아방스의 코더들 스크립트 목록 갱신하러 가보겠습니다. 다음에도 좋은스크립트 부탁드립니다.^^

     


  • profile
    Mimesis 2012.07.02 16:13
    사용하고싶은데.. 이해가 안가네요 ㅠㅠ 익숙해지려면 또 한참을 뜯어보고 있어야 할 텐데.. 하아
  • ?
    아이미르 2012.07.02 16:40
    흐음... 뭐랄까... 질답게에서 아이템 시세를 변경하고 싶다는 질문을 읽었죠. 그 다음에 밑에 댓글도 봤는데 그렇게 하면 모든 아이템에 대해서, 아니 아이템이라고 하면 item만 취급하는 것 같으니 모든 품목에 대해서 동일한 시세가 적용되니까 품목마다 시세를 달리할 순 없을까... 거기에 무역이라고 하면 상점에서 품목의 수량을 무한정 공급하는 게 좀 에러지 않을까 해서 만들어본 스크립트 입니다.

    즉, 다른 건 둘째치고 수량과 시세라는 데 초점을 맞춘거죠.

    그렇게 해서 이래저래 시행착오를 하다가 ( 위에 습작님 조언을 좀 참고해서 ), 아예 game_shop이라고 데이터 저장용 클래스를 만들었습니다. 사실 game_temp안에서 어떻게 해결해보려 했는데 데이터 저장할때 클래스 별로 저장되는 거 같더라고요...

    사용법이 약간 복잡한 건 인정합니다아... 모든 상점에 모든 품목의 수량과 시세를 데이터화 한다는 게 쉽지는 않겠지요... 어떻게 아이템란에 써넣게 할까 했는데 그럼 상점마다 구별이 안가니;;;

    데이터 구조는 SHOP[상점번호][품목타입][품목id]=[수량, 시세] 입니다.
    상점번호는 상점을 구별하기 위한 것으로 스크립트 초반부의 설정항목에서 변수 번호를 바꿀 수 있고요 그 변수값에 따라 상점의 처리에 해당하는 상점이 구별되는 겁니다. 품목타입은 아이템은 0, 무기는 1, 방어구는 2를 기입해주면 되고, 품목id는 알만툴 데이터베이스란에 아이템, 무기, 방어구 데이터 만드는 데 보면 이름 왼쪽에 번호 있습니다. 그거 입니다.

    알만툴 디폴트 데이터에 보면 포션이 아이템 1번이고 핸드 액스가 무기 1번이고 평상복이 방어구 1번이더군요. 그럼 7번 상점의 포션의 자료는 SHOP[7][0][1]=[A, B] 이렇게 작성하고 7번 상점의 핸드액스의 자료는
    SHOP[7][1][1] =[C, D] 이런 식입니다.

    초기 자료를 다 작성하면 사실 상점을 만들 때, 이벤트에 변수 설정( 상점을 구분하기 위해서 )해주고 상점의 처리를 해주면 됩니다. 이때 상점의 처리에 포함된 아이템과 SHOP데이터는 중복파트를 제거하게 되어 있으니 귀찮으면 상점의 처리는 안의 내용물을 비워두셔도 무방합니다.

    그다음에 예제의 오른쪽에 있는 이벤트는 명령어 쪽 몇개 테스트 하던 자료인데 이게 사실 스크립트로 저장된 상점의 수량&시세 데이터를 만져야 되니까 한꺼번에 만지기에는 귀찮아서 몇개 함수를 만들어본 겁니다. 하나하나 건드리려면 스크립트에서 $game_shop.commodity[A][B][C][D] 를 건드려 줘야 합니다.

    위랑 똑같은 구조니까 A는 상점번호, B는 품목type, C는 품목id, D는 수량일 경우는 0, 시세일 경우는 1입니다.

    에... 임용공부 때문에 사실상 눈팅만 주로 하다보니 스크립트 감이 좀 죽는 거 같기도 하고 저도 대항온 같은 게임을 좋아하기도 해서 스크립트를 만들었는 데... 사실상 시행착오와 닥돌의 정신으로 중무장하고 있기 때문에 그리 어려운 스크립트는 아닐 거라고 생각합니다. VX 스크립트 에서 시세조절 스크립트, 허걱님의 확장변수 스크립트나 습작님의 스크립트 같은 여러 스크립트를 닥치는 대로 조합해서 만들었으니까요.

    Mimesis님도 화이팅입니다 :)
  • profile
    하늘바라KSND 2012.07.02 17:35
    Vx에도 시세조절이 있는건가요?!

    에이스것이라 엄청 안타까워하고 있었는데, 말이죠..ㅎㅋㅋㅋ

    하지만 아방스엔 없나봐요.. 안보이는 것으로 봐선..ㅠ
  • ?
    아이미르 2012.07.02 17:38
    VX 것도 통합이었던 것으로 기억합니다. 이 스크립트처럼 몽땅 다 처리하기 위해 복잡하지 않고 구입, 판매 쪽만 있는... 제 기억이 맞다면 Yanfly 였던 걸로 기억합니다.
  • profile
    하늘바라KSND 2012.07.02 17:42
    yanfly..

    아방스에는 스킬과 관계도만 있네요..
    전체를 찾아봐야 겠네요.ㅎㅎ
  • ?
    시옷청룡 2012.07.08 11:50
    와...
  • profile
    FNS키리토 2012.11.01 17:21
    시,시세라니.....
  • profile
    Mimesis 2013.03.26 10:29

    #--------------------------------------------------------------------------
    # ● 아이템을 허가 상태로 표시할지
    #--------------------------------------------------------------------------
    def enable?(item)
    obj = $data_items[item.id]
    a = item && price(item) <= @money && number(item) > 0
    b = item.class == RPG::Item && obj.num != 0
    return a && !$game_party.item_max?(item) unless b
    c1 = $game_party.max_item_num
    c2 = $game_party.now_item_num
    c = ((c1 - c2)/$data_items[item.id].num).to_i > 0

    return a && c
    end
    #-----------

     

     

      #--------------------------------------------------------------------------
      # ● 최대 구입 가능 개수의 취득
      #--------------------------------------------------------------------------
      def max_buy
        obj_num = $game_shop.commodity[shkd[0]][shkd[1]][shkd[2]][0]
        n = buying_price == 0 ? obj_num : [obj_num, money / buying_price].min
       
        obj = $data_items[@item.id]
        if @item.class == RPG::Item and obj.num != 0
          m1 = $game_party.max_item_num.abs
          m2 = $game_party.now_item_num.abs
          m = ((m1 - m2)/$data_items[@item.id].num).to_i
          if m <= 0
          m = 0
          end
        else
          m = $game_party.max_item_number(@item) - $game_party.item_number(@item)
        end
        return [n, m].min
      end

    -----------------------
    화물이 넘치는 버그가 살짝 있어서 위 두 부분을 조금 수정했습니다.

     

    시세관련 스크립트를 만들어주신 아이미르님께 감사를~!

     

  • profile
    Mimesis 2013.03.26 10:31

    상점 갯수를 늘리면 튕겨서 ㅠㅠ 아래부분을 조금 수정해서 쓰겠습니다. 죄송합니다.

    #-------------------------------------------------------
    # 이 아래부터 개수및 시세 자료 입니다.
    # SHOP[A][B][C] = [D, E]
    # A = 상점 번호, B = 물품 번호. 아이템은 0, 무기는 1, 방어구는 2
    # C = 물품 ID, D = 물품 개수, E = 시세
    #--------------------------------------------------------

    for i in 1..SHOP_MAX
    SHOP[i] = []
    SHOP[i][0] = [] # 0 :아이템.
    for id in 1..ITEM_MAX
    SHOP[i][0][id] = [ 0, 110]
    end

    SHOP[i][1] = [] # 1 : 무기
    for id in 1..WEAPON_MAX
    SHOP[i][1][id] = [ 0, 110]
    end

    SHOP[i][2] = [] # 2 : 방어구
    for id in 1..ARMOR_MAX
    SHOP[i][2][id] = [ 0, 110]
    end

    end

     

    이부분에 뭔가 의도하신게 있는듯 한데;; 지역별로 시세를 달리하는거라든지.. 그런것같은데 잘모르겠어서;;

  • ?
    아이미르 2013.03.26 11:52
    수정해서 쓰셔도 괜찮습니다 제가 게임만들 시간같은 게 없어서 보탬이 될까 햐서 만드는 스크립트들입니다 <br /><br />그리고 프로젝트 안에서 사용할 상점의 최대수를 설정항목의 SHOP_MAX 로 정해야합니다 배열이라는 게 미리 설정을 해야되는 거 같더라고요;
  • ?
    게임애호가 2014.02.22 12:04

      SHOP[1][0][1] = [ 0, 100]

      SHOP[1][0][2] = [ 0, 100]

      SHOP[1][0][3] = [ 0, 100] 

      SHOP[1][0][4] = [ 0, 100] 

      SHOP[1][0][5] = [ 0, 100] 

      SHOP[1][0][6] = [ 0, 100] 

      SHOP[1][0][7] = [ 0, 100] 

      SHOP[1][0][8] = [ 0, 100] 

      SHOP[1][0][9] = [ 0, 100]

      SHOP[1][0][10] = [ 0, 100]

      SHOP[1][0][11] = [ 0, 100]

      SHOP[1][0][12] = [ 0, 100]

      SHOP[1][0][13] = [ 0, 100]

      SHOP[1][0][14] = [ 0, 100]

      SHOP[1][0][15] = [ 0, 100]

      SHOP[1][0][16] = [ 0, 100]

      SHOP[1][0][17] = [ 0, 100]

      SHOP[1][0][18] = [ 60, 100]

      SHOP[1][0][19] = [ 50, 100]

      SHOP[1][0][20] = [ 50, 100]

      SHOP[1][0][21] = [ 50, 100]

      SHOP[1][0][22] = [ 50, 100]

      SHOP[1][0][23] = [ 10, 100]

      SHOP[1][0][24] = [ 10, 100]

      SHOP[1][0][25] = [ 10, 100]

      SHOP[1][0][26] = [ 10, 100]

      SHOP[1][0][27] = [ 0, 100]

      SHOP[1][0][28] = [ 8, 100]

      SHOP[1][0][29] = [ 5, 100]

      SHOP[1][0][30] = [ 2, 100]

      SHOP[1][0][31] = [ 0, 100]

      SHOP[1][0][32] = [ 3, 100]

      SHOP[1][0][33] = [ 4, 100]

      SHOP[1][0][34] = [ 23, 100]

      SHOP[1][0][35] = [ 2, 100]

      SHOP[1][0][36] = [ 0, 100]

      SHOP[1][0][37] = [ 35, 100]

      SHOP[1][0][38] = [ 40, 100]

      SHOP[1][0][39] = [ 0, 100]

      SHOP[1][0][40] = [ 6, 100]

      SHOP[1][0][41] = [ 8, 100]

      SHOP[1][0][42] = [ 3, 100]

      SHOP[1][0][43] = [ 6, 100]

      SHOP[1][0][44] = [ 0, 100]

      SHOP[1][0][45] = [ 0, 100]

      SHOP[1][0][46] = [ 0, 100]

      SHOP[1][0][47] = [ 0, 100]

      SHOP[1][0][48] = [ 0, 100]

      SHOP[1][0][49] = [ 0, 100]

      SHOP[1][0][50] = [ 0, 100]


    왠지 스크립트랑 다르게 상점에서의 초기개수가 전부 0으로 나오는데요?


    아이템종류 50개 시세 전부 설정하고 상점의 처리에서는 18~26번 아이템만 배치했는데 배치한 아이템 수량이 전부 0으로 나오네요.



  • ?
    게임애호가님 축하합니다.^^ 2014.02.22 12:04
    포인트 팡팡!에 당첨되셨습니다.
    게임애호가님은 17포인트를 보너스로 받으셨습니다.
  • ?
    게임애호가 2014.02.22 14:36

    아 아템종류도 상점도 너무많아서 연습용으로 겜을 따로 만들어서 해보니 상점이 2개이상일때 스크립트가 안먹히는거였네요

  • ?
    게임애호가 2014.02.22 14:42

    아 해결했습니다. 변수가 0포함해서 33개라 상점번호변수설정을 33으로 했던걸 1로 바꾸니까 되네요.


    그럼 상점갯수를 33으로 하면 되는건가

  • ?
    게임애호가 2014.02.22 14:45
    33하면 오류뜨고 32하니까 제데로 되네요. 0은 포함하지 않는것 같습니다.

    뭔가 댓글이 많은데 다른사람들도 볼수있게 삭제처리 되지 않았으면 하네요.