¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 1.]

#1KScenario XP Empty KScenario XP el Jue Jul 04, 2019 8:41 am

Reputación del mensaje :100% (2 votos)

kyonides

kyonides
KScenario XP

por Kyonides-Arkanthes


Introducción

Este script trata de permitirles escoger no solo un héroe entre varios sino también su destino inicial o lugar donde comenzará su historia. El número de héroes o de destinos (mapas iniciales) queda a su gusto, aunque recomiendo que ofrezcan al menos 3 destinos. Incluso les puede permitir que se reutilice el script en casos, no sé, como que lo llamen al terminar el juego en Gameover o al terminar una sección de su juego donde saltarán a la historia de otro héroe o protagonista.

KScenario XP Kscenarioxp12 KScenario XP Kscenarioxp05 KScenario XP Kscenarioxp08 KScenario XP Kscenarioxp13

El Mismísimo Script

Código:
# * KScenario XP
#   Scripter : Kyonides-Arkanthes
#   v1.0.12 - 2019-07-04

#  This scriptlet lets you pick a starting hero and his destination.
#  You will need to create a directory called KScenario to place all
#  temporary text files this script will need to parse to retrieve
#  hero's specific data.

#  Script Call: $scene = KScenario.new

module KSceneSetup
  FIRST_SCENE = Scene_Title
  # Way to sort Heroes, Options :random or :sorted
  RANDOM_OR_SORTED = :random
  # Exclude Heroes you have chosen in case you will ever return to this scene
  EXCLUDE_CHOSEN_HEROES = true
  SECONDS = 15 # Seconds the final message will be displayed on screen
  BACKDROP = "bandit hideout" + Graphics.width.to_s
  # The following backdrops should be placed in the Pictures directory.
  EQUIP_BACKDROP = 'equipbox' # Dimensions: 160 x 110 px
  CHOICE_BACKDROP = '' # Dimensions: 240 x 80 px
  REPLY_BACKDROP = 'replybox' # Dimensions: 480 x 116 px
  DESTINATIONS_IMAGE = 'destinations side'
  # The cursors are icons so place them in the Icons directory.
  CURSORS = ['podium', 'dagger']
  BGM = 'Felix da Housecat - Silver Screen.ogg'
  BGM_VOLUME = 100
  BGM_PITCH = 100
  TITLES = ["Choose a Hero", "Destination %s of %s", 'Rumors', 'Bonus:']
  TITLE_FONT = "Arial"
  TITLE_SIZE = 30
  LABEL_COLOR = Color.new(255, 255, 80)
  EQUIP_LIST_FONT_SIZE = 18
  EQUIP_LIST_FONT_COLOR = Color.new(255, 255, 40)
  EQUIP_LIST_BAR_COLOR = Color.new(255, 0, 0)
  LABELS = ['Age', 'y/o', 'Gold', 'Preferred Places']
  STATS_LABELS = ['MaxHP', 'MaxSP', 'Strenght', 'Dexterity',
                  'Agility', 'Intelligence']
  EQUIP_LABELS = %w{Items Weapons Shields Helmets Armors Accessories}
  EQUIPMENT_LABEL = 'This is the equipment your hero might obtain'
  CHOICE_LABELS = ['Are you really sure?', 'Yes', 'No']
  DESTINY_LABELS = ["%s, your destiny is about to unfold!",
                    'Time Left:', 'seconds']
  DESCRIPTION = 'Backstory'
  class << self
    attr_accessor :destinations, :starters, :chosen
    def chosen?(hero_id) @chosen.include?(hero_id) end
  end

  class Hero
    def initialize
      @id = 0
      @age = 0
      @gold = 0
      @items = []
      @weapons = []
      @shields = []
      @helmets = []
      @armors = []
      @accessories = []
      @place = ''
      @description = []
      @reply = []
    end
    attr_accessor :id, :age, :gold, :place
    attr_accessor :items, :weapons, :shields, :helmets, :armors, :accessories
    attr_reader :description, :reply
  end

  class Place
    def initialize
      @id = 0
      @x = 0
      @y = 0
      @gold = 0
      @name = ''
      @picture = ''
      @description = ''
    end
    attr_accessor :id, :x, :y, :gold, :name, :picture, :description
  end
end

module KSceneRetrieve
  DATA_FILENAME = 'Data/KScenario.rxdata'
  CHOSEN_FILENAME = 'StoryIDs.rxdata'
  module_function
  def scan_int(line) line.scan(/\d+/)[0].to_i end
  def scan_int_ary(line) line.scan(/\d+/).map{|d| d.to_i} end
  def save_chosen_stories
    File.open(CHOSEN_FILENAME,'wb'){|f| Marshal.dump(KSceneSetup.chosen, f) }
  end

  def retrieve_data
    begin
      File.open(CHOSEN_FILENAME,'rb'){|f| KSceneSetup.chosen = Marshal.load(f) }
    rescue
      KSceneSetup.chosen ||= []
      save_chosen_stories
    end
    begin
      File.open(DATA_FILENAME,'rb') do |f|
        KSceneSetup.starters = Marshal.load(f)
        KSceneSetup.destinations = Marshal.load(f)
      end
    rescue
      read_file
    end
  end

  def read_file
    heroes = []
    filenames = Dir['KScenario/hero*.txt'].sort
    filenames.each do |fn|
      heroes << hero = KSceneSetup::Hero.new
      lines = File.readlines(fn)
      hero.id = scan_int(fn)
      hero.age = scan_int(lines.shift)
      hero.gold = scan_int(lines.shift)
      hero.items = scan_int_ary(lines.shift)
      hero.weapons = scan_int_ary(lines.shift)
      hero.shields = scan_int_ary(lines.shift)
      hero.helmets = scan_int_ary(lines.shift)
      hero.armors = scan_int_ary(lines.shift)
      hero.accessories = scan_int_ary(lines.shift)
      hero.place = lines.shift.chomp.sub(/place\: /i,'')
      lines.shift
      hero.description << lines.shift.chomp
      hero.description << lines.shift.chomp
      hero.description << lines.shift.chomp
      lines.shift
      hero.reply << lines.shift.chomp
      hero.reply << lines.shift.chomp
      hero.reply << lines.shift.chomp
      hero.reply << lines.shift.chomp
    end
    if KSceneSetup::RANDOM_OR_SORTED == :sorted
      KSceneSetup.starters = heroes.sort{|a,b| a.id <=> b.id }
    elsif KSceneSetup::RANDOM_OR_SORTED == :random
      KSceneSetup.starters = []
      heroes.size.times do |n|
        hero = heroes.delete_at(rand(heroes.size))
        KSceneSetup.starters << hero
      end
    end
    KSceneSetup.destinations = destinations = []
    lines = File.readlines('KScenario/places.txt')
    max = lines.size + 1
    (max / 8).times do |n|
      destinations << destination = KSceneSetup::Place.new
      destination.id = scan_int(lines.shift)
      destination.x = scan_int(lines.shift)
      destination.y = scan_int(lines.shift)
      destination.gold = scan_int(lines.shift)
      destination.name = lines.shift.chomp.sub(/name: /i,'')
      destination.picture = lines.shift.chomp.sub(/picture: /i,'')
      destination.description = lines.shift.chomp.sub(/description: /i,'')
      lines.shift rescue nil
    end
    File.open(DATA_FILENAME,'wb') do |f|
      Marshal.dump(KSceneSetup.starters, f)
      Marshal.dump(KSceneSetup.destinations, f)
    end
  end
  retrieve_data
end

class Game_Actor
  attr_writer :weapon_id, :armor1_id, :armor2_id, :armor3_id, :armor4_id
end

class StarterSpriteset
  include KSceneSetup
  def initialize
    @width = Graphics.width
    @height = Graphics.height
    if @width == 640
      @space = 202
      @reduce_font_size = 2
      @desc_width = 484
      @width_offset = 4
      @start_x = 28
    else
      @space = 206
      @reduce_font_size = 0
      @desc_width = 560
      @width_offset = 8
      @start_x = 32
    end
    @equip_box_max = (@width - 148) / 162
    @e_offset = 162
    @choice_x = [96, 188]
    @dw = 480
    @index = 0
    @equip_index = 0
    @place_index = 0
    @currency = $data_system.words.gold
    @white = Color.new(255, 255, 255)
    @black = Color.new(0, 0, 0)
    @semi_black = Color.new(0, 0, 0, 160)
    create_viewports
    @sprites = []
    @names = []
    @char_names = []
    @starters = []
    @equip_names = []
    create_basic_sprites
    @heroes = KSceneSetup.starters.dup
    @heroes.delete_if{|h| KSceneSetup.chosen?(h.id) } if EXCLUDE_CHOSEN_HEROES
    @heroes.each {|s| create_character(s) }
    create_labels
    update_label_settings
    create_stats_weaponry
    update_graphics
    create_places
    create_choice
    create_destiny
  end

  def create_viewports
    @vp = Viewport.new(0, 0, @width, @height)
    @vp.z = 0
    @place_vp = Viewport.new(@start_x, 260, @width - @width_offset, 202)
    @place_vp.z += 100
    @choice_vp = Viewport.new(0, 0, @width, @height)
    @choice_vp.z += 200
  end

  def create_basic_sprites
    @sprites << @backdrop = Sprite.new(@vp)
    @backdrop.bitmap = RPG::Cache.title(BACKDROP)
    @destinations = KSceneSetup.destinations.dup
    @place_ids = @destinations.map{|d| d.id }
    @sprites << @title = Sprite.new(@vp)
    @title.bitmap = bit = Bitmap.new(@width, 38)
    bit.font.name = TITLE_FONT
    bit.font.size = TITLE_SIZE - @reduce_font_size
    bit.draw_text(0, 0, @width, 38, TITLES[0], 1)
    @sprites << @cursor = Sprite.new(@vp)
    @cursor.x = @sx = 145
    @cursor.y = 96
    @cursor.bitmap = RPG::Cache.icon(CURSORS[0]).dup
  end

  def create_character(starter)
    max = @starters.size
    actor = $data_actors[starter.id]
    @starters << s = Sprite.new(@vp)
    s.x = 144 + max * 36
    s.y = 56
    @names << actor.name
    @char_names << name = actor.character_name
    bmap = RPG::Cache.character(name, actor.character_hue).dup
    w = bmap.width / 4
    h = bmap.height / 4
    s.bitmap = Bitmap.new(w, h)
    s.bitmap.blt(0, 0, bmap, Rect.new(0, 0, w, h))
  end

  def create_labels
    @bw = 140
    @sprites << @hero_face = Sprite.new(@vp)
    @hero_face.x = 24
    @hero_face.y = 32
    @sprites << @name_label = Sprite.new(@vp)
    @name_label.x = 4
    @name_label.y = 138
    @name_label.bitmap = @name_bmp = Bitmap.new(@bw, 22)
    @sprites << @age_label = Sprite.new(@vp)
    @age_label.x = 4
    @age_label.y = 162
    @age_label.bitmap = @age_bmp = Bitmap.new(@bw, 22)
    @sprites << @gold_label = Sprite.new(@vp)
    @gold_label.x = 4
    @gold_label.y = 186
    @gold_label.bitmap = @gold_bmp = Bitmap.new(@bw, 22)
    @sprites << @place_label = Sprite.new(@vp)
    @place_label.x = 4
    @place_label.y = 210
    @place_label.bitmap = @place_bmp = Bitmap.new(@bw, 48)
    @sprites << @desc_label = Sprite.new(@vp)
    @desc_label.x = 150
    @desc_label.y = 124
    @desc_label.bitmap = @desc_bmp = Bitmap.new(@desc_width, 98)
    @starters_max = @starters.size
    @sprites << @equip_label = Sprite.new(@vp)
    @equip_label.x = 154
    @equip_label.y = 228
    w = @width - 162
    @equip_label.bitmap = bit = Bitmap.new(w, 24)
    bit.fill_rect(0, 0, w, 24, @semi_black)
    bit.draw_text(0, 0, w, 22, EQUIPMENT_LABEL, 1)
    @sprites << @stats_box = Sprite.new(@vp)
    @stats_box.x = 4
    @stats_box.y = 256
    @stats_box.bitmap = @stats_bmp = Bitmap.new(@bw, 154)
    @bitmaps = [@name_bmp, @age_bmp, @gold_bmp, @place_bmp]
    @bitmaps += [@desc_bmp, @stats_bmp]
  end

  def update_cursor(direction)
    direction = direction == :left ? @starters_max - 1 : 1
    @index = (@index + direction) % @starters_max
    @cursor.x = @sx + @index * 36
    @hero_face.bitmap.dispose
    @bitmaps.each {|b| b.clear }
    update_label_settings
    update_graphics
  end

  def update_label_settings
    @bitmaps.each {|b| b.font.size = 20 - @reduce_font_size }
    @name_bmp.font.bold = true
    @gold_bmp.font.bold = true
  end

  def create_stats_weaponry
    @equip_margin = 148
    @equip_backdrops = []
    hero = @heroes[@index]
    if EQUIP_BACKDROP == ''
      @equip_bmp = Bitmap.new(@e_offset, 6 * 22)
      @equip_bmp.fill_rect(0, 0, @e_offset, 6 * 24, @black)
    else
      @backdrop_found = true
      @equip_bmp = RPG::Cache.picture(EQUIP_BACKDROP).dup
    end
    create_equipment(hero.items, 0)
    create_equipment(hero.weapons, 1)
    create_equipment(hero.shields, 2)
    create_equipment(hero.helmets, 3)
    create_equipment(hero.armors, 4)
    create_equipment(hero.accessories, 5)
    @sprites += @equip_backdrops
  end

  def get_data(kind)
    case kind
    when 0 then $data_items
    when 1 then $data_weapons
    else $data_armors
    end
  end

  def create_equipment(equip, kind)
    data = get_data(kind)
    @equip_backdrops << bd = Sprite.new(@vp)
    bd.x = @equip_margin + kind % @equip_box_max * 162
    bd.y = 256 + kind / @equip_box_max * 112
    bd.z = 200 - kind * 25
    bd.bitmap = @equip_bmp.dup
    @equip_names << sprite = Sprite.new(@vp)
    sprite.x = bd.x
    sprite.y = bd.y
    sprite.z = bd.z
    sprite.bitmap = Bitmap.new(@e_offset, 6 * 22)
  end

  def update_graphics
    @hero_face.bitmap = RPG::Cache.face(@char_names[@index]).dup
    @name_bmp.draw_text(0, 0, @bw, 22, @names[@index], 1)
    hero = @heroes[@index]
    years = LABELS[1]
    tw = @age_bmp.text_size(years).width + 4
    @age_bmp.font.color = LABEL_COLOR
    @age_bmp.draw_text(0, 0, 48, 22, LABELS[0])
    @age_bmp.font.color = @white
    @age_bmp.draw_text(0, 0, @age_bmp.width - tw, 22, hero.age.to_s, 2)
    @age_bmp.draw_text(0, 0, @age_bmp.width, 22, years, 2)
    @gold_bmp.font.color = LABEL_COLOR
    @gold_bmp.draw_text(0, 0, 52, 22, LABELS[2])
    @gold_bmp.font.color = @white
    @gold_bmp.draw_text(0, 0, 120, 22, hero.gold.to_s, 2)
    @gold_bmp.font.color = Color.new(80, 255, 255)
    @gold_bmp.draw_text(120, 0, 20, 22, @currency, 2)
    @place_bmp.font.color = LABEL_COLOR
    @place_bmp.draw_text(0, 0, @bw, 22, LABELS[3])
    @place_bmp.font.color = @white
    @place_bmp.draw_text(0, 22, @bw, 22, hero.place, 2)
    @desc_bmp.fill_rect(0, 12, @desc_width, 86, @semi_black)
    @desc_bmp.font.color = LABEL_COLOR
    @desc_bmp.draw_text(12, 0, 160, 24, DESCRIPTION)
    @desc_bmp.font.color = @white
    w = @desc_width - 8
    desc = hero.description
    3.times{|n| @desc_bmp.draw_text(4, 24 + n * 24, w, 24, desc[n]) }
    actor = $data_actors[hero.id]
    lvl = actor.initial_level
    param = actor.parameters
    stats = [param[0, lvl], param[1, lvl], param[2, lvl], param[3, lvl]]
    stats += [param[4, lvl], param[5, lvl]]
    stats.map!{|v| v.to_s }
    @stats_bmp.clear
    6.times do |n|
      h = n * 22
      @stats_bmp.font.color = LABEL_COLOR
      @stats_bmp.draw_text(0, h, @bw, 22, STATS_LABELS[n])
      @stats_bmp.font.color = @white
      @stats_bmp.draw_text(0, h, @bw, 22, stats[n], 2)
    end
    update_equipment(hero.items, 0)
    update_equipment(hero.weapons, 1)
    update_equipment(hero.shields, 2)
    update_equipment(hero.helmets, 3)
    update_equipment(hero.armors, 4)
    update_equipment(hero.accessories, 5)
  end

  def update_equipment(equip, kind)
    data = get_data(kind)
    bit = @equip_names[kind].bitmap
    bit.clear
    bit.fill_rect(3, 24, @e_offset - 10, 4, @black)
    bit.fill_rect(4, 25, @e_offset - 12, 2, EQUIP_LIST_BAR_COLOR)
    bit.font.size = EQUIP_LIST_FONT_SIZE
    bit.font.color = EQUIP_LIST_FONT_COLOR
    bit.draw_text(0, 0, @e_offset, 22, EQUIP_LABELS[kind], 1)
    bit.font.color = @white
    equip.size.times do |n|
      name = data[equip[n]].name
      m = n + 1
      bit.draw_text(4, 3 + m * 22, @e_offset - 4, 22, name)
    end
  end

  def create_places
    if @width == 640
      x_offset = 0
      w_offset = 32
    else
      x_offset = 4
      w_offset = 40
    end
    @place_max = (@width - w_offset) / @space
    @places = []
    @sprites << @dest_sprite = Sprite.new(@vp)
    @sprites << @dest_title = Sprite.new(@vp)
    @dest_title.visible = false
    @dest_title.x = 176
    @dest_title.y = 228
    @dest_title.bitmap = @dest_title_bmp = Bitmap.new(240, 24)
    @dest_sprite.visible = false
    @dest_sprite.x = x_offset
    @dest_sprite.y = 260
    @dest_sprite.bitmap = RPG::Cache.picture(DESTINATIONS_IMAGE).dup
    @destinations.each do |place|
      sprite = Sprite.new(@place_vp)
      sprite.visible = false
      sprite.x = @places.size * @space
      sprite.bitmap = RPG::Cache.picture(place.picture).dup
      @places << sprite
    end
    @sprites << @dest_name = Sprite.new(@place_vp)
    @dest_name.visible = false
    @dest_name.y = 128
    @dest_name.bitmap = @dest_bmp = Bitmap.new(200, 22)
    @sprites << @dest_desc = Sprite.new(@vp)
    @dest_desc.visible = false
    @dest_desc.x = 8
    @dest_desc.y = 418
    @dest_desc.bitmap = @dest_desc_bmp = Bitmap.new(@width - 16, 44)
    @sprites << @bonus_label = Sprite.new(@vp)
    @bonus_label.visible = false
    @bonus_label.x = 128
    @bonus_label.y = 418
    @bonus_label.bitmap = @bonus_bmp = Bitmap.new(@width - 144, 22)
    @dest = [@dest_title, @dest_sprite, @dest_name, @dest_desc, @bonus_label]
    @dest += @places
    @total_places = @places.size
    @sprites += @places
  end

  def create_choice
    @sprites << @choice_sprite = Sprite.new(@choice_vp)
    @choice_sprite.x = @width / 2 - 120
    @choice_sprite.y = @height / 2 - 100
    @choice_sprite.visible = false
    if CHOICE_BACKDROP == ''
      bmp = Bitmap.new(240, 80)
      bmp.fill_rect(0, 0, 240, 80, @black)
    else
      bmp = RPG::Cache.picture(CHOICE_BACKDROP).dup
    end
    @choice_sprite.bitmap = bmp
    bmp.draw_text(0, 0, 240, 24, CHOICE_LABELS[0], 1)
    bmp.draw_text(48, 48, 60, 24, CHOICE_LABELS[1], 1)
    bmp.draw_text(132, 48, 60, 24, CHOICE_LABELS[2], 1)
    @choice_x.map!{|v| @choice_sprite.x + v }
    @sprites << @choice_cursor = Sprite.new(@choice_vp)
    @choice_cursor.visible = false
    @choice_cursor.x = @choice_x[1]
    @choice_cursor.y = @choice_sprite.y + 24
    @choice_cursor.bitmap = RPG::Cache.icon(CURSORS[1]).dup
  end

  def create_destiny
    @sprites << @destiny_backdrop = Sprite.new(@choice_vp)
    @destiny_backdrop.visible = false
    @destiny_backdrop.bitmap = bit = Bitmap.new(@width, @height)
    bit.fill_rect(0, 0, @width, @height, @semi_black)
    @sprites << @destiny_label = Sprite.new(@choice_vp)
    @destiny_label.visible = false
    @destiny_label.x = 32
    @destiny_label.y = @height / 3
    @destiny_label.bitmap = @destiny_bmp = Bitmap.new(@width - 64, 28)
    @destiny_bmp.fill_rect(0, 0, @width - 64, 28, @semi_black)
    @sprites << @destiny_reply = Sprite.new(@choice_vp)
    @destiny_reply.visible = false
    @destiny_reply.x = (@width - @dw) / 2
    @destiny_reply.y = @destiny_label.y + 40
    if REPLY_BACKDROP == ''
      @reply_bmp = Bitmap.new(@dw, 116)
      @reply_bmp.fill_rect(0, 0, @dw, 116, @white)
      @reply_bmp.fill_rect(4, 4, @dw - 8, 108, @semi_black)
    else
      @reply_bmp = RPG::Cache.picture(REPLY_BACKDROP).dup
    end
    @destiny_reply.bitmap = @reply_bmp
    @sprites << @destiny_face = Sprite.new(@choice_vp)
    @destiny_face.visible = false
    @destiny_face.x = @destiny_reply.x + 8
    @destiny_face.y = @destiny_label.y + 48
    @sprites << @timer = Sprite.new(@choice_vp)
    @timer.visible = false
    @timer.x = @destiny_reply.x + 120
    @timer.y = @destiny_face.y + 128
    @timer.bitmap = @timer_bmp = Bitmap.new(260, 24)
  end

  def show_places
    @stats_box.visible = false
    @equip_label.visible = false
    (@equip_backdrops + @equip_names).each{|s| s.visible = false }
    show_current_destination
    @dest_bmp.fill_rect(0, 0, 200, 22, @semi_black)
    @dest_bmp.draw_text(0, 0, 200, 22, @destinations[@place_index].name, 1)
    @dest.each{|sprite| sprite.visible = true }
    @dest_title.visible = true
  end

  def show_current_destination
    place = @destinations[@place_index]
    @dest_title_bmp.font.color = LABEL_COLOR
    text = sprintf(TITLES[1], @place_index + 1, @total_places)
    @dest_title_bmp.fill_rect(0, 0, 240, 24, @semi_black)
    @dest_title_bmp.draw_text(0, 0, 240, 22, text, 1)
    w = @width - 16
    @dest_desc_bmp.fill_rect(0, 20, w, 24, @semi_black)
    @dest_desc_bmp.font.size = 24
    @dest_desc_bmp.font.color = LABEL_COLOR
    @dest_desc_bmp.draw_text(0, 0, w / 2, 22, TITLES[2])
    @dest_desc_bmp.font.color = @white
    @dest_desc_bmp.font.size = 20
    @dest_desc_bmp.draw_text(4, 22, w - 4, 22, place.description)
    @bonus_bmp.clear
    amount = place.gold.to_s
    tw = @bonus_bmp.text_size(amount).width
    lw = @bonus_bmp.text_size(TITLES[3]).width
    @bonus_bmp.font.color = LABEL_COLOR
    @bonus_bmp.draw_text(0, 0, 68, 22, TITLES[3])
    @bonus_bmp.draw_text(12 + lw + tw, 0, 80, 22, @currency)
    @bonus_bmp.font.color = @white
    @bonus_bmp.draw_text(8 + lw, 0, 120, 22, amount)
  end

  def hide_places
    n = 0
    @dest_desc.visible = false
    @dest_title.visible = false
    @dest_name.visible = false
    @dest_sprite.visible = false
    @places.each do |sprite|
      sprite.x = n * @space
      sprite.visible = false
      n += 1
    end
    @bonus_bmp.clear
    @dest_bmp.clear
    @dest_title_bmp.clear
    @dest_name.x = 0
    @place_index = 0
    @stats_box.visible = true
    @equip_label.visible = true
    (@equip_backdrops + @equip_names).each{|s| s.visible = true }
  end

  def reset_places
    n = 0
    @places.each do |place|
      place.x = n * @space
      n += 1
    end
  end

  def update_place_left
    @place_index = (@place_index + @total_places - 1) % @total_places
    if @place_index == 0 or @place_max == @total_places
      reset_places
      @dest_name.x = 0
    elsif @place_index == @total_places - 1
      px = (@place_max - 1) * @space
      px -= (@place_max - @total_places) * @space if @place_max > @total_places
      n = 0
      @places.reverse.each do |place|
        place.x = px - n * @space
        n += 1
      end
      @dest_name.x = px
    elsif @place_index < @place_max
      reset_places unless @place_index == @place_max - 2
      @dest_name.x = @place_index * @space
    elsif @place_index >= @place_max
      @places.each{|place| place.x += @space }
    end
    show_current_destination
    update_place_name
  end

  def update_place_right
    @place_index = (@place_index + 1) % @total_places
    if @place_index == 0 or @place_max == @total_places
      reset_places
      @dest_name.x = 0
    elsif @place_index < @place_max
      @dest_name.x = @place_index * @space
    elsif @place_index >= @place_max
      @places.each{|place| place.x -= @space }
    end
    show_current_destination
    update_place_name
  end

  def update_place_name
    @dest_bmp.clear
    @dest_bmp.fill_rect(0, 0, 200, 22, @semi_black)
    @dest_bmp.draw_text(0, 0, 200, 22, @destinations[@place_index].name, 1)
  end

  def toggle_choice
    @show_choice = !@show_choice
    @choice_sprite.visible = @show_choice
    @choice_cursor.visible = @show_choice
    @choice_cursor.x = @choice_x[1]
  end

  def show_destiny(time)
    time = (time / Graphics.frame_rate).to_s
    hero = @heroes[@index]
    text = sprintf(DESTINY_LABELS[0], $game_actors[hero.id].name)
    @destiny_bmp.draw_text(0, 0, @width - 64, 24, text, 1)
    w = @dw - 122
    bmp = @reply_bmp
    4.times {|n| bmp.draw_text(114, 8 + n * 24, w, 24, hero.reply[n]) }
    update_timer(time)
    @destiny_face.bitmap = @hero_face.bitmap.dup
    @destiny_backdrop.visible = true
    @destiny_reply.visible = true
    @destiny_label.visible = true
    @destiny_face.visible = true
    @timer.visible = true
  end

  def update_time_left(time)
    return if time % Graphics.frame_rate > 0
    time = (time / Graphics.frame_rate).to_s
    update_timer(time)
  end

  def update_timer(time)
    @timer_bmp.clear
    @timer_bmp.fill_rect(32, 0, 260, 24, @black)
    @timer_bmp.draw_text(40, 0, 100, 22, DESTINY_LABELS[1])
    @timer_bmp.draw_text(40, 0, 140, 22, time, 2)
    @timer_bmp.draw_text(184, 0, 76, 22, DESTINY_LABELS[2])
  end

  def dispose
    @equip_names.each{|s| s.dispose }
    @equip_names.clear
    @starters.each {|s| s.dispose }
    @destinations.clear
    @starters.clear
    @names.clear
    @places.clear
    @place_ids.clear
    @choice_vp.dispose
    @place_vp.dispose
    @vp.dispose
    @sprites.each do |sprite|
      next unless sprite.bitmap
      sprite.bitmap.dispose
      sprite.dispose
    end
    @equip_bmp.dispose
    @equip_bmp = nil
    @choice_vp = @place_vp = @vp = nil
    @semi_black = @black = @white = nil
  end
  def hero() @heroes[@index] end
  def place_index() @place_index end
  def update_choice(n) @choice_cursor.x = @choice_x[n] end
end

class KScenario
  def main
    file = RPG::AudioFile.new
    file.name = KSceneSetup::BGM
    file.volume = KSceneSetup::BGM_VOLUME
    file.pitch = KSceneSetup::BGM_PITCH
    $game_system.bgm_play(file)
    if Dir['Save*.rxdata'].empty?
      File.delete(KSceneRetrieve::CHOSEN_FILENAME) rescue nil
    end
    @timer = Graphics.frame_rate * KSceneSetup::SECONDS
    @stage = :main
    @spriteset = StarterSpriteset.new
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      break if $scene != self
    end
    Graphics.freeze
    Audio.bgm_stop
    @spriteset.dispose
    @stage = nil
  end

  def update
    case @stage
    when :main then update_main
    when :place then update_destination
    when :choice then update_final_choice
    when :destiny then update_destiny
    end
  end

  def update_main
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      return $scene = KSceneSetup::FIRST_SCENE.new
    elsif Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_cursor(:left)
      return
    elsif Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_cursor(:right)
      return
    elsif Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @stage = :place
      @spriteset.show_places
    end
  end

  def update_destination
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @spriteset.hide_places
      return @stage = :main
    elsif Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_place_left
      return
    elsif Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_place_right
      return
    elsif Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @spriteset.toggle_choice
      @choice_index = 1
      @stage = :choice
    end
  end

  def no_exit
    $game_system.se_play($data_system.cancel_se)
    @spriteset.toggle_choice
    @stage = :place
  end

  def update_final_choice
    if Input.trigger?(Input::B)
      return no_exit
    elsif Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @choice_index = (@choice_index + 1) % 2
      @spriteset.update_choice(@choice_index)
      return
    elsif Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @choice_index = (@choice_index + 1) % 2
      @spriteset.update_choice(@choice_index)
      return
    elsif Input.trigger?(Input::C)
      return no_exit if @choice_index == 1
      $game_system.se_play($data_system.decision_se)
      hero = @spriteset.hero
      KSceneSetup.chosen << hero.id
      KSceneSetup.chosen = KSceneSetup.chosen.uniq
      KSceneRetrieve.save_chosen_stories
      actor = $game_actors[hero.id]
      item_id = hero.items[rand(hero.items.size)] || 0
      w = hero.weapons
      s = hero.shields
      h = hero.helmets
      b = hero.armors
      a = hero.accessories
      actor.weapon_id = w[rand(w.size)] || 0
      actor.armor1_id = s[rand(s.size)] || 0
      actor.armor2_id = h[rand(h.size)] || 0
      actor.armor3_id = b[rand(b.size)] || 0
      actor.armor4_id = a[rand(a.size)] || 0
      place = KSceneSetup.destinations[@spriteset.place_index]
      $game_party = Game_Party.new
      $game_party.add_actor(hero.id)
      $game_party.gain_gold(hero.gold + place.gold)
      $game_party.gain_item(item_id, 1)
      $game_map.setup(place.id)
      $game_player.moveto(place.x, place.y)
      $game_player.refresh
      $game_map.autoplay
      $game_map.update
      @spriteset.toggle_choice
      @spriteset.show_destiny(@timer)
      return @stage = :destiny
    end
  end

  def update_destiny
    @timer -= 1
    @spriteset.update_time_left(@timer)
    return if @timer > 0
    Graphics.frame_count = 0
    $scene = Scene_Map.new
  end
end

Plantillas en TXT para que el script las lea

Plantilla para cada Héroe que vayan a incluir, por ejemplo: hero 1.txt
Código:
Age: 19
Gold: 2500
Items:
Weapons: 29,30
Shields:
Helmets: 9,10
Body Armors:
Accessories:
Place: Dark and mystical
Description - 3 Lines Max!
Our werewolf reporter found out she owns a mysterious pub in
the Black Forest attended by strange customers. Her drinks are
so famous that people suspect she is some sort of mage.
Reply - 4 Lines Max!
Bah! There's nothing a good drink of
mine can't cure so stop babbling like
a lil baby, you fool!

Plantilla para todos los mapas "iniciales" que pueden elegir - debe llamarse places.txt
Código:
Map ID: 1
X Coord: 10
Y Coord: 10
Extra Gold: 500
Name: Sun Desert
Picture: arid land
Description: You can only find salamanders taking a sunbath here.

Map ID: 2
X Coord: 10
Y Coord: 10
Extra Gold: 500
Name: Cherry Town
Picture: medieval town
Description: A quite noisy town where you can find anything you need.

Map ID: 3
X Coord: 10
Y Coord: 10
Extra Gold: 1000
Name: Sunset Valley
Picture: sunset woods
Description: You'd get lost in no time unless you're an elf!

Map ID: 4
X Coord: 10
Y Coord: 10
Extra Gold: 600
Name: Suicide Slums
Picture: medieval slums
Description: Everything has a price, life is no exception!

Map ID: 5
X Coord: 10
Y Coord: 10
Extra Gold: 1000
Name: Bad Reppy Pub
Picture: strange pub
Description: If you care about your reputation, this isn't the right place for you.

Notas

En todas las plantillas deben dejar un renglón en blanco al puro final para evitarse errores al parsear los archivos. Los TXT son archivos temporales para crear RXDATA en la carpeta Data.

Los gráficos como los cuadros blanco y negro son un relleno en caso de que no eligieran utilizar una imagen de fondo con las dimensiones indicadas en el script.

En el dado caso de que les apareza algún error por Graphics.width o Graphics.height or RPG::Cache.face, copien y peguen el siguiente scriptlet en sus editores de script y todo marchará sobre ruedas.

Código:
module Graphics
  def self.width() 640 end
  def self.height() 480 end
end

module RPG
  module Cache
    def self.face(name) load_bitmap('Graphics/Faces/', name) end
  end
end

La razón por la que podía ocurrir dichos errores sería que yo desarrollé el script no solo para el RMXP por defecto sino también para HiddenChest, una variante del engine mkxp de Ancurio. Mi engine tiene la opción de utilizar mayores resoluciones de ventana que las del XP (hasta 1680 x 1050 px).

#2KScenario XP Empty Re: KScenario XP el Jue Jul 04, 2019 6:09 pm

Vala

Vala
¡Bravooo! Se ve super genial y con ese script cualquier proyecto tendrá un mayor atractivo. Siempre me encantaron esos juegos en los que se desarrollan varias líneas contemporáneas y luego las historias de los héroes se cruzan. Lástima que no uso XP, pero estoy segura de que a muchos les servirá.

Ópalo Reputación por el aporte, y muchas gracias por compartirlo.

Saludos,
Vala.



KScenario XP M4FTeH
KScenario XP Dreki_userbar_by_orochii-d5lt2qd

#3KScenario XP Empty Re: KScenario XP el Sáb Jul 06, 2019 3:16 am

orochii

orochii
Lo de selección de personaje me recuerda a un script vieeeeejo como nada en el mundo de Moghunter. Que era medio feo de setear (creo que estaba hecho fijo para 8 personajes, así que si querías tener digamos 3 a escoger, mala suerte xD).

Pero este tiene más cosas, viéndolo más detenidamente este me recuerda más bien a los sistemas de creación de partida de Baldur's Gate y por el estilo. Puedes añadir los personajes que quieras, mostrar un backstory al jugador, objetos con que inicia, etc. Y lo de la localización de inicio, que quiza no es algo que saliera en Baldur's Gate pero me hace pensar en el cuadro de escribir backstory (muchas veces lo dejé en lo que venía :yaomingface:).



KScenario XP Halo_m7KScenario XP 2c825 // KScenario XP 2c80V// KScenario XP Indiedb// KScenario XP 2vFLJ

KScenario XP Dreki_userbar_by_orochii-d5lt2qd
Covenant Studios

¿Y toda esa sangre? ¡Blargh!
Ghrraaaaaaaaaaaahhhh...

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.