I've been messing with modifying Wachungas Multiple Message Windows script, and trying to think of what features it could use that aren't already built in. Some of the stuff is already done, but just wondering what else could be done to it to make it better? Some of this stuff I put into my Caterpillar (see the Official Scripts List) but I just packaged that modification with the Caterpillar instead of making that version its own script, so you can check some of these features out. The newer stable features are the ones that are included in the Caterpillar.
Stuff I've done already:
- A couple of bugfixes for Choice Windows not working right when displaying while more than one message window
- Auto Orient Message Bubbles based on speaker's direction
- Display next message at a specific time instead of both windows at the same time.
- Allow and Detect Cancel Number Input Window
- Set a Maximum Distance from an Event before exiting processing (shorter distance than all the way offscreen)
- Reorienting Window when the Speaker turns while speaking
- Allowing Message Windows to go off the screen instead of flipping
- Setting a Select Window Index (allows the selected choice to be something other than the first choice)
Excluding Face Windows which I have no intention of doing, does anyone else have any other ideas that could make MMW more useful to you?
Playing a looping SE while the text is scrolling?
Actually, thats not a bad idea! I'll see what I can do. Of course, putting in options to vary the pitch and what not...
And, of course, a call script to disable it or change the sound.
Okay, I have something working pretty well as far a sounds for each letter go. I'll have to explain a bit of what I have so far and need some feedback before I continue.
I did set it so you can enable / disable sounds on the fly as well as change the sound. For testing, Im just using the cursor sounds. But playing with it, it didnt feel quite right. It was too "flat". All monotone. It was also way way too frequent. So I thought about that too. I made an option to change how frequently the sound will play, mostly because I dont know what sound you might want to use and how long that sound will play for. So there is a Frequency option so a sound only plays ever X number of letters. Sounded better, but needed to make the sound have some variations in the Pitch. What I came up with was an option to change the pitch of the sound, and randomized it a bit. So I have a Pitch, and Pitch Range, and Frequency.
What I have so far sounds a lot like the Banjo Kazooie style of talking, but at this moment, its all RANDOM. So if the text repeats, the next time you play it, it will sound totally different. Not sure I like that, but I'll leave it in as an option. What I was thinking is making it based on either vowel or letter sounds, so the pitch would vary while the text was displayed, but would sound exactly the same the next time it plays. I also set it so that letter_by_letter has to be on and the player has NOT skipped the message. Had to do that.
Of course, if you dont want the pitch to be random, like for a typewriter or computer output, the randomness can be disabled. Everything can be adjusted by calling a script, but I have not built anything in to change anything during the message itself, like changing color for a certain word, Im thinking of allowing adjusting the volume and pitch using something like \S[v70] to set the volume to 70, or something like that, of course, something for the pitch and range as well.
Do you think these are good ideas, or am I making it too complex, or not versatile enough?
EDIT:
The other question I have is based on some stuff that I've already built in.
I have it set up so if you walk away from an event while speaking, your MMW settings will go back to what they were before. Would you like the sound settings to also be reset when you walk away from an event, or do you have another idea of how you would like me to handle changing sound settings for you?
Please do not double-post within 24 hours. Thanks.
That sounds very, very versatile. Seems like you've included plenty of options!
And yeah, it probably should reset when you walk away if all of the other stuff resets too.
Another thought. You know how normally the default message windows are somewhat transparent, but with MMW they are opaque, even if you set it back to default settings? I do think it looks cooler opaque, but it also blocks some of the screen. Maybe a setting that allows you to enable/disable transparency in normal message windows?
I've looked at that transparency thing before, but didnt like what happened. The problem is the message tail. It is a separate graphic, and when it layers with the message bubble, when they are both partially transparent, they dont layer correctly. If another scripter had an idea of how to do it and make it look good, it might be feasible.
What I was saying is only have the option for normal message windows, not balloons. But now that you mention it, it would be nice to get the balloons transparent too...
*looks at Blizz for ideas*
im thinking creating an addition to the window class to erase a section of the windowskin, i have had a little mess around myself but i have no idea what the real Window class methods are like, i did however achieve it using a custom window class like so:
the custom class(by Selwyn):
#===========================================================
# ? Bitmap
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ? erase
#--------------------------------------------------------------------------
def erase(*args)
if args.size == 1
rect = args[0]
elsif args.size == 4
rect = Rect.new(*args)
end
fill_rect(rect, Color.new(0, 0, 0, 0))
end
end
#==============================================================================
# ? SG
#------------------------------------------------------------------------------
# ?Selwyn's Graphics module
#==============================================================================
#==============================================================================
# ? SG::Skin
#==============================================================================
class Skin
#--------------------------------------------------------------------------
# ? instances settings
#--------------------------------------------------------------------------
attr_reader :margin
attr_accessor :bitmap
#--------------------------------------------------------------------------
# ? initialize
#--------------------------------------------------------------------------
def initialize
@bitmap = nil
@values = {}
@values['bg'] = Rect.new(0, 0, 128, 128)
@values['pause0'] = Rect.new(160, 64, 16, 16)
@values['pause1'] = Rect.new(176, 64, 16, 16)
@values['pause2'] = Rect.new(160, 80, 16, 16)
@values['pause3'] = Rect.new(176, 80, 16, 16)
@values['arrow_up'] = Rect.new(152, 16, 16, 8)
@values['arrow_down'] = Rect.new(152, 40, 16, 8)
@values['arrow_left'] = Rect.new(144, 24, 8, 16)
@values['arrow_right'] = Rect.new(168, 24, 8, 16)
self.margin = 16
end
#--------------------------------------------------------------------------
# ? width
#--------------------------------------------------------------------------
def margin=(width)
@margin = width
set_values
end
#--------------------------------------------------------------------------
# ? set_values
#--------------------------------------------------------------------------
def set_values
w = @margin
@values['ul_corner'] = Rect.new(128, 0, w, w)
@values['ur_corner'] = Rect.new(192-w, 0, w, w)
@values['dl_corner'] = Rect.new(128, 64-w, w, w)
@values['dr_corner'] = Rect.new(192-w, 64-w, w, w)
@values['up'] = Rect.new(128+w, 0, 64-2*w, w)
@values['down'] = Rect.new(128+w, 64-w, 64-2*w, w)
@values['left'] = Rect.new(128, w, w, 64-2*w)
@values['right'] = Rect.new(192-w, w, w, 64-2*w)
end
#--------------------------------------------------------------------------
# ? []
#--------------------------------------------------------------------------
def [](value)
return @values[value]
end
end
#==============================================================================
# ? SG::Cursor_Rect
#==============================================================================
class Cursor_Rect < ::Sprite
#--------------------------------------------------------------------------
# ? instances settings
#--------------------------------------------------------------------------
attr_reader :height, :width, :skin, :margin
#--------------------------------------------------------------------------
# ? initialize
#--------------------------------------------------------------------------
def initialize(viewport)
super(viewport)
@width = 0
@height = 0
@skin = nil
@margin = 0
@rect = {}
@rect['cursor_up'] = Rect.new(129, 64, 30, 1)
@rect['cursor_down'] = Rect.new(129, 95, 30, 1)
@rect['cursor_left'] = Rect.new(128, 65, 1, 30)
@rect['cursor_right'] = Rect.new(159, 65, 1, 30)
@rect['upleft'] = Rect.new(128, 64, 1, 1)
@rect['upright'] = Rect.new(159, 64, 1, 1)
@rect['downleft'] = Rect.new(128, 95, 1, 1)
@rect['downright'] = Rect.new(159, 95, 1, 1)
@rect['bg'] = Rect.new(129, 65, 30, 30)
end
#--------------------------------------------------------------------------
# ? margin=
#--------------------------------------------------------------------------
def margin=(margin)
@margin = margin
set(x, y, width, height)
end
#--------------------------------------------------------------------------
# ? skin=
#--------------------------------------------------------------------------
def skin=(skin)
@skin = skin
draw_rect
end
#--------------------------------------------------------------------------
# ? width=
#--------------------------------------------------------------------------
def width=(width)
return if @width == width
@width = width
if @width == 0 and self.bitmap != nil
self.bitmap.dispose
self.bitmap = nil
end
draw_rect
end
#--------------------------------------------------------------------------
# ? height=
#--------------------------------------------------------------------------
def height=(height)
return if @height == height
@height = height
if @height == 0 and self.bitmap != nil
self.bitmap.dispose
self.bitmap = nil
end
draw_rect
end
#--------------------------------------------------------------------------
# ? set
#--------------------------------------------------------------------------
def set(x, y, width, height)
self.x = x + @margin
self.y = y + @margin
if @width != width or @height != height
@width = width
@height = height
if width > 0 and height > 0
draw_rect
end
end
end
#--------------------------------------------------------------------------
# ? empty
#--------------------------------------------------------------------------
def empty
self.x = 0
self.y = 0
self.width = 0
self.height = 0
end
#--------------------------------------------------------------------------
# ? draw_rect
#--------------------------------------------------------------------------
def draw_rect
return if @skin == nil
if @width > 0 and @height > 0
self.bitmap = Bitmap.new(@width, @height)
rect = Rect.new(1, 1, @width - 2, @height - 2)
self.bitmap.stretch_blt(rect, @skin, @rect['bg'])
self.bitmap.blt(0, 0, @skin, @rect['upleft'])
self.bitmap.blt(@width-1, 0, @skin, @rect['upright'])
self.bitmap.blt(0, @height-1, @skin, @rect['downright'])
self.bitmap.blt(@width-1, @height-1, @skin, @rect['downleft'])
rect = Rect.new(1, 0, @width - 2, 1)
self.bitmap.stretch_blt(rect, @skin, @rect['cursor_up'])
rect = Rect.new(0, 1, 1, @height - 2)
self.bitmap.stretch_blt(rect, @skin, @rect['cursor_left'])
rect = Rect.new(1, @height-1, @width - 2, 1)
self.bitmap.stretch_blt(rect, @skin, @rect['cursor_down'])
rect = Rect.new(@width - 1, 1, 1, @height - 2)
self.bitmap.stretch_blt(rect, @skin, @rect['cursor_right'])
end
end
end
#==============================================================================
# ? SG::Window
#------------------------------------------------------------------------------
# ?
#==============================================================================
class Window
#--------------------------------------------------------------------------
# ? set instances variables
#--------------------------------------------------------------------------
attr_reader(:x, :y, :z, :width, :height, :ox, :oy, :opacity, :back_opacity,
:stretch, :contents_opacity, :visible, :pause)
attr_accessor :active
#--------------------------------------------------------------------------
# ? initialize
#--------------------------------------------------------------------------
def initialize()
@skin = Skin.new
@viewport = Viewport.new(0, 0, 0, 0)
@cr_vport = Viewport.new(0, 0, 0, 0)
@width = 0
@height = 0
@ox = 0
@oy = 0
@opacity = 255
@back_opacity = 255
@contents_opacity = 255
@frame = Sprite.new()
@bg = Sprite.new()
@window = Sprite.new(@viewport)
@pause_s = Sprite.new()
@arrows = []
for i in 0...4
@arrows.push(Sprite.new(@cr_vport))
@arrows[i].bitmap = Bitmap.new(16, 16)
@arrows[i].visible = false
end
@cursor_rect = Cursor_Rect.new(@cr_vport)
@cursor_rect.margin = @skin.margin
@cursor_fade = true
@pause_s.visible = false
@pause = false
@active = true
@stretch = true
@visible = true
self.x = 0
self.y = 0
self.z = 100
self.windowskin = RPG::Cache.windowskin($game_system.windowskin_name)
end
#--------------------------------------------------------------------------
# ? contents=
#--------------------------------------------------------------------------
def contents=(bmp)
@window.bitmap = bmp
if bmp != nil
if bmp.width > @viewport.rect.width
bmp.height > @viewport.rect.height
draw_arrows
end
end
end
#--------------------------------------------------------------------------
# ? contents
#--------------------------------------------------------------------------
def contents
return @window.bitmap
end
#--------------------------------------------------------------------------
# ? dispose
#--------------------------------------------------------------------------
def dispose
@bg.dispose
@frame.dispose
@window.dispose
@cursor_rect.dispose
@viewport.dispose
@pause_s.dispose
@cr_vport.dispose
for arrow in @arrows
arrow.dispose
end
end
#--------------------------------------------------------------------------
# ? update
#--------------------------------------------------------------------------
def update
@window.update
@cursor_rect.update
@viewport.update
@cr_vport.update
@pause_s.src_rect = @skin["pause#{(Graphics.frame_count / 8) % 4}"]
@pause_s.update
update_visible
update_arrows
if @cursor_fade
@cursor_rect.opacity -= 10
@cursor_fade = false if @cursor_rect.opacity <= 100
else
@cursor_rect.opacity += 10
@cursor_fade = true if @cursor_rect.opacity >= 255
end
end
#--------------------------------------------------------------------------
# ? update_visible
#--------------------------------------------------------------------------
def update_visible
@frame.visible = @visible
@bg.visible = @visible
@window.visible = @visible
@cursor_rect.visible = @visible
if @pause
@pause_s.visible = @visible
else
@pause_s.visible = false
end
end
#--------------------------------------------------------------------------
# ? pause=
#--------------------------------------------------------------------------
def pause=(pause)
@pause = pause
update_visible
end
#--------------------------------------------------------------------------
# ? update_arrows
#--------------------------------------------------------------------------
def update_arrows
if @window.bitmap == nil or @visible == false
for arrow in @arrows
arrow.visible = false
end
else
@arrows[0].visible = @oy > 0
@arrows[1].visible = @ox > 0
@arrows[2].visible = (@window.bitmap.width - @ox) > @viewport.rect.width
@arrows[3].visible = (@window.bitmap.height - @oy) > @viewport.rect.height
end
end
#--------------------------------------------------------------------------
# ? visible=
#--------------------------------------------------------------------------
def visible=(visible)
@visible = visible
update_visible
update_arrows
end
#--------------------------------------------------------------------------
# ? x=
#--------------------------------------------------------------------------
def x=(x)
@x = x
@bg.x = x + 2
@frame.x = x
@viewport.rect.x = x + @skin.margin
@cr_vport.rect.x = x
@pause_s.x = x + (@width / 2) - 8
set_arrows
end
#--------------------------------------------------------------------------
# ? y=
#--------------------------------------------------------------------------
def y=(y)
@y = y
@bg.y = y + 2
@frame.y = y
@viewport.rect.y = y + @skin.margin
@cr_vport.rect.y = y
@pause_s.y = y + @height - @skin.margin
set_arrows
end
#--------------------------------------------------------------------------
# ? z=
#--------------------------------------------------------------------------
def z=(z)
@z = z
@bg.z = z
@frame.z = z + 1
@cr_vport.z = z + 2
@viewport.z = z + 3
@pause_s.z = z + 4
end
#--------------------------------------------------------------------------
# ? ox=
#--------------------------------------------------------------------------
def ox=(ox)
return if @ox == ox
@ox = ox
@viewport.ox = ox
update_arrows
end
#--------------------------------------------------------------------------
# ? oy=
#--------------------------------------------------------------------------
def oy=(oy)
return if @oy == oy
@oy = oy
@viewport.oy = oy
update_arrows
end
#--------------------------------------------------------------------------
# ? width=
#--------------------------------------------------------------------------
def width=(width)
@width = width
@viewport.rect.width = width - @skin.margin * 2
@cr_vport.rect.width = width
if @width > 0 and @height > 0
@frame.bitmap = Bitmap.new(@width, @height)
@bg.bitmap = Bitmap.new(@width - 4, @height - 4)
draw_window
end
self.x = @x
self.y = @y
end
#--------------------------------------------------------------------------
# ? height=
#--------------------------------------------------------------------------
def height=(height)
@height = height
@viewport.rect.height = height - @skin.margin * 2
@cr_vport.rect.height = height
if @height > 0 and @width > 0
@frame.bitmap = Bitmap.new(@width, @height)
@bg.bitmap = Bitmap.new(@width - 4, @height - 4)
draw_window
end
self.x = @x
self.y = @y
end
#--------------------------------------------------------------------------
# ? opacity=
#--------------------------------------------------------------------------
def opacity=(opacity)
value = [[opacity, 255].min, 0].max
@opacity = value
@contents_opacity = value
@back_opacity = value
@frame.opacity = value
@bg.opacity = value
@window.opacity = value
end
#--------------------------------------------------------------------------
# ? back_opacity=
#--------------------------------------------------------------------------
def back_opacity=(opacity)
value = [[opacity, 255].min, 0].max
@back_opacity = value
@bg.opacity = value
end
#--------------------------------------------------------------------------
# ? contents_opacity=
#--------------------------------------------------------------------------
def contents_opacity=(opacity)
value = [[opacity, 255].min, 0].max
@contents_opacity = value
@window.opacity = value
end
#--------------------------------------------------------------------------
# ? cursor_rect
#--------------------------------------------------------------------------
def cursor_rect
return @cursor_rect
end
#--------------------------------------------------------------------------
# ? cursor_rect=
#--------------------------------------------------------------------------
def cursor_rect=(rect)
@cursor_rect.x = rect.x
@cursor_rect.y = rect.y
if @cursor_rect.width != rect.width or @cursor_rect.height != rect.height
@cursor_rect.set(@cursor_rect.x, @cursor_rect.y, rect.width, rect.height)
end
end
#--------------------------------------------------------------------------
# ? windowskin
#--------------------------------------------------------------------------
def windowskin
return @skin.bitmap
end
#--------------------------------------------------------------------------
# ? windowskin=
#--------------------------------------------------------------------------
def windowskin=(windowskin)
return if windowskin == nil
if @skin.bitmap != windowskin
@pause_s.bitmap = windowskin
@pause_s.src_rect = @skin['pause0']
@skin.bitmap = windowskin
@cursor_rect.skin = windowskin
draw_window
draw_arrows
end
end
#--------------------------------------------------------------------------
# ? margin=
#--------------------------------------------------------------------------
def margin=(margin)
if @skin.margin != margin
@skin.margin = margin
self.x = @x
self.y = @y
temp = @height
self.height = 0
self.width = @width
self.height = temp
@cursor_rect.margin = margin
set_arrows
end
end
#--------------------------------------------------------------------------
# ? stretch=
#--------------------------------------------------------------------------
def stretch=(bool)
if @stretch != bool
@stretch = bool
draw_window
end
end
#--------------------------------------------------------------------------
# ? set_arrows
#--------------------------------------------------------------------------
def set_arrows
@arrows[0].x = @width / 2 - 8
@arrows[0].y = 8
@arrows[1].x = 8
@arrows[1].y = @height / 2 - 8
@arrows[2].x = @width - 16
@arrows[2].y = @height / 2 - 8
@arrows[3].x = @width / 2 - 8
@arrows[3].y = @height - 16
end
#--------------------------------------------------------------------------
# ? draw_arrows
#--------------------------------------------------------------------------
def draw_arrows
return if @skin.bitmap == nil
@arrows[0].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_up'])
@arrows[1].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_left'])
@arrows[2].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_right'])
@arrows[3].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_down'])
update_arrows
end
#--------------------------------------------------------------------------
# ? draw_window
#--------------------------------------------------------------------------
def draw_window
return if @skin.bitmap == nil
return if @width == 0 or @height == 0
m = @skin.margin
if @frame.bitmap.nil?
@frame.bitmap = Bitmap.new(@width, @height)
@bg.bitmap = Bitmap.new(@width - 4, @height - 4)
end
@frame.bitmap.clear
@bg.bitmap.clear
if @stretch
dest_rect = Rect.new(0, 0, @width-4, @height-4)
@bg.bitmap.stretch_blt(dest_rect, @skin.bitmap, @skin['bg'])
else
bgw = Integer((@width-4) / 128) + 1
bgh = Integer((@height-4) / 128) + 1
for x in 0..bgw
for y in 0..bgh
@bg.bitmap.blt(x * 128, y * 128, @skin.bitmap, @skin['bg'])
end
end
end
bx = Integer((@width - m*2) / @skin['up'].width) + 1
by = Integer((@height - m*2) / @skin['left'].height) + 1
for x in 0..bx
w = @skin['up'].width
@frame.bitmap.blt(x * w + m, 0, @skin.bitmap, @skin['up'])
@frame.bitmap.blt(x * w + m, @height - m, @skin.bitmap, @skin['down'])
end
for y in 0..by
h = @skin['left'].height
@frame.bitmap.blt(0, y * h + m, @skin.bitmap, @skin['left'])
@frame.bitmap.blt(@width - m, y * h + m, @skin.bitmap, @skin['right'])
end
@frame.bitmap.erase(@width - m, 0, m, m)
@frame.bitmap.erase(0, @height - m, m, m)
@frame.bitmap.erase(@width - m, @height - m, m, m)
@frame.bitmap.blt(0, 0, @skin.bitmap, @skin['ul_corner'])
@frame.bitmap.blt(@width - m, 0, @skin.bitmap, @skin['ur_corner'])
@frame.bitmap.blt(0, @height - m, @skin.bitmap, @skin['dl_corner'])
@frame.bitmap.blt(@width - m, @height - m, @skin.bitmap, @skin['dr_corner'])
end
end
then i did this in a scene to delete parts of the windowskin:
class Window
def erase(x, y, width, height)
@frame.bitmap.erase(x, y, width, height)
@bg.bitmap.erase(x, y, width, height)
end
end
class Test < Window_Base
def initialize
super(0, 0, 400, 400)
end
end
class Test_Scene
def main
@test = Test.new
@test.erase(0, 0, 100, 100)
Graphics.transition
loop { Graphics.update; Input.update; break if $scene != self }
@test.dispose
end
end
so the idea is to delete the windowskin where the image will overlap, then you wont see the over lap when turning the transparency down, i did try to find a recreation of the real window class but i had no luck :(
for tranparent balloons, I guess the best solution is blt the window and the tail
https://dl.dropbox.com/u/74796308/RMXP/Multiple%20Message%20Windows%20Demo.rar
Small stuff I've done :
- Face image and Name in balloon message
- Furigana text
- Auto shrink and enlarge balloon message
- Opacity
Quote from: Heretic86 on August 29, 2012, 10:35:27 pm
Stuff I've done already:
- A couple of bugfixes for Choice Windows not working right when displaying while more than one message window
- Auto Orient Message Bubbles based on speaker's direction
- Display next message at a specific time instead of both windows at the same time.
- Allow and Detect Cancel Number Input Window
- Set a Maximum Distance from an Event before exiting processing (shorter distance than all the way offscreen)
- Reorienting Window when the Speaker turns while speaking
- Allowing Message Windows to go off the screen instead of flipping
- Setting a Select Window Index (allows the selected choice to be something other than the first choice)
could you share your version? just curious :
D
Totally planning on sharing it. Need to wrap a few things up on it tho, and think some things out. The stuff is easy enough to do, just time consuming when everyone wants you to fix their computer that you just fixed the previous week for the same exact thing...
Quote from: LiTTleDRAgo on September 02, 2012, 07:37:21 am
https://dl.dropbox.com/u/74796308/RMXP/Multiple%20Message%20Windows%20Demo.rar
when playing with baby, I get this bug.
(https://dl.dropbox.com/u/71706537/bug_report_mms.png)
window can't be closed until start chat with others. :D
That transparent window works very nice! Hopefully it can be made to work correctly!
Still working out some kinks here and there, and doing some documenting, so I'll probably have something to upload in a day or two. Does that version of MMW offer anything to adjust transparency for "Non Floating Windows"? Wachnunga called the "Bubble" windows "Floating" and the default looking ones Non Floating. I am curious now, since it was asked, about transparency for the Non Floating ones.
By the way, the stuff I'll be uploading isnt just for the sounds, which is part of what is taking so long...
Hidden secrets, huh? We'll be waiting.
Quote from: Lukas on September 02, 2012, 11:18:34 am
Quote from: LiTTleDRAgo on September 02, 2012, 07:37:21 am
https://dl.dropbox.com/u/74796308/RMXP/Multiple%20Message%20Windows%20Demo.rar
when playing with baby, I get this bug.
(https://dl.dropbox.com/u/71706537/bug_report_mms.png)
window can't be closed until start chat with others. :D
fixed, it was a silly mistake
Quote from: Heretic86 on September 02, 2012, 08:06:25 pm
That transparent window works very nice! Hopefully it can be made to work correctly!
Still working out some kinks here and there, and doing some documenting, so I'll probably have something to upload in a day or two. Does that version of MMW offer anything to adjust transparency for "Non Floating Windows"? Wachnunga called the "Bubble" windows "Floating" and the default looking ones Non Floating. I am curious now, since it was asked, about transparency for the Non Floating ones.
By the way, the stuff I'll be uploading isnt just for the sounds, which is part of what is taking so long...
I'm sure the "Non Floating Windows" is also affected
Try talking to the girl wearing a hat to confirm it
(http://i.imgur.com/v3Bva.jpg)
Okay, Im pretty happy with this:
THIS HAS THE REQUESTED SOUNDS FEATURE FOR MMW
http://www.775.net/~heretic/downloads/rmxp/HereticsCaterpillarDemoVer1.99.exe
I havent done my typical super thorough testing to find all the bugs, so I am sure that more than a few might still exist. But this is the version that I've messed wtih and added some new features, some, I think were REQUIRED (bugfixes) and others just enhance functionality. Im dead tired so I'll have to check other versions to see what we'd need to do to merge them together later. I really do want to get rid of the SDK dependancy...
found bug in your caterpillar demo
first is auto font installer, it's trying to find fileutils.rb which didn't exist and crashed
second is self_set_switch in enemy event in map
Quote from: Heretic86 on August 29, 2012, 10:35:27 pm
Stuff I've done already:
- A couple of bugfixes for Choice Windows not working right when displaying while more than one message window - done
- Auto Orient Message Bubbles based on speaker's direction
- Display next message at a specific time instead of both windows at the same time.
- Allow and Detect Cancel Number Input Window - done
- Set a Maximum Distance from an Event before exiting processing (shorter distance than all the way offscreen)
- Reorienting Window when the Speaker turns while speaking
- Allowing Message Windows to go off the screen instead of flipping
- Setting a Select Window Index (allows the selected choice to be something other than the first choice) - done
- Sound - done
https://dl.dropbox.com/u/74796308/RMXP/Multiple%20Message%20Windows%20Demo.rar
ah, I have an idea for a feature, a message log
all the message recorded in one window, and when clicked, it will show all the message that player heard
Oops! I know exactly what happened there. I was trying to yank out other scripts I was messing with (one of them was one of yours, event sensor) and got a little script yanking happy! I forgot about the set_self_switch thing I was testing out with the pirates. I put those two scripts back in for the sake of this demo, and re-uploaded the file.
Off topic, but in your event sensor, not the one I monkeyed with, is there anything you can do for line of sight visibility to player? For example, only enable D self switch if line of sight as well? And not trying to be too complex, but I have this way of doing fences that seems kind of cool. The passability bits blocks up movement on one side and down bits on the other, so I'd have to guess a visibility bit could be either a terrain tag, or all passability bits blocked. How does that sound to you?
I have heard there is a bug in that auto font installer, but dont think I will be able to fix it cuz I am unable to recreate it on my computer. I think it is caused by the version of windows. The auto font installer was Wachunga's originally, and hasnt been altered. Maybe something else you could take a look at since I'm unable to recreate it?
Logging messages does sound like a good idea! I might take a look into that. If implemented, will probably throw it in a log file, and load that. Might have to do it as an Add On cuz it would probably have to be scene based from the menu.
What did you think of the rest of the features? Any trouble with them?
The bug with the font installer probably stems from the fact that only an admin can install fonts. If the current user is not, then it will fail. You can use the following method to check before allowing the script to run:
def elevated?
whoami = `whoami /groups` rescue nil
return true if whoami =~ /S-1-16-12288/
admin = `net localgroup administrators | find "%USERNAME%"` rescue ""
return !admin.empty?
end
That looks awesome F0!
But before I try putting it in, do you think that putting in some error msgs to advise the user that they may not be aware of would be considerate and useful? Actually, not sure if I want to try putting it in or not, considering, like I said, I cant recreate the error on my computer. Im still on XP (Im flat broke), so someone else wanna take a crack at it?
Next question. Unrelated to the Auto Font Install, how much effort was involved in yanking the SDK dependancy?
EDIT:
Double post. Sue me.
I think the big question is should we / are we interested in collaborating these different versions together into a larger, more inclusive version for everyone? If so, how do we want to go about this?
Everybody has to abide by the forum rules. No double posting within 24 hours. Editing your post marks the topic as unread for everyone.
Quote from: gameus on September 03, 2012, 11:34:20 pm
Everybody has to abide by the forum rules. No double posting within 24 hours. Editing your post marks the topic as unread for everyone.
I agree. That's the second time in this topic alone. The next one simply gets deleted, no making an edit for you. Aside, as G_G said, there isn't really much point, it bumps the topic when you modify it. Anyways, sorry, back on topic. :P
Quote from: Heretic86 on September 03, 2012, 02:11:30 pm
Off topic, but in your event sensor, not the one I monkeyed with, is there anything you can do for line of sight visibility to player? For example, only enable D self switch if line of sight as well? And not trying to be too complex, but I have this way of doing fences that seems kind of cool. The passability bits blocks up movement on one side and down bits on the other, so I'd have to guess a visibility bit could be either a terrain tag, or all passability bits blocked. How does that sound to you?
it should be easy to add one more condition, but I will leave it as it is because it is "Simple Event Sensor"
adding something complex will defeat the purpose
Quote from: Heretic86 on September 03, 2012, 07:32:02 pm
Next question. Unrelated to the Auto Font Install, how much effort was involved in yanking the SDK dependancy?
it shouldn't be too hard, but, why you use an SDK version when un-SDK-ed version is already exist?
Oh, I just remembered I was the one that did that. :facepalm:
I don't think it was very hard, I did it when I was still learning to script, so it was all very basic stuff. SDK pretty much just broke single methods into multiple methods, so it really only required putting them back again. I did some other very minor stuff to it if I remember correctly, but nothing to really change functionality except for making "shadowed text" from TOA not be used on floating windows or something, since it looked like garbage when using black text on a white background.
Quote from: gameus on September 03, 2012, 11:34:20 pm
Everybody has to abide by the forum rules. No double posting within 24 hours. Editing your post marks the topic as unread for everyone.
Well, ok.
---
Back on topic...
When I started messing with the script, I had pretty much forgotten about SDK dependancy and made changes to the SDK dependant version. When I get a chance, I'll see what I can do to yank SDK dependancy. Once I do this, does anyone have any interest in combining changes for the other versions, like the Blizz ABS version?
Quote from: Heretic86 on September 04, 2012, 04:40:12 am
When I started messing with the script, I had pretty much forgotten about SDK dependancy and made changes to the SDK dependant version. When I get a chance, I'll see what I can do to yank SDK dependancy. Once I do this, does anyone have any interest in combining changes for the other versions, like the Blizz ABS version?
Yes, definitely make it compatible with BABS. I feel that's important since this is THE site for Blizz ABS.
Why not just start with the Blizz ABS version and make your changes to it? It would probably be easier.
I'll have to take a look into it, but I would also need to know (in general) what modifications had been made to the original script to make it compatible with BlizzABS?
Mainly coordinates for where to display windows in relation to characters.
Quote from: Heretic86 on September 04, 2012, 05:51:11 pm
I'll have to take a look into it, but I would also need to know (in general) what modifications had been made to the original script to make it compatible with BlizzABS?
change in Game_Player -> update method is aliased, not redefined
Quote
#==============================================================================
# ** 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 < Game_Character
#--------------------------------------------------------------------------
# * Alias Listing
#--------------------------------------------------------------------------
alias drg128b_upd update unless method_defined?(:drg128b_upd)
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
message_showing = $game_temp.message_window_showing
unless moving? || @move_route_forcing ||
($game_system.map_interpreter.running? && !message_showing) ||
(message_showing && !$game_system.message.move_during) ||
($game_temp.choice_max > 0 || $game_temp.num_input_digits_max > 0)
input = Input.dir4
if input
case input
when 2 then move_down
when 4 then move_left
when 6 then move_right
when 8 then move_up
end
end
end
drg128b_upd
end
end
change in Scene_Map and Scene_Battle, changed the variable to make it plug and play without changing @message_window to an array
Quote
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
(0...2).each {|i| eval "
class Scene_#{['Map','Battle'][i]}
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
# necessary for accessing actor/enemy sprites in battle
attr_reader :spriteset
attr_accessor :multi_message_window
#--------------------------------------------------------------------------
# * Alias Listing
#--------------------------------------------------------------------------
alias drg128_main main unless method_defined?(:drg128_main)
alias drg128_upd update unless method_defined?(:drg128_upd)
#--------------------------------------------------------------------------
# * New Message Window Addition
#--------------------------------------------------------------------------
def new_message_window(index)
if @multi_message_window[index] != nil
# clear message windows at and after this index
last_index = @multi_message_window.size - 1
last_index.downto(index) { |i|
if @multi_message_window[i] != nil
@multi_message_window[i].dispose
@multi_message_window[i] = nil
end }
@multi_message_window.compact!
end
@multi_message_window.push(Window_Message.new(index))
end
#--------------------------------------------------------------------------
# * drg152_main
#--------------------------------------------------------------------------
def drg152_main
@multi_message_window = []
@multi_message_window[0] = Window_Message.new(0)
drg128_main
@multi_message_window.each {|mw| mw.dispose}
end
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
drg152_main
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
@message_window = Nothing.new if !@message_window.is_a?(Nothing)
drg128_upd
@multi_message_window.each {|mw| mw.update}
end
end#"}
#==============================================================================
# ** Nothing
#------------------------------------------------------------------------------
# There is nothing here
#==============================================================================
class Nothing
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :update, :dispose
end
and adding a new method in Game_System for allowing "move during message" feature
btw, I've added shortcut function and your foot forward thing to Blizz ABS version
Burnout! Got a little sick of coding and decided to just spend some time off doing different things.
I'll see if I can take a crack at merging them together this weekend. It looks like I'll end up spending most of my time removing SDK stuff, then I'll try to implement the Blizz compatible version.