KEnterText HC
#1
KEnterText HC

by Kyonides

Introduction

Ever since HiddenChest version 1.1.98 was released, game developers are now able to implement a very simple text input interface in their games.
It heavily depends on the new additions to the Input module to make it work normally.
The CapsLock and Shift keys DO alter the outcome while typing a text.
You can count on the basic ASCII characters to enter a name or nickname or even a number. Accents will be ignored.

Screenshot

RMXP
Code:
# * KEnterText HC for XP * #
#  Scripter : Kyonides
#  2025-12-09

class KEnterText
  def main
    @stage = :main
    @blink_timer = Graphics.frame_rate / 5
    @blink_state = false
    @index = 0
    @name_chars = []
    @nick_chars = []
    @box_sprites = []
    lbit = Bitmap.new(208, 160)
    lbit.draw_text(16, 0, 208, 24, "Your Name")
    lbit.draw_text(16, 78, 208, 24, "Your Nickname")
    @label_sprite = Sprite.new
    @label_sprite.set_xy(16, 12)
    @label_sprite.bitmap = lbit
    blue = Color.new(80, 80, 255)
    bbit = Bitmap.new(208, 32)
    bbit.fill_rect(bbit.rect, blue)
    2.times do |n|
      sprite = Sprite.new
      sprite.set_xy(16, 48 + n * 76)
      sprite.bitmap = bbit.dup
      @box_sprites << sprite
    end
    bbit.dispose
    cbit = Bitmap.new(20, 28)
    cbit.font.size = 24
    cbit.font.outline = true
    cbit.draw_text(cbit.rect, "|")
    @cursor_sprite = Sprite.new
    @cursor_sprite.set_xy(22, 50)
    @cursor_sprite.bitmap = cbit
    @name_bitmap = Bitmap.new(200, 28)
    @name_bitmap.font.size = 24
    @name_bitmap.font.outline = true
    @name_sprite = Sprite.new
    @name_sprite.set_xy(20, 50)
    @name_sprite.bitmap = @name_bitmap
    @nick_bitmap = Bitmap.new(200, 28)
    @nick_bitmap.font.size = 24
    @nick_bitmap.font.outline = true
    @nick_sprite = Sprite.new
    @nick_sprite.set_xy(20, 124)
    @nick_sprite.bitmap = @nick_bitmap
    @texts = { name: @name_chars, nick: @nick_chars }
    Graphics.transition
    while @stage
      Graphics.update
      Input.update
      update
    end
    Graphics.freeze
    @nick_bitmap.dispose
    @nick_sprite.dispose
    @name_bitmap.dispose
    @name_sprite.dispose
    cbit.dispose
    @cursor_sprite.dispose
    @box_sprites.each do |sprite|
      sprite.bitmap.dispose
      sprite.dispose
    end
    @label_sprite.dispose
  end

  def update
    case @stage
    when :main
      update_index
    when :name
      update_name
    when :nick
      update_nickname
    end
  end

  def update_blink
    @blink_timer -= 1
    if @blink_timer == 0
      @blink_timer = Graphics.frame_rate / 5
      @blink_state = !@blink_state
      @cursor_sprite.visible = @blink_state
    end
  end

  def process_text_box_cancel
    Input.text_input = false
    Input.clear_text_input
    Input.update
    @cursor_sprite.visible = @blink_state = false
    @blink_timer = Graphics.frame_rate / 5
    @stage = :main
  end

  def process_char(bitmap, ary)
    char = Input.last_char
    if Input.press?(Input::SHIFT)
      char = Input.capslock_state ? char.downcase : char.upcase
    end
    ary << char
    ary.compact!
    refresh_text(bitmap, ary.join)
  end

  def refresh_text(bitmap, text)
    tw = bitmap.text_width(text)
    @cursor_sprite.x = 22 + tw
    bitmap.clear
    bitmap.draw_text(bitmap.rect, text)
  end

  def update_index
    if Input.trigger?(Input::Escape)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return @stage = nil
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @index = (@index - 1) % 2
      @cursor_sprite.y = 50 + @index * 76
      return
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @index = (@index + 1) % 2
      @cursor_sprite.y = 50 + @index * 76
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      $game_system.se_play($data_system.decision_se)
      Input.text_input = true
      Input.update
      @stage = set_stage
      text = @texts[@stage].join
      tw = @name_bitmap.text_width(text)
      @cursor_sprite.x = 22 + tw
      @cursor_sprite.visible = @blink_state = true
    end
  end

  def set_stage
    case @index
    when 0
      :name
    when 1
      :nick
    end
  end

  def update_name
    update_blink
    if Input.trigger?(Input::Escape)
      $game_system.se_play($data_system.cancel_se)
      process_text_box_cancel
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      $game_system.se_play($data_system.decision_se)
      Graphics.screenshot
      process_text_box_cancel
      return
    elsif Input.repeat?(Input::Backspace)
      $game_system.se_play($data_system.buzzer_se)
      @name_chars.pop
      refresh_text(@name_bitmap, @name_chars.join)
      return
    elsif Input.trigger_any? and Input.last_key?
      $game_system.se_play($data_system.equip_se)
      process_char(@name_bitmap, @name_chars)
    end
  end

  def update_nickname
    update_blink
    if Input.trigger?(Input::Escape)
      $game_system.se_play($data_system.cancel_se)
      process_text_box_cancel
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      $game_system.se_play($data_system.decision_se)
      Graphics.screenshot
      process_text_box_cancel
      return
    elsif Input.repeat?(Input::Backspace)
      $game_system.se_play($data_system.buzzer_se)
      @nick_chars.pop
      refresh_text(@nick_bitmap, @nick_chars.join)
      return
    elsif Input.trigger_any? and Input.last_key?
      $game_system.se_play($data_system.equip_se)
      process_char(@nick_bitmap, @nick_chars)
    end
  end
end

RMVX + RMVX ACE
Code:
# * KEnterText HC for VX + ACE * #
#  Scripter : Kyonides
#  2025-12-09

class KEnterText
  def main
    @vx_ace = Game::RGSS_VERSION == 3
    @stage = :main
    @blink_timer = Graphics.frame_rate / 5
    @blink_state = false
    @index = 0
    @name_chars = []
    @nick_chars = []
    @box_sprites = []
    lbit = Bitmap.new(208, 160)
    lbit.draw_text(16, 0, 208, 24, "Your Name")
    lbit.draw_text(16, 78, 208, 24, "Your Nickname")
    @label_sprite = Sprite.new
    @label_sprite.set_xy(16, 12)
    @label_sprite.bitmap = lbit
    blue = Color.new(80, 80, 255)
    bbit = Bitmap.new(208, 32)
    bbit.fill_rect(bbit.rect, blue)
    2.times do |n|
      sprite = Sprite.new
      sprite.set_xy(16, 48 + n * 76)
      sprite.bitmap = bbit.dup
      @box_sprites << sprite
    end
    bbit.dispose
    cbit = Bitmap.new(20, 28)
    cbit.font.size = 24
    cbit.font.outline = true
    cbit.draw_text(cbit.rect, "|")
    @cursor_sprite = Sprite.new
    @cursor_sprite.set_xy(22, 50)
    @cursor_sprite.bitmap = cbit
    @name_bitmap = Bitmap.new(200, 28)
    @name_bitmap.font.size = 24
    @name_bitmap.font.outline = true
    @name_sprite = Sprite.new
    @name_sprite.set_xy(20, 50)
    @name_sprite.bitmap = @name_bitmap
    @nick_bitmap = Bitmap.new(200, 28)
    @nick_bitmap.font.size = 24
    @nick_bitmap.font.outline = true
    @nick_sprite = Sprite.new
    @nick_sprite.set_xy(20, 124)
    @nick_sprite.bitmap = @nick_bitmap
    @texts = { name: @name_chars, nick: @nick_chars }
    Graphics.transition
    while @stage
      Graphics.update
      Input.update
      update
    end
    Graphics.freeze
    @nick_bitmap.dispose
    @nick_sprite.dispose
    @name_bitmap.dispose
    @name_sprite.dispose
    cbit.dispose
    @cursor_sprite.dispose
    @box_sprites.each do |sprite|
      sprite.bitmap.dispose
      sprite.dispose
    end
    @label_sprite.dispose
  end

  def update
    case @stage
    when :main
      update_index
    when :name
      update_name
    when :nick
      update_nickname
    end
  end

  def update_blink
    @blink_timer -= 1
    if @blink_timer == 0
      @blink_timer = Graphics.frame_rate / 5
      @blink_state = !@blink_state
      @cursor_sprite.visible = @blink_state
    end
  end

  def process_text_box_cancel
    Input.text_input = false
    Input.clear_text_input
    Input.update
    @cursor_sprite.visible = @blink_state = false
    @blink_timer = Graphics.frame_rate / 5
    @stage = :main
  end

  def process_char(bitmap, ary)
    char = Input.last_char
    if Input.press?(Input::SHIFT)
      char = Input.capslock_state ? char.downcase : char.upcase
    end
    ary << char
    ary.compact!
    refresh_text(bitmap, ary.join)
  end

  def refresh_text(bitmap, text)
    tw = bitmap.text_width(text)
    @cursor_sprite.x = 22 + tw
    bitmap.clear
    bitmap.draw_text(bitmap.rect, text)
  end

  def update_index
    if Input.trigger?(Input::Escape)
      Sound.play_cancel
      $scene = Scene_Map.new
      return @stage = nil
    elsif Input.trigger?(Input::UP)
      Sound.play_cursor
      @index = (@index - 1) % 2
      @cursor_sprite.y = 50 + @index * 76
      return
    elsif Input.trigger?(Input::DOWN)
      Sound.play_cursor
      @index = (@index + 1) % 2
      @cursor_sprite.y = 50 + @index * 76
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      @vx_ace ? Sound.play_ok : Sound.play_decision
      Input.text_input = true
      Input.update
      @stage = set_stage
      text = @texts[@stage].join
      tw = @name_bitmap.text_width(text)
      @cursor_sprite.x = 22 + tw
      @cursor_sprite.visible = @blink_state = true
    end
  end

  def set_stage
    case @index
    when 0
      :name
    when 1
      :nick
    end
  end

  def update_name
    update_blink
    if Input.trigger?(Input::Escape)
      Sound.play_cancel
      process_text_box_cancel
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      @vx_ace ? Sound.play_ok : Sound.play_decision
      Graphics.screenshot
      process_text_box_cancel
      return
    elsif Input.repeat?(Input::Backspace)
      Sound.play_buzzer
      @name_chars.pop
      refresh_text(@name_bitmap, @name_chars.join)
      return
    elsif Input.trigger_any? and Input.last_key?
      Sound.play_equip
      process_char(@name_bitmap, @name_chars)
    end
  end

  def update_nickname
    update_blink
    if Input.trigger?(Input::Escape)
      Sound.play_cancel
      process_text_box_cancel
      return
    elsif Input.trigger?(Input::Enter) or Input.trigger?(Input::Return)
      @vx_ace ? Sound.play_ok : Sound.play_decision
      Graphics.screenshot
      process_text_box_cancel
      return
    elsif Input.repeat?(Input::Backspace)
      Sound.play_buzzer
      @nick_chars.pop
      refresh_text(@nick_bitmap, @nick_chars.join)
      return
    elsif Input.trigger_any? and Input.last_key?
      Sound.play_equip
      process_char(@nick_bitmap, @nick_chars)
    end
  end
end

Terms & Conditions

The same as HiddenChest's.
That's it!  Tongue sticking out
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9

Maranatha!

The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.

[Image: SP1-Scripter.png]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: SP1-Reporter.png]

My Original Stories (available in English and Spanish)

List of Compiled Binary Executables I have published...
HiddenChest & Roole

Give me a free copy of your completed game if you include at least 3 of my scripts! Laughing + Tongue sticking out

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Reply


Messages In This Thread
KEnterText HC - by kyonides - Today, 01:27 AM



Users browsing this thread: 1 Guest(s)