bowei

Untitled

Feb 21st, 2020
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.82 KB | None | 0 0
  1. #==============================================================================
  2. # ■ 物品拾起 by 余音·魔眼
  3. #------------------------------------------------------------------------------
  4. #  使用说明:
  5. #   在空白的事件首行输入<物品类型(空格)物品编号>,
  6. #   进游戏里,物品就会出现在该事件的位置。
  7. #   物品类型中,"ITEM"代表物品,"WEAPON"代表武器,"ARMOR"代表护甲,
  8. #   例:<"ITEM" 1>就代表在该事件位置摆放1号物品恢复剂。
  9. #   在举起道具的状态时,按下按妞(:B)时,
  10. #   会使用正在举起的物品(前提是该物品的使用场合必须设置为随时可用),
  11. #   若该物品是消耗品,使用后将消失,人物也将变回原来的行走状态,
  12. #   若不是,则没有演出效果。
  13. # 与NPC对话时,可以把正在举起的物品交给他/她,会赠送物品给他/她。
  14. # 设置时可用事件脚本clear_item清除主角手中的物品,
  15. # 可用pick_lift?(物品类型("ITEM"/"WEAPON"/"ARMOR"), 物品编号)
  16. # 判断正在举起的物品ID。
  17. #==============================================================================
  18. module Hawkeye; end
  19. module Hawkeye::Pick
  20. #==============================================================================
  21. # ■ 设定开始
  22. #==============================================================================
  23.  
  24. MoveTime = 10
  25. #举起或放下物品的时间(帧)
  26.  
  27. IncomTime = 12
  28. #物品放进背包的时间(帧)
  29.  
  30. Deviation = 22
  31. #举起物品时,物品Y坐标与人物正中心的距离
  32.  
  33. LiftSuffix = "_Pickup"
  34. #人物举起物品时的文件后缀
  35.  
  36. IncomSuffix = "_Putaway"
  37. #人物将物品放进背包时的文件后缀
  38.  
  39. #==============================================================================
  40. # ■ 设定结束
  41. #==============================================================================
  42. end
  43.  
  44. class RPG::Item
  45.  
  46. alias hawkeye_pick_item_menu_ok? menu_ok?
  47. def menu_ok?
  48. if $game_player.pick_lift?
  49. @occasion == 0
  50. else
  51. hawkeye_pick_item_menu_ok?
  52. end
  53. end
  54.  
  55. end
  56.  
  57. class Game_Actor
  58.  
  59. attr_accessor :state
  60.  
  61. alias hawkeye_pick_item_conditions_met? item_conditions_met?
  62. def item_conditions_met?(item)
  63. if $game_party.in_battle
  64. hawkeye_pick_item_conditions_met?(item)
  65. else
  66. usable_item_conditions_met?(item) && pick_lift?
  67. end
  68. end
  69.  
  70. def pick_lift?
  71. @state == :lift
  72. end
  73.  
  74. end
  75.  
  76.  
  77. class Game_Party
  78.  
  79. alias hawkeye_pick_consume_item consume_item
  80. def consume_item(item)
  81. if in_battle
  82. hawkeye_pick_consume_item
  83. else
  84. return
  85. end
  86. end
  87.  
  88. end
  89.  
  90. class Game_Map
  91.  
  92. attr_accessor :map_data, :map, :event
  93.  
  94. def setup(map_id)
  95. @map_data ||= {}
  96. @map_id = map_id
  97. @map = @map_data[@map_id] ? @map_data[@map_id] : load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
  98. @tileset_id = @map.tileset_id
  99. @display_x = 0
  100. @display_y = 0
  101. referesh_vehicles
  102. setup_events
  103. setup_scroll
  104. setup_parallax
  105. setup_battleback
  106. @need_refresh = false
  107. end
  108.  
  109. def setup_events
  110. c_event = current_event
  111. @events = {}
  112. @map.events.each do |i, event|
  113. @events[i] = Game_Event.new(@map_id, event)
  114. end
  115. if c_event
  116. id = @events != {} ? @events.keys.max + 1 : 1
  117. @map.events[id] = RPG::Event.new(c_event.x, c_event.y)
  118. @map.events[id].id = id
  119. @events[id] = c_event
  120. @events[id].id = id
  121. c_event = nil
  122. end
  123. @common_events = parallel_common_events.collect do |common_event|
  124. Game_CommonEvent.new(common_event.id)
  125. end
  126. refresh_tile_events
  127. end
  128.  
  129. alias hawkeye_pick_passable? passable?
  130. def passable?(x, y, d)
  131. return false if item_ly?(x, y)
  132. hawkeye_pick_passable?(x, y, d)
  133. end
  134.  
  135. def clear_current_event
  136. event = @events.values.find{|event|event.pick_lift?}
  137. @events.delete(event.id)
  138. @map.events.delete(event.id)
  139. end
  140.  
  141. def create_current_event(item)
  142. id = @events != {} ? @events.keys.max + 1 : 1
  143. x, y = $game_player.x, $game_player.y
  144. @map.events[id] = RPG::Event.new(x, y)
  145. @map.events[id].id = id
  146. type = {RPG::Item => "ITEM", RPG::Weapon => "WEAPON", RPG::Armor => "ARMOR"}
  147. @map.events[id].pages[0].list[0].code = 108
  148. @map.events[id].pages[0].list[0].parameters[0] = "<"+type[item.class]+" "+item.id.to_s+">"
  149. @events[id] = Game_Event.new(@map_id, RPG::Event.new(x, y))
  150. lift_deviation = @events[id].lift_deviation
  151. @events[id].y -= lift_deviation
  152. @events[id].real_y -= lift_deviation
  153. @events[id].id = id
  154. @events[id].priority_type = 2
  155. @events[id].state = :lift
  156. @events[id].item = item
  157. end
  158.  
  159. def current_event
  160. @events.values.find{|event|event.pick_lift?}
  161. end
  162.  
  163. def pick_pos?(event, x, y)
  164. [event.x, event.y] == [x, y]
  165. end
  166.  
  167. def item_ly?(x, y)
  168. @events.values.any?{|event|event.pick_ly? && pick_pos?(event, x, y)}
  169. end
  170.  
  171. end
  172.  
  173. class Game_Player
  174.  
  175. attr_reader :state
  176. attr_accessor :pattern
  177.  
  178. alias hawkeye_pick_initialize initialize
  179. def initialize
  180. hawkeye_pick_initialize
  181. @state = :empty
  182. end
  183.  
  184. alias hawkeye_pick_move_by_input move_by_input
  185. def move_by_input
  186. return if pick_wait? || pick_incom?
  187. hawkeye_pick_move_by_input
  188. end
  189.  
  190. def state=(value)
  191. @state = value
  192. actor.state = @state
  193. end
  194.  
  195. def pick_wait?
  196. @state == :wait
  197. end
  198.  
  199. def pick_incom?
  200. @state == :incom
  201. end
  202.  
  203. def pick_empty?
  204. @state == :empty
  205. end
  206.  
  207. def pick_lift?
  208. @state == :lift
  209. end
  210.  
  211. def perform_transfer
  212. if transfer?
  213. set_direction(@new_direction)
  214. $game_map.map_data[$game_map.map_id] = Marshal.load(Marshal.dump($game_map.map))
  215. $game_map.map_data[$game_map.map_id].events.each do |id, event|
  216. $game_map.events[id].create_all_list(event) if !$game_map.events[id].pick_lift?
  217. end
  218. if @new_map_id != $game_map.map_id
  219. $game_map.setup(@new_map_id)
  220. $game_map.autoplay
  221. end
  222. moveto(@new_x, @new_y)
  223. clear_transfer_info
  224. end
  225. end
  226.  
  227. end
  228.  
  229. class Game_Event
  230.  
  231. include Hawkeye::Pick
  232.  
  233. attr_accessor :id, :x, :y, :real_x, :real_y, :state, :item, :priority_type
  234.  
  235. alias hawkeye_pick_refresh refresh
  236. def refresh
  237. return if @state
  238. hawkeye_pick_refresh
  239. end
  240.  
  241. alias hawkeye_pick_initialize initialize
  242. def initialize(map_id, event)
  243. hawkeye_pick_initialize(map_id, event)
  244. return unless @list
  245. @list.each do |command|
  246. if command.code == 108 || command.code == 408
  247. command.parameters.each do |line|
  248. if line =~ /<(.+?)[ ]*(\d+)>/i
  249. @typekey, id = $1.upcase, $2.to_i
  250. @type = {
  251. "ITEM" => $data_items[id],
  252. "WEAPON" => $data_weapons[id],
  253. "ARMOR" => $data_armors[id]
  254. }
  255. init_ly
  256. break
  257. end
  258. end
  259. end
  260. end
  261. end
  262.  
  263. def clear_data
  264. clear_page_settings
  265. @through = false
  266. clear_all_list
  267. @priority_type = 1 if @priority_type != 1
  268. @trigger = 0
  269. end
  270.  
  271. def init_ly
  272. @item = @type[@typekey]
  273. save_all_list
  274. clear_data
  275. @state = :ly
  276. end
  277.  
  278. def clear_all_list
  279. @event.pages.each{|page|page.list = []}
  280. end
  281.  
  282. def save_all_list
  283. @last_pages = Marshal.load(Marshal.dump(@event.pages))
  284. end
  285.  
  286. def create_all_list(event)
  287. event.pages = Marshal.load(Marshal.dump(@last_pages)) if @last_pages
  288. end
  289.  
  290. def pick_condition?
  291. $game_player.movable? && Input.trigger?(:C) &&
  292. !$game_player.pick_wait? && !moving? &&
  293. !$game_player.moving?
  294. end
  295.  
  296. def pos_round?(x, y, xl, yl, obj)
  297. [x, y] == [obj.x + xl, obj.y + yl]
  298. end
  299.  
  300. def get_pos_round_xy(xl, yl, obj)
  301. @x, @y = obj.x + xl, obj.y + yl
  302. end
  303.  
  304. def get_pos_round_rxry(xl, yl, obj)
  305. @real_x, @real_y = obj.real_x + xl, obj.real_y + yl
  306. end
  307.  
  308. def orient?(d)
  309. @last_direction = d
  310. $game_player.direction == d
  311. end
  312.  
  313. def pick_ly?
  314. @state == :ly
  315. end
  316.  
  317. def pick_lift?
  318. @state == :lift
  319. end
  320.  
  321. def pick_up?
  322. @state == :up
  323. end
  324.  
  325. def pick_down?
  326. @state == :down
  327. end
  328.  
  329. def ly_condition?
  330. pick_lift? && $game_player.pick_lift? && @priority_type == 2
  331. end
  332.  
  333. def lift_condition?
  334. pick_ly? && $game_player.pick_empty? && @priority_type == 1
  335. end
  336.  
  337. def ready_ly
  338. ready_ly_direction if orient?(4)
  339. ready_ly_direction if orient?(6)
  340. ready_ly_direction if orient?(8)
  341. ready_ly_direction if orient?(2)
  342. end
  343.  
  344. def ready_lift
  345. @incoord = {4 => 6, 6 => 4, 8 => 2, 2 => 8}
  346. player = $game_player
  347. ready_lift_direction if pos_round?(@x, @y, -1, 0, player) && orient?(4)
  348. ready_lift_direction if pos_round?(@x, @y, 1, 0, player) && orient?(6)
  349. ready_lift_direction if pos_round?(@x, @y, 0, -1, player) && orient?(8)
  350. ready_lift_direction if pos_round?(@x, @y, 0, 1, player) && orient?(2)
  351. end
  352.  
  353. def ready_ly_direction
  354. @state = :down
  355. $game_player.state = :wait
  356. move_straight($game_player.direction)
  357. end
  358.  
  359. def ready_lift_direction
  360. @state = :up
  361. $game_player.state = :wait
  362. @priority_type = 2
  363. move_straight(@incoord[@last_direction])
  364. end
  365.  
  366. def update
  367. super
  368. check_event_trigger_auto
  369. process_pick
  370. return unless @interpreter
  371. @interpreter.setup(@list, @event.id) unless @interpreter.running?
  372. @interpreter.update
  373. end
  374.  
  375. def process_pick
  376. ready_pick if pick_condition?
  377. fin_move if $game_player.pick_wait? && !moving?
  378. track_player if pick_lift?
  379. end
  380.  
  381. def ready_pick
  382. ready_lift if lift_condition?
  383. ready_ly if ly_condition?
  384. end
  385.  
  386. def fin_move
  387. character_name = $game_player.actor.actor.character_name
  388. name = character_name + LiftSuffix
  389. get = {
  390. :up => [name, :lift, :lift],
  391. :down => [character_name, :ly, :empty]
  392. }
  393. if pick_up? || pick_down?
  394. @priority_type = 1 if @state == :down
  395. last_state = @state
  396. $game_player.set_graphic(get[last_state][0], 0)
  397. @state = get[last_state][1]
  398. $game_player.state = get[last_state][2]
  399. end
  400. end
  401.  
  402. def track_player
  403. rx, ry = @real_x, @real_y
  404. rx_l, ry_l = 0, -lift_deviation
  405. player = $game_player
  406. if !pos_round?(rx, ry, rx_l, ry_l, player)
  407. get_pos_round_rxry(rx_l, ry_l, player)
  408. end
  409. if !$game_player.moving?
  410. get_pos_round_xy(0, -lift_deviation, player)
  411. end
  412. end
  413.  
  414. alias hawkeye_pick_distance_per_frame distance_per_frame
  415. def distance_per_frame
  416. if $game_player.pick_wait? && (pick_up? || pick_down?)
  417. return 1.0 / MoveTime
  418. else
  419. hawkeye_pick_distance_per_frame
  420. end
  421. end
  422.  
  423. alias hawkeye_pick_move_straight move_straight
  424. def move_straight(d, turn_ok = true)
  425. if pick_down?
  426. @y += lift_deviation
  427. if !passable?(@x, @y, d)
  428. @state = :lift
  429. $game_player.state = :lift
  430. @y -= lift_deviation
  431. return
  432. end
  433. end
  434. hawkeye_pick_move_straight(d)
  435. @real_y -= lift_deviation if pick_down?
  436. @y = pick_up? ? @y - lift_deviation : @y if @move_succeed
  437. $game_map.map.events[id].x, $game_map.map.events[id].y = @x, @y
  438. end
  439.  
  440. def lift_deviation
  441. return Deviation / 32.0
  442. end
  443.  
  444. end
  445.  
  446. class Game_Interpreter
  447.  
  448. def clear_item
  449. SceneManager.scene.clear_item if $game_player.pick_lift?
  450. end
  451.  
  452. def pick_lift?(type, id)
  453. type_class = {
  454. "ITEM" => RPG::Item,
  455. "WEAPON" => RPG::Weapon,
  456. "ARMOR" => RPG::Armor
  457. }
  458. return false unless $game_map.current_event
  459. return false if type != "ITEM" && type != "WEAPON" && type != "ARMOR"
  460. item = $game_map.current_event.item
  461. return item.is_a?(type_class[type.upcase]) && item.id == id
  462. end
  463.  
  464. end
  465.  
  466.  
  467. class Spriteset_Map
  468. attr_reader :tile_map
  469.  
  470. alias hawkeye_pick_create_tilemap create_tilemap
  471. def create_tilemap
  472. hawkeye_pick_create_tilemap
  473. create_items
  474. end
  475.  
  476. def create_items
  477. @item_sprite = []
  478. $game_map.events.each_value do |event|
  479. if (event.pick_ly? || event.pick_lift?) && event.item
  480. @item_sprite.push(Sprite_Pick.new(event.item, event, @tilemap))
  481. end
  482. end
  483. end
  484.  
  485. alias hawkeye_pick_update_tilemap update_tilemap
  486. def update_tilemap
  487. hawkeye_pick_update_tilemap
  488. update_pick
  489. end
  490.  
  491. def update_pick
  492. refresh_pick if @map_id != $game_map.map_id
  493. @item_sprite.each{|sprite|sprite.update}
  494. end
  495.  
  496. alias hawkeye_pick_dispose dispose
  497. def dispose
  498. hawkeye_pick_dispose
  499. dispose_pick
  500. end
  501.  
  502. def dispose_pick
  503. @item_sprite.each{|sprite|sprite.dispose}
  504. end
  505.  
  506. def clear_current_sprite
  507. current_sprite.dispose
  508. @item_sprite.delete_if{|sprite|sprite.disposed?}
  509. end
  510.  
  511. def current_sprite
  512. @item_sprite.find{|sprite|sprite.event.pick_lift?}
  513. end
  514.  
  515. def current_event
  516. current_sprite.event
  517. end
  518.  
  519. def current_item
  520. current_event.item
  521. end
  522.  
  523. def refresh_pick
  524. dispose_pick
  525. create_items
  526. end
  527.  
  528. def update_tileset
  529. if @tileset != $game_map.tileset
  530. load_tileset
  531. refresh_characters
  532. refresh_pick
  533. end
  534. end
  535.  
  536. end
  537.  
  538. class Sprite_Pick < Sprite
  539.  
  540. attr_reader :event
  541.  
  542. def initialize(item, event, tilemap)
  543. super(nil)
  544. self.x, self.y, self.z = event.x * 32, event.y * 32, event.screen_z
  545. self.ox, self.oy = tilemap.ox , tilemap.oy
  546. self.bitmap = Bitmap.new(32, 32)
  547. draw_icon(item.icon_index, 4, 4)
  548. @tilemap = tilemap
  549. @event = event
  550. end
  551.  
  552. def draw_icon(icon_index, x, y)
  553. bitmap = Cache.system("Iconset")
  554. rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  555. self.bitmap.blt(x, y, bitmap, rect)
  556. end
  557.  
  558. def update
  559. super
  560. update_placement
  561. end
  562.  
  563. def update_placement
  564. self.ox = @tilemap.ox if self.ox != @tilemap.ox
  565. self.oy = @tilemap.oy if self.oy != @tilemap.oy
  566. get_pick_pos(@event) if !pick_pos?(@event, self.x, self.y)
  567. self.z = @event.screen_z + 1 if self.z != @event.screen_z + 1 && @event.pick_lift?
  568. end
  569.  
  570. def pick_pos?(event, x, y)
  571. [x, y] == [event.real_x * 32, event.real_y * 32]
  572. end
  573.  
  574. def get_pick_pos(event)
  575. self.x, self.y = event.real_x * 32, event.real_y * 32
  576. end
  577.  
  578. end
  579.  
  580. class Window_ItemList
  581.  
  582. def enable?(item)
  583. item ? true : false
  584. end
  585.  
  586. end
  587.  
  588. class Scene_Map
  589.  
  590. attr_reader :spriteset
  591.  
  592. include Hawkeye::Pick
  593.  
  594. alias hawkeye_pick_update update
  595. def update
  596. if $game_player.pick_lift?
  597. process_use if Input.trigger?(:B)
  598. incom_bag if Input.trigger?(:A)
  599. end
  600. hawkeye_pick_update
  601. end
  602.  
  603. def process_use
  604. if item_usable?
  605. use_item
  606. clear_item if @spriteset.current_item.consumable
  607. else
  608. Sound.play_buzzer
  609. end
  610. end
  611.  
  612. def incom_bag
  613. $game_party.gain_item(@spriteset.current_item, 1)
  614. @spriteset.clear_current_sprite
  615. $game_map.clear_current_event
  616. $game_player.state = :incom
  617. @last_direction = $game_player.direction
  618. $game_player.set_direction(2)
  619. $game_player.set_graphic(character_name + IncomSuffix, 0)
  620. end
  621.  
  622. alias hawkeye_pick_update_basic update_basic
  623. def update_basic
  624. update_wait_incom if $game_player.pick_incom?
  625. hawkeye_pick_update_basic
  626. end
  627.  
  628. def update_wait_incom
  629. @count ||= 1
  630. pattern = {
  631. IncomTime / 3 * 0 + 1 => 0,
  632. IncomTime / 3 * 1 + 1 => 0,
  633. IncomTime / 3 * 2 + 1 => 0,
  634. }
  635. $game_player.pattern = pattern[@count] if pattern.keys.include?(@count)
  636. @count += 1
  637. fin_move if @count > IncomTime
  638. end
  639.  
  640. def fin_move
  641. $game_player.state = :empty
  642. $game_player.set_graphic(character_name, 0)
  643. $game_player.set_direction(@last_direction)
  644. @last_direction = nil
  645. @count = nil
  646. end
  647.  
  648. alias hawkeye_pick_update_call_menu update_call_menu
  649. def update_call_menu
  650. return if wait_judge?
  651. hawkeye_pick_update_call_menu
  652. end
  653.  
  654. alias hawkeye_pick_update_call_debug update_call_debug
  655. def update_call_debug
  656. return if wait_judge?
  657. hawkeye_pick_update_call_debug
  658. end
  659.  
  660. def wait_judge?
  661. $game_player.pick_lift? || $game_player.pick_wait? || $game_player.pick_incom?
  662. end
  663.  
  664. def character_name
  665. $game_player.actor.actor.character_name
  666. end
  667.  
  668. def item_usable?
  669. user.usable?(item) && item_effects_valid?
  670. end
  671.  
  672. def user
  673. $game_player.actor
  674. end
  675.  
  676. def item_target_actors
  677. return user
  678. end
  679.  
  680. def item_usable?
  681. user.usable?(item) && item_effects_valid?
  682. end
  683.  
  684. def item_effects_valid?
  685. [item_target_actors].any? do |target|
  686. target.item_test(user, item)
  687. end
  688. end
  689.  
  690. def use_item
  691. play_se_for_item
  692. user.use_item(item)
  693. use_item_to_actors
  694. check_common_event
  695. check_gameover
  696. end
  697.  
  698. def play_se_for_item
  699. Sound.play_use_item
  700. end
  701.  
  702. def use_item_to_actors
  703. [item_target_actors].each do |target|
  704. item.repeats.times { target.item_apply(user, item) }
  705. end
  706. end
  707.  
  708. def item
  709. return $game_map.events.values.find{|event|event.pick_lift?}.item
  710. end
  711.  
  712. def check_common_event
  713. SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
  714. end
  715.  
  716. def clear_item
  717. @spriteset.clear_current_sprite
  718. $game_map.clear_current_event
  719. $game_player.set_graphic(character_name, 0)
  720. $game_player.state = :empty
  721. end
  722.  
  723. end
  724.  
  725. class Scene_ItemBase
  726.  
  727. include Hawkeye::Pick
  728.  
  729. def determine_item
  730. $game_map.create_current_event(item)
  731. $game_player.set_graphic(character_name + LiftSuffix, 0)
  732. $game_player.state = :lift
  733. $game_party.lose_item(item, 1)
  734. activate_item_window
  735. SceneManager.goto(Scene_Map)
  736. end
  737.  
  738. def character_name
  739. $game_player.actor.actor.character_name
  740. end
  741.  
  742. end
Add Comment
Please, Sign In to add comment