Activity Feed

Bob423 published a Forum Topic in Forums / RPG Maker XP Requests


1 day ago     4 Comments     39 Views

Trying to make scarf

I was disappointed to find that none of the RTP sprites have scarves, but I noticed that part of Monster 11's cape kinda looks like a scarf.

After humanizing monster 11 and making it look like Polraudio dressed as his avatar (for my super secret project), I started trying to turn the cape into a scarf, which I want to put on a different sprite...I didn't get far.

scarf-17220.png

 

By the way, feel free to use this one:

[spoiler]

polraudio-dressed-as-his-avatar-17220.pn

[/spoiler]

The purple part of the top one is actually slightly darker than the RTP.

 

I was hoping someone would give it a try and see what they can do with it.

PrinceEndymion88 published a Forum Topic in Forums / Established Games


1 day ago     0 Comments     35 Views

Sailor Moon Another Story 2: Perfect Edition

Sailor Moon Another Story 2: Perfect Edition
2vtwkdu.png
Why Another Story 2?
This game is the (unofficial) sequel of the famous game "Sailor Moon Another Story" for Super Nintendo.
Why Perfect Edition?
'Cause I've already released a first version of the game in December 26, 2010.  The Perfect Edition is profoundly different than the first version. Maps completely recreated, scripts rewritten and a different story.
Storyline:
After the destruction of his planet, Nanna, a young boy, joins to the Queen Tiamat in her goal to destroy the Earth and Sailor Moon. The latter defeated the mad Apsu, Tiamat's sister, who now seeks revenge.
Nanna and Tiamat will be flanked by 5 young warriors, originating from a different reality. They are:
ningal.png
Ningal: counterpart of Sailor Moon. For her Nanna is like a brother. Her powers are based on the darkness.
nammu.png
Nammu: counterpart of Sailor Mercury . Her powers are based on the water.
ereshkigal.png
Ereshkigal: counterpart of Sailor Mars. Her powers are based on the fire.
ashnan.png
Ashnan: counterpart of Sailor Jupiter. Her powers are based on electricity.
ashnan.png
Belili: counterpart of Sailor Venus. Even her powers are based on the darkness.

The five girls, however, hide a secret. Their revenge is different than that of Tiamat but they also, blinded by hate, want to destroy Sailor Moon and the others Sailor Senshi.

But how can they defeat Sailor Moon and her friends? It's simple.
They'll do revive to Sailor Moon her worst nightmares, hurling against her some of her most powerful enemies already addressed in the past.

To complicate matters there will be the P-Crystal, created by Nanna, who, with its mysterious power will make life difficult for Sailor Moon.

Characters (Playable):
[spoiler]
Actor_Sailor%20Moon.png
Sailor Moon:  an underachieving schoolgirl who lives in Tokyo. She meets Luna who is searching for the Moon Princess. Luna discovers that she is destined to save Earth from the forces of evil and gives her a broach to transform into Sailor Moon, and asks her to form the Sailor Senshi, find their princess and protect the "Legendary Silver Crystal." As Usagi matures, she becomes one of the universe's powerful warriors and protects her adopted home planet, Earth, from villains who wish to harm it. Usagi is depicted as carefree and cheerful when at ease but quickly serious and strategic-minded when fighting.
Actor_Sailor%20Mercury.png
Sailor Mercury: is the first Sailor Senshi to be discovered by Sailor Moon, and serves as the "brains" of the group. She possesses powers associated with water, is highly intelligent, and can use a supercomputer to collect information on various battle factors.
Actor_Sailor%20Mars.png
Sailor Mars: is the second Sailor Senshi to be discovered by Usagi and the secondary leader of the Sailor Senshi after Minako Aino. She possesses powers associated with fire, as well as psychic and spiritual ones.
Actor_Sailor%20Jupiter.png
Sailor Jupiter: is the third Sailor Senshi to be discovered by Usagi Tsukino, and serves as the "muscles" of the group. She possesses powers associated with electricity and plants, and superhuman strength.
Actor_Sailor%20Venus.png
Sailor Venus: she is the leader of the Sailor Senshi. She possesses powers associated with love and beauty.
Actor_Sailor%20Pluto.png
Sailor Pluto: she is the soldier who guards the gates of time.
Actor_Sailor%20Chibi-Moon.png
Sailor Chibi-Moon: she is the daughter of Sailor Moon from the future. Her real name is the same as her mother's, but is called Chibi-Usa (Little Usagi).
Actor_Sailor%20Neptune.png
Sailor Neptune: she is elegant, sophisticated, capable of sharp anger, occasionally cold, and fully dedicated to her duty as a Sailor Senshi. She possesses powers associated with the sea, precognitive ones, and various others granted by a mirror.
Actor_Sailor%20Uranus.png
Sailor Uranus: she fights alongside her partner and lover Sailor Neptune. She possesses powers associated with the sky, precognition, and sword combat.
Actor_Sailor%20Saturn.png
Sailor Saturn: she possesses powers associated with destruction, death, and rebirth; she has the ability to annihilate a planet and even an entire star system, as well as resetting the evolution of the same to zero.
Actor_Sailor%20Star%20Maker.png
Sailor Star Maker: is the most intellectual member of the Sailor Starlights.
Actor_Sailor%20Star%20Fighter.png
Sailor Star Fighter: is the leader of the Sailor Starlights. She is arrogant and tends to be, at least on the surface, confident in her own abilities.
Actor_Sailor%20Star%20Healer.png
Sailor Star Healer: is a lonely person who does not like to socialize or do sports.
Actor_Sailor%20Star%20Kakyuu.png
Sailor Star Kakyuu: she is the Princess of planet Kinmoku, destroyed by the hand of Sailor Galaxia.
Actor_Sailor%20Pallas.png
Sailor Pallas:  one of the four protectors of Chibi-Usa. Childlike member of the Quartet.
Actor_Sailor%20Vesta.png
Sailor Vesta:  one of the four protectors of Chibi-Usa. She is loud, brash, and somewhat violent.
Actor_Sailor%20Juno.png
Sailor Juno:  one of the four protectors of Chibi-Usa. She is athletic and somewhat impulsive.
Actor_Sailor%20Ceres.png
Sailor Ceres: the leader of the four protectors of Chibi-Usa. She can manipulate flowers.[/spoiler]

Difference with the first version of the game:
[spoiler]Language:
-You can select between english or italian language, every time the game start.


Battle System:
-The system now remembers the last selection in the battle system so if, for example, in the last round or in the last battle the last choice was "Magic" the cursor will automatically be placed on that choice, just like Sailor Moon Another Story.
-Graphics changed: new battlebacks, new graphics selection, new graphics of enemies and improved animations.
-Formation: Now every formation(SHOOT, ARROW, VICTORY or CLUSTER), in addition to enabling the special attack selectable according to the choice of the formation, will increase of 5% some statistics, different for each formation.

Title Screen:
-The opening scene now is totally different from that of the first version of the game. Thanks to StarSeed86 for allowing me to use her Princess Serenity.
Now from the scene of the title, you can also open the game's website.

Menu of the game:
-Now the game menu is divided into several sections.
-You can equip every Sailor Senshi with 3 weapons / armor / items.
-The "Magic" menu is now divided into "Magic" and "Link Tech", so as not to mix them all together.
-The "Items" menu is now divided into "Items" and "Rare Items".
-Now there is also a Puzzle completable finding the pieces scattered throughout the game.
-The "Settings" menu has been redesigned and has been also added a menu to exit the game or enable Full Sceen or Windowed vision.
-Graphics totally recreated
-Party and formation menu improved.

Game:
- Added "Story of Usagi" mode, for those unfamiliar with the story of Sailor Moon.
- New Storyline and new (and old) enemies.
- Improved graphics and environments and in some cases totally recreated.
- New environments
- Enabled the train and bus to move around Tokyo.
- Shop modified[/spoiler]

Screenshots:
[spoiler]
2nurgqc.png
2s1ruzc.png
25pp9fo.png
6qcdgy.png
2viihd3.png
29vfk1i.png
[/spoiler]
Other screenshots are avaible here: http://sailormoonanotherstory2.altervista.org/screenshots.php

Demo:
Demo avaible from here: http://sailormoonanotherstory2.altervista.org/demo_en.php

Full Game:
You can download the old version of the game (released in the far 2010) here: http://sailormoonanotherstory2.altervista.org/fullgame.php
I'll post the full Perfect Edition when it'll be completed. Be patient and wait :D

Credits:
I want to say "THANKS" to all the people who helped me with the game. I've credited you in the game!!!

Tell me any problem, also relating to translations.

cdaz published a Forum Topic in Forums / RPG Maker XP Support


1 day ago     0 Comments     24 Views

Is there any way to remapping default key input.

I know there are Script to make you can bush every keyboard button but that's not I need(at least not now).

All I want just remaping key control just like when we push F1 but I want to set it default key . Player don't need to waste they time to messing with it by themself.

For example player download my game and they can push A on Xbox360 Pad to take action ,push B to cancle and push Y to Open menu like every modern JRPG.

And player not to setting it by themself they just open the game and have fun with that setting.

Is there any way to do this or I really need to capture the best key setting and tell player to set after me by themself?

I try to search in default Script found a lot of calling to use input::X but can't find any line that said how input::X work.

Ardaceus published a Forum Topic in Forums / Feedback, Bug Report and Forum Help


1 day ago     8 Comments     44 Views

Errors and Ideas for GDU

I've noticed a few errors on this website that makes things harder to do, so I decided to create this post to put all the errors I've found on this website that restrict certain things. And while I'm at this, I also want to post some ideas for the website that someone could do to make things better and easier for new people.

 

Problems

1. I've said it a few times, but being able to set a gif as your picture doesn't work, and I really would like to set a gif as my picture.

2. There is a blog section that nobody uses. Because it is under a tab nobody really knows exists. And in the list tab, it shows nothing.

3. We still have that arcade that has the high score boards broken. I've broken a few records and they don't appear, and it is really pointless as of now.

4. I made a tutorial on VX Ace, but the announcement that I made a tutorial didn't appear in the latest banner.

5. It is super annoying to delete things in the manager, because THERE IS NO MASS DELETE!!!

6. In the chat, when sharing videos, the videos take up too much of the chat, and it crowds it... Talking to a few people who like spamming videos...

7. This site doesn't work on mobile.

8. What the bloody hell does this button do? rss-28418.png

9. What is the point of becoming a friend with someone? Is there any benefits?

10. Try making a new account and see how fun that is. It took me 3 days to make an account on this website. For it didn't register me right (at least it's better than the RPG Maker Forums which blocked me out completely).

11. I see that you can become a subscriber and/or a Legend(?) on this site, but no real indication on what someone needs to do to become one of those, or what being one means.

12. Why can't I delete my own quotes, or access what I made? And it seriously needs to be revamped, but that's for the Ideas section.

13. The logo in the game page creator won't upload, and will always use your page banner.

14. You mention a layout feature for the character profiles section... how long ago did you mention Coming Soon?

15. pro-28418.png

16. Why do we still have games on the game page that are left to rot alone amidst other games or were discontinued?

 

Ideas

1. A YouTube Channel for people here on GDU.

2. Some sort of Teamspeak Server.

3. Reopen the shops.

4. Fix all the issues above there.

6. An "Explore the World" page on Game Pages.

7. Have community events where we all show up at once and discuss matters like these, or to discuss games on the game pages, or to mange collabs on the YouTube channel or something. Or for challenges that award GDUpoints to the winner.

8. Realize I skipped 5 and slap yourself in the face because you didn't realize that.

9. A page that features all of a person's work, like drawings, sprites, scripts, games, or even the fun things like written stories (fanfics or whatever), quotes, polls/questions, an area like that! Though I think I'm asking too much of Marked at this point :|

10. Allow people to donate to GDU through patreon or by PayPal or something.

11. I still don't know what most buttons do in this editor I'm using to type this out. Like what does this do? 

[sharedmedia=gallery:images:5397]
Okay, that shares files you've uploaded... and what does this do? OmWhDidn'I know that was a thing?
 
Or how about 

 

I found out that this Quote system exists, but I have no idea why I would ever use it. Thanks whoever made this editor. Because now I can take up more space than I really need to because I don't know which button makes the spoiler button which packs in a bunch of text that people don't want to see. ~ Ardaceus 2015

Also, for the first month, I had no clue where anything was, and I was like a Runner in the maze, mapping out every single thing and finding where to locate each section... Like I still have troubles getting to the userpages of other people because I have to find their logo and name on this website to go there.

 

So what I'm saying is that someone needs to write a full detailed instruction manual on how things in GDU work, like how to use the chat most effectively, making use of all it's features, how to utilize the topic editor fully, because I still have no clue what half of those buttons do up there, and for how to traverse the site. Please somebody make a Bomarkedio's Guide to the GalaxyDimensionUniverse. I'm slowly dying after making that not so hilarious pun.

 

 

Also don't think that I'm attacking this website for being terrible, if this really was a terrible site, I don't think I would still be here, unlike every other site which I have left at some point or another because of bad people on the site, or the site completely failed in every aspect at some point.

 

So if anyone else has suggestions to ideas for the site, or notices any errors, don't post below, go and bug the living Illuminati out of a certain person called Roochu, because the ghost says so. If you go bug Roochu, I will not haunt you, I will not spook you, and I we will be having our jolly day. But if you post below, I will haunt you, I will spook you... and I will give you cake... Just remember that a certain meme will make you think twice about that pastry though.

 

Ardi out.

tlbearer published a Forum Topic in Forums / RPG Maker VX Ace Requests


1 day ago     0 Comments     28 Views

In need of a title screen

I am in need of a title screen and an icon/logo for the game I'm working on, Of Man and Machine. I will provide the link to the forum so you can get a feel for the game. The game takes place in the south part of the continent where it is desert, and dieing/dead forests, some mountains and such. The game takes place about 100 yrs after the war. If you have any questions about the game just post here or PM me.

 

Link:

 

http://www.gdunlimited.net/forums/topic/11430-of-man-and-machine/

 

 

kaboth published a Forum Topic in Forums / RPG Maker VX Ace Requests


2 days ago     2 Comments     39 Views

request boar sprite

I like to request a boar sprite for my project, thanks.

James Anthony Hyatt published a Game in Games / RPG Maker VX Ace


3 days ago     1 Comments     50 Views

SWAT Kitty-The Prelude


Storyline


*Ques deep dramatic voice*

In a world where a random Kitty decides to try out for the SWAT team ,will it have what it take to pass the test??? In this short timed game you will face off against multiple enemies in an attempt to pass the Qualification test for the Swat team. You will chase them across multiple maps, in houses and out of houses, all the while avoiding the cars ….cause you know you are a kitty , and cars kill kitties.

This game is a fun little test basically to see how the system are working together for a larger game i plan on doing that is about the kitty from this game in a much larger world battling the bad guys as a member of swat.

Features


  • On map Combat
  • A timer
  • The ability to jump
  • A hidden Boss Battle
  • A cute and fun challenging little game




*The DL that is provided is with out the RTP..again the RTP is need to be installed to play this game Download from here if you need it :

http://www.rpgmakerw...n-time-packages




*it has been brought to my attention that there is a possibility of a glitch with the Combat system , where you will get a script error, just close the game and reopen it , it should fix it just fine, or so i have been told. as of yet i have been unable to duplicate the error on my end.



SWAT Kitty Credits:

First and foremost, I want to Thank the RPG Maker Skype Group, the game was conceptualized and loads of help given in that group , great group if you havent joined it you might want to
you can find information about the group on RPGMAKERVXACE.net and http://forums.rpgmakerweb.com/




Graphics:
Enterbrain-Base RTP Stuff
Jason Perry-Old School Modern 1 and 2 DLC
James Hyatt/Argotz -Title Graphics

Scripts:
Khas ArcThunder (SAS v4)
MOG Hunter (Animated Title Screen)
Nicke (Varable Hud)
Galv (Galv's Jump Abilty)

Sound Effects/Music:
Mandraw -Dungeon_-_Maximum_Security
Mandraw -Dungeon_-_Wrong_Way_Street
Enterbrain-Default RTP Stuff

Game Conceptualization/s:
James Hyatt/Argotz
Lord Squirrel
Chibievil


If i have missed anyone please let me know and i will add your name to the list.

Yvy published a Development Blog Post in Games / RPG Maker VX Ace / Digimon World Ace: The Lost Symbols / Blog


3 days ago     2 Comments     26 Views

So Long, And Thanks!

Hello, everyone.
I don't have good news today. I just found out that my health is plummeting and a possible disease is emerging. Now, I'll have to stop my life to start the treatment. Due to this, I'll be unable to work on this project for undefined time. So, I'm putting it on Hiatus.

Sorry for this. I never wanted this to happen, but it caught me by surprise. I really wish I could continue working on this for the time being, but the treatment will render me unable to. I won't be able to deliver the promised second demo, at least for now. I won't even be able to surf on the web, to be honest.

I'd like to thank everyone who's been suporting this project, either by sharing it, by doing videos or even with simple comments and feedback. That means a lot to me. I hope I can return to finish it someday. I have great things planned and I don't intend on stopping.

Goodbye for now,
Yvy

kaboth published a Forum Topic in Forums / Resource Showcase & Critique


4 days ago     2 Comments     65 Views

PandaMaru resources

Didn't know where to put this so move it if needed. These are NOT made by me I just found these browsing the web.

 

https://translate.google.com/translate?hl=en&sl=de&u=http://maruresources.lonewolflab.com/%3Fpage_id%3D1401&prev=search

Tomo2000 published a Forum Topic in Forums / RPG Maker XP Support


4 days ago     0 Comments     20 Views

I Must Be Missing Something Simple

Meddling with C++ and Java lately for university has really been screwing with my general ability to RGSS, but I digress. This is nowhere near the final version but I simply want a script where, in a script section of an event, I can initialize it and then do something like "if @citizens.isInfected == true". I'm sure I must be doing something simple wrong but I have no idea why. Thanks guys.

class Citizens
  attr_accessor   :infected
 
  def initialize
    @citizen_id = 0
    @infected = false
  end
 
  def isInfected
    if @infected == true
      return true
    else
      return false
    end
  end

  def getInfected
    @infected = true
  end
end

Gaudete published a Forum Topic in Forums / RPG Maker XP Support


4 days ago     2 Comments     42 Views

Help with MPs Daily Life needed + Issue with Multiple Massage Windows

Hey together,
I want to use Moonpearls Daily Life script, but I have several issues using it. Maybe we have here some Pros who understand what MP did in her script ;) Since you need multiple scripts to bring this to work I won't upload them here, but it's also here on this site ;) http://www.gdunlimited.net/scripts/rpg-maker-xp/environment-and-field-scripts/moonpearl-s-daily-life-1-time-and-lighting
I copied scripts and the resources from her Demo to my project, but now I have a problem with Wachugas Multiple Massage Window-Script, added in the spoiler below.

When I start my game I get following error: Script 'MMW - Heretic Version' line 3404: RGSSError occurred.

disposed window

Is someone able to help me with that?

[spoiler]

[rgss]#-----------------------------------------
#--- ---
#--- Multiple Message Windows ---
#------- HERETIC REVISION ------------
#------- Version 1.55 ------------
#------- ------------
#-----------------------------------------
#
# NO LONGER REQUIRES SDK. It will work fine with or without the SDK now!
#
# *NOTE* - This script should go ABOVE the CATERPILLAR SCRIPT
#
#
#
#==============================================================================
# ** Multiple Message Windows (SDK and Non SDK Bundle!)
#------------------------------------------------------------------------------
# Wachunga
# 1.5
# 2006-11-17
#==============================================================================

=begin


Version History: (Heretic)
1.55
- Removed SDK Dependancy
- Script will work either WITH or WITHOUT the SDK now automatically
* NOTE: Different methods are defined and replaced depending on whether
or not the SDK is installed or not.

1.54
- Added Option for Variable Text with \v[Tn]
$game_system.mmw_text[0] = "Hello World!"
In the "Show Text..." box, put in \v[T0] to display Hello World!

- Added Player Sticky

This means that Event and Player Message Stickyness are now independant.
When the player moves around, I tried to reposition the Message Bubble to
maximize player visibility by placing the Message Bubble out of where I
think they are intending to go. For example, when the player presses
Right, the Players Character faces to the Right, so in order to make sure
the Player can see where they are trying to go, the Message Bubble is
repositioned to the left of the Players Character.

Repositioning can cause some issues with making some Messages off screen
and unable to be read. In order to work around this, Sticky was added to
favor the Top and Bottom positions. A Sticky Message can start anywhere,
but once it is moved, it will try to stick to the Top or the Bottom because
position on the Left and Right causes some long messages to go offscreen
and become unreadable.

That is what Sticky means.

- $game_player.sticky is set to FALSE by Default, and will RESET to FALSE
at the end of Event Execution.

- Added Windowskin as a Saved Variable. That way if you walk away from
a sign that has a different Windowskin, that Windowskin will also be
reset when you walk away from a sign before the Event complets its list
of commands to execute.

- Fixed a Visual Bug where a Non Floating Message Window would change
the Windowskin while fading out. Redefined Window_Base update to
fix this bug.

- Changed set_max_dist to allow a Zero Distance. This is useful for
Passable Events.

- Fixed some Visual Glitches caused by other features I added becoming
read in characters in version 1.04 of the engine. 1.02 seems to
work just fine and caused me to miss these.

- Fixed a bug with set_max_dist(N). Cutscenes where the Player is moved
around by Event Commands would cause Event to stop executing. Changed
to require move_during to be True and $game_player.move_route_forcing
to be False for Message Windows to automatically close. So if you
set message.move_during = false, a Cutscene is assumed and Windows
will not be closed.

1.53 (Heretic)

- Added SOUNDS while text is printing out. Think Banjo Kazooie

What you NEED to know: When an Event has finished its commands, or if
you walk away from it, your Sound Settings will RESET. This is intentional.
It was implemented to save you work. Although it is quite possible to do,
the way a non scripter would end up trying to do this would be tremendous.
Thus, I did it for you.

There are several things you should know about SOUNDS.

#1 - Sound does NOT play for every single character. It plays a sound every
several characters. Im not psychic, so I dont know what sound you will
be using, if any at all. Because of this, the duration of that sound might
be different than some of the samples I've included. As a result, you may
decide that it sounds better to play your sound every character or every 5
characters. Thus, it is totally optional. The option is called
message.sound_frequency

#2 - It only plays sounds for Letters and Numbers, so non alphanumeric
characters do not play sounds. This includes spaces, and special characters
used for any of the message script options. This is just something that I
thought you should be aware of.

#3 - The Audio File you use needs to be imported into Sound Effects, under
Materialbase -> Audio/SE (its the one at the very bottom of the list).
I ran into a couple of files that caused both the editor and the game to
crash when I tried to play them, so you may need to convert problematic
audio files to a different format.

Several of the files I've imported I got from FlashKit.com. Not all of
these files were compatible. Other than that, it does have a good selection
of royalty free sound files.

http://www.flashkit.com/soundfx/

I considered setting up sound properties for each event and NPC, but decided
to pass on that because it caused more problems than it appeared to solve.
Also being considered are options to change the sound properties from within
the text itself. The same way as you can make characters bold, delay, or
other features already built into the script. If there is interest, I will
put them in, but for now, once a window starts to display its text, there
arent any options to change it until the next message window is displayed.

----- SOUND OPTIONS -----

These can be changed at any time with scripts.

message.sound = true / false # Enables or Disables Text Sounds
message.sound_audio = '001-System01' # Audio SE (in DB) to play
message.sound_volume = 80 # Text Sound Volume
message.sound_pitch = 80 # Text Sound Pitch
message.sound_pitch_range = 20 # How Much to vary the Pitch
message.sound_vary_pitch = true # Whether to Vary the Pitch or not
message.sound_frequency = 2 # Plays a sound this many letters


1.52 (Heretic)

- Added ability to "Auto Close" Non Floating Messages based on proximity
to the triggered event. You'll have to set a script for Every Event
you want this to occur on.
"set_max_dist(n)" where n the Distance in Steps. One is Minimum.

Notes: set_max_dist will SAVE all of your MMW settings, and in the
event that the event execution is terminated early, it will restore
these settings you originally had. This is done automatically in
order to prevent you from having to do unnecessary work. I find
it was most useful for Signs where you might set message.floating = false
which would have resulted in you needing to put in floating = true
for every other event. It just saves you work. SO if you do want
to have a more permanent adjustment to your MMW settings, call them
BEFORE you call "set_max_dist(n)"

If you expect the event to play out in its entirety, consider
using message.move_during = false. This is intended to allow the event
to NOT COMPLETE all the entries in an event by allowing the player to
walk away and close the window.

- Added the ability to "flip" a Message Bubble (non floating) on NPC Turn.

This was done to allow the player to see where they are going. When
the player moves around, they need to be able to see where they are
going, and a Message Bubble can sometimes get in their way. I also
set it up so that once an NPC is moved (not turned), this feature
turns itself off because it assumes a Cutscene.

This requires several things to work.
#1: reposition_on_turn is enabled (message.reposition_on_turn = true)
#2: NPC is set to turn_toward_player(repeat)
#3: NPC has NOT been moved (there are ways around this)
#4: Message Window is Auto Oriented using \$ or \%

If you feel like re-enabling this feature after an NPC has been
moved, you can use a Move Route Script @allow_flip = true for
that NPC.

- Added the Auto Flipping Message Windows to be "Sticky"

What this means is that when a Message Window is repositioned, the
next window will appear in the same location as the previous window.

Change it with message.sticky = true / false

1.51b

- Added \G+ and \G- to allow Gold Window to be at the Top or Bottom
of the screen. \G can still be used. It just positions opposite
of where the player is at. Just a bit more control over the
position of the Gold Window.

1.51a

- By Request, added the \F* option to put the "Other Foot Forward"

1.51

- Added \* option to display next message at ANY time

- Added \$ and \$ options to Auto Orient Message Bubbles relative to
the direction the Speaker is facing.

- Added "Foot Forward" commands available with \F+ and \F-

- Added automatic features to reset a Speaking NPC to its original Stance
and make it Continue its Move Route.

*NOTE* - The links provided in the comments may be out of date.

This custom message system adds numerous features on top of the default
message system, the most notable being the ability to have multiple message
windows open at once. The included features are mostly themed around turning
messages into speech (and thought) balloons, but default-style messages are
of course still possible.

Note:
This version of the script uses the SDK, available from:
http://www.rmxp.org/forums/showthread.php?t=1802

FEATURES

New in 1.5:
* \C[#ffffff] for hexadecimal color
* \C for return to default color
* display name of item, weapon, armor or skill
* \N[In] = display name of item with id n (note the "I")
* \N[Wn] = display name of weapon with id n (note the "W")
* \N[An] = display name of armor with id n (note the "A")
* \N[Sn] = display name of skill with id n (note the "S")
* display icon of item, weapon, armor or skill
* \I[In] = display icon of item with id n (note the "I")
* \I[Wn] = display icon of weapon with id n (note the "W")
* \I[An] = display icon of armor with id n (note the "A")
* \I[Sn] = display icon of skill with id n (note the "S")
* display icon and name of item, weapon, armor or skill
* \I&N[In] = display icon and name of item with id n (note the "I")
* \I&N[Wn] = display icon and name of weapon with id n (note the "W")
* \I&N[An] = display icon and name of armor with id n (note the "A")
* \I&N[Sn] = display icon and name of skill with id n (note the "S")
* new windowskins available
* speech windowskin now definable separately from default windowskin
* fixed bold bug where degree sign would occasionally appear
* input number window now shares parent window's font
* changed \Var[n] back to default of \V[n]

New in 1.1:
* message.autocenter for automatically centering text within messages
* \N[en] for displaying name of enemy with id n (note the "e")
* \MAP for displaying the name of the current map

At a glance:
* multiple message windows
* speech balloons
* position over player/event (follows movement and scrolling)
* optional message tail (for speech or thought balloons)
* can specify location relative to player/event (up, down, left, right)
* thought balloons
* can use different windowskin, message tail and font color
* letter-by-letter mode
* variable speed (and delays)
* skippable on button press
* autoresize messages
* player movement allowed during messages
* if speaker moves offscreen, message closes (like ChronoTrigger)
* everything also works during battle
* settings configurable at anytime

Full list of options:

(Note that all are case *insensitive*.)

=============================================================================
Local (specified in message itself and resets at message end)
=============================================================================
- \L = letter-by-letter mode toggle
- \A = auto-pause mode toggle for ,.?! characters
- \S[n] = set speed at which text appears in letter-by-letter mode
- \D[n] = set delay (in frames) before next text appears
- \P[n] = position message over event with id n
* use n=0 for player
* in battle, use n=a,b,c,d for actors (e.g. \P[a] for first actor)
and n=1,...,n for enemies (e.g. \P[1] for first enemy)
where order is actually the reverse of troop order (in database)
- \P[Cn] = Tie-In with Caterpillar. Positions Message over Cat Actor
in n Position of Caterpillar. 1 for First Cat Actor, etc...
* example: \P[C2] for 2nd Cat Actor, or 3rd Actor in Caterpillar
* n excludes Player
- \P = position message over current event (default for floating messages)
- \^ = message appears directly over its event
- \v = message appears directly below its event
- \< = message appears directly to the left of its event
- \> = message appears directly to the right of its event
- \$ = message appears above actor unless facing up, then appears below
- \% = message appears behind actor relative to direction
- \B = bold text
- \I = italic text
- \C[#xxxxxx] = change to color specified by hexadecimal (eg. ffffff = white)
- \C = change color back to default
- \! = message autoclose
- \? = wait for user input before continuing
- \+ = make message appear at same time as preceding one
* note: must be at the start of message to work
- \* = displays the next message immediately if available
* note: next event command must be text, choice, or number input
- \@ = thought balloon
- \N[En] = display name of enemy with id n (note the "E")
- \N[In] = display name of item with id n (note the "I")
- \N[Wn] = display name of weapon with id n (note the "W")
- \N[An] = display name of armor with id n (note the "A")
- \N[Sn] = display name of skill with id n (note the "S")
- \I[In] = display icon of item with id n (note the "I")
- \I[Wn] = display icon of weapon with id n (note the "W")
- \I[An] = display icon of armor with id n (note the "A")
- \I[Sn] = display icon of skill with id n (note the "S")
- \I&N[In] = display icon and name of item with id n (note the "I")
- \I&N[Wn] = display icon and name of weapon with id n (note the "W")
- \I&N[An] = display icon and name of armor with id n (note the "A")
- \I&N[Sn] = display icon and name of skill with id n (note the "S")
- \MAP = display the name of the current map

* Foot Forward Notes * - Sprite Sheets only have 16 total Frames of Animation
and of which, 4 are duplicates. Foot Forward Options allow access to
ALL of the frames of animation available in Default Sprite Sheets.

- \F+ = character puts their Foot Forward
- \F* = character puts their Other Foot Forward
- \F- = character resets their Foot Forward

*NOTE* - Foot Forward Animation will RESET if the event is moved off screen.
- Change @auto_ff_reset if this feature causes you trouble with
character animations.

It also ONLY works with the following conditions
- Direction Fix is OFF
- Move Animation is ON
- Stop Animation is OFF (technically thats Step, they typo'd)
- @auto_ff_reset is TRUE
- * These settings are the DEFAULT when a New Event is created

You can disable the "Auto Foot Forward Off" feature by adding \no_ff
to an Event's Name. IE: Bill\no_ff

---- Resets ----

These occur when the player walks away from a Speaking NPC

Put these strings in an Event's Name to use!

\no_ff - If you don't want a specific event to be RESET, you can add
\no_ff to the Event's Name. EV041\no_ff and Event will
not be affected by Foot Forward Reset when Player Walks off screen

\no_mc - No Move Continue - In the event you dont want a specific event to
continue its Move Route from where it left off when it is moved
off-screen, put \no_mc in the Event's Name. I.E. EV12\no_mc

These are, of course, in addition to the default options:
- \V[n] = display value of variable n
- \V[Tn] = display value of text variable n
- \N[n] = display name of actor with id n
- \C[n] = change color to n
- \G = display gold window - Screen Opposite of Player's Position
- \G+ = display gold window at the Top of the Screen
- \G- = display gold window at the Bottom of the Screen
- \\ = show the '\' character

=============================================================================
Global (specified below or by Call Script and persist until changed)
=============================================================================
Miscellaneous:
- message.move_during = true/false
* allow/disallow player to move during messages
- message.show_pause = true/false
* show/hide "waiting for player" pause graphic
- message.autocenter = true/false
* enable/disable automatically centering text within messages
- message.auto_comma_pause = true/false
* inserts a delay before the next character after these characters ,!.?
* expects correct punctuation. One space after a comma, the rest 2 spaces
- message.auto_comma_delay = n
* changes how long to wait after a pausable character
- message.auto_ff_reset = true/false
* resets a Foot Forward stance if a message wnidow is closed for off-screen
* set to false if it causes animation problems, or, dont use Foot Forward
on a specific NPC or Event
- message.auto_move_continue = true/false
* when moving an event off screen while speaking, resets previous move route
- message.dist_exit = true/false
* close messages if the player walks too far away
- message.dist_max = n
* the distance away from the player before windows close
- message.reposition_on_turn = true / false
* Repeat Turn Toward Player NPC's Reorient Message Windows if they Turn
- message.sticky
* If Message was Repositioned, next message will go to that Location

Auto Repositioning Message Windows
- Cannot be Player
- NPC MUST have some form of Repeating Turn, usually toward Player
- NPC MUST NOT MOVE. Turning is Fine, but cant MOVE

- set_max_dist(n)
* Useful for allowing player to walk away from signs
* Saves your MMW Config in case of a Walk-Away Closure
* call from Event Editor => Scripts

Speech/thought balloon related:
- message.resize = true/false
* enable/disable automatic resizing of messages (only as big as necessary)
- message.floating = true/false
* enable/disable positioning messages above current event by default
(i.e. equivalent to including \P in every message)
- message.location = TOP, BOTTOM, LEFT or RIGHT
* set default location for floating messages relative to their event
- message.show_tail = true/false
* show/hide message tail for speech/thought balloons

Letter-by-letter related:
- message.letter_by_letter = true/false
* enable/disable letter-by-letter mode (globally)
- message.text_speed = 0-20
* set speed at which text appears in letter-by-letter mode (globally)
- message.skippable = true/false
* allow/disallow player to skip to end of message with button press

Font:
- message.font_name = font
* set font to use for text, overriding all defaults
(font can be any TrueType from Windows/Fonts folder)
- message.font_size = size
* set size of text (default 22), overriding all defaults
- message.font_color = color
* set color of text, overriding all defaults
* you can use same 0-7 as for \C[n] or "#xxxxxx" for hexadecimal

Set Move Route:
- foot_forward_on
* Optional Parameter - frame
* foot_forward_on(0) is default, treated as just foot_forward_on
* foot_forward_on(1) puts the "Other" Foot Forward
- foot_forward_off

Note that the default thought and shout balloon windowskins don't
stretch to four lines very well (unfortunately).

Thanks:
XRXS code for self-close and wait for input
Slipknot for a convenient approach to altering settings in-game
SephirothSpawn for bitmap rotate method

=end

#------------------------------------------------------------------------------
# * SDK Log Script
#------------------------------------------------------------------------------
#SDK.log('Multiple Message Windows', 'Wachunga', 1.5, '2006-11-17')

#------------------------------------------------------------------------------
# * Begin SDK Enabled Check
#------------------------------------------------------------------------------
#if SDK.state('Multiple Message Windows') == true

#==============================================================================
# Settings
#==============================================================================

#----------------------------------------------------------------------------
# Windowskins
#----------------------------------------------------------------------------
# Note: all files must be in the Graphics/Windowskins/ folder
# Tip: tails don't look right on windowskins with gradient backgrounds

# filenames of tail and windowskin used for speech balloons
FILENAME_SPEECH_TAIL = "white-tail_speech.png"
FILENAME_SPEECH_WINDOWSKIN = "white-windowskin_speech.png"

# filenames of tail and windowskin used for thought balloons
FILENAME_THOUGHT_TAIL = "white-tail_thought.png"
FILENAME_THOUGHT_WINDOWSKIN = "white-windowskin_thought.png"

#----------------------------------------------------------------------------
# Fonts
#----------------------------------------------------------------------------
# Note: if floating or resize (i.e. "speech balloons") are disabled,
# Font.default_name, Font.default_size and Font.default_color are used
# (you can change these in Main)
# During gameplay, you can use message.font_name etc to override all defaults

# defaults for speech text
SPEECH_FONT_COLOR = "#000000"
SPEECH_FONT_NAME = "Times New Roman","Comic Sans MS"
SPEECH_FONT_SIZE = 18

# defaults for thought text
THOUGHT_FONT_COLOR = "#000000"
THOUGHT_FONT_NAME = "Times New Roman","Comic Sans MS"
THOUGHT_FONT_SIZE = 16

# note that you can use an array of fonts for SPEECH_FONT_NAME, etc.
# e.g. ['Komika Slim', 'Arial']
# (if Verdana is not available, MS PGothic will be used instead)

#----------------------------------------------------------------------------
# Misc
#----------------------------------------------------------------------------
# If using a specialty windowskin (e.g. the default thought balloon one),
# you can force the window width to always be a multiple of the number
# specified in this constant (even when using the resize feature).
# This allows, for example, the windowskin frame to be designed to
# repeat every 16 pixels so that the frame never looks cut off.
THOUGHT_WIDTH_MULTIPLE = 16
# (set to 0 if you're not using any such windowskins)

class Game_Message

# Any of the below can be changed by a Call Script event during gameplay.
# E.g. turn letter-by-letter mode off with: message.letter_by_letter = false

def initialize
# whether or not messages appear one letter at a time
@letter_by_letter = true
# note: can also change within a single message with \L

# the default speed at which text appears in letter-by-letter mode
@text_speed = 0
# note: can also change within a single message with \S[n]

# this is defined as a user setting that can be changed during gameplay
@text_speed_player = 0

# Heretic's Notes:
#
# This is a placeholder for the default user setting in the event that
# a character needs to speak at a different speed without destroying
# the users preferences...
# Call by message.text_speed = message.text_speed_player
# YOU HAVE TO ENTER A NEWLINE (PRESS ENTER) BEFPRE 2ND VARIABLE
# DUE TO WRAPPING TEXT BUG WITH SCRIPTS IN EVENT SCRIPTS
# Otherwise you get errors

# whether or not players can skip to the end of (letter-by-letter) messages
@skippable = true

# whether or not messages are automatically resized based on the message
@resize = true

# whether or not message windows are positioned above
# characters/events by default, i.e. without needing \P every message
# (only works if resize messages enabled -- otherwise would look very odd)
@floating = true

# whether or not to automatically center lines within the message
@autocenter = true

# whether or not event-positioned messages have a tail(for speech balloons)
# (only works if floating and resized messages enabled -- otherwise would
# look very odd indeed)
@show_tail = true

# whether or not to display "waiting for user input" pause graphic
# (probably want this disabled for speech balloons)
@show_pause = false

# whether the player is permitted to move while messages are displayed
@move_during = true

# the default location for floating messages (relative to the event)
# note that an off-screen message will be "flipped" automatically
@location = TOP

# font details
# overrides all defaults; leave nil to just use defaults (e.g. as above)
@font_name = nil
@font_size = nil
@font_color = nil

# pause on these characters ,.?!
# pause for delay number of frames if this is true, toggle with \A in Text
@auto_comma_pause = true
# inserts this number of frames to ,!.? characters, nil for off
@auto_comma_delay = 5

# designers can allow or disallow choices, why not number windows too?
@allow_cancel_numbers = true
# speeds up text display a bit so players dont get bored waiting
@update_text_while_fading = true

# reset foot_forwad stance on auto-close due to Event going off-screen
@auto_ff_reset = true
# continues Move Route when NPC is speaking and goes off screen
@auto_move_continue = true

# exit if distance from speaker is too great
@dist_exit = true
# distance player can be before window closes
@dist_max = 4

# allow message windows to float off screen instead of flipping
@allow_offscreen = true

# reposition the message window if the speaker turns
@reposition_on_turn = true

# if Msg Windows were Reoriented by Player Movement, sticky to that spot
@sticky = true

# Sounds While Speaking Related
@sound = false # Enables or Disables Text Sounds
@sound_audio = '001-System01' # Audio SE (in DB) to play
@sound_volume = 80 # Text Sound Volume
@sound_pitch = 100 # Text Sound Pitch
@sound_pitch_range = 20 # How Much to vary the Pitch
@sound_vary_pitch = true # Whether to Vary the Pitch or not
@sound_frequency = 3 # Plays a sound this many letters

# Save these settings - DONT EDIT
save_sound_settings
end

attr_accessor :move_during # Walk around while speaking
attr_accessor :letter_by_letter # Display msg letter by letter
attr_accessor :text_speed # How fast text is displayed
attr_accessor :text_speed_player # Saves Player Preference
attr_accessor :skippable # Msg can be skipped
attr_accessor :resize # Resizes Message Window
attr_accessor :floating # Messages are Speech Bubbles
attr_accessor :autocenter # Centers Text in Window
attr_accessor :show_tail # Speech Bubble Tail
attr_accessor :show_pause # Shows Icon to press a button
attr_accessor :location # Relative to Speaker Top Bottom etc
attr_accessor :font_name # Name of Font to be used
attr_accessor :font_size # Size of Font
attr_accessor :font_color # Color of Font
attr_accessor :auto_comma_pause # Pauses on these characters ?,.!
attr_accessor :auto_comma_delay # How many Frames to Delay
attr_accessor :allow_cancel_numbers # Allows cancelling Number Input
attr_accessor :auto_ff_reset # Foot Forward Animation reset
attr_accessor :auto_move_continue # Continues Previous Move Route
attr_accessor :update_text_while_fading # Update Text while Fading In
attr_accessor :dist_exit # Auto Close Window if true
attr_accessor :dist_max # Dist Max Player from Speaker
attr_accessor :allow_offscreen # Allows Msg Windows Off Screen
attr_accessor :reposition_on_turn # Reposition Windows if Speaker Turn
attr_accessor :sticky # Msgs "Prefer" Sticky Locations
# Sound Related
attr_accessor :sound # Enables or Disables Text Sounds
attr_accessor :sound_audio # Audio SE (in DB) to play
attr_accessor :sound_volume # Text Sound Volume
attr_accessor :sound_pitch # Text Sound Pitch
attr_accessor :sound_pitch_range # How Much to vary the Pitch
attr_accessor :sound_vary_pitch # Whether to Vary the Pitch or not
attr_accessor :sound_frequency # Plays a sound this many letters



# Used for storing the Default Sound Configuration
def save_sound_settings
# Allows Saving ONCE
return if @default_sounds_audio
# Stores the Default Values
@default_sound_audio = @sound_audio
@default_sound_volume = @sound_volume
@default_sound_pitch = @sound_pitch
@default_sound_pitch_range = @sound_pitch_range
@default_sound_vary_pitch = @sound_vary_pitch
@default_sound_frequency = @sound_frequency
end

# Loads the Default Sound Settings
def load_sound_settings
# If settings have not been saved
return if not @default_sound_audio

# Default System Sound Configuration
@sound_audio = @default_sound_audio
@sound_volume = @default_sound_volume
@sound_pitch = @default_sound_pitch
@sound_pitch_range = @default_sound_pitch_range
@sound_vary_pitch = @default_sound_vary_pitch
@sound_frequency = @default_sound_frequency
end
end

#==============================================================================
# Private constants (don't edit)
#==============================================================================

# used for message.location
TOP = 8
BOTTOM = 2
LEFT = 4
RIGHT = 6

#------------------------------------------------------------------------------

class Game_Character
attr_accessor :direction # Used for changing bubble orientation
attr_accessor :direction_fix # Character locked facing a direction
attr_accessor :walk_anime # Character steps when moves
attr_accessor :step_anime # Character is Stepping
attr_accessor :erased # Erased Flag
attr_accessor :original_move_speed # Characters original Move Speed
attr_accessor :original_move_frequency # Characters original Move Speed
attr_accessor :no_ff # Prevents Auto Foot Forward Off
attr_accessor :no_mc # No 'M'ove Continue
attr_accessor :dist_kill # Closes ALL windows if Player X Dist

unless self.method_defined?('heretic_char_mmw_initialize')
alias heretic_char_mmw_initialize initialize
end

def initialize
# Run Original
heretic_char_mmw_initialize
# Add New Properties
@original_move_speed = 4
@original_move_frequency = 6
@no_ff = nil
@no_mc = nil
@dist_kill = nil
# Game Player - Sticky
if self.is_a?(Game_Player)
@sticky = false
end
end
end

class Game_Event < Game_Character
unless self.method_defined?('heretic_event_mmw_initialize')
alias heretic_event_mmw_initialize initialize
end

def initialize(map_id, event, *args)
heretic_event_mmw_initialize(map_id, event, *args)
check_no_auto_ff(event)
check_no_mc(event)
end

# These occur when Windows are Auto Closed for going Off Screen

# Check for no Auto Foot Forward Off - In the event of Animation Problems...
def check_no_auto_ff(event)
event.name.gsub(/\\no_ff/i) {@no_ff = true}
end

# Check for no MC - 'M'ove 'C'ontinue - Restores Original Move Route...
def check_no_mc(event)
event.name.gsub(/\\no_mc/i) {@no_mc = true}
end
end

class Window_Message < Window_Selectable
attr_accessor :choice_window # Allows Multi Windows with Choice Selection

#==============================================================================
# Private constants (don't edit)
#==============================================================================

# Characters that produce Text Sounds - a to z and 0 thru 9
CHARACTERS = [('a'..'z'),('0'..'9')].map{|i| i.to_a}.flatten

#------------------------------------------------------------------------------


#--------------------------------------------------------------------------
# * Initialize
#--------------------------------------------------------------------------

def initialize(msgindex = 0)
super(80, 304, 480, 160)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
self.z = 9000 + msgindex * 5 # permits messages to overlap legibly
@fade_in = false
@fade_out = false
@contents_showing = false
@cursor_width = 0
self.active = false
self.index = -1
@msgindex = msgindex
@tail = Sprite.new
@tail.bitmap =
if @msgindex == 0
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
else
# don't use cached version or else all tails
# are rotated when multiple are visible at once
Bitmap.new("Graphics/Windowskins/"+FILENAME_SPEECH_TAIL)
end
# keep track of orientation of tail bitmap
if @tail.bitmap.orientation == nil
@tail.bitmap.orientation = 0
end
# make origin the center, not top left corner
@tail.ox = @tail.bitmap.width/2
@tail.oy = @tail.bitmap.height/2
# Removed due to Tail Overlap on Secondary Message Bubbles
#@tail.z = 9999
# Increase Z Index
@tail.z = self.z + 4
@tail.visible = false
if $game_system.message.floating and $game_system.message.resize
@windowskin = FILENAME_SPEECH_WINDOWSKIN
else
# use windowskin specified in database
@windowskin = $game_system.windowskin_name
end
if $game_system.message.floating and $game_system.message.resize
# if used as speech balloons, use constants
@font_name = SPEECH_FONT_NAME
@font_color = check_color(SPEECH_FONT_COLOR)
@font_size = SPEECH_FONT_SIZE
else
# use defaults
@font_name = Font.default_name
@font_color = Font.default_color
@font_size = Font.default_size
end
# override defaults if necessary
if $game_system.message.font_name != nil
@font_name = $game_system.message.font_name
end
if $game_system.message.font_color != nil
@font_color = check_color($game_system.message.font_color)
end
if $game_system.message.font_size != nil
@font_size = $game_system.message.font_size
end
@update_text = true
@letter_by_letter = $game_system.message.letter_by_letter
@text_speed = $game_system.message.text_speed
# id of character for speech balloons
@float_id = nil
# location of box relative to speaker
@location = $game_system.message.location
# insert a pause for commas, periods and other special characters
@auto_comma_pause = $game_system.message.auto_comma_pause
@auto_comma_delay = $game_system.message.auto_comma_delay
# allows number windows to be cancelled
@allow_cancel_numbers = $game_system.message.allow_cancel_numbers
# allows windows to update text while fading in
@update_text_while_fading = $game_system.message.update_text_while_fading
# resets foot forward animation when off screen
@auto_ff_reset = $game_system.message.auto_ff_reset
# resets foot forward animation when off screen
@auto_move_continue = $game_system.message.auto_move_continue
# allows a specific window to be flagged if choices are displayed
@choice_window = nil

# Close a Window if distance from speaker is too great
@dist_exit = $game_system.message.dist_exit
# Maximum Distance player can be away from speaker before closing
@dist_max = $game_system.message.dist_max

# Sounds While Speaking Related
@sound = $game_system.message.sound
@sound_audio = $game_system.message.sound_audio
@sound_volume = $game_system.message.sound_volume
@sound_pitch = $game_system.message.sound_pitch
@sound_pitch_range = $game_system.message.sound_pitch_range
@sound_vary_pitch = $game_system.message.sound_vary_pitch
@sound_frequency = $game_system.message.sound_frequency
@sound_counter = 0
end

def dispose
terminate_message
# have to check all windows before claiming that no window is showing
if $game_temp.message_text.compact.empty?
$game_temp.message_window_showing = false
end

if @input_number_window != nil
@input_number_window.dispose
end
super
end
#--------------------------------------------------------------------------
# * Terminate Message
#--------------------------------------------------------------------------

def terminate_message
return if $game_temp.input_in_window == true
self.active = false
self.pause = false
self.index = -1
self.contents.clear
# Clear showing flag
@contents_showing = false

# Clear variables related to text, choices, and number input
@tail.visible = false
# note that these variables are now indexed arrays
$game_temp.message_text[@msgindex] = nil
# Call message callback
if $game_temp.message_proc[@msgindex] != nil
# make sure no message boxes are displaying
if $game_temp.message_text.compact.empty?
$game_temp.message_proc[@msgindex].call
end
$game_temp.message_proc[@msgindex] = nil
end
self.choice_window = nil
@update_text = true
$game_temp.choice_start = 99
$game_temp.choice_max = 0
$game_temp.choice_cancel_type = 0
$game_temp.choice_proc = nil
$game_temp.num_input_start = 99
$game_temp.num_input_variable_id = 0
$game_temp.num_input_digits_max = 0
# Open gold window
if @gold_window != nil
@gold_window.dispose
@gold_window = nil
end
end

#--------------------------------------------------------------------------
# * Refresh Message Window
#--------------------------------------------------------------------------

def refresh
self.contents.clear
@x = @y = 0 # now instance variables
@float_id = nil
@location = $game_system.message.location
if $game_system.message.floating and $game_system.message.resize
@windowskin = FILENAME_SPEECH_WINDOWSKIN
else
# use windowskin specified in database
@windowskin = $game_system.windowskin_name
end
if $game_system.message.floating and $game_system.message.resize
# if used as speech balloons, use constants
@font_name = SPEECH_FONT_NAME
@font_color = check_color(SPEECH_FONT_COLOR)
@font_size = SPEECH_FONT_SIZE
else
# use default font
@font_name = Font.default_name
@font_color = Font.default_color
@font_size = Font.default_size
end
# override font defaults
if $game_system.message.font_name != nil
@font_name = $game_system.message.font_name
end
if $game_system.message.font_color != nil
@font_color = check_color($game_system.message.font_color)
end
if $game_system.message.font_size != nil
@font_size = $game_system.message.font_size
end
@line_widths = nil
@wait_for_input = false
@tail.bitmap =
if @msgindex == 0
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
else
Bitmap.new("Graphics/Windowskins/"+FILENAME_SPEECH_TAIL)
end
RPG::Cache.windowskin(FILENAME_SPEECH_TAIL)
@tail.bitmap.orientation = 0 if @tail.bitmap.orientation == nil
@text_speed = $game_system.message.text_speed
@letter_by_letter = $game_system.message.letter_by_letter
@auto_comma_pause = $game_system.message.auto_comma_pause
@auto_comma_delay = $game_system.message.auto_comma_delay
@allow_cancel_numbers = $game_system.message.allow_cancel_numbers
@auto_ff_reset = $game_system.message.auto_ff_reset
@auto_move_continue = $game_system.message.auto_move_continue
@update_text_while_fading = $game_system.message.update_text_while_fading
@dist_exit = $game_system.message.dist_exit
@dist_max = $game_system.message.dist_max
@dist_max = 1 if @dist_max < 1
@auto_orient = nil
@delay = @text_speed
@player_skip = false
# Sound Related
@sound = $game_system.message.sound
@sound_volume = $game_system.message.sound_volume
@sound_pitch = $game_system.message.sound_pitch
@sound_pitch_range = $game_system.message.sound_pitch_range
@sound_vary_pitch = $game_system.message.sound_vary_pitch
@sound_frequency = $game_system.message.sound_frequency
@sound_counter = 0
# End Sound Related
@cursor_width = 0
# Indent if choice
if $game_temp.choice_start == 0
@x = 8
end
# If waiting for a message to be displayed
if $game_temp.message_text[@msgindex] != nil
@text = $game_temp.message_text[@msgindex] # now an instance variable
# Control text processing
begin
last_text = @text.clone
@text.gsub!(/\\[V]\[[T]([0-9]+)\]/i) { $game_system.mmw_text[$1.to_i] }
@text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }





end until @text == last_text
@text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
# Change "\\\\" to "\000" for convenience
@text.gsub!(/\\\\/) { "\000" }
@text.gsub!(/\\[Gg][\+]/) { "\023" } # Gold Window at TOP
@text.gsub!(/\\[Gg][\-]/) { "\024" } # Gold Window at Bottom
@text.gsub!(/\\[Gg]/) { "\002" } # Gold Window Auto, based on Player Loc

# display icon of item, weapon, armor or skill
@text.gsub!(/\\[Ii]\[([IiWwAaSs][0-9]+)\]/) { "\013[#{$1}]" }
# display name of enemy, item, weapon, armor or skill
@text.gsub!(/\\[Nn]\[([EeIiWwAaSs])([0-9]+)\]/) do
case $1.downcase
when "e"
entity = $data_enemies[$2.to_i]
when "i"
entity = $data_items[$2.to_i]
when "w"
entity = $data_weapons[$2.to_i]
when "a"
entity = $data_armors[$2.to_i]
when "s"
entity = $data_skills[$2.to_i]
end
entity != nil ? entity.name : ""
end
# display icon and name of item, weapon, armor or skill
@text.gsub!(/\\[Ii]&[Nn]\[([IiWwAaSs])([0-9]+)\]/) do
case $1.downcase
when "e"
entity = $data_enemies[$2.to_i]
when "i"
entity = $data_items[$2.to_i]
when "w"
entity = $data_weapons[$2.to_i]
when "a"
entity = $data_armors[$2.to_i]
when "s"
entity = $data_skills[$2.to_i]
end
entity != nil ? "\013[#{$1+$2}] " + entity.name : ""
end
# display name of current map
@text.gsub!(/\\[Mm][Aa][Pp]/) { $game_map.name }
# change font color
@text.gsub!(/\\[Cc]\[([0-9]+|#[0-9A-Fa-f]{6,6})\]/) { "\001[#{$1}]" }
# return to default color
@text.gsub!(/\\[Cc]/) { "\001" }
# toggle letter-by-letter mode
@text.gsub!(/\\[Ll]/) { "\003" }
# toggle auto_comma_pause mode
@text.gsub!(/\\[Aa]/) { "\016" }
# trigger Foot Forward Animation
@text.gsub!(/\\[Ff]\+/) { "\020" }
# trigger Foot Forward Animation Alter Frame
@text.gsub!(/\\[Ff]\*/) { "\022" }
# trigger Reset Foot Forward Animation
@text.gsub!(/\\[Ff]\-/) { "\021" }
# change text speed (for letter-by-letter)
@text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\004[#{$1}]" }
# insert delay
@text.gsub!(/\\[Dd]\[([0-9]+)\]/) { "\005[#{$1}]" }

# insert delays for commas, periods, questions and exclamations
@text.gsub!(/, /) { ", \015" } # Comma with One Space
@text.gsub!(/! /) { "! \015" } # Exclamation Point with Two Spaces
@text.gsub!(/\? /) { "? \015" } # Question Mark with Two Spaces
@text.gsub!(/\. /) { ". \015" } # Period with Two Spaces

# self close message
@text.gsub!(/\\[!]/) { "\006" }
# wait for button input
@text.gsub!(/\\[?]/) { "\007" }
# bold
@text.gsub!(/\\[Bb]/) { "\010" }
# italic
@text.gsub!(/\\[Ii]/) { "\011" }
# add msg with \*
@text.gsub!(/\\

  • /) { "\014" }
    # thought balloon
    if @text.gsub!(/\\[@]/, "") != nil
    @windowskin = FILENAME_THOUGHT_WINDOWSKIN
    @font_name = THOUGHT_FONT_NAME
    @font_size = THOUGHT_FONT_SIZE
    @font_color = check_color(THOUGHT_FONT_COLOR)
    @tail.bitmap =
    if @msgindex == 0
    RPG::Cache.windowskin(FILENAME_THOUGHT_TAIL)
    else
    Bitmap.new("Graphics/Windowskins/"+FILENAME_THOUGHT_TAIL)
    end
    @tail.bitmap.orientation = 0 if @tail.bitmap.orientation == nil
    end
    # Get rid of "\+" (multiple messages)
    @text.gsub!(/\\[+]/, "")
    # Get rid of "\*" (multiple messages)
    @text.gsub!(/\\
  • /, "")
    # Get rid of "\\^", "\\v", "\\<", "\\>" (relative message location)
    if @text.gsub!(/\\\^/, "") != nil
    @location = 8
    elsif @text.gsub!(/\\[Vv]/, "") != nil
    @location = 2
    elsif @text.gsub!(/\\[<]/, "") != nil
    @location = 4
    elsif @text.gsub!(/\\[>]/, "") != nil
    @location = 6
    end
    # Get rid of "\\P" (position window to given character)
    if @text.gsub!(/\\[Pp]\[([0-9]+)\]/, "") != nil
    @float_id = $1.to_i
    elsif @text.gsub!(/\\[Pp]\[([a-zA-Z])\]/, "") != nil and
    $game_temp.in_battle
    @float_id = $1.downcase
    # Tie-In with Caterpillar, use \P[Cn] for a Cat Actor or Follower \P[C1]
    elsif @text.gsub!(/\\[Pp]\[[Cc]([0-9]+)\]/, "") != nil and
    !$game_temp.in_battle and
    Interpreter.method_defined?('get_cat_position_id')
    # This only works with Heretic's Caterpillar
    if $1.to_i == 0
    @float_id = 0 # Player
    elsif $1.to_i > 0 and $1.to_i <= $game_system.caterpillar.actors.size
    # temporary shortuct to keep on one line
    s = $game_system.map_interpreter
    # Returns the Event ID of the Cat Actor in that position
    @float_id = s.get_cat_position_id($1.to_i - 1)
    end
    elsif @text.gsub!(/\\[Pp]/, "") != nil or
    ($game_system.message.floating and $game_system.message.resize) and
    !$game_temp.in_battle
    # Just assigns the Event ID of the \P[x] Event
    @float_id = $game_system.map_interpreter.event_id
    end
    # Orient to Behind Events Direction with \%
    if @text.gsub!(/\\[%]/, "") != nil and !$game_temp.in_battle
    d = (@float_id > 0) ?
    $game_map.events[@float_id].direction : $game_player.direction
    # Allows Window to Reorient if the Speaker Turns
    @auto_orient = 1
    # If Sticky is Disabled...
    if !$game_system.message.sticky
    # Unset any possible Stickys
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    # Game Player Sticky
    if @float_id == 0 and not $game_player.sticky
    # Reset Game Player Preferred Location
    $game_player.preferred_loc = nil
    end
    end
    if @float_id > 0 and $game_map.events[@float_id].preferred_loc and
    $game_map.events[@float_id].allow_flip
    # This just helps to keep the position the same
    @location = $game_map.events[@float_id].preferred_loc
    elsif @float_id == 0 and $game_player.preferred_loc and
    $game_player.allow_flip
    # Set Location to Players Preferred Location.
    @location = $game_player.preferred_loc
    else
    if d == 2
    @location = 8
    if @float_id == 0 and $game_player.sticky
    $game_player.preferred_loc = 8
    end
    elsif d == 4
    @location = 6
    elsif d == 6
    @location = 4
    elsif d == 8
    @location = 2
    if @float_id == 0 and $game_player.sticky
    $game_player.preferred_loc = 8
    end
    else
    @location = 8
    end
    end
    end
    # Orient Above unless facing UP, then Down
    if @text.gsub!(/\\[\$]/, "") != nil and !$game_temp.in_battle
    # This Allows Top / Bottom Flipping if the Speaker Turns
    @auto_orient = 2
    d = (@float_id > 0) ?
    $game_map.events[@float_id].direction : $game_player.direction
    # Check for "Sticky" messages
    if !$game_system.message.sticky
    # Unset any possible Stickys
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    if @float_id == 0 and not $game_player.sticky
    $game_player.preferred_loc = nil
    end
    end
    # If the message got flipped due to Character Turning, then Prefer
    pl = (@float_id > 0) ? $game_map.events[@float_id].preferred_loc :
    (@float_id == 0) ? $game_player.preferred_loc : nil
    if ((@float_id > 0 and $game_map.events[@float_id].allow_flip) or
    (@float_id == 0 and $game_player.allow_flip)) and
    (pl == 2 or pl == 8)

    # Set Location to the Preferred Location. Only works if Triggered
    # Other Events are NOT included in this "Stickyness"
    @location = pl
    else
    # Orient by Direction
    case d
    when 8
    @location = 2
    else
    @location = 8
    end
    end
    # Set Preferred Location for Sticky
    if $game_system.message.sticky
    # Set Sticky for Player
    if @float_id == 0 and $game_player.preferred_loc == nil and
    $game_player.sticky
    # Set Sticky for Player, expires at end of Event Processing
    $game_player.preferred_loc = @location
    # Set Sticky for Event
    elsif @float_id > 0 and
    $game_map.events[@float_id].preferred_loc == nil
    # Set Sticky for Event, expires at end of Event Processing
    $game_map.events[@float_id].preferred_loc = @location
    end
    end
    end
    if $game_system.message.resize or $game_system.message.autocenter
    # calculate length of lines
    text = @text.clone
    temp_bitmap = Bitmap.new(1,1)
    temp_bitmap.font.name = @font_name
    temp_bitmap.font.size = @font_size
    @line_widths = [0,0,0,0]
    for i in 0..3
    line = text.split(/\n/)[3-i]
    if line == nil
    next
    end
    line.gsub!(/[\001-\007](\[[#A-Fa-f0-9]+\])?/, "")
    line.gsub!(/\013\[[IiWwAaSs][0-9]+\]/, "\013")
    line.chomp.split(//).each do |c|


    # C for Characters in Size of Message Bubble

    case c
    when "\000"
    c = "\\"
    when "\010"
    # bold
    temp_bitmap.font.bold = !temp_bitmap.font.bold
    next
    when "\011"
    # italics
    temp_bitmap.font.italic = !temp_bitmap.font.italic
    next
    when "\013"
    # icon
    @line_widths[3-i] += 24
    next
    when "\014","\015","\016","\020","\021","\022","\023","\024"
    # Featres Heretic added, causes garbage to appear
    next
    end
    @line_widths[3-i] += temp_bitmap.text_size(c).width
    end
    if (3-i) >= $game_temp.choice_start
    # account for indenting
    @line_widths[3-i] += 8 unless $game_system.message.autocenter
    end
    end
    if $game_temp.num_input_variable_id > 0
    # determine cursor_width as in Window_InputNumber
    # (can't get from @input_number_window because it doesn't exist yet)
    cursor_width = temp_bitmap.text_size("0").width + 8
    # use this width to calculate line width (+8 for indent)
    input_number_width = cursor_width*$game_temp.num_input_digits_max
    input_number_width += 8 unless $game_system.message.autocenter
    @line_widths[$game_temp.num_input_start] = input_number_width
    end
    temp_bitmap.dispose
    end
    resize
    reposition if @float_id != nil
    self.contents.font.name = @font_name
    self.contents.font.size = @font_size
    self.contents.font.color = @font_color
    self.windowskin = RPG::Cache.windowskin(@windowskin)
    # autocenter first line if enabled
    # (subsequent lines are done as "\n" is encountered)
    if $game_system.message.autocenter and @text != ""
    @x = (self.width-40)/2 - @line_widths[0]/2
    end
    end
    end

    #--------------------------------------------------------------------------
    # * Resize Window
    #--------------------------------------------------------------------------
    def resize
    if !$game_system.message.resize
    # reset to defaults
    self.width = 480
    self.height = 160
    self.contents = Bitmap.new(width - 32, height - 32)
    self.x = 80 # undo any centering
    return
    end
    max_x = @line_widths.max
    max_y = 4
    @line_widths.each do |line|
    max_y -= 1 if line == 0 and max_y > 1
    end
    if $game_temp.choice_max > 0
    # account for indenting
    max_x += 8 unless $game_system.message.autocenter
    end
    new_width = max_x + 40
    if @windowskin == FILENAME_THOUGHT_WINDOWSKIN and THOUGHT_WIDTH_MULTIPLE >0
    # force window width to be a multiple of THOUGHT_WIDTH_MULTIPLE
    # so that specialty windowskins (e.g. thought balloon) look right
    if new_width % THOUGHT_WIDTH_MULTIPLE != 0
    new_width += THOUGHT_WIDTH_MULTIPLE-(new_width%THOUGHT_WIDTH_MULTIPLE)
    end
    end
    self.width = new_width
    self.height = max_y * 32 + 32
    self.contents = Bitmap.new(width - 32, height - 32)
    self.x = 320 - (self.width/2) # center
    end

    def triggered_id?(event_id)
    return false if not $scene.is_a?(Scene_Map)
    # If the Event Speaking is the one that was Triggered in max_dist_id
    return true if $game_system.map_interpreter.max_dist_id ==
    $game_system.map_interpreter.event_id
    end

    #--------------------------------------------------------------------------
    # * Reposition Window
    #--------------------------------------------------------------------------
    def reposition
    if $game_temp.in_battle
    if "abcd".include?(@float_id) # must be between a and d
    @float_id = @float_id[0] - 97 # a = 0, b = 1, c = 2, d = 3
    if $scene.spriteset.actor_sprites[@float_id] == nil
    @tail.visible = false
    return
    end
    sprite = $scene.spriteset.actor_sprites[@float_id]
    else
    @float_id -= 1 # account for, e.g., player entering 1 for index 0
    if $scene.spriteset.enemy_sprites[@float_id] == nil
    @tail.visible = false
    return
    end
    sprite = $scene.spriteset.enemy_sprites[@float_id]
    end

    if sprite.height != nil
    char_height = sprite.height
    char_width = sprite.width
    char_x = sprite.x
    char_y = sprite.y - char_height/2
    else
    # This prevents GAME CRASH Enemy doesnt exist
    return
    end

    else # not in battle...
    char = (@float_id == 0 ? $game_player : $game_map.events[@float_id])
    if char == nil
    # no such character
    @float_id = nil
    return
    end
    # close message (and stop event processing) if speaker is off-screen
    # or the window itself is completely off-screen
    if char.screen_x <= 0 or char.screen_x >= 640 or
    char.screen_y <= 0 or char.screen_y > 480 or
    ($game_system.message.move_during and
    not triggered_id?(char.id) and
    @dist_exit and char.allow_flip and
    @float_id > 0 and not char.within_range?(@dist_max, @float_id)) or
    ($game_system.message.allow_offscreen and !$game_temp.in_battle and
    (self.height - self.y > 480 or self.height + self.y < 0 or
    self.width - self.x > 640 or self.width + self.x < 0))
    # Moved Off Screen or out of range so close Window
    terminate_message
    # 115 Breaks Event Processing
    $game_system.map_interpreter.command_115
    # reset foot forward on speak stance
    if @auto_ff_reset and not char.no_ff
    char.foot_forward_off
    end
    # reset 'M'ove 'C'ontinue
    if @auto_move_continue and not char.no_mc
    char.event_move_continue(@float_id, true)
    end
    # Instanced for this Msg Window, prevents calling Resets multiple times
    @auto_ff_reset = false
    # Turn off the Triggered Flag
    char.allow_flip = false
    char.preferred_loc = nil
    # Load the Default Sound Settings because Player walked away
    $game_system.message.load_sound_settings
    return
    end
    char_height = RPG::Cache.character(char.character_name,0).height / 4
    char_width = RPG::Cache.character(char.character_name,0).width / 4
    # record coords of character's center
    char_x = char.screen_x
    char_y = char.screen_y - char_height/2
    end
    params = [char_height, char_width, char_x, char_y]
    # position window and message tail
    vars = new_position(params)
    x = vars[0]
    y = vars[1]

    # check if need to flip because of Speaker Direction
    flip = need_flip?(@float_id, @location, x, y, params)

    # check if any window locations need to be "flipped"
    # because of Window Location
    if @location == 4 and
    ((x < 0 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)) or
    flip)
    # if the msg is an Auto Oriented Msg and it needs to be flipped
    if @auto_orient == 1 and need_flip?(@float_id, @location, x, y)
    @location = put_behind(@float_id, 6)
    else
    # switch to right
    @location = 6
    end
    vars = new_position(params)
    x = vars[0]
    if x + self.width > 640 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)
    # right is no good either...
    if y >= 0
    # switch to top
    @location = 8
    vars = new_position(params)
    else
    # switch to bottom
    @location = 2
    vars = new_position(params)
    end
    end
    if $game_system.message.sticky
    $game_map.events[@float_id].preferred_loc = @location if @float_id > 0
    if @float_id == 0 and [2,8].include?(@location)
    if $game_player.allow_flip and $game_player.sticky
    $game_player.preferred_loc = @location
    else
    $game_player.preferred_loc = nil
    end
    end
    else
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    end
    elsif @location == 6 and
    ((x + self.width > 640 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)) or
    flip)
    # if the msg is an Auto Oriented Msg and it needs to be flipped
    if @auto_orient == 1 and need_flip?(@float_id, @location, x, y)
    @location = put_behind(@float_id, 4)
    else
    # switch to left
    @location = 4
    end
    vars = new_position(params)
    x = vars[0]
    if x < 0 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)
    # left is no good either...
    if y >= 0
    # switch to top
    @location = 8
    vars = new_position(params)
    else
    # switch to bottom
    @location = 2
    vars = new_position(params)
    end
    end
    if $game_system.message.sticky
    $game_map.events[@float_id].preferred_loc = @location if @float_id > 0
    if @float_id == 0 and [2,8].include?(@location)
    if $game_player.allow_flip and $game_player.sticky
    $game_player.preferred_loc = @location
    else
    $game_player.preferred_loc = nil
    end
    end
    else
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    end
    elsif @location == 8 and
    ((y < 0 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)) or
    flip)
    # if the msg is an Auto Oriented Msg and it needs to be flipped
    if @auto_orient == 1 and need_flip?(@float_id, @location, x, y)
    @location = put_behind(@float_id, 2)
    else
    # switch to bottom
    @location = 2
    end
    vars = new_position(params)
    y = vars[1]

    if y + self.height > 480 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)
    # bottom is no good either...
    # note: this will probably never occur given only 3 lines of text
    # note: heretic - yeah right. Wait till I get ahold of your code!
    x = vars[0]
    if x >= 0
    # switch to left
    @location = 4
    vars = new_position(params)
    else
    # switch to right
    @location = 6
    vars = new_position(params)
    end
    end
    if not $game_temp.in_battle
    if $game_system.message.sticky
    $game_map.events[@float_id].preferred_loc = @location if @float_id > 0
    if @float_id == 0 and [2,8].include?(@location)
    if $game_player.allow_flip and $game_player.sticky
    $game_player.preferred_loc = @location
    else
    $game_player.preferred_loc = nil
    end
    end
    else
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    end
    end
    elsif @location == 2 and
    ((y + self.height > 480 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)) or
    flip)
    # if the msg is an Auto Oriented Msg and it needs to be flipped
    if @auto_orient == 1 and need_flip?(@float_id, @location, x, y)
    @location = put_behind(@float_id, 8)
    else
    # switch to top
    @location = 8
    end
    vars = new_position(params)
    y = vars[1]
    if y < 0 and
    (!$game_system.message.allow_offscreen or $game_temp.in_battle)
    # top is no good either...
    # note: this will probably never occur given only 3 lines of text
    # note: heretic - yeah right. Wait till I get ahold of your code!
    x = vars[0]
    if x >= 0
    # switch to left
    @location = 4
    vars = new_position(params)
    else
    # switch to right
    @location = 6
    vars = new_position(params)
    end
    end
    if not $game_temp.in_battle
    if $game_system.message.sticky
    $game_map.events[@float_id].preferred_loc = @location if @float_id > 0
    if @float_id == 0 and [2,8].include?(@location)
    if $game_player.allow_flip and $game_player.sticky
    $game_player.preferred_loc = @location
    else
    $game_player.preferred_loc = nil
    end
    end
    else
    $game_map.events[@float_id].preferred_loc = nil if @float_id > 0
    end
    end
    end
    x = vars[0]
    y = vars[1]
    tail_x = vars[2]
    tail_y = vars[3]
    # adjust windows if near edge of screen
    if not $game_system.message.allow_offscreen or $game_temp.in_battle
    if x < 0
    x = 0
    elsif (x + self.width) > 640
    x = 640 - self.width
    end
    if y < 0
    y = 0
    elsif (y + self.height) > 480
    y = 480 - self.height
    elsif $game_temp.in_battle and @location == 2 and (y > (320 - self.height))
    # when in battle, prevent enemy messages from overlapping battle status
    # (note that it could still happen from actor messages, though)
    y = 320 - self.height
    tail_y = y
    end
    end
    # finalize positions
    self.x = x
    self.y = y
    @tail.x = tail_x
    @tail.y = tail_y
    end

    #--------------------------------------------------------------------------
    # * Need Flip? - Prevent Player from walking under Message Bubbles
    #--------------------------------------------------------------------------
    def need_flip?(event_id, loc, x, y, params = nil)
    return false if !@auto_orient or
    @fade_out or
    event_id.nil? or
    (event_id != 0 and
    $game_map.events[event_id].erased) or
    $game_temp.in_battle or
    !$game_system.message.reposition_on_turn or
    !$game_system.message.move_during
    # vars for speaker
    event = (event_id > 0) ? $game_map.events[event_id] : $game_player
    dir = event.direction

    # if an argument is passed called params and not allowed offscreen
    if params and not $game_system.message.allow_offscreen
    case loc
    when 2
    new_loc = 8
    when 4
    new_loc = 6
    when 6
    new_loc = 4
    when 8
    new_loc = 2
    end
    # check what the new coordinates of a repositioned window will be
    new_vars = new_position(params, new_loc, no_rotate = true)
    new_x = new_vars[0]
    new_y = new_vars[1]
    # return false if not allowed off screen and new position is off screen
    if (new_x < 0 and new_loc == 4) or
    (new_x + self.width > 640) or
    (new_y < 0) or
    (new_y + self.height > 480)
    # if not allowed offscreen and trying to flip offscreen
    return false
    end
    end

    # default result
    result = false
    result = true if @auto_orient == 2 and
    event.allow_flip and
    dir == loc

    if @auto_orient == 1
    if event_id > 1
    # If Auto Orient Any Direction, try to put preference on top / bottom
    # Top / Bottom Preference was made for readability of Msgs
    # because it is easier to go off screen left and right
    if dir == loc or
    ((dir == 2 or dir == 8) and (loc == 4 or loc == 6))
    result = true
    end
    elsif event_id == 0 and $game_player.allow_flip

    # if Game Player Message is Sticky
    if $game_player.sticky and
    ((dir == 2 and loc != 8) or
    (dir == 8 and loc != 2) or
    (
    (not $game_player.preferred_loc) and
    ((dir == 4 and loc != 6) or (dir == 6 and loc != 4))
    )
    )
    # Return that Message needs to be Flipped
    result = true
    # If Game Player Non Sticky Message not behind Player
    elsif not $game_player.sticky and
    ((dir == 2 and loc != 8) or
    (dir == 4 and loc != 6) or
    (dir == 6 and loc != 4) or
    (dir == 8 and loc != 2))
    # Return that Message needs to be Flipped
    result = true
    end
    end
    end
    return result
    end

    #--------------------------------------------------------------------------
    # Place Message Bubble behind Speaker
    #--------------------------------------------------------------------------
    def put_behind(event_id, default_loc)
    return default_loc if event_id.nil? or $game_temp.in_battle
    dir = (event_id > 0 ) ? $game_map.events[event_id].direction :
    $game_player.direction
    return 2 if dir == 8
    return 4 if dir == 6
    return 6 if dir == 4
    return 8 if dir == 2
    return default_loc
    end

    #--------------------------------------------------------------------------
    # * Determine New Window Position
    #--------------------------------------------------------------------------
    def new_position(params, location = @location, no_rotate = nil)
    char_height = params[0]
    char_width = params[1]
    char_x = params[2]
    char_y = params[3]
    if location == 8
    # top
    x = char_x - self.width/2
    y = char_y - char_height/2 - self.height - @tail.bitmap.height/2
    @tail.bitmap.rotation(0) if not no_rotate
    tail_x = x + self.width/2
    tail_y = y + self.height
    elsif location == 2
    # bottom
    x = char_x - self.width/2
    y = char_y + char_height/2 + @tail.bitmap.height/2
    @tail.bitmap.rotation(180) if not no_rotate
    tail_x = x + self.width/2
    tail_y = y
    elsif location == 4
    # left
    x = char_x - char_width/2 - self.width - @tail.bitmap.width/2
    y = char_y - self.height/2
    @tail.bitmap.rotation(270) if not no_rotate
    tail_x = x + self.width
    tail_y = y + self.height/2
    elsif location == 6
    # right
    x = char_x + char_width/2 + @tail.bitmap.width/2
    y = char_y - self.height/2
    @tail.bitmap.rotation(90) if not no_rotate
    tail_x = x
    tail_y = y + self.height/2
    end
    return [x,y,tail_x,tail_y]
    end

    #--------------------------------------------------------------------------
    # * Text Sound
    #--------------------------------------------------------------------------

    def play_text_sound(char)
    sound = "Audio/SE/" + $game_system.message.sound_audio
    volume = @sound_volume

    if @sound_vary_pitch and @sound_pitch
    # Prevent Negative Numbers...
    sound_pitch_range = (@sound_pitch_range > @sound_pitch) ?
    @sound_pitch : @sound_pitch_range
    # If we want to Randomize the Sounds
    if @sound_vary_pitch == "random"
    # Random within the Range
    pitch = rand(sound_pitch_range * 2) + @sound_pitch - sound_pitch_range
    # Vary Sound Pitch to be based on Letter Sounds
    else

    # Note to Self - Reorganize based on actual Letter Sounds, not so Random
    if ['l','m','n','q','u','w','2'].include?(char)
    pitch = @sound_pitch - sound_pitch_range
    elsif ['a','f','h','j','k','o','r','x','1','4','7','8'].include?(char)
    pitch = @sound_pitch - sound_pitch_range / 2
    elsif ['b','c','d','e','g','p','t','v','z','0','3','6'].to_a.include?(char)
    pitch = @sound_pitch
    elsif ['s','7'].to_a.include?(char)
    pitch = @sound_pitch + sound_pitch_range / 2
    elsif ['i','y','5','9'].to_a.include?(char)
    pitch = @sound_pitch + sound_pitch_range
    else
    pitch = rand(@sound_pitch_range * 2) + @sound_pitch
    end
    end
    else
    pitch=(@sound_pitch and @sound_pitch.is_a?(Numeric)) ? @sound_pitch : 100
    end

    # Play the Sound
    Audio.se_play(sound, volume, pitch)
    end

    #--------------------------------------------------------------------------
    # * Update Text
    #--------------------------------------------------------------------------
    def update_text
    if @text != nil
    # Get 1 text character in c (loop until unable to get text)
    while ((c = @text.slice!(/./m)) != nil)
    # Plays Sounds for each Letter, Numbers and Spaces Excluded
    if @sound and @letter_by_letter and !@player_skip and
    CHARACTERS.include?(c.downcase)
    # Increment for each Letter Sound Played
    @sound_counter += 1
    # Prevents Division by Zero, allows 0 to play a sound every letter
    frequency = (@sound_frequency == 0) ?
    @sound_counter : @sound_frequency
    # Play Sound for each New Word or if Remainder is 0
    if @sound_counter == 1 or @sound_counter % frequency == 0
    # Play correct sound for each letter
    play_text_sound(c.downcase)
    end
    else
    @sound_counter = 0
    end
    # If \\
    if c == "\000"
    # Return to original text
    c = "\\"
    end
    # If \C[n] or \C[#xxxxxx] or \C
    if c == "\001"
    # Change text color
    @text.sub!(/\[([0-9]+|#[0-9A-Fa-f]{6,6})\]/, "")
    if $1 != nil
    self.contents.font.color = check_color($1)
    else
    # return to default color
    if $game_system.message.font_color != nil
    color = check_color($game_system.message.font_color)
    elsif $game_system.message.floating and $game_system.message.resize
    color = check_color(SPEECH_FONT_COLOR)
    else
    # use defaults
    color = Font.default_color
    end
    self.contents.font.color = color
    end
    # go to next text
    next
    end
    # If \G+ (Gold Window at the Top)
    if c == "\023"
    # Make gold window
    if @gold_window == nil
    @gold_window = Window_Gold.new
    @gold_window.x = 560 - @gold_window.width
    if $game_temp.in_battle
    @gold_window.y = 192
    else
    @gold_window.y = 32
    end
    @gold_window.opacity = self.opacity
    @gold_window.back_opacity = self.back_opacity
    end
    # Dont take up space in window, next character
    next
    end
    # If \G- (Gold Window at the Bottom)
    if c == "\024"
    # Make gold window
    if @gold_window == nil
    @gold_window = Window_Gold.new
    @gold_window.x = 560 - @gold_window.width
    if $game_temp.in_battle
    @gold_window.y = 192
    else
    @gold_window.y = 384
    end
    @gold_window.opacity = self.opacity
    @gold_window.back_opacity = self.back_opacity
    end
    # Dont take up space in window, next character
    next
    end
    # If \G
    if c == "\002"
    # Make gold window
    if @gold_window == nil
    @gold_window = Window_Gold.new
    @gold_window.x = 560 - @gold_window.width
    if $game_temp.in_battle
    @gold_window.y = 192
    else
    @gold_window.y = self.y >= 128 ? 32 : 384
    end
    @gold_window.opacity = self.opacity
    @gold_window.back_opacity = self.back_opacity
    end
    # go to next text
    next
    end
    # If \L
    if c == "\003"
    # toggle letter-by-letter mode
    @letter_by_letter = !@letter_by_letter
    # go to next text
    next
    end
    # If \S[n]
    if c == "\004"
    @text.sub!(/\[([0-9]+)\]/, "")
    speed = $1.to_i
    if speed >= 0
    @text_speed = speed
    # reset player skip after text speed change
    @player_skip = false
    end
    return
    end
    # If \D[n]
    if c == "\005"
    @text.sub!(/\[([0-9]+)\]/, "")
    delay = $1.to_i
    if delay >= 0
    @delay += delay
    # reset player skip after delay
    @player_skip = false
    end
    return
    end
    # If \!
    if c == "\006"
    # close message and return from method
    terminate_message
    return
    end
    # If \?
    if c == "\007"
    @wait_for_input = true
    return
    end
    # If \B or \b
    if c == "\010"
    # bold
    self.contents.font.bold = !self.contents.font.bold
    return
    end
    # If \I or \i
    if c == "\011"
    # italics
    self.contents.font.italic = !self.contents.font.italic
    return
    end
    if c == "\013"
    # display icon of item, weapon, armor or skill
    @text.sub!(/\[([IiWwAaSs])([0-9]+)\]/, "")
    case $1.downcase
    when "i"
    item = $data_items[$2.to_i]
    when "w"
    item = $data_weapons[$2.to_i]
    when "a"
    item = $data_armors[$2.to_i]
    when "s"
    item = $data_skills[$2.to_i]
    end
    if item == nil
    return
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(4+@x, 32*@y+4, bitmap, Rect.new(0, 0, 24, 24))
    @x += 24
    #self.contents.draw_text(x + 28, y, 212, 32, item.name)
    return
    end
    # if \*
    if c == "\014"
    if $scene.is_a?(Scene_Battle)
    # Set Variables in the Battle Interpreter to display Next Window
    $game_system.battle_interpreter.set_multi
    elsif $scene.is_a?(Scene_Map)
    # Set Variables in the Map Interpreter to display Next Window
    $game_system.map_interpreter.set_multi
    end
    return
    end
    # if ", " or ". " or "! " or "? " characters with spaces
    if c == "\015"
    if @auto_comma_pause and @letter_by_letter
    delay = @text_speed + @auto_comma_delay
    if delay >= 0
    @delay += delay
    # reset player skip after delay
    @player_skip = false
    end
    end
    return
    end
    # if \A (Auto Pause for Commas, Periods, Exclamation and Question Marks)
    if c == "\016"
    # toggle auto comma pause
    @auto_comma_pause = !@auto_comma_pause
    return
    end
    # if \F+ (Foot Forward Animation On)
    if c == "\020" and @float_id
    speaker = (@float_id > 0) ? $game_map.events[@float_id] : $game_player
    speaker.foot_forward_on
    # Dont take up space in window, next character
    next
    end
    # if \F- (Foot Forward Animation Off)
    if c == "\021" and @float_id
    speaker = (@float_id > 0) ? $game_map.events[@float_id] : $game_player
    speaker.foot_forward_off
    # Dont take up space in window, next character
    next
    end
    # if \F* (Foot Forward Animation On "Other" Foot)
    if c == "\022" and @float_id
    speaker = (@float_id > 0) ? $game_map.events[@float_id] : $game_player
    speaker.foot_forward_on(frame = 1)
    # Dont take up space in window, next character
    next
    end
    # If new line text
    if c == "\n"
    # Update cursor width if choice
    if @y >= $game_temp.choice_start
    width = $game_system.message.autocenter ? @line_widths[@y]+8 : @x
    @cursor_width = [@cursor_width, width].max
    end
    # Add 1 to y
    @y += 1
    if $game_system.message.autocenter and @text != ""
    @x = (self.width-40)/2 - @line_widths[@y]/2
    else
    @x = 0
    # Indent if choice
    if @y >= $game_temp.choice_start
    @x = 8
    end
    end
    # go to next text
    next
    end
    # Draw text
    self.contents.draw_text(4 + @x, 32 * @y, 40, 32, c)
    # Add x to drawn text width
    @x += self.contents.text_size( c ).width
    # add text speed to time to display next character
    @delay += @text_speed unless !@letter_by_letter or @player_skip
    return if @letter_by_letter and !@player_skip
    end
    end
    # If choice and window has choices set to be displayed
    if $game_temp.choice_max > 0 and @choice_window
    @item_max = $game_temp.choice_max
    self.active = true
    if $choice_index and $choice_index.is_a?(Integer) and
    $choice_index < $game_temp.choice_max
    self.index = $choice_index
    else
    self.index = 0
    end
    end
    # If number input and this window shows choices and no number window exists
    if $game_temp.num_input_variable_id > 0 and @choice_window and
    not @input_number_window
    digits_max = $game_temp.num_input_digits_max
    number = $game_variables[$game_temp.num_input_variable_id]
    @input_number_window = Window_InputNumber.new(digits_max)
    @input_number_window.set_font(@font_name, @font_size, @font_color)
    @input_number_window.number = number
    @input_number_window.x =
    if $game_system.message.autocenter
    offset = (self.width-40)/2-@line_widths[$game_temp.num_input_start]/2
    self.x + offset + 4
    else
    self.x + 8
    end
    @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end
    @update_text = false
    end

    def reset_window
    if $game_temp.in_battle
    self.y = 16
    else
    case $game_system.message_position
    when 0 # up
    self.y = 16
    when 1 # middle
    self.y = 160
    when 2 # down
    self.y = 304
    end
    end
    if $game_system.message_frame == 0
    self.opacity = 255
    else
    self.opacity = 0
    end
    # transparent speech balloons don't look right, so keep opacity at 255
    # self.back_opacity = 160
    @tail.opacity = 255
    end

    def update
    super
    # Terminate ANY Messages if Player too far away, useful for signs
    if $scene.is_a?(Scene_Map)
    if $game_system.map_interpreter.event_id != 0
    e_id = $game_system.map_interpreter.event_id
    ev = $game_map.events[e_id]
    if ev and $game_map.events[e_id].dist_kill
    if not ev.within_range?(ev.dist_kill, e_id) and
    not $game_player.move_route_forcing and
    $game_system.message.move_during
    # Player moved too far away so kill windows and event processing
    if @input_number_window != nil
    # Dispose of number input window
    @input_number_window.dispose
    @input_number_window = nil
    end
    # Terminate This Msg - Leave Others so each handles their @float_id
    terminate_message
    # 115 Breaks Event Processing
    $game_system.map_interpreter.command_115

    # If there is someone speaking
    if @float_id
    # Player
    # Note: No Move Continue because moving away
    # is a Player initiated Action
    if @float_id == 0
    # reset foot forward on speak stance
    if @auto_ff_reset and not $game_player.no_ff
    # Command to turn Foot Forward Poses Off
    $game_player.foot_forward_off
    end
    $game_player.allow_flip = false
    $game_player.preferred_loc = nil
    elsif @float_id > 0
    # reset foot forward on speak stance
    if @auto_ff_reset and not $game_map.events[@float_id].no_ff
    # Command to turn Foot Forward Poses Off
    $game_map.events[@float_id].foot_forward_off
    end
    # reset 'M'ove 'C'ontinue
    if @auto_move_continue and not $game_map.events[@float_id].no_mc
    # Continue doing what it was doing before
    event_to_reset = $game_map.events[@float_id]
    event_to_reset.event_move_continue(@float_id, true, 1)
    end
    $game_map.events[@float_id].allow_flip = false
    $game_map.events[@float_id].preferred_loc = nil
    end
    end
    # Instanced for this Msg Window, prevents calling Resets multiple times
    @auto_ff_reset = false
    # Turn off the Triggered Flag
    ev.allow_flip = false
    ev.preferred_loc = nil

    if $game_temp.message_text.compact.empty?
    ev.dist_kill = nil
    $game_system.map_interpreter.restore_mmw_vars
    #$game_map.need_refresh = true
    if not $game_map.events[e_id].no_mc
    $game_map.events[e_id].event_move_continue(e_id, true, 1)
    $game_system.map_interpreter.max_dist_id = nil
    end
    end
    # Load the Default Sound Settings because Player walked away
    $game_system.message.load_sound_settings
    end
    end
    end
    end

    # If fade in
    if @fade_in
    self.contents_opacity += 24
    if @input_number_window != nil
    @input_number_window.contents_opacity += 24
    end
    if self.contents_opacity == 255
    @fade_in = false
    end
    # allow text to be updated while window is fading in
    return if not $game_system.message.update_text_while_fading
    end
    # If inputting number
    if @input_number_window != nil
    @input_number_window.update
    # Confirm
    if Input.trigger?(Input::C)
    # Allows windows to be closed
    $game_temp.input_in_window = false
    # play sound effect
    $game_system.se_play($data_system.decision_se)
    # Set Variable to identify the Number Window was Cancelled
    $game_system.number_cancelled = false
    # if variable_id was lost, refer to backup
    if $game_temp.num_input_variable_id == 0
    $game_variables[$game_temp.num_input_variable_id_backup] =
    @input_number_window.number
    else
    $game_variables[$game_temp.num_input_variable_id] =
    @input_number_window.number
    end
    $game_map.need_refresh = true
    # Dispose of number input window
    @input_number_window.dispose
    @input_number_window = nil
    if $scene.message_window.size > 1
    for msg in $scene.message_window
    msg.terminate_message
    end
    else
    terminate_message
    end
    # Cancel, if allowed
    # *NOTE* - use "number_cancelled?" to checks if Cancel Button was pushed
    elsif Input.trigger?(Input::B) and
    $game_system.message.allow_cancel_numbers
    # play cancel sound effect
    $game_system.se_play($data_system.cancel_se)
    # Allows windows to be closed
    $game_temp.input_in_window = false
    # Set Variable to identify the Number Window was Cancelled
    $game_system.number_cancelled = true
    # Dispose of number input window
    @input_number_window.dispose
    @input_number_window = nil
    if $scene.message_window.size > 1
    for msg in $scene.message_window
    msg.terminate_message
    end
    else
    terminate_message
    end
    end
    # prevent terminating windows and destroying variables
    return
    end
    # If message is being displayed
    if @contents_showing
    # Confirm or cancel finishes waiting for input or message
    if Input.trigger?(Input::C) or Input.trigger?(Input::B)
    if @wait_for_input
    @wait_for_input = false
    self.pause = false
    elsif $game_system.message.skippable
    @player_skip = true
    end
    # Dont close the window if waiting for choices to be displayed
    if $game_temp.input_in_window and
    $game_temp.message_text.compact.size > 1 and
    not $input_window_wait
    # wait until next input to confirm any choices
    $input_window_wait = true
    return
    else
    $input_window_wait = false
    end
    end
    if need_reposition?
    reposition # update message position for character/screen movement
    if @contents_showing == false
    # i.e. if char moved off screen
    return
    end
    end
    if @update_text and !@wait_for_input
    if @delay == 0
    update_text
    else
    @delay -= 1
    end
    return
    end

    # If choice isn't being displayed, show pause sign
    if !self.pause and ($game_temp.choice_max == 0 or @wait_for_input)
    self.pause = true unless !$game_system.message.show_pause
    end
    # Cancel
    if Input.trigger?(Input::B)
    if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
    # Allow ALL windows to be closed
    $game_temp.input_in_window = false
    # Play Sound Effect
    $game_system.se_play($data_system.cancel_se)
    # Process the Choice
    $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
    # If multi window cancel choice
    if $scene.message_window.size > 1
    for msg in $scene.message_window
    msg.terminate_message
    end
    else
    terminate_message
    end
    end
    # personal preference: cancel button should also continue
    terminate_message
    end
    # Confirm
    if Input.trigger?(Input::C)
    # Allow ALL windows to be closed
    $game_temp.input_in_window = false
    # if choice is displayed in one of multiple windows
    if $game_temp.choice_max > 0
    if $scene.message_window.size > 1
    for i in 0...$scene.message_window.size
    if $scene.message_window[i].choice_window
    # return selection position by index of the choice window
    @index = $scene.message_window[i].index
    end
    end
    end
    $game_system.se_play($data_system.decision_se)
    $game_temp.choice_proc.call(self.index)
    end
    # If Preceeding Window not closed because choice displayed
    if $scene.message_window.size > 1
    choice = false
    for i in 0...$scene.message_window.size
    if $scene.message_window[i].choice_window
    choice = true
    break
    end
    end
    # If window is a choice window and other windows held open
    if choice
    # close all the message windows
    for msg in $scene.message_window
    msg.terminate_message
    end
    else
    # close the single message window
    terminate_message
    end
    else
    if $game_temp.choice_max > 0
    $game_system.se_play($data_system.decision_se)
    $game_temp.choice_proc.call(self.index)
    end
    terminate_message
    end
    end
    return
    end
    # If display wait message or choice exists when not fading out
    if @fade_out == false and $game_temp.message_text[@msgindex] != nil
    @contents_showing = true
    $game_temp.message_window_showing = true
    reset_window
    refresh
    Graphics.frame_reset
    self.visible = true
    if show_message_tail?
    @tail.visible = true
    elsif @tail.visible
    @tail.visible = false
    end
    self.contents_opacity = 0
    if @input_number_window != nil
    @input_number_window.contents_opacity = 0
    end
    @fade_in = true
    return
    end
    # If message which should be displayed is not shown, but window is visible
    if self.visible
    @fade_out = true
    self.opacity -= 96
    @tail.opacity -= 96 if @tail.opacity > 0
    if need_reposition?
    # update message position for character/screen movement
    reposition
    end
    if self.opacity == 0
    self.visible = false
    @fade_out = false
    @tail.visible = false if @tail.visible
    # have to check all windows before claiming that no window is showing
    if $game_temp.message_text.compact.empty?
    $game_temp.message_window_showing = false
    end
    end
    return
    end
    end

    #--------------------------------------------------------------------------
    # * Repositioning Determination
    #--------------------------------------------------------------------------
    def need_reposition?
    if !$game_temp.in_battle and $game_system.message.floating and
    $game_system.message.resize and @float_id != nil
    if $game_system.message.move_during and @float_id == 0 and
    (($game_player.last_real_x != $game_player.real_x) or
    ($game_player.last_real_y != $game_player.real_y))
    # player with floating message moved
    # (note that relying on moving? leads to "jumpy" message boxes)
    return true
    elsif ($game_map.last_display_y != $game_map.display_y) or
    ($game_map.last_display_x != $game_map.display_x)
    # player movement or scroll event caused the screen to scroll
    return true
    else
    char = $game_map.events[@float_id]
    if char != nil and
    ((char.last_real_x != char.real_x) or
    (char.last_real_y != char.real_y))
    # character moved
    return true
    end
    end
    end
    return false
    end

    #--------------------------------------------------------------------------
    # * Show Message Tail Determination
    #--------------------------------------------------------------------------
    def show_message_tail?
    if $game_system.message.show_tail and $game_system.message.floating and
    $game_system.message.resize and $game_system.message_frame == 0 and
    @float_id != nil
    return true
    end
    return false
    end

    def update_cursor_rect
    if @index >= 0
    n = $game_temp.choice_start + @index
    if $game_system.message.autocenter
    x = 4 + (self.width-40)/2 - @cursor_width/2
    else
    x = 8
    end
    self.cursor_rect.set(x, n * 32, @cursor_width, 32)
    else
    self.cursor_rect.empty
    end
    end

    end

    #------------------------------------------------------------------------------

    class Game_Character
    attr_reader :last_real_x # last map x-coordinate
    attr_reader :last_real_y # last map y-coordinate
    attr_accessor :move_frequency # allows resetting if interrupted
    attr_accessor :allow_flip # if event was triggered by player
    attr_accessor :preferred_loc # triggered after Msg Reposition

    alias heretic_game_ch_mmw_initialize initialize
    def initialize
    # Original
    heretic_game_ch_mmw_initialize
    # Used with Flip and Sticky Options...
    @preferred_loc = nil
    end

    alias wachunga_game_char_update update
    def update
    @last_real_x = @real_x
    @last_real_y = @real_y
    wachunga_game_char_update
    end

    def within_range?(range = 4, id = @event_id)
    e = $game_map.events[id]
    radius = (Math.hypot((e.x - $game_player.x), (e.y - $game_player.y))).abs
    #BAWLZ
    return (range >= radius)
    end

    #----------------------------------------------------------------------------
    # * Allows Animation Change regardless of Direction
    #----------------------------------------------------------------------------

    unless self.method_defined?('foot_forward_on')
    def foot_forward_on(frame = 0)
    return if @direction_fix or !@walk_anime or @step_anime or
    $game_temp.in_battle
    if frame == 0
    case @direction
    when 2
    @pattern = 3
    when 4, 6, 8
    @pattern = 1
    else
    @pattern = 0
    end
    @original_pattern = @pattern
    refresh
    elsif frame == 1
    case @direction
    when 2
    @pattern = 1
    when 4, 6, 8
    @pattern = 3
    else
    @pattern = 0
    end
    @original_pattern = @pattern
    refresh
    end
    end

    def foot_forward_off
    # If called by walking off screen, dont affect a Sign or Stepping Actor
    return if $game_temp.in_battle or @direction_fix or !@walk_anime or @no_ff
    @pattern, @original_pattern = 0, 0
    end
    end

    # Call from Event Editor => Scripts
    # DO NOT call from Set Move Route => Scripts
    def event_move_continue(event_id, valid = false, alt = false)
    # return if Event has a No 'M'ove 'C'ontinue flag
    return if @no_mc
    # Restore Original Move Route if Event went off the screen while talking
    # This may be buggy if multiple event pages are used
    if @ff_original_move_route != nil and valid
    # Release forced move route
    @move_route_forcing = false
    # Restore original values
    @move_speed = @ff_original_move_speed
    @move_frequency = @ff_original_move_frequency
    @move_route = @ff_original_move_route
    @move_route_index = @ff_original_move_route_index
    # Release storing variables
    @ff_original_move_index = nil
    @ff_original_move_speed = nil
    @ff_original_move_frequency = nil
    @ff_original_move_route = nil
    @original_move_route = nil
    @original_move_route_index = nil
    elsif @original_move_route != nil and valid and alt
    # Release forced move route
    @move_route_forcing = false
    @move_route = @original_move_route
    @move_route_index = @original_move_route_index
    @original_move_route = nil
    @original_move_route_index = nil
    end
    end

    unless self.method_defined?('heretic_mmw_lock')
    alias heretic_mmw_lock lock
    alias heretic_mmw_unlock unlock
    end

    def lock
    # Call Original
    heretic_mmw_lock
    # Store Movement Variables in case player walks away
    @ff_original_move_route_index = @move_route_index
    @ff_original_move_speed = @move_speed
    @ff_original_move_frequency = @move_frequency
    @ff_original_move_route = @move_route
    # Store Variable that Event was Triggered by Player
    @allow_flip = true
    end

    def unlock
    # Call Original
    heretic_mmw_unlock
    # Unset Variable that Event was Triggered by Player
    @allow_flip = false
    @preferred_loc = nil
    # Reset Player as well...
    $game_player.allow_flip = false
    $game_player.preferred_loc = nil
    $game_player.sticky = false

    # Unset any possible dist kill flags
    if $game_temp.message_text.compact.empty?
    $game_map.events[@id].dist_kill = nil if @id
    $game_system.map_interpreter.max_dist_id = nil
    end

    # Reset Choice Index
    $choice_index = 0

    # Loads the Default Sound Settings at the End of Event Interaction
    $game_system.message.load_sound_settings if $game_system.message.sound
    end

    end

    #------------------------------------------------------------------------------

    class Game_Player < Game_Character

    attr_accessor :sticky # Used for Positioning Msg Bubbles

    alias wachunga_mmw_game_player_update update
    def update
    # The conditions are changed so the player can move around while messages
    # are showing (if move_during is true), but not if user is making a
    # choice or inputting a number
    # Note that this check overrides the default one (later in the method)
    # because it is more general
    unless moving? or
    @move_route_forcing or
    ($game_system.map_interpreter.running? and
    !$game_temp.message_window_showing) or
    ($game_temp.message_window_showing and
    !$game_system.message.move_during) or
    ($game_temp.choice_max > 0 or $game_temp.num_input_digits_max > 0)
    update_player_movement
    end
    wachunga_mmw_game_player_update
    end

    end

    #------------------------------------------------------------------------------

    class Game_Temp
    alias wachunga_mmw_game_temp_initialize initialize
    def initialize
    wachunga_mmw_game_temp_initialize
    @message_text = []
    @message_proc = []
    end
    end

    #------------------------------------------------------------------------------

    class Sprite_Battler < RPG::Sprite
    # necessary for positioning messages relative to battlers
    attr_reader :height
    attr_reader :width
    end

    #------------------------------------------------------------------------------

    class Scene_Battle
    # necessary for accessing actor/enemy sprites in battle
    attr_reader :spriteset
    end

    #------------------------------------------------------------------------------

    class Spriteset_Battle
    # necessary for accessing actor/enemy sprites in battle
    attr_reader :actor_sprites
    attr_reader :enemy_sprites
    end

    #------------------------------------------------------------------------------

    class Scene_Map
    attr_accessor :message_window
    # SDK Compatability
    if Module.constants.include?('SDK')
    def main_draw
    # Make sprite set
    @spriteset = Spriteset_Map.new
    # Make message window
    @message_window = []
    @message_window[0] = Window_Message.new(0)
    # Transition run
    Graphics.transition
    end

    alias wachunga_mmw_scene_map_main_dispose main_dispose
    def main_dispose
    wachunga_mmw_scene_map_main_dispose
    for mw in @message_window
    mw.dispose
    end
    end

    def update_graphics
    # Update sprite set
    @spriteset.update
    # Update message window
    for mw in @message_window
    mw.update
    end
    end
    end

    #--------------------------------------------------------------------------
    # * Scene_Map - New Message Window Addition
    #--------------------------------------------------------------------------
    def new_message_window(index)
    if @message_window[index] != nil
    # clear message windows at and after this index
    last_index = @message_window.size - 1
    last_index.downto(index) do |i|
    if @message_window[i] != nil
    @message_window[i].dispose
    @message_window[i] = nil
    end
    end
    @message_window.compact!
    end
    new_message = Window_Message.new(index)
    @message_window.push(new_message)
    end

    end

    #------------------------------------------------------------------------------

    class Scene_Battle
    attr_accessor :message_window

    # If SDK is installed
    if Module.constants.include?('SDK')
    def main_windows
    # Make other windows
    @party_command_window = Window_PartyCommand.new
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @status_window = Window_BattleStatus.new
    @message_window = []
    @message_window[0] = Window_Message.new(0)
    end

    def main_dispose
    # Dispose of windows
    @actor_command_window.dispose
    @party_command_window.dispose
    @help_window.dispose
    @status_window.dispose
    for mw in @message_window
    mw.dispose
    end
    @skill_window.dispose unless @skill_window == nil
    @item_window.dispose unless @item_window == nil
    @result_window.dispose unless @result_window == nil
    # Dispose of sprite set
    @spriteset.dispose
    $choice_index = 0
    end

    def update_objects
    # Update windows
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    for mw in @message_window
    mw.update
    end
    # Update sprite set
    @spriteset.update
    end

    # End SDK / Non SDK Compatability Test
    end

    #--------------------------------------------------------------------------
    # * Scene_Battle - New Message Window Addition
    #--------------------------------------------------------------------------
    def new_message_window(index)
    if @message_window[index] != nil
    # clear message windows at and after this index
    last_index = @message_window.size - 1
    last_index.downto(index) do |i|
    if @message_window[i] != nil
    @message_window[i].dispose
    @message_window[i] = nil
    end
    end
    @message_window.compact!
    end
    @message_window.push(Window_Message.new(index))
    end

    end

    #------------------------------------------------------------------------------

    class Game_System
    attr_accessor :number_cancelled # Allows detection if a Number Input Cancel
    attr_accessor :mmw_text # Holds Strings to show in Msgs \v[Tn]
    attr_reader :message # Shortcut, allows message without $game_

    alias wachunga_mmw_game_system_init initialize
    def initialize
    wachunga_mmw_game_system_init
    @message = Game_Message.new
    # allows detection if a Number Input was Cancelled
    @number_cancelled = false
    # Holds Strings to show in Msgs
    @mmw_text = []
    end
    end

    #------------------------------------------------------------------------------

    class Interpreter
    attr_reader :event_id
    attr_reader :list
    attr_accessor :index
    attr_accessor :max_dist_id

    alias wachunga_mmw_interp_setup setup
    def setup(list, event_id)
    wachunga_mmw_interp_setup(list, event_id)
    # index of window for the message
    @msgindex = 0
    # whether multiple messages are displaying
    @multi_message = false
    # Id of Event that is using set_max_dist
    @max_dist_id = nil
    end

    def setup_choices(parameters)
    # Set Select Window to Active
    $scene.message_window[@msgindex].active = true
    # Set choice item count to choice_max
    $game_temp.choice_max = parameters[0].size
    # Set choice to message_text
    for text in parameters[0]
    # just add index for array
    $game_temp.message_text[@msgindex] += text + "\n"
    end
    # Set cancel processing
    $game_temp.choice_cancel_type = parameters[1]
    # Set callback
    current_indent = @list[@index].indent
    $game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
    end

    # Not sure if this will be useful, leaving undocumented for now
    def event_move_continue(event_id)
    $game_map.events[event_id].event_move_continue(event_id, true)
    end

    def number_cancelled?
    return $game_system.number_cancelled
    end

    def set_multi
    # Setting these two variables causes the Next Message to be displayed.
    @multi_message = true
    @message_waiting = false
    end

    #--------------------------------------------------------------------------
    # * Show Text
    #--------------------------------------------------------------------------
    def command_101
    # If other text has been set to message_text
    if $game_temp.message_text[@msgindex] != nil
    if @multi_message
    @msgindex += 1
    $scene.new_message_window(@msgindex)
    else
    # End
    return false
    end
    end
    @msgindex = 0 if !@multi_message
    @multi_message = false
    # Set message end waiting flag and callback
    @message_waiting = true
    # just adding indexes
    $game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
    # Set message text on first line
    $game_temp.message_text[@msgindex] = @list[@index].parameters[0] + "\n"
    # Start Message on Line 1
    line_count = 1
    # Loop
    loop do
    # If next event command text is on the second line or after
    if @list[@index+1].code == 401
    # Add the second line or after to message_text
    # just adding index
    $game_temp.message_text[@msgindex]+=@list[@index+1].parameters[0]+"\n"
    line_count += 1
    # If event command is not on the second line or after
    else
    # If next event command is show choices
    if @list[@index+1].code == 102
    # If choices fit on screen
    if @list[@index+1].parameters[0].size <= 4 - line_count
    # Prevent the closure of a single window with multiple windows
    $game_temp.input_in_window = true
    # Flag this window as having choices displayed for multi
    $scene.message_window[@msgindex].choice_window = @msgindex
    # Advance index
    @index += 1
    # Choices setup
    $game_temp.choice_start = line_count
    setup_choices(@list[@index].parameters)
    end
    # If next event command is input number
    elsif @list[@index+1].code == 103
    # If number input window fits on screen
    if line_count < 4
    # Prevent the closure of a single window with multiple windows
    $game_temp.input_in_window = true
    # Flag this window as having choices displayed
    $scene.message_window[@msgindex].choice_window = @msgindex
    # Advance index
    @index += 1
    # Number input setup
    $game_temp.num_input_start = line_count
    $game_temp.num_input_variable_id = @list[@index].parameters[0]
    $game_temp.num_input_digits_max = @list[@index].parameters[1]
    $game_temp.num_input_variable_id_backup =
    @list[@index].parameters[0]
    end
    # start multimessage if next line is "Show Text" starting with "\+"
    elsif @list[@index+1].code == 101
    if @list[@index+1].parameters[0][0..1]=="\\+"
    @multi_message = true
    @message_waiting = false
    end
    end
    # Continue
    return true
    end
    # Advance index
    @index += 1
    end
    end

    #--------------------------------------------------------------------------
    # * Show Choices
    #--------------------------------------------------------------------------
    def command_102
    # Prevent the closure of a single window with multiple windows
    $game_temp.input_in_window = true
    # Flag this window as having choices displayed for multi
    $scene.message_window[@msgindex].choice_window = @msgindex
    # If text has been set to message_text
    # just adding index
    if $game_temp.message_text[@msgindex] != nil
    # End
    return false
    end
    # Set message end waiting flag and callback
    @message_waiting = true
    # adding more indexes
    $game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
    # Choices setup
    $game_temp.message_text[@msgindex] = ""
    $game_temp.choice_start = 0
    setup_choices(@parameters)
    # Continue
    return true
    end

    #--------------------------------------------------------------------------
    # * Input Number
    #--------------------------------------------------------------------------
    def command_103
    # Prevent the closure of a single window with multiple windows
    $game_temp.input_in_window = true
    # Flag this window as having choices displayed
    $scene.message_window[@msgindex].choice_window = @msgindex
    # If text has been set to message_text
    # just adding index
    if $game_temp.message_text[@msgindex] != nil
    # End
    return false
    end
    # Set message end waiting flag and callback
    @message_waiting = true
    # adding more indexes
    $game_temp.message_proc[@msgindex] = Proc.new { @message_waiting = false }
    # Number input setup
    $game_temp.message_text[@msgindex] = ""
    $game_temp.num_input_start = 0
    $game_temp.num_input_variable_id = @parameters[0]
    $game_temp.num_input_digits_max = @parameters[1]
    $game_temp.num_input_variable_id_backup = @list[@index].parameters[0]
    # Continue
    return true
    end

    #--------------------------------------------------------------------------
    # * Script
    #--------------------------------------------------------------------------
    # Fix for RMXP bug: call script boxes that return false hang the game
    # See, e.g., http://rmxp.org/forums/showthread.php?p=106639
    #--------------------------------------------------------------------------
    def command_355
    # Set first line to script
    script = @list[@index].parameters[0] + "\n"
    # Loop
    loop do
    # If next event command is second line of script or after
    if @list[@index+1].code == 655
    # Add second line or after to script
    script += @list[@index+1].parameters[0] + "\n"
    # If event command is not second line or after
    else
    # Abort loop
    break
    end
    # Advance index
    @index += 1
    end
    # Evaluation
    result = eval(script)
    # If return value is false
    if result == false
    # End
    #return false
    end
    # Continue
    return true
    end

    def message
    $game_system.message
    end

    def within_range?(range = 4, id = @event_id)
    e = $game_map.events[id]
    radius = (Math.hypot((e.x - $game_player.x), (e.y - $game_player.y))).abs
    return (radius <= range)
    end

    unless self.method_defined?('heretic_mmw_command_209')
    alias heretic_mmw_command_202 command_202
    alias heretic_mmw_command_209 command_209
    end

    #--------------------------------------------------------------------------
    # * Set Event Location
    #--------------------------------------------------------------------------
    def command_202
    # Run the Original
    heretic_mmw_command_202
    # Get character
    character = get_character(@parameters[0])
    # If no character exists, Player is still checked...
    if character == nil
    # Continue
    return true
    end
    if @event_id != 0
    $game_map.events[@event_id].allow_flip = false
    $game_map.events[@event_id].preferred_loc = nil
    end
    # Return that the command has run...
    return true
    end
    #--------------------------------------------------------------------------
    # * Set Move Route
    #--------------------------------------------------------------------------
    def command_209
    # Run the Original
    heretic_mmw_command_209
    # Get character
    character = get_character(@parameters[0])
    # If no character exists, Player is still checked...
    if character == nil
    # Continue
    return true
    end
    if @parameters[1]
    # Any Movement Related Commands, Turn Commands and Others are Ignored
    codes = *[1..14]
    # Scripts from Caterpillar that cause Movement in NPC's
    commands = ['move_toward_event','move_away_from_event']
    # Check the List of Move Commands to see if they are Movement Related...
    for command in @parameters[1].list
    if codes.include?(command.code) and @event_id != 0
    $game_map.events[@event_id].allow_flip = false
    $game_map.events[@event_id].preferred_loc = nil
    # quit iterating
    return true
    elsif command.code == 45
    script = command.parameters[0]
    for string in commands
    found = false
    script.sub(string) {found = true}
    if found and @event_id != 0
    $game_map.events[@event_id].allow_flip = false if found
    $game_map.events[@event_id].preferred_loc = nil if found
    # quit iterating
    return true
    end
    end
    end
    end
    end
    end

    def set_max_dist(dist)
    return if not $scene.is_a?(Scene_Map)
    $game_map.events[@event_id].dist_kill = dist if dist.is_a?(Numeric)
    # If Max Distance is 0 and Location is NOT Passable when triggered
    if $game_map.events[@event_id].dist_kill == 0 and
    (!$game_map.passable?($game_map.events[@event_id].x,
    $game_map.events[@event_id].y,
    0) or
    ($game_map.events[@event_id].character_name != "" and
    !$game_map.events[@event_id].through))
    # Bump it up to 1 because 0 doesnt work for non passable triggers
    $game_map.events[@event_id].dist_kill = 1
    end

    # Prevent closing at a distance for other NPC's that might be speaking...
    @max_dist_id = event_id
    # Save MMW Configuration in case of a Walk Away...
    save_mmw_vars
    end

    def save_mmw_vars
    # Window Skin
    @windowskin_name_save = $game_system.windowskin_name
    # MMW Variables
    @mmw_vars_saved = true
    @mmw_letter_by_letter = $game_system.message.letter_by_letter
    @mmw_text_speed = $game_system.message.text_speed
    @mmw_text_speed_player = $game_system.message.text_speed_player
    @mmw_skippable = $game_system.message.skippable
    @mmw_resize = $game_system.message.resize
    @mmw_floating = $game_system.message.floating
    @mmw_autocenter = $game_system.message.autocenter
    @mmw_show_tail = $game_system.message.show_tail
    @mmw_show_pause = $game_system.message.show_pause
    @mmw_move_during = $game_system.message.move_during
    @mmw_location = $game_system.message.location
    @mmw_font_name = $game_system.message.font_name
    @mmw_font_size = $game_system.message.font_size
    @mmw_font_color = $game_system.message.font_color
    @mmw_auto_comma_pause = $game_system.message.auto_comma_pause
    @mmw_auto_comma_delay = $game_system.message.auto_comma_delay
    @mmw_allow_cancel_numbers = $game_system.message.allow_cancel_numbers
    @mmw_update_text_while_fading=$game_system.message.update_text_while_fading
    @mmw_auto_ff_reset = $game_system.message.auto_ff_reset
    @mmw_auto_move_continue = $game_system.message.auto_move_continue
    @mmw_dist_exit = $game_system.message.dist_exit
    @mmw_dist_max = $game_system.message.dist_max
    @mmw_allow_offscreen = $game_system.message.allow_offscreen
    @mmw_reposition_on_turn = $game_system.message.reposition_on_turn
    @mmw_sticky = $game_system.message.sticky
    # Sound Stuff
    @mmw_sound = $game_system.message.sound
    @mmw_sound_volume = $game_system.message.sound_volume
    @mmw_sound_pitch = $game_system.message.sound_pitch
    @mmw_sound_pitch_range = $game_system.message.sound_pitch_range
    @mmw_sound_vary_pitch = $game_system.message.sound_vary_pitch
    @mmw_sound_frequency = $game_system.message.sound_frequency
    end

    def restore_mmw_vars
    if @mmw_vars_saved
    # Windowskin - Used with Different Backgrounds on Signs
    $game_system.windowskin_name = @windowskin_name_save
    # MMW Variables
    $game_system.message.letter_by_letter = @mmw_letter_by_letter
    $game_system.message.text_speed = @mmw_text_speed
    $game_system.message.text_speed_player = @mmw_text_speed_player
    $game_system.message.skippable = @mmw_skippable
    $game_system.message.resize = @mmw_resize
    $game_system.message.floating = @mmw_floating
    $game_system.message.autocenter = @mmw_autocenter
    $game_system.message.show_tail = @mmw_show_tail
    $game_system.message.show_pause = @mmw_show_pause
    $game_system.message.move_during = @mmw_move_during
    $game_system.message.location = @mmw_location
    $game_system.message.font_name = @mmw_font_name
    $game_system.message.font_size = @mmw_font_size
    $game_system.message.font_color = @mmw_font_color
    $game_system.message.auto_comma_pause = @mmw_auto_comma_pause
    $game_system.message.auto_comma_delay = @mmw_auto_comma_delay
    $game_system.message.allow_cancel_numbers = @mmw_allow_cancel_numbers
    $game_system.message.update_text_while_fading=@mmw_update_text_while_fading
    $game_system.message.auto_ff_reset = @mmw_auto_ff_reset
    $game_system.message.auto_move_continue = @mmw_auto_move_continue
    $game_system.message.dist_exit = @mmw_dist_exit
    $game_system.message.dist_max = @mmw_dist_max
    $game_system.message.allow_offscreen = @mmw_allow_offscreen
    $game_system.message.reposition_on_turn = @mmw_reposition_on_turn
    $game_system.message.sticky = @mmw_sticky
    # Sound Stuff
    $game_system.message.sound = @mmw_sound
    $game_system.message.sound_volume = @mmw_sound_volume
    $game_system.message.sound_pitch = @mmw_sound_pitch
    $game_system.message.sound_pitch_range = @mmw_sound_pitch_range
    $game_system.message.sound_vary_pitch=@mmw_sound_vary_pitch
    $game_system.message.sound_frequency = @mmw_sound_frequency
    end
    end
    end

    #------------------------------------------------------------------------------

    class Game_Map
    attr_accessor :last_display_x # last display x-coord * 128
    attr_accessor :last_display_y # last display y-coord * 128

    alias wachunga_mmw_game_map_update update
    def update
    @last_display_x = @display_x
    @last_display_y = @display_y
    wachunga_mmw_game_map_update
    end

    # This was removed because it requires the SDK

    #def name
    # return load_data('Data/MapInfos.rxdata')[@map_id].name
    #end

    # Removes some of the need for the SDK

    # NOTE: This is also defined in Caterpillar, which doesnt require the SDK

    #----------------
    # * Name
    #----------------
    @@map_info = load_data("Data/MapInfos.rxdata")

    def name(id = @map_id)
    return @@map_info[id].name
    end

    end

    #------------------------------------------------------------------------------

    # Note: I know this is a crappy way to do it, but I cant figure out another
    # way to prevent the loss of data when showing a number input with multiple
    # windows being displayed. It destroys the data before it can call the data
    # so just creating a backup of that data. It works, thats all I care.

    class Game_Temp
    attr_accessor :num_input_variable_id_backup # prevents variable loss
    attr_accessor :input_in_window # prevents window closures

    #--------------------------------------------------------------------------
    # * Object Initialization
    #--------------------------------------------------------------------------
    unless self.method_defined?('heretic_number_window_backup_initialize')
    alias heretic_number_window_backup_initialize initialize
    end

    def initialize
    # Call Original
    heretic_number_window_backup_initialize
    @num_input_variable_id_backup = 0
    @input_in_window = false
    end
    end

    #------------------------------------------------------------------------------

    class Bitmap

    attr_accessor :orientation

    #--------------------------------------------------------------------------
    # * Rotation Calculation
    #--------------------------------------------------------------------------
    def rotation(target)
    return if not [0, 90, 180, 270].include?(target) # invalid orientation
    if @rotation != target
    degrees = target - @orientation
    if degrees < 0
    degrees += 360
    end
    rotate(degrees)
    end
    end

    #--------------------------------------------------------------------------
    # * Rotate Square (Clockwise)
    #--------------------------------------------------------------------------
    def rotate(degrees = 90)
    # method originally by SephirothSpawn
    # would just use Sprite.angle but its rotation is buggy
    # (see http://www.rmxp.org/forums/showthread.php?t=12044)
    return if not [90, 180, 270].include?(degrees)
    copy = self.clone
    if degrees == 90
    # Passes Through all Pixels on Dummy Bitmap
    for i in 0...self.height
    for j in 0...self.width
    self.set_pixel(width - i - 1, j, copy.get_pixel(j, i))
    end
    end
    elsif degrees == 180
    for i in 0...self.height
    for j in 0...self.width
    self.set_pixel(width - j - 1, height - i - 1, copy.get_pixel(j, i))
    end
    end
    elsif degrees == 270
    for i in 0...self.height
    for j in 0...self.width
    self.set_pixel(i, height - j - 1, copy.get_pixel(j, i))
    end
    end
    end
    @orientation = (@orientation + degrees) % 360
    end

    end

    #------------------------------------------------------------------------------

    class Window_Base

    #--------------------------------------------------------------------------
    # * Check Color
    # color : color to check
    #--------------------------------------------------------------------------
    def check_color(color)
    if color.type == Color
    # already a Color object
    return color
    elsif color[0].chr == "#"
    # specified as hexadecimal
    r = color[1..2].hex
    g = color[3..4].hex
    b = color[5..6].hex
    return Color.new(r,g,b)
    else
    # specified as integer (0-7)
    color = color.to_i
    if color >= 0 and color <= 7
    return text_color(color)
    end
    end
    return normal_color
    end

    end

    #------------------------------------------------------------------------------

    class Window_InputNumber < Window_Base

    def set_font(fname, fsize, fcolor)
    return if fname == nil and fsize == nil and fcolor == nil
    # Calculate cursor width from number width
    dummy_bitmap = Bitmap.new(32, 32)
    dummy_bitmap.font.name = fname
    dummy_bitmap.font.size = fsize
    @cursor_width = dummy_bitmap.text_size("0").width + 8
    dummy_bitmap.dispose
    self.width = @cursor_width * @digits_max + 32
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = fname
    self.contents.font.size = fsize
    self.contents.font.color = check_color(fcolor)
    refresh
    update_cursor_rect
    end

    def refresh
    self.contents.clear
    #self.contents.font.color = normal_color
    s = sprintf("%0*d", @digits_max, @number)
    for i in 0...@digits_max
    self.contents.draw_text(i * @cursor_width + 4, 0, 32, 32, s[i,1])
    end
    end

    end

    #------------------------------------------------------------------------------
    # * End SDK Enable Test
    #------------------------------------------------------------------------------
    #end

    #==============================================================================
    # ** Window_Base
    #------------------------------------------------------------------------------
    # This class is for all in-game windows.
    #==============================================================================

    class Window_Base < Window
    #--------------------------------------------------------------------------
    # * Frame Update - Redefinition - Added Aug 31st, 2013
    #
    # This fixes a Visual Bug where a Windowskin will change on you when
    # a Non Floating Message Window is Fading Out. The NEXT Message will
    # have the newly set Windowskin applied.
    #--------------------------------------------------------------------------
    def update
    super
    # Reset if windowskin was changed
    if $game_system.windowskin_name != @windowskin_name
    # Prevents changing Message Windowskin until Next Message
    if not self.is_a?(Window_Message)
    @windowskin_name = $game_system.windowskin_name
    self.windowskin = RPG::Cache.windowskin(@windowskin_name)
    end
    end
    end
    end

    # MMW SDK / Non-SDK Patch

    # If SDK is not installed
    if not Module.constants.include?('SDK')

    # Use this script to disable Multiple Message Windows SDK Requirements

    #=============================================================================
    # ** Game_Multi_Message
    #-----------------------------------------------------------------------------
    # This class handles the actor array. Refer to "$game_actors" for each
    # instance of this class.
    #=============================================================================

    class Game_Multi_Message
    #--------------------------------------------------------------------------
    # * Data
    #--------------------------------------------------------------------------
    def initialize() @data = [] end
    def [](id) @data[id] end
    def []=(id,val) @data[id] = val end
    def update() @data.each {|s| s.respond_to?(:update) && s.update } end
    def dispose() @data.each {|s| s.respond_to?(:dispose) && s.dispose } end
    #--------------------------------------------------------------------------
    # ● Method Missing
    #--------------------------------------------------------------------------
    def method_missing(val,*args,&block)
    return @data.send(val.to_s,*args,&block) if @data.respond_to?(val.to_sym)
    text = "Undefined method #{val} at #{self.inspect}"
    raise(NoMethodError, text, caller(1))
    end
    end

    #=============================================================================
    # ** Scene_Map
    #-----------------------------------------------------------------------------
    # This class performs map screen processing.
    #=============================================================================
    class Scene_Map
    #--------------------------------------------------------------------------
    # ● Alias Listing
    #--------------------------------------------------------------------------
    $@ || alias_method(:mmw_sdk_patch_update, :update)
    #--------------------------------------------------------------------------
    # ● Main Dispose
    #--------------------------------------------------------------------------
    method_defined?(:main_dispose) or define_method(:main_dispose) {0}
    #--------------------------------------------------------------------------
    # ● Frame Update
    #--------------------------------------------------------------------------
    def update(*args)
    unless @message_window.is_a?(Game_Multi_Message)
    @message_window.respond_to?(:dispose) && @message_window.dispose
    @message_window = Game_Multi_Message.new
    @message_window[0] = Window_Message.new(0)
    end
    mmw_sdk_patch_update(*args)
    end
    end

    #=============================================================================
    # ** Scene_Battle
    #-----------------------------------------------------------------------------
    # This class performs battle screen processing.
    #=============================================================================
    class Scene_Battle
    #--------------------------------------------------------------------------
    # ● Alias Listing
    #--------------------------------------------------------------------------
    $@ || alias_method(:mmw_sdk_patch_update, :update)
    #--------------------------------------------------------------------------
    # ● Frame Update
    #--------------------------------------------------------------------------
    def update(*args)
    unless @message_window.is_a?(Game_Multi_Message)
    @message_window.respond_to?(:dispose) && @message_window.dispose
    @message_window = Game_Multi_Message.new
    @message_window[0] = Window_Message.new(0)
    end
    mmw_sdk_patch_update(*args)
    end
    end

    #=============================================================================
    # ** Game_Player
    #-----------------------------------------------------------------------------
    # This class handles the player. Its functions include event starting
    # determinants and map scrolling. Refer to "$game_player" for the one
    # instance of this class.
    #=============================================================================
    class Game_Player
    #--------------------------------------------------------------------------
    # * Player Movement Update
    #--------------------------------------------------------------------------
    unless method_defined?(:update_player_movement)
    def update_player_movement
    case Input.dir4
    when 2 then move_down
    when 4 then move_left
    when 6 then move_right
    when 8 then move_up
    end
    end
    end
    end

    end # End SDK Not Installed
  • [/rgss]

[/spoiler]

 

Then I have another problem with the Daily Life... MP marked her lightsources with "Lightsource:r16", "Lightsource:p72,48" and others of this kind. I guess the :r and :P is for define the flickering of the light, but what does the number mean?

Sadly she/he didn't guide through her scripts and demos. So I don't understand that.

 

It would be really nice, if someone could help me with my two problems.

 

Bye, Gaudete

Gaudete published a Forum Topic in Forums / Introductions and Farewells


4 days ago     4 Comments     76 Views

Gaudete is here

Hey together,

it's me Gaudete and I'm working with the RPG Maker XP for a few years now. But I was never able to finish a project (game or book) until now. My current project "Wanderjahr" or in English "Year of Travel" is full of my ideas for a big (and maybe to complex) world full of magic, war and bugs. Nasty bugs with the events and scripts....

 

Hopfully I can find the solution for my current and coming problems here at Game Dev Unlimited ;)

 

Greetings from Gaudete

cdaz published a Forum Topic in Forums / RPG Maker XP Support


5 days ago     5 Comments     73 Views

Show Variable on Screen with Event ?

I try to search Script for this but can't found one.

So I try to made it by Event.

 

I made Picture of Number 0-9.

 

Create an Event with Condition brunch to check if this variable (Named Killing Spree) = 0 Show Picture'0'

if this variable (Named Killing Spree) = 1 Show Picture'1' blah blah .

 

But the problem is when The variable reached to ten.

 

I don't know how to made how to reset Ones Place number to 10.

Same as Tens Place I don't know how to reset it to 0 when reached at 100.

 

And... another queastion this is not serious problem but I just curious.

why I can't use "Equal or Less" and "Equal or Greater"

When I try to make [if Killing Spree < 10] Show 0 (at Tens Place) ,[if Killing Spree >=10] Show 1 then it's not work.

But when I change to [if Killing Spree >9] it work with out problem.

 

I'm pretty sure I was use <=,>= a lot of time in my C# class at college but it never work on RMXP.
(I has this problem when I try to made my custome HP Gauge to)

Ardaceus published a Forum Topic in Forums / Entertainment & Media


1 week ago     2 Comments     83 Views

Who Is Your Favourite Composer

I want to make a list of awesome orchestral music, but I don't know of many composers whom make awesome soundtrack pieces. So I thought, "Why the hell not make a discussion topic on these forums about what our favourite composers are." and here I am.

 

My favourite composer without a doubt is Mattia Cupelli. He makes such awesome music scores, and he has made some soundtracks for movies like The Man of Steel and Interstellar. He captivates me with every single second that the music he makes plays. It's amazing to hear him out on your first time around.

 

I started out with a piece called "Love Lost" http://www.youtube.com/watch?v=LcWVZToz3hI

Then it went on to a piece called "Sparks" http://www.youtube.com/watch?v=Uaj7oou_HvU

And I was bought when I came to "Leaf" http://www.youtube.com/watch?v=rBeuQcChw9E

 

You must listen.

 

So what is your favourite composer? And stay away from pop, dubstep, rock, goth, techno, remixes, stuff like that.

NightmareFelix published a Forum Topic in Forums / RPG Maker XP Support


1 week ago     0 Comments     69 Views

Script Clashing Problem - Kellessdee's Dynamic Lighting and Near Fantastica's Anti-Lag

Hi, folks. I'm running into a bit of a scripting clash that I'm not entirely sure how to fix or what's causing it.

 

I've been using Kellessdee's Dynamic Lighting script for ages, but in certain areas where I've got a lot of events there's tons of lag. So I added Near Fantastica's Anti-Lag script, and it works great.

 

EXCEPT that there's something wrong in regards to refreshing the page while scrolling, and the dynamic lighting effects no longer scroll with their respective light sources, they just stay put on the screen.

NightmareFelix published a Forum Topic in Forums / Established Games


1 week ago     0 Comments     94 Views

[FULL GAME] Hollow Creek Stories: Felix's Nightmare

Hollow Creek Stories: Felix's Nightmare

 

icon-19859.png

 

After a lengthy development cycle and a strange sort of release purgatory, I finally present you with Black City Studios' flagship title, Hollow Creek Stories: Felix's Nightmare, now available to play for free in its full game format!

 

425482-418217684895029-788818329-19859.j

 

What lies within?

 

On the trail of a deadly serial killer, a small team of special investigators find themselves stranded and separated in a deserted estate that houses many dark secrets and dangers. Can they save the life of a lost child and solve the mystery, or will they become the next victims? And what will they learn about what their teammates will do to survive?

 

523954-421134487936682-110571192-19859.j

 

You're not finished here yet...

 

A single-character turn-based engine puts you alone against the horrors of the Weston Estate, with its complex puzzles, deadly monsters and long-forgotten secrets. A survival-horror structure makes you weigh gaining experience and clearing rooms against the threat of death or wasting your limited ammunition and health. Find out if you have what it takes to survive.

 

562835-421133711270093-370243029-19859.j

 

I KNOW YOU

 

To learn more about this game, more screenshots, character descriptions, and its finer details, check out the page under our Games tab right here at gdunlimited. I'll even link ya!
http://www.gdunlimited.net/games/hollow-creek-stories-felixs-nightmare/home
 

 

But for those of you who just want to cut straight to the meat of the game, 

DOWNLOAD IT HERE!!! 

https://dl.dropboxusercontent.com/u/31107893/HCSFN.zip

 

 

 

 

And thanks for reading. Any feedback, reviews, bug reports, etc. can be sent straight to me and will be greatly appreciated, or you can just ask questions or whatever right here in this thread.

 

 

Polraudio published a Forum Topic in Forums / Feedback, Bug Report and Forum Help


1 week ago     21 Comments     177 Views

Teamspeak Server?

Yo marked how hard would it be to get us a teamspeak server so we can all talk through voice?

It will be very nice for when we want to collaborate with each other or just hang out without having to use shitty skype or steam.

Kim Holton published a Forum Topic in Forums / RPG Maker VX Ace Requests


1 week ago     2 Comments     93 Views

Sprites required for new project

Hi,

 

I am currently working on a project in RPG Maker VX Ace for commercial use and I am now looking for additional sprites and images that I can use for this project.

 

If you want to help me out with some sprites or images that you have designed, I would be happy to credit you as well as provide your website/email with the credits.

 

I am looking for heavy fantasy stuff that is in line with the style already provided with RPG Maker VX Ace.

 

If you have any additional questions, please do not hesitate to contact me or reply in this thread.

 

Best wishes,

 

Kim

Miku Sama published a Forum Topic in Forums / Stories and Literature


1 week ago     4 Comments     124 Views

Short Story *Work In Progress*

 So im writing a short story, I would like some feedback while its still early into the actual story, I am updating every few days/week so it may take awhile until its finished. I do plan on giving it a front cover.etc for when its finished so I can offer it as a .pdf download (It'll also make it look awesome XD)

 

Google Docs: https://docs.google.com/document/d/1J1UrOYruy9ywFu67hACfIiyY2oVq1xj2OBQ_QRXtgy8/edit?usp=sharing

 

I'll update the link every week so its upto date. You can be as brutal as you want when criticizing me..since well any criticism is good criticism. 

Netherware Entertainment published a Forum Topic in Forums / Miscellaneous Engines


1 week ago     2 Comments     47 Views

Official Trailer "Desolate City: The Bloody Dawn"

Hi everyone!

Still in development, we present this action RPG & survival-horror adventure. Most of the game system is stable, but still a long way to go.

The duration of the game will be long and the trailer shown what we can expect in this adventure.

We hope you like it, we keep you informed!

 

[youtube]https://www.youtube.com/watch?v=BrGaogCz7-8[/youtube]

Latest News