SHARE
TWEET

RPG Maker VX Ace - Enhanced Camera

MakerSystems Dec 8th, 2014 (edited) 2,422 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %Q(
  2. ╔════╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═════╗
  3. ║ ╔══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╗ ║
  4. ╠─╣                             Enhanced Camera                              ╠─╣
  5. ╠─╣                           by RPG Maker Source.                           ╠─╣
  6. ╠─╣                          www.rpgmakersource.com                          ╠─╣
  7. ║ ╚══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╝ ║
  8. ╠════╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═╤═╩═════╣
  9. ║ ┌────┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴─────┐ ║
  10. ╠─┤ Version 1.0.2                   07/03/15                        DD/MM/YY ├─╣
  11. ║ └────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┘ ║
  12. ╠══════╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══════╣
  13. ║                                                                              ║
  14. ║               This work is protected by the following license:               ║
  15. ║     ╔══════════════════════════════════════════════════════════════════╗     ║
  16. ║     │                                                                  │     ║
  17. ║     │ Copyright © 2014 Maker Systems.                                  │     ║
  18. ║     │                                                                  │     ║
  19. ║     │ This software is provided 'as-is', without any kind of           │     ║
  20. ║     │ warranty. Under no circumstances will the author be held         │     ║
  21. ║     │ liable for any damages arising from the use of this software.    │     ║
  22. ║     │                                                                  │     ║
  23. ║     │ Permission is granted to anyone to use this software on their    │     ║
  24. ║     │ free or commercial games made with a legal copy of RPG Maker     │     ║
  25. ║     │ VX Ace, as long as Maker Systems - RPG Maker Source is           │     ║
  26. ║     │ credited within the game.                                        │     ║
  27. ║     │                                                                  │     ║
  28. ║     │ Selling this code or any portions of it 'as-is' or as part of    │     ║
  29. ║     │ another code, is not allowed.                                    │     ║
  30. ║     │                                                                  │     ║
  31. ║     │ The original header, which includes this copyright notice,       │     ║
  32. ║     │ must not be edited or removed from any verbatim copy of the      │     ║
  33. ║     │ sotware nor from any edited version.                             │     ║
  34. ║     │                                                                  │     ║
  35. ║     ╚══════════════════════════════════════════════════════════════════╝     ║
  36. ║                                                                              ║
  37. ║                                                                              ║
  38. ╠══════════════════════════════════════════════════════════════════════════════╣
  39. ║ 1. VERSION HISTORY.                                                        ▼ ║
  40. ╠══════════════════════════════════════════════════════════════════════════════╣
  41. ║                                                                              ║
  42. ║ • Version 1.0.0, 08/12/14 - (DD/MM/YY).                                      ║
  43. ║                                                                              ║
  44. ║ • Version 1.0.1, 13/12/14 - (DD/MM/YY).                                      ║
  45. ║                                                                              ║
  46. ║ • Version 1.0.2, 07/03/15 - (DD/MM/YY).                                      ║
  47. ║   - Camera will now behave like default when strength is set to 1.           ║
  48. ║                                                                              ║
  49. ╠══════════════════════════════════════════════════════════════════════════════╣
  50. ╠══════════════════════════════════════════════════════════════════════════════╣
  51. ║ 2. USER MANUAL.                                                            ▼ ║
  52. ╠══════════════════════════════════════════════════════════════════════════════╣
  53. ║                                                                              ║
  54. ║ ┌──────────────────────────────────────────────────────────────────────────┐ ║
  55. ║ │ ■ Introduction.                                                          │ ║
  56. ║ └┬┬┬┬──────────────────────────────────────────────────────────────────┬┬┬┬┘ ║
  57. ║                                                                              ║
  58. ║  Hello there! This script is "plug and play", you can simply insert it into  ║
  59. ║  your project and it will perform flawlessly.                                ║
  60. ║                                                                              ║
  61. ║  This script greatly improves the appearence of your games. Once you see it  ║
  62. ║  in action, you will love it.                                                ║
  63. ║                                                                              ║
  64. ║  It makes the camera smoothly follow the player with a nice deceleration     ║
  65. ║  effect, and provides new functions that makes it more versatile.            ║
  66. ║                                                                              ║
  67. ║  Although it will work as soon as you insert it, we included some            ║
  68. ║  instructions in the next section for you to take advantage of some of the   ║
  69. ║  new features provided and to create awesome scenes and mechanics.           ║
  70. ║                                                                              ║
  71. ║  We hope you enjoy it.                                                       ║
  72. ║                                                                              ║
  73. ║  Thanks for choosing our products.                                           ║
  74. ║                                                                              ║
  75. ║ ┌──────────────────────────────────────────────────────────────────────────┐ ║
  76. ║ │ ■ Configuration.                                                         │ ║
  77. ║ └┬┬┬┬──────────────────────────────────────────────────────────────────┬┬┬┬┘ ║
  78. ║                                                                              ║
  79. ║  "How do I change the strength of the deceleration effect?"                  ║
  80. ║  Right click anywhere in the script editor and select "Find" (or CTRL + F)   ║
  81. ║  search for "DECELERATION_VALUE" (without quotation marks).                  ║
  82. ║                                                                              ║
  83. ║  You will see something like "DECELERATION_VALUE = 22"                       ║
  84. ║                                                                              ║
  85. ║  Set the number after the equality sign to any numer you like, bigger or     ║
  86. ║  equal than 1. The bigger the number, the stronger the deceleration effect   ║
  87. ║  and thus the slower the camera movement when following the player. Small    ║
  88. ║  numbers result in a faster deceleration, default value is 22.               ║
  89. ║                                                                              ║
  90. ║ ┌──────────────────────────────────────────────────────────────────────────┐ ║
  91. ║ │ ■ Feature Documentation.                                                 │ ║
  92. ║ └┬┬┬┬──────────────────────────────────────────────────────────────────┬┬┬┬┘ ║
  93. ║                                                                              ║
  94. ║  There are several commands that you can use inside a Script Call (Event     ║
  95. ║  Command) to create awesome scenes and mechanics. Although they are easy to  ║
  96. ║  use and understand, it is useful to have a reference to check in case you   ║
  97. ║  forget something about them.                                                ║
  98. ║                                                                              ║
  99. ║  The script commands that you can use inside a Script Call (Event Command)   ║
  100. ║  are displayed inside the following chart, followed by their description     ║
  101. ║  and, if needed, usage details and examples.                                 ║
  102. ║                                                                              ║
  103. ║  ┌───────────────────────────────┐                                           ║
  104. ║  │ ms_pro_cam_wait_for_scrolling │                                           ║
  105. ║  ├───────────────────────────────┴────────────────────────────────────────┐  ║
  106. ║  │ Waits until screen scrolling is completed before executing the next    │  ║
  107. ║  │ event command. This works for both the event command default scrolling │  ║
  108. ║  │ and for the new "scroll to position" (ms_pro_cam_center_at) function   │  ║
  109. ║  │ of Enhanced Camera.                                                    │  ║
  110. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  111. ║  ┌────────────────────────────────────┐                                      ║
  112. ║  │ ms_pro_cam_center_at(x, y, frames) │                                      ║
  113. ║  ├────────────────────────────────────┴───────────────────────────────────┐  ║
  114. ║  │ Smoothly centers the camera at the desired coordinates in the exact    │  ║
  115. ║  │ desired number of frames.                                              │  ║
  116. ║  │                                                                        │  ║
  117. ║  │ In other words, this command allows you to tell the camera to move to  │  ║
  118. ║  │ a point, center the view on that point, and do so exactly in the time  │  ║
  119. ║  │ you desire.                                                            │  ║
  120. ║  │                                                                        │  ║
  121. ║  │ The speed of the camera movement is automatically adjusted to arrive   │  ║
  122. ║  │ at its destination exactly when its time is up.                        │  ║
  123. ║  │                                                                        │  ║
  124. ║  │ NOTE: Compatible with looped maps. Normally, if the camera is at the   │  ║
  125. ║  │ upper left corner of the map and you use this command to move it to    │  ║
  126. ║  │ ther lower right corner, the camera will go through the map center.    │  ║
  127. ║  │ But when you have horizontal, vertical or both loops in your maps, it  │  ║
  128. ║  │ will go through the shortest path, which in the case of the above      │  ║
  129. ║  │ example, is a short movement in the upper left direction (to just      │  ║
  130. ║  │ cross the map border). When you call ms_pro_cam_center_at, you have to │  ║
  131. ║  │ add three "parameters" to it, those parameters are x (target x         │  ║
  132. ║  │ position) y (target y position) and frames (time that the movement     │  ║
  133. ║  │ must take)                                                             │  ║
  134. ║  │                                                                        │  ║
  135. ║  │ As an example, if you want the camera to center at x44 y44 and to do   │  ║
  136. ║  │ so in 6 seconds (360 frames at normal 60FPS rate), you should use:     │  ║
  137. ║  │                                                                        │  ║
  138. ║  │ ms_pro_cam_center_at(44, 44, 360)                                      │  ║
  139. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  140. ║  ┌───────────────────────────────────────┐                                   ║
  141. ║  │ ms_pro_cam_center_at_char(id, frames) │                                   ║
  142. ║  ├───────────────────────────────────────┴────────────────────────────────┐  ║
  143. ║  │ Similar as ms_pro_cam_center_at but instead of using an X and Y value, │  ║
  144. ║  │ uses an id of the character whose position is the target.              │  ║
  145. ║  │                                                                        │  ║
  146. ║  │ (*) What is "id"?                                                      │  ║
  147. ║  │ id is a number representing the character, -1 is for player, 0 for the │  ║
  148. ║  │ calling event and 1 and up for event id.                               │  ║
  149. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  150. ║  ┌──────────────────────────────────────────┐                                ║
  151. ║  │ ms_pro_cam_focus_on(id, can_cancel, key) │                                ║
  152. ║  ├──────────────────────────────────────────┴─────────────────────────────┐  ║
  153. ║  │ Tells the camera to follow the desired character as if it would        │  ║
  154. ║  │ normally do for the player. In other words, tells the system to stop   │  ║
  155. ║  │ following the player and start following the desired character         │  ║
  156. ║  │ (determined by the parameter "id")                                     │  ║
  157. ║  │                                                                        │  ║
  158. ║  │ (*) What is "id"?                                                      │  ║
  159. ║  │ id is a number representing the character, -1 is for player, 0 for the │  ║
  160. ║  │ calling event and 1 and up for event id.                               │  ║
  161. ║  │                                                                        │  ║
  162. ║  │ As an example, if you want to focus the camera on an event and its ID  │  ║
  163. ║  │ is 22, use: ms_pro_cam_focus_on(22)                                    │  ║
  164. ║  │                                                                        │  ║
  165. ║  │ And if you later want to center it back to the player:                 │  ║
  166. ║  │ ms_pro_cam_focus_on(-1)                                                │  ║
  167. ║  │                                                                        │  ║
  168. ║  │ (*) What is "can_cancel"?                                              │  ║
  169. ║  │ can_cancel is either true or false and it is not necessary to include  │  ║
  170. ║  │ it in the command call unless you want the player to be able to focus  │  ║
  171. ║  │ the camera back on the playing character by pressing a key. Default is │  ║
  172. ║  │ false.                                                                 │  ║
  173. ║  │                                                                        │  ║
  174. ║  │ (*) What is "key"?                                                     │  ║
  175. ║  │ key is the symbol that represents the aforementioned key. It is not    │  ║
  176. ║  │ necessary to include it. Check RPG Maker Ace's help file for all the   │  ║
  177. ║  │ Input keys supported by the program. Keep in mind that if you use a    │  ║
  178. ║  │ custom or expanded input module (script) you can use more keys.        │  ║
  179. ║  │ Default is :CTRL (CONTROL) key (always put a double colon before the   │  ║
  180. ║  │ name of the key).                                                      │  ║
  181. ║  │                                                                        │  ║
  182. ║  │ This are the keys supported by default in Ace:                         │  ║
  183. ║  │                                                                        │  ║
  184. ║  │ :DOWN :LEFT :RIGHT :UP (Arrow Keys)                                    │  ║
  185. ║  │ :A :B :C :X :Y :Z :L :R (These do no represent keyboard letters)       │  ║
  186. ║  │ :SHIFT :CTRL :ALT                                                      │  ║
  187. ║  │ :F5 :F6 :F7 :F8 :F9                                                    │  ║
  188. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  189. ║  ┌─────────────────────────────────────┐                                     ║
  190. ║  │ ms_pro_cam_character_on_screen?(id) │                                     ║
  191. ║  ├─────────────────────────────────────┴──────────────────────────────────┐  ║
  192. ║  │ Checks if character is visible on screen.                              │  ║
  193. ║  │                                                                        │  ║
  194. ║  │ This one is a slightly different than the others, since it will return │  ║
  195. ║  │ either true or false, you could use it in an Event Conditional Branch  │  ║
  196. ║  │ Command, fourth tab, last option (Script). You simply insert the       │  ║
  197. ║  │ command with the desired id that represents the character to check,    │  ║
  198. ║  │ and it will act as a normal conditional branch.                        │  ║
  199. ║  │                                                                        │  ║
  200. ║  │ Why would you want to use something like that? Imagine the player has  │  ║
  201. ║  │ to chase a thief down the street, you could center the camera at the   │  ║
  202. ║  │ running thief and tell the player to chase it closely or otherwise the │  ║
  203. ║  │ thief will run away. You can use this command to check if the player   │  ║
  204. ║  │ is "keeping up", if the player is not visible on screen, the thief     │  ║
  205. ║  │ escaped.                                                               │  ║
  206. ║  │                                                                        │  ║
  207. ║  │ This is just one example, you can use it for any mechanic that you can │  ║
  208. ║  │ think of.                                                              │  ║
  209. ║  │                                                                        │  ║
  210. ║  │ The "id" parameter works exactly like described above.                 │  ║
  211. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  212. ║  ┌──────────────────────┐                                                    ║
  213. ║  │ ms_pro_cam_reset_str │                                                    ║
  214. ║  ├──────────────────────┴─────────────────────────────────────────────────┐  ║
  215. ║  │ Sets the deceleration strength to the number defined in                │  ║
  216. ║  │ DECELERATION_VALUE.                                                    │  ║
  217. ║  │                                                                        │  ║
  218. ║  │ You can use this command to set back the deceleration strength to its  │  ║
  219. ║  │ default value. This affects only the "following" feature of the        │  ║
  220. ║  │ camera, like normal player focus/following and event focus/following.  │  ║
  221. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  222. ║  ┌───────────────────────┐                                                   ║
  223. ║  │ ms_pro_cam_str(value) │                                                   ║
  224. ║  ├───────────────────────┴────────────────────────────────────────────────┐  ║
  225. ║  │ Sets the deceleration strength to the desired value.                   │  ║
  226. ║  │                                                                        │  ║
  227. ║  │ This command sets the deceleration strength of the focus/following     │  ║
  228. ║  │ feature of the camera to any number you insert as the "value"          │  ║
  229. ║  │ parameter.                                                             │  ║
  230. ║  │                                                                        │  ║
  231. ║  │ Keep in mind that the lower the number, the faster the camera will     │  ║
  232. ║  │ focus/follow (1 will result in something similar to RPG Maker Ace's    │  ║
  233. ║  │ default) and the bigger the number, the stronger the deceleration and  │  ║
  234. ║  │ thus the slower the speed.                                             │  ║
  235. ║  │                                                                        │  ║
  236. ║  │ You can use ms_pro_cam_reset_str, described above, to reset back the   │  ║
  237. ║  │ strength to its default setting.                                       │  ║
  238. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  239. ║  ┌──────────────────────────────────────┐                                    ║
  240. ║  │ ms_pro_cam_ignore_player(true/false) │                                    ║
  241. ║  ├──────────────────────────────────────┴─────────────────────────────────┐  ║
  242. ║  │ If set to true, it won't follow the player, but it will scroll as      │  ║
  243. ║  │ usual when using scroll event commands or when using                   │  ║
  244. ║  │ ms_pro_cam_center_at.                                                  │  ║
  245. ║  │ If set to false, it will follow the player as usual when neeeded.      │  ║
  246. ║  │                                                                        │  ║
  247. ║  │ Why would you want to use it?                                          │  ║
  248. ║  │ In case you want to make some camera movement across the map without   │  ║
  249. ║  │ focusing on any particular character, and you don't want the camera to │  ║
  250. ║  │ jump back to the player as soon as the scrolling is finished and the   │  ║
  251. ║  │ player moves.                                                          │  ║
  252. ║  │                                                                        │  ║
  253. ║  │ By having this set to true (and thus "ignoring" the player) the camera │  ║
  254. ║  │ can be set still (it can be moving too) to any map location and it     │  ║
  255. ║  │ won't focus back on the player even if the player is moving.           │  ║
  256. ║  │                                                                        │  ║
  257. ║  │ Use true to ignore the player and false to acknowledge it back.        │  ║
  258. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  259. ║  ┌────────────────────────┐                                                  ║
  260. ║  │ ms_pro_cam_lock_camera │                                                  ║
  261. ║  ├────────────────────────┴───────────────────────────────────────────────┐  ║
  262. ║  │ Prevents the camera movement until ms_pro_cam_unlock_camera is called. │  ║
  263. ║  │                                                                        │  ║
  264. ║  │ This one is pretty simple, when you call it, the camera won't move     │  ║
  265. ║  │ anymore until you "unlock" it again. Nothing will move it, not even    │  ║
  266. ║  │ zombie vampires.                                                       │  ║
  267. ║  │                                                                        │  ║
  268. ║  │ Keep in mind that the player can still move freely and everything will │  ║
  269. ║  │ work as usual.                                                         │  ║
  270. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  271. ║  ┌──────────────────────────┐                                                ║
  272. ║  │ ms_pro_cam_unlock_camera │                                                ║
  273. ║  ├──────────────────────────┴─────────────────────────────────────────────┐  ║
  274. ║  │ Allows normal camera movement.                                         │  ║
  275. ║  │                                                                        │  ║
  276. ║  │ This one is to reverse the locking caused by the above command. The    │  ║
  277. ║  │ camera will "go back to life" and perform as usual.                    │  ║
  278. ║  └────────────────────────────────────────────────────────────────────────┘  ║
  279. ║                                                                              ║
  280. ╠══════════════════════════════════════════════════════════════════════════════╣
  281. ╠══════════════════════════════════════════════════════════════════════════════╣
  282. ║ 3. NOTES.                                                                  ▼ ║
  283. ╠══════════════════════════════════════════════════════════════════════════════╣
  284. ║                                                                              ║
  285. ║  Have fun and enjoy!                                                         ║
  286. ║                                                                              ║
  287. ╠══════════════════════════════════════════════════════════════════════════════╣
  288. ╠══════════════════════════════════════════════════════════════════════════════╣
  289. ║ 4. CONTACT.                                                                ▼ ║
  290. ╠══════════════════════════════════════════════════════════════════════════════╣
  291. ║                                                                              ║
  292. ║  Keep in touch with us and be the first to know about new releases:          ║
  293. ║                                                                              ║
  294. ║  www.rpgmakersource.com                                                      ║
  295. ║  www.facebook.com/RPGMakerSource                                             ║
  296. ║  www.twitter.com/RPGMakerSource                                              ║
  297. ║  www.youtube.com/user/RPGMakerSource                                         ║
  298. ║                                                                              ║
  299. ║  Get involved! Have an idea for a system? Let us know.                       ║
  300. ║                                                                              ║
  301. ║  Spread the word and help us reach more people so we can continue creating   ║
  302. ║  awesome resources for you!                                                  ║
  303. ║                                                                              ║
  304. ╚══════════════════════════════════════════════════════════════════════════════╝)
  305.  
  306. #==============================================================================
  307. # ** Maker Systems
  308. #------------------------------------------------------------------------------
  309. #  Module for our Systems.
  310. #==============================================================================
  311.  
  312. module MakerSystems
  313.  
  314.   #============================================================================
  315.   # ** Enhanced Camera
  316.   #----------------------------------------------------------------------------
  317.   #  Contains configurable values for the camera systems.
  318.   #============================================================================
  319.  
  320.   module EnhancedCamera
  321.    
  322.     #------------------------------------------------------------------------
  323.     # * Scrolling Deceleration Strength.                                [OPT]
  324.     #------------------------------------------------------------------------
  325.     DECELERATION_VALUE = 38
  326.    
  327.   end
  328.  
  329. end
  330.  
  331. #==============================================================================
  332. # ** Game_Interpreter
  333. #------------------------------------------------------------------------------
  334. #  Added methods to use in Script Call Event Command.
  335. #==============================================================================
  336.  
  337. class Game_Interpreter
  338.  
  339.   #--------------------------------------------------------------------------
  340.   # * Reset Deceleration Strength.                                      [NEW]
  341.   #--------------------------------------------------------------------------
  342.   def ms_pro_cam_reset_str
  343.     # Set camera deceleration strength back to default.
  344.     $game_map.ms_ecam_str =
  345.     MakerSystems::EnhancedCamera::DECELERATION_VALUE.to_f
  346.   end
  347.  
  348.   #--------------------------------------------------------------------------
  349.   # * Deceleration Strength.                                            [NEW]
  350.   #--------------------------------------------------------------------------
  351.   def ms_pro_cam_str(value)
  352.     # Set camera deceleration strength.
  353.     $game_map.ms_ecam_str = value.to_f
  354.   end
  355.  
  356.   #--------------------------------------------------------------------------
  357.   # * Ignore Player Toggle.                                             [NEW]
  358.   #--------------------------------------------------------------------------
  359.   def ms_pro_cam_ignore_player(value)
  360.     # Set ignore player flag.
  361.     $game_map.ms_ecam_ignore_player = value
  362.   end
  363.  
  364.   #--------------------------------------------------------------------------
  365.   # * Lock Camera.                                                      [NEW]
  366.   #--------------------------------------------------------------------------
  367.   def ms_pro_cam_lock_camera
  368.     # Turns on camera lock flag.
  369.     $game_map.ms_ecam_locked = true
  370.   end
  371.  
  372.   #--------------------------------------------------------------------------
  373.   # * Unlock Camera.                                                    [NEW]
  374.   #--------------------------------------------------------------------------
  375.   def ms_pro_cam_unlock_camera
  376.     # Turns off camera lock flag.
  377.     $game_map.ms_ecam_locked = false
  378.   end
  379.  
  380.   #--------------------------------------------------------------------------
  381.   # * Character on Screen?                                              [NEW]
  382.   #--------------------------------------------------------------------------
  383.   def ms_pro_cam_character_on_screen?(id)
  384.     # Get character based on provided number (id).
  385.     character = get_character(id)
  386.     # Inside screen boundaries?
  387.     character.screen_x > 0 && character.screen_x < Graphics.width &&
  388.     character.screen_y > 0 && character.screen_y < Graphics.height
  389.   end
  390.  
  391.   #--------------------------------------------------------------------------
  392.   # * Focus on Character.                                               [NEW]
  393.   #--------------------------------------------------------------------------
  394.   def ms_pro_cam_focus_on(id, can_cancel = false, key = :CTRL)
  395.     # Get character based on provided number (id).
  396.     character = get_character(id)
  397.     # Special handling if Player is the target.
  398.     if character.is_a?(Game_Player)
  399.       # Clears special character focus variable.
  400.       $game_map.ms_ecam_target        = nil
  401.       # Turns off ignore player flag.
  402.       $game_map.ms_ecam_ignore_player = false
  403.       # Moves camera back to player.
  404.       $game_map.ms_ecam_center(character.real_x, character.real_y)
  405.     else
  406.       # Sets camera target to its new target character.
  407.       $game_map.ms_ecam_target      = character
  408.       # Sets cancel focus flag.
  409.       $game_map.ms_ecam_cancel     = can_cancel
  410.       # Sets cancel focus key.
  411.       $game_map.ms_ecam_cancel_key = key
  412.     end
  413.   end
  414.  
  415.   #--------------------------------------------------------------------------
  416.   # * Wait for Scrolling.                                               [NEW]
  417.   #--------------------------------------------------------------------------
  418.   def ms_pro_cam_wait_for_scrolling
  419.     # Yield until scrolling is completed.
  420.     Fiber.yield while $game_map.scrolling? || $game_map.ms_ecam_iterations
  421.   end
  422.  
  423.   #--------------------------------------------------------------------------
  424.   # * Center Camera at Position.                                        [NEW]
  425.   #--------------------------------------------------------------------------
  426.   def ms_pro_cam_center_at(x, y, frames)
  427.     # Set camera location target.
  428.     $game_map.ms_ecam_go_to(x, y, frames)
  429.   end
  430.  
  431.   #--------------------------------------------------------------------------
  432.   # * Center Camera at Character.                                       [NEW]
  433.   #--------------------------------------------------------------------------
  434.   def ms_pro_cam_center_at_char(id, frames)
  435.     # Get character based on provided number (id).
  436.     character = get_character(id)
  437.     # Set camera location target.
  438.     $game_map.ms_ecam_go_to(character.x, character.y, frames)
  439.   end
  440.  
  441. end
  442.  
  443. #==============================================================================
  444. # ** Game_Map
  445. #------------------------------------------------------------------------------
  446. #  Edited update_scroll and initialize.
  447. #==============================================================================
  448.  
  449. class Game_Map
  450.  
  451.   #--------------------------------------------------------------------------
  452.   # * Public Instance Variables.                                        [NEW]
  453.   #--------------------------------------------------------------------------
  454.   attr_accessor :ms_ecam_target, :ms_ecam_iterations, :ms_ecam_str,
  455.                 :ms_ecam_ignore_player, :ms_ecam_locked, :ms_ecam_cancel,
  456.                 :ms_ecam_cancel_key, :ms_ecam_active
  457.                
  458.   #--------------------------------------------------------------------------
  459.   # * Alias Initialize.                                                 [NEW]
  460.   #--------------------------------------------------------------------------
  461.   alias_method(:ms_ecam_original_initialize, :initialize)
  462.  
  463.   #--------------------------------------------------------------------------
  464.   # * Initialize.                                                       [MOD]
  465.   #--------------------------------------------------------------------------
  466.   def initialize
  467.     # Original method.
  468.     ms_ecam_original_initialize
  469.     # Initializes deceleration strength.
  470.     @ms_ecam_str = MakerSystems::EnhancedCamera::DECELERATION_VALUE.to_f
  471.   end
  472.  
  473.   #--------------------------------------------------------------------------
  474.   # * Center Position.                                                  [NEW]
  475.   #--------------------------------------------------------------------------
  476.   def ms_ecam_center(target_real_x, target_real_y, hard = false)
  477.     # Target position, centered.
  478.     @ms_ecam_real_x = target_real_x - screen_tile_x / 2
  479.     @ms_ecam_real_y = target_real_y - screen_tile_y / 2
  480.     # Position correction for no horizontally looped maps.
  481.     unless loop_horizontal?
  482.       # Limit for the X axis.
  483.       limit_x  = width  - screen_tile_x
  484.       limit_x  = 0 if limit_x < 0
  485.       # Keeps target position inside correct boundaries.
  486.       @ms_ecam_real_x = 0       if @ms_ecam_real_x < 0
  487.       @ms_ecam_real_x = limit_x if @ms_ecam_real_x > limit_x
  488.     end
  489.     # Position correction for no vertically looped maps.
  490.     unless loop_vertical?
  491.       # Limit for the Y axis.
  492.       limit_y  = height - screen_tile_y
  493.       limit_y  = 0 if limit_y < 0
  494.       # Keeps target position inside correct boundaries.
  495.       @ms_ecam_real_y = 0       if @ms_ecam_real_y < 0
  496.       @ms_ecam_real_y = limit_y if @ms_ecam_real_y > limit_y
  497.     end
  498.     # Ensures correct target values in case of looping any axis.
  499.     @ms_ecam_real_x %= width
  500.     @ms_ecam_real_y %= height
  501.     # No smooth movement?
  502.     if hard
  503.       # Sets display position now, without any smooth deceleration effect.
  504.       @display_x = @ms_ecam_real_x
  505.       @display_y = @ms_ecam_real_y
  506.     end
  507.   end
  508.  
  509.   #--------------------------------------------------------------------------
  510.   # * Prepares Camera Target.                                           [NEW]
  511.   #--------------------------------------------------------------------------
  512.   def ms_ecam_go_to(target_x, target_y, period = 60.0)
  513.     # Prevents execution of any kind of camera movement if locked flag is on.
  514.     return if @ms_ecam_locked
  515.     # Sets correct target positions.
  516.     ms_ecam_center(target_x, target_y)
  517.     # Gets correct X distance.
  518.     @ms_ecam_x_amplitude = ms_ecam_correct_amplitude(@display_x,
  519.                                    @ms_ecam_real_x, width, loop_horizontal?)
  520.     # Gets correct Y distance.
  521.     @ms_ecam_y_amplitude = ms_ecam_correct_amplitude(@display_y,
  522.                                     @ms_ecam_real_y, height, loop_vertical?)
  523.     # Initializes iteration counter.
  524.     @ms_ecam_iterations = 0.0
  525.     # Saves the original, starting position.
  526.     @ms_ecam_x_original = @display_x
  527.     @ms_ecam_y_original = @display_y
  528.     # Sets period (time).
  529.     @ms_ecam_period = period.to_f
  530.   end
  531.  
  532.   #--------------------------------------------------------------------------
  533.   # * Correct Amplitude.                                                [NEW]
  534.   #--------------------------------------------------------------------------
  535.   def ms_ecam_correct_amplitude(current, target, limit, condition)
  536.     # Checks if looping in the desired axis.
  537.     if condition
  538.       # Returns shortest distance, crossing map borders if needed.
  539.       if ((target - current) % limit) < ((current - target) % limit)
  540.         (target - current) % limit
  541.       else
  542.         -((current - target) % limit)
  543.       end
  544.     else
  545.       # Returns normal distance.
  546.       target - current
  547.     end
  548.   end
  549.  
  550.   #--------------------------------------------------------------------------
  551.   # * Alias Update Scroll.                                              [NEW]
  552.   #--------------------------------------------------------------------------
  553.   alias_method(:ms_ecam_original_update_scroll, :update_scroll)
  554.  
  555.   #--------------------------------------------------------------------------
  556.   # * Update Scroll.                                                    [MOD]
  557.   #--------------------------------------------------------------------------
  558.   def update_scroll
  559.     # Default method only unless Enhanced Camera is active.
  560.     return ms_ecam_original_update_scroll unless @ms_ecam_str > 1
  561.     # Prevents execution of any kind of camera movement if locked flag is on.
  562.     return if @ms_ecam_locked
  563.     # If non player target for camera.
  564.     if @ms_ecam_target
  565.       # If can be cancelled by player input and the key is triggered.
  566.       if @ms_ecam_cancel && Input.trigger?(@ms_ecam_cancel_key)
  567.         # Clears target flag.
  568.         @ms_ecam_target = nil
  569.         # Moves camera back to player.
  570.         ms_ecam_center($game_player.real_x, $game_player.real_y)
  571.       else
  572.         # Centers camera on target.
  573.         ms_ecam_center(@ms_ecam_target.real_x, @ms_ecam_target.real_y, false)
  574.       end
  575.     end
  576.     # Iterations pending?
  577.     if @ms_ecam_iterations
  578.       # Calculates period.
  579.       period = (@ms_ecam_iterations / @ms_ecam_period) * 1.57
  580.       # Sets new display positions.
  581.       @display_x = @ms_ecam_x_original + @ms_ecam_x_amplitude * Math.sin(period)
  582.       @display_y = @ms_ecam_y_original + @ms_ecam_y_amplitude * Math.sin(period)
  583.       # Ensures correct display values.
  584.       @display_x %= $game_map.width
  585.       @display_y %= $game_map.height
  586.       # If target positions were reached.
  587.       if period == 1.57
  588.         # Sets target position flag off.
  589.         @ms_ecam_iterations = nil
  590.         # Updates target positions.
  591.         @ms_ecam_real_x = @display_x
  592.         @ms_ecam_real_y = @display_y
  593.       else
  594.         # Updates iteration count.
  595.         @ms_ecam_iterations += 1.0
  596.       end
  597.     else
  598.       # Camera being moved by event commands?
  599.       if scrolling?
  600.         # Target position is actual display position.
  601.         @ms_ecam_real_x = @display_x
  602.         @ms_ecam_real_y = @display_y
  603.       else
  604.         # Moves camera. Correct step value with deceleration effect. X Axis.
  605.         @display_x += ms_ecam_correct_amplitude(@display_x,
  606.         @ms_ecam_real_x, width, loop_horizontal?) / @ms_ecam_str
  607.         # Moves camera. Correct step value with deceleration effect. Y Axis.
  608.         @display_y += ms_ecam_correct_amplitude(@display_y,
  609.         @ms_ecam_real_y, height, loop_vertical?)  / @ms_ecam_str
  610.         # Keeps map display values inside correct boundaries.
  611.         @display_x %= width
  612.         @display_y %= height
  613.       end
  614.     end
  615.     # Original method.
  616.     ms_ecam_original_update_scroll
  617.   end
  618.  
  619. end
  620.  
  621. #==============================================================================
  622. # ** Game_Player
  623. #------------------------------------------------------------------------------
  624. #  Replaced update_scroll and center.
  625. #==============================================================================
  626.  
  627. class Game_Player < Game_Character
  628.  
  629.   #--------------------------------------------------------------------------
  630.   # * Alias Update Scroll.                                              [NEW]
  631.   #--------------------------------------------------------------------------
  632.   alias_method(:ms_ecam_original_update_scroll, :update_scroll)
  633.  
  634.   #--------------------------------------------------------------------------
  635.   # * Update Scroll.                                                    [MOD]
  636.   #--------------------------------------------------------------------------
  637.   def update_scroll(last_real_x, last_real_y)
  638.     # Check if Enhanced Camera is active.
  639.     if $game_map.ms_ecam_str > 1
  640.       # Check if it is good to go.
  641.       unless $game_map.ms_ecam_target || $game_map.ms_ecam_iterations ||
  642.              $game_map.ms_ecam_ignore_player || !moving?
  643.         # Updates the camera centering.
  644.         $game_map.ms_ecam_center(@real_x, @real_y)
  645.       end
  646.     else
  647.       # Not active? Then default method only.
  648.       ms_ecam_original_update_scroll(last_real_x, last_real_y)
  649.     end
  650.   end
  651.  
  652.   #--------------------------------------------------------------------------
  653.   # * Alias Center.                                                     [NEW]
  654.   #--------------------------------------------------------------------------
  655.   alias_method(:ms_ecam_original_center, :center)
  656.  
  657.   #--------------------------------------------------------------------------
  658.   # * Center.                                                           [MOD]
  659.   #--------------------------------------------------------------------------
  660.   def center(x, y)
  661.     # Check if Enhanced Camera is active.
  662.     if $game_map.ms_ecam_str > 1
  663.       # Don't center if the camera is anchored to its position.
  664.       return if $game_map.ms_ecam_locked
  665.       # Center camera display position at once.
  666.       $game_map.ms_ecam_center(x.to_f, y.to_f, true)
  667.     else
  668.       # Not active? Then default method only.
  669.       ms_ecam_original_center(x, y)
  670.     end
  671.   end
  672.  
  673. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top