Advertisement
biud436

Create Instance Event - RGSS3 Scripts

Jan 27th, 2015
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 7.22 KB | None | 0 0
  1. #==============================================================================
  2. # Author       : biud436
  3. # Change Log   :
  4. #   2019.02.01 - 이벤트 이름 설정 방식 변경
  5. #   2018.08.30 - 이벤트 삭제 방법 변경
  6. #   2015.07.10 - 그래픽 설정 수정
  7. #   2015.07.07 - 일괄 삭제 메소드(열거자 형식) 추가
  8. #   2015.06.22 - 새로운 메소드 추가
  9. #   2015.06.16 - 모든 페이지를 설정합니다.
  10. #   2015.02.02 - 다른 맵에 있는 이벤트도 불러올 수 있습니다
  11. #   2015.01.18 - 최초 버전입니다
  12. #==============================================================================
  13. # ** Terms of Use
  14. #==============================================================================
  15. # Free for commercial and non-commercial use
  16. #==============================================================================
  17.  
  18. $imported = {} if $imported.nil?
  19. $imported["RS_InstanceEvent"] = true
  20.  
  21. class Game_Event
  22.   attr_reader :move_type
  23.   def get_pages
  24.     @event.pages
  25.   end
  26.   def name
  27.     @event.name
  28.   end
  29.   def name=(val)
  30.     ret = val
  31.     ret = "" if not ret.is_a?(String)
  32.     @event.name = ret
  33.   end
  34. end
  35.  
  36. module OPT
  37.   EVData = Struct.new(:sprite_name,:sprite_index,:pages, :name)
  38.   #--------------------------------------------------------------------------
  39.   # * Init Struct
  40.   #--------------------------------------------------------------------------
  41.   def set_character_data
  42.     ev_data = EVData.new
  43.     page = RPG::Event::Page.new
  44.     page.graphic.character_name = ev_data.sprite_name = "Actor#{1 + rand(5)}"
  45.     page.graphic.character_index = ev_data.sprite_index = rand(8)
  46.     page.trigger = 0
  47.     page.priority_type = 1
  48.     page.move_speed = 4
  49.     page.move_frequency = 3
  50.     page.move_type = 3
  51.     page.through = false
  52.     page.list = get_test_event_list
  53.     page.move_route = get_test_move_route
  54.     ev_data.pages = [page]
  55.     ev_data
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # * 이벤트 커맨드 리스트를 스크립트로 작성한 것입니다
  59.   #--------------------------------------------------------------------------
  60.   def get_test_event_list
  61.     list = []
  62.     # 페이스칩 명 , 페이스칩의 인덱스, 메시지의 배경, 메시지의 위치 설정
  63.     list.push RPG::EventCommand.new(101,0,["",0,0,2])
  64.     # 대화창 표시
  65.     list.push RPG::EventCommand.new(401,0,["테스트 대화입니다"])
  66.     # 인스턴스 캐릭터를 파괴합니다
  67.     list.push RPG::EventCommand.new(355,0,["instance_destroy(@event_id)"])
  68.     # 빈 커맨드를 만나야 이벤트가 끝납니다. 따라서 빈 이벤트를 반드시 추가해야 합니다.
  69.     list.push RPG::EventCommand.new
  70.     list
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # * 실제 이벤트에 설정해놓은 커맨드 리스트를 가져옵니다
  74.   #--------------------------------------------------------------------------
  75.   def get_event_list(event_index)
  76.     list = $game_map.events[event_index].list
  77.     list
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # * 이동 루트의 설정을 스크립트로 작성한 것입니다
  81.   #--------------------------------------------------------------------------
  82.   def get_test_move_route
  83.     # 이동 루트의 설정입니다
  84.     move_route = RPG::MoveRoute.new
  85.     move_route.repeat = true
  86.     # 램덤 이동
  87.     move_route.list = [RPG::MoveCommand.new(9),RPG::MoveCommand.new]
  88.     move_route
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # * 실제 이벤트에 설정해놓은 이동 루트를 가져옵니다
  92.   #--------------------------------------------------------------------------
  93.   def get_move_route(event_index)
  94.     list = $game_map.events[event_index].move_route
  95.     list
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # * 다른 맵에 있는 이벤트를 가져옵니다.
  99.   #--------------------------------------------------------------------------
  100.   def set_event_data(index,map_id=$game_map.map_id)
  101.     events = {}
  102.     map = load_data(sprintf("Data/Map%03d.rvdata2", map_id))
  103.     map.events.each {|i, event| events[i] = Game_Event.new(map_id, event) }
  104.     ev_data = EVData.new
  105.     page = events[index].find_proper_page
  106.     ev_data.sprite_name = page.graphic.character_name
  107.     ev_data.sprite_index = page.graphic.character_index
  108.     ev_data.pages = events[index].get_pages
  109.     ev_data.name = events[index].name
  110.     ev_data
  111.   end
  112. end
  113.  
  114. class Object
  115.   include OPT
  116.   #--------------------------------------------------------------------------
  117.   # * 이벤트를 즉시 생성합니다
  118.   #--------------------------------------------------------------------------
  119.   def instance_create(x,y,data=set_character_data)
  120.  
  121.     # 기초 이벤트를 구성합니다
  122.     m_event = RPG::Event.new(x,y)
  123.  
  124.     # 이벤트의 ID 를 설정합니다
  125.     m_event.id = if $game_map.events.empty?
  126.       1
  127.     else
  128.       $game_map.events.keys.max + 1
  129.     end
  130.  
  131.     # 이벤트의 이름입니다
  132.     if data.name.empty?
  133.       m_event.name = "EV#{m_event.id.to_s}"
  134.     else
  135.       m_event.name = data.name
  136.     end
  137.  
  138.     # 페이지 설정
  139.     data.pages.each_with_index { |page,i| m_event.pages[i] = page }
  140.  
  141.     # 이벤트를 추가합니다
  142.     event = Game_Event.new($game_map.map_id,m_event)
  143.     $game_map.events[m_event.id] = event
  144.  
  145.     # Spriteset_Map 의 캐릭터 배열에 방금 만든 캐릭터를 추가합니다
  146.     get_scene = SceneManager.scene
  147.     if get_scene.is_a?(Scene_Map)
  148.       get_scene = get_scene.spriteset
  149.       get_sprite = Sprite_Character.new(get_scene.viewport1,event)
  150.       get_scene.character_sprites.push(get_sprite)
  151.       return $game_map.events[m_event.id]
  152.     end
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # * 이벤트를 구성하고 있는 모든 오브젝트를 없앱니다
  156.   #--------------------------------------------------------------------------
  157.   def instance_destroy(index)
  158.     $game_map.events.delete(index)
  159.     get_scene = SceneManager.scene.spriteset
  160.     get_scene.character_sprites.delete_if do |ev|
  161.       ev.character.id == index
  162.     end
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # * 병렬 처리 이벤트에서 이벤트를 생성합니다
  166.   #--------------------------------------------------------------------------
  167.   def instance_create_ex(event_id,x,y,map_id=$game_map.map_id)
  168.     Thread.new do
  169.       ev_data = set_event_data(event_id,map_id)
  170.       instance_create(x,y,ev_data)
  171.     end
  172.   end
  173. end
  174.  
  175. class Scene_Map
  176.   attr_accessor :spriteset
  177. end
  178.  
  179. class Spriteset_Map
  180.   attr_accessor :character_sprites
  181.   attr_reader :viewport1
  182. end
  183.  
  184. class Game_Character
  185.   attr_reader   :move_route
  186. end
  187.  
  188. class Object
  189.   def instance_destroy_each(args)
  190.     return unless args.is_a?(Range) || args.is_a?(Array)
  191.     args.each do |i|
  192.       $game_map.events.delete(i)
  193.       get_scene = SceneManager.scene.spriteset
  194.       get_scene.character_sprites.delete(i - 1)
  195.     end
  196.     SceneManager.scene.spriteset.refresh_characters
  197.   end
  198. end
  199.  
  200. class Game_Event < Game_Character
  201.   attr_reader   :id
  202. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement