Multiple Message Windows - What new features does it need?

Started by Heretic86, August 29, 2012, 10:35:27 pm

Previous topic - Next topic

Heretic86

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?
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Boba Fett Link

This post will self-destruct in 30 seconds.

Heretic86

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...
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Boba Fett Link

And, of course, a call script to disable it or change the sound.
This post will self-destruct in 30 seconds.

Heretic86

August 31, 2012, 07:25:05 pm #4 Last Edit: August 31, 2012, 10:50:47 pm by ForeverZer0
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.
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Boba Fett Link

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?
This post will self-destruct in 30 seconds.

Heretic86

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.
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Boba Fett Link

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*
This post will self-destruct in 30 seconds.

diagostimo

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 :(

LiTTleDRAgo

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
Spoiler: ShowHide

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

Heretic86

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...
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Lukas

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.
bug?: ShowHide

window can't be closed until start chat with others. :D

Spoiler: ShowHide

This image been put in a spoiler because it's 2 MB which is above the size of images allowed in a spoiler.
Thank you for your understanding.
~Blizz



~Sorry :)

Heretic86

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...
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

Boba Fett Link

This post will self-destruct in 30 seconds.

LiTTleDRAgo

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.
bug?: ShowHide

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

Spoiler: ShowHide

Heretic86

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...
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

LiTTleDRAgo

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

Heretic86

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?
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)

ForeverZer0

September 03, 2012, 02:52:48 pm #18 Last Edit: September 03, 2012, 02:54:11 pm by ForeverZer0
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
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Heretic86

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?
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)