[Ace] State Cycle and Icons problems (str33g1)

● ARCHIVED · READ-ONLY
Started by Malfim 4 posts View original ↗
  1. Hey guys, I need some help. I can't script even to save my life, but i'm trying to learn and so and I need your help.

    I'm using the str33g1 script to show a battle hud, so i've been trying to edit it lttle by little to serve my needs, but i'm facing a problem right now. In the states cycle area, I want to show a max of 3 icons and have the cycling begin only when there are 4 or more states, in wich I have succeeded, i think. But when I have less than 3 states, the icons repeat themselves, like this:



    Is there a way to this not happen? Like, I want it to show only one icon per state ):

    Here's my edited script:

    Spoiler
    #==============================================================================
    # ★RGSS2
    # STR33g1_Battle Status 0.5 08/03/20
    # VXAce Version by Melosx 12/03/04
    #
    # ・STR11e has the same specifications.
    # ★STR11eの後付ゲージプラグインを利用することができます。
    #  このスクリプトより下に導入してください。
    #
    # ◇Features
    # ・Different HP/MP/TP Gauge Flavor
    # ・"Rolling" Numbers
    # ・State Icon Cycle
    #
    # ◇Materials
    # This script requires several image skins.
    # Skin images are placed in the .Graphics\System folder.
    #
    # ・Main Skin
    #  HP/MP Back Gauge Skin
    #  No size limit.
    # ・HP/MP Gauge
    #  Normally two gauges
    #   Width = Unlimited
    #  Height = Gauge Height(Optional) * 2
    #  一列目に通常ゲージ、二列目に追尾ゲージを配置します。
    # ・Numbers
    #  0123456789 is the order of number arrays
    #   Width = One Frame Width(Any Size) * 10
    #  Height = Unlimited
    # ・State Skin
    #  State Icon Main Skin
    #  なにもステートが掛かっていない時は非表示になる仕様の為、
    #  Main skin is separate.
    #  No size limit.
    #
    #==============================================================================
    # ■ Window_BattleStatus
    #==============================================================================
    class Window_BattleStatus < Window_Selectable
    # Skin File name
    BTSKIN_00 = "Btskin_main" # Main Skin
    BTSKIN_01 = "Btskin_hp" # HP(Gauge)
    BTSKIN_02 = "Btskin_mp" # MP(Gauge)
    BTSKIN_07 = "Btskin_tp" # TP(gauge)
    BTSKIN_04 = "Btskin_n00" # HP(Numbers)
    BTSKIN_05 = "Btskin_n01" # MP(Numbers)
    BTSKIN_08 = "Btskin_n02" # TP(Numbers)
    BTSKIN_03 = "Btskin_state" # State
    # Skin coordinates[ x, y]
    BTSKIN_B_XY = [ -5, 3] # Standard Coordinates
    BTSKIN_00XY = [ 0, 0] # Main Skin
    BTSKIN_01XY = [158, 14] # HP(Gauge)
    BTSKIN_02XY = [241, 14] # MP(Gauge)
    BTSKIN_07XY = [323, 14] # TP(Gauge)
    BTSKIN_04XY = [183, 1] # HP(Numbers)
    BTSKIN_05XY = [269, 1] # MP(Numbers)
    BTSKIN_08XY = [352, 1] # TP(Numbers)
    BTSKIN_03XY = [100, -10] # State Skin
    BTSKIN_06XY = [82, 0] # State
    # Various Settings
    BTSKIN_01GS = 2 # HP Gauge Speed (Low values are fast)
    BTSKIN_02GS = 4 # MP Gauge Speed(Low values are fast)
    BTSKIN_07GS = 4 # TP Gauge Speed(Low values are fast)
    BTSKIN_04SS = 8 # HP Rolling Numbers Speed(Low values are fast)
    BTSKIN_05SS = 2 # MP Rolling Numbers Speed(Low values are fast)
    BTSKIN_08SS = 4 # TP Rolling Numbers Speed(Low values are fast)
    BTSKIN_04NS = 4 # HP Maximum Digits
    BTSKIN_05NS = 4 # MP Maximum Digits
    BTSKIN_08NS = 3 # TP Maximum Digits
    BTSKIN_06WH = [72,24] # [State Width, Height]
    BTSKIN_06SC = 3 # State Icon Scroll Speed
    # (Values close to 1 are fast)


    # バトルステータス座標
    def set_xy
    @x = []
    @y = []
    for i in 0...$game_party.battle_members.size
    x = 0
    y = (i * 24)
    @x = x + 16#+ STRRGSS2::ST_SX
    @y = y + 16#+ STRRGSS2::ST_SY
    end
    end
    # 設定箇所ここまで
    @@f = false

    #--------------------------------------------------------------------------
    # ★ エイリアス
    #--------------------------------------------------------------------------
    alias initialize_str33 initialize
    def initialize(f = false)
    initialize_str33
    unless @@f
    @f = @@f = true
    else
    @f = false
    end
    set_xy
    @s_sprite = []
    @s_party = []
    @s_lv = []
    @opacity = 0
    self.contents.dispose
    self.create_contents
    self.back_opacity = 0
    self.opacity = 0
    #@column_max = $game_party.actors.size
    @viewport = Viewport.new(0, 416-128, 416, 128)
    @hpgw = (Cache.system(BTSKIN_01)).width
    @mpgw = (Cache.system(BTSKIN_02)).width
    @tpgw = (Cache.system(BTSKIN_07)).width
    @viewport.z = self.z - 1
    @state_opacity = []
    @item_max = $game_party.battle_members.size
    return unless @f
    for i in 0...@item_max
    draw_item(i)
    end
    update
    end
    #--------------------------------------------------------------------------
    # ● リフレッシュ潰し
    #--------------------------------------------------------------------------
    def refresh
    # :)
    end
    #--------------------------------------------------------------------------
    # ● ステートの描画
    #--------------------------------------------------------------------------
    def draw_actor_state(actor)
    icon = Cache.system("Iconset")
    w = actor.states.size * 24
    w = 24 if w < 1
    bitmap = Bitmap.new(w, BTSKIN_06WH[1])
    count = 0
    for state in actor.states
    icon_index = state.icon_index
    x = 24 * count
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    bitmap.blt(x, 0, icon, rect)
    count += 1
    end
    return bitmap
    end
    #--------------------------------------------------------------------------
    # ● 名前作成
    #--------------------------------------------------------------------------
    def name_bitmap(actor)
    bitmap = Bitmap.new(100, 24)
    bitmap.font.size = 16
    bitmap.draw_text(0, 0, 100, 24, actor.name)
    return bitmap
    end
    #--------------------------------------------------------------------------
    # ● ステート数取得
    #--------------------------------------------------------------------------
    def state_size(actor)
    return actor.states.size
    end
    #--------------------------------------------------------------------------
    # ● アイテム作成
    #--------------------------------------------------------------------------
    def draw_item(index)
    return unless @f
    actor = $game_party.battle_members[index]
    #
    @s_sprite[index] = []
    s = @s_sprite[index]
    # メインスキン
    s[0] = Sprite.new(@viewport)
    s[0].bitmap = Cache.system("HUD_" + actor.name)
    s[0].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_00XY[0]
    s[0].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_00XY[1]
    s[0].z = 0
    # HP
    s[1] = Sprite.new(@viewport)
    s[1].bitmap = Cache.system(BTSKIN_01)
    s[1].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_01XY[0]
    s[1].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_01XY[1]
    s[1].z = 4
    w = s[1].bitmap.width
    h = s[1].bitmap.height / 2
    s[1].src_rect.set(0, 0, w, h)
    s[2] = Sprite.new(@viewport)
    s[2].bitmap = Cache.system(BTSKIN_01)
    s[2].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_01XY[0]
    s[2].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_01XY[1]
    s[2].z = 3
    s[2].src_rect.set(0, h, w, h)
    s[11] = 96
    s[6] = Sprite_strNumbers.new(@viewport, BTSKIN_04, BTSKIN_04NS)
    s[6].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_04XY[0]
    s[6].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_04XY[1]
    s[6].z = 5
    s[13] = actor.hp
    s[6].update(s[13])
    # MP
    s[3] = Sprite.new(@viewport)
    s[3].bitmap = Cache.system(BTSKIN_02)
    s[3].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_02XY[0]
    s[3].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_02XY[1]
    s[3].z = 4
    w = s[3].bitmap.width
    h = s[3].bitmap.height / 2
    s[3].src_rect.set(0, 0, w, h)
    s[4] = Sprite.new(@viewport)
    s[4].bitmap = Cache.system(BTSKIN_02)
    s[4].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_02XY[0]
    s[4].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_02XY[1]
    s[4].z = 3
    s[4].src_rect.set(0, h, w, h)
    s[12] = 56
    s[7] = Sprite_strNumbers.new(@viewport, BTSKIN_05, BTSKIN_05NS)
    s[7].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_05XY[0]
    s[7].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_05XY[1]
    s[7].z = 5
    s[14] = actor.mp
    s[7].update(s[14])
    #TP
    s[16] = Sprite.new(@viewport)
    s[16].bitmap = Cache.system(BTSKIN_07)
    s[16].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_07XY[0]
    s[16].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_07XY[1]
    s[16].z = 4
    w = s[16].bitmap.width
    h = s[16].bitmap.height / 2
    s[16].src_rect.set(0, 0, w, h)
    s[17] = Sprite.new(@viewport)
    s[17].bitmap = Cache.system(BTSKIN_07)
    s[17].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_07XY[0]
    s[17].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_07XY[1]
    s[17].z = 3
    s[17].src_rect.set(0, h, w, h)
    s[20] = 56
    s[18] = Sprite_strNumbers.new(@viewport, BTSKIN_08, BTSKIN_08NS)
    s[18].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_08XY[0]
    s[18].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_08XY[1]
    s[18].z = 5
    s[19] = (actor.tp).to_i
    s[18].update(s[19])
    # ステート
    s[5] = Viewport.new(0, 0, BTSKIN_06WH[0], BTSKIN_06WH[1])
    s[5].rect.x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_06XY[0] + @viewport.rect.x
    s[5].rect.y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_06XY[1] + @viewport.rect.y
    s[5].z = @viewport.z + 1
    s[8] = Sprite.new(@viewport)
    s[8].bitmap = Cache.system(BTSKIN_03)
    s[8].x = @x[index] + BTSKIN_B_XY[0] + BTSKIN_03XY[0]
    s[8].y = @y[index] + BTSKIN_B_XY[1] + BTSKIN_03XY[1]
    s[8].z = -2
    s[9] = Plane.new(s[5])
    s[9].bitmap = draw_actor_state(actor)
    s[10] = state_size(actor)
    # 現在のステータスに
    s[11] = ((@hpgw * (actor.hp / (actor.mhp * 1.0))) + 1).truncate
    if actor.mmp != 0
    s[12] = ((@mpgw * (actor.mp / (actor.mmp * 1.0))) + 1).truncate
    else
    s[12] = 0
    end
    s[20] = ((@tpgw * (actor.tp / (actor.max_tp* 1.0))) + 1).truncate
    s[1].src_rect.width = s[11]
    s[2].src_rect.width = s[11]
    s[3].src_rect.width = s[12]
    s[4].src_rect.width = s[12]
    s[16].src_rect.width = s[20]
    s[17].src_rect.width = s[20]
    s[6].update(s[13])
    s[7].update(s[14])
    s[18].update(s[19])
    # 不可視に
    for l in [0,1,2,3,4,8,9,16,17]
    s[l].opacity = 0
    end
    for l in [6,7,18]
    s[l].o = 0
    end
    # 情報記憶
    @s_lv[index] = actor.level
    @s_party[index] = [actor.name, actor.hp, actor.mhp,
    actor.mp, actor.mmp, actor.states, actor.tp]
    #
    end
    #--------------------------------------------------------------------------
    # ● オブジェクト開放
    #--------------------------------------------------------------------------
    def dispose
    super
    return unless @f
    for i in 0...@s_sprite.size
    for l in [0,1,2,3,4,8,9,16,17]
    @s_sprite[l].bitmap.dispose
    @s_sprite[l].dispose
    end
    for l in [5,6,7,18]
    @s_sprite[l].dispose
    end
    end
    @@f = false
    end
    #--------------------------------------------------------------------------
    # ● フレーム更新
    #--------------------------------------------------------------------------
    def update
    super
    return unless @f
    for i in 0...@s_sprite.size
    s = @s_sprite
    a = $game_party.battle_members
    m = @s_party
    @state_opacity = 0 if @state_opacity == nil
    # 不透明度アップ
    @state_opacity += 8
    if @opacity < 272
    @opacity += 8
    for l in [0,1,2,3,4,16,17]
    s[l].opacity = @opacity
    end
    for l in [6,7,18]
    s[l].o = @opacity
    end
    end
    # HP/MP/TP更新
    update_hp(s,a,m)
    update_mp(s,a,m)
    update_tp(s,a,m)
    # ステート更新
    if s[10] > BTSKIN_06WH[0] / 24 and (Graphics.frame_count % BTSKIN_06SC) == 0
    s[9].ox += 1
    end
    if s[10] > 0 and @state_opacity < 272
    for l in [8,9]
    s[l].opacity = @state_opacity
    end
    end
    if a.states != m[5]
    m[5] = a.states
    s[9].ox = 0
    s[9].bitmap.dispose
    s[9].bitmap = draw_actor_state($game_party.battle_members)
    s[10] = state_size($game_party.battle_members)
    @state_opacity = 0
    for l in [8,9]
    s[l].opacity = @state_opacity
    end
    end
    end
    end
    #--------------------------------------------------------------------------
    # ● フレーム更新 (HP)
    #--------------------------------------------------------------------------
    def update_hp(s,a,m)
    # HPくるくる
    if a.hp != s[13]
    c = 0; c = 1 if a.hp < a.mhp / 4; c = 2 if a.hp == 0
    if s[13] > a.hp
    s[13] -= BTSKIN_04SS
    s[13] = a.hp if s[13] < a.hp
    else
    s[13] += BTSKIN_04SS
    s[13] = a.hp if s[13] > a.hp
    end
    s[6].update(s[13], c)
    end
    # HP
    if a.hp != m[1]
    s[11] = ((@hpgw * (a.hp / (a.mhp * 1.0))) + 1).truncate
    m[1] = a.hp
    end
    sr = s[1].src_rect
    if sr.width != s[11]
    sp = BTSKIN_01GS
    sr.width = (s[11] + (s[1].src_rect.width * (sp - 1))) / sp
    sr.width = 2 if sr.width <= 1 and a.hp > 0
    end
    sr = s[2].src_rect
    sp = 2
    if sr.width != s[1].src_rect.width and (Graphics.frame_count % sp) == 0
    if sr.width < s[1].src_rect.width
    sr.width += 1
    else
    sr.width -= 1
    end
    end
    sr.width = 2 if sr.width <= 1 and a.hp > 0
    end
    #--------------------------------------------------------------------------
    # ● フレーム更新 (MP)
    #--------------------------------------------------------------------------
    def update_mp(s,a,m)
    # MPくるくる
    if a.mp != s[14]
    c = 0; c = 1 if a.mp < a.mmp / 4
    if s[14] > a.mp
    s[14] -= BTSKIN_05SS
    s[14] = a.mp if s[14] < a.mp
    else
    s[14] += BTSKIN_05SS
    s[14] = a.mp if s[14] > a.mp
    end
    s[7].update(s[14], c)
    end
    # MP
    if a.mp != m[3]
    if a.mmp != 0
    s[12] = ((@mpgw * (a.mp / (a.mmp * 1.0))) + 1).truncate
    else
    s[12] = 0
    end
    m[3] = a.mp
    end
    sr = s[3].src_rect
    if sr.width != s[12]
    sp = BTSKIN_02GS
    sr.width = (s[12] + (s[3].src_rect.width * (sp - 1))) / sp
    sr.width = 2 if sr.width <= 1 and a.mp > 0
    end
    sr = s[4].src_rect
    sp = 2
    if sr.width != s[3].src_rect.width and (Graphics.frame_count % sp) == 0
    if sr.width < s[3].src_rect.width
    sr.width += 1
    else
    sr.width -= 1
    end
    end
    sr.width = 2 if sr.width <= 1 and a.mp > 0
    end
    def update_tp(s,a,m)
    # TPくるくる
    if a.tp != s[19]
    c = 0; c = 1 if a.tp < 100
    if s[19] > a.tp
    s[19] -= BTSKIN_08SS
    s[19] = a.tp if s[19] < a.tp
    else
    s[19] += BTSKIN_08SS
    s[19] = a.tp if s[19] > a.tp
    end
    s[18].update(s[19].to_i, c)
    end
    # TP
    if a.tp != m[6]
    if a.tp != 0
    s[20] = ((@tpgw * (a.tp / (a.max_tp * 1.0))) + 1).truncate
    else
    s[20] = 0
    end
    m[6] = a.tp
    end
    sr = s[16].src_rect
    if sr.width != s[20]
    sp = BTSKIN_07GS
    sr.width = (s[20] + (s[16].src_rect.width * (sp - 1))) / sp
    sr.width = 2 if sr.width <= 1 and a.tp > 0
    end
    sr = s[17].src_rect
    sp = 2
    if sr.width != s[16].src_rect.width and (Graphics.frame_count % sp) == 0
    if sr.width < s[16].src_rect.width
    sr.width += 1
    else
    sr.width -= 1
    end
    end
    sr.width = 2 if sr.width <= 1 and a.tp > 0
    end
    end
    #==============================================================================
    # ■ Sprite_strNumber
    #==============================================================================
    class Sprite_strNumber < Sprite
    #--------------------------------------------------------------------------
    # ● オブジェクト初期化
    #--------------------------------------------------------------------------
    def initialize(v, gra, n = 0)
    @n = n
    super(v)
    self.bitmap = Cache.system(gra)
    @w = self.bitmap.width/10
    @h = self.bitmap.height/3
    self.src_rect = Rect.new(@n*@w, 0, @w, @h)
    end
    #--------------------------------------------------------------------------
    # ● フレーム更新
    #--------------------------------------------------------------------------
    def update(n = -1, c = 0)
    @n = n
    self.src_rect.x = @n*@w
    self.src_rect.y = c*@h
    end
    end
    #==============================================================================
    # ■ Sprite_strNumbers
    #==============================================================================
    class Sprite_strNumbers
    attr_accessor :x
    attr_accessor :y
    attr_accessor :z
    attr_accessor :o
    #--------------------------------------------------------------------------
    # ● オブジェクト初期化
    #--------------------------------------------------------------------------
    def initialize(v, gra, n = 4, s = 0)
    @n = n.to_i # 桁数
    @x = 0
    @y = 0
    @z = 0
    @o = 255
    @sprite = []
    # 字間設定
    b = Cache.system(gra)
    @s = b.width / 10 - s
    # スプライト作成
    for i in 0...n
    @sprite = Sprite_strNumber.new(v, gra)
    end
    update
    end
    #--------------------------------------------------------------------------
    # ● フレーム更新
    #--------------------------------------------------------------------------
    def update(v = 0, c = 0)
    val = []
    # 数値を配列に格納
    for i in 0...@n
    if (10 ** (i)) == 0
    val = v % 10
    else
    val = v / (10 ** (i)) % 10
    end
    end
    val = val.reverse
    # 先頭の0を取り除く
    for i in 0...@n
    if val == 0 and @n != i + 1
    val = -1
    else
    break
    end
    end
    # スプライト更新
    for i in 0...@n
    @sprite.update(val, c)
    @sprite.x = @x + (i * @s)
    @sprite.y = @y
    @sprite.z = @z
    @sprite.opacity = @o
    end
    end
    #--------------------------------------------------------------------------
    # ● 不透明度の適用
    #--------------------------------------------------------------------------
    def o=(val)
    @o = val
    for i in 0...@n
    @sprite.opacity = @o
    end
    end
    #--------------------------------------------------------------------------
    # ● オブジェクト開放
    #--------------------------------------------------------------------------
    def dispose
    for i in 0...@sprite.size
    @sprite.bitmap.dispose
    @sprite.dispose
    end
    end
    end
    #==============================================================================
    # ■ Scene_Battle
    #==============================================================================
    class Scene_Battle
    def update_info_viewport
    return 0
    end
    def create_status_window
    @status_window = Window_BattleStatus.new
    @status_window.x = 0
    end
    def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height
    @info_viewport.rect.height = @status_window.height
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
    end
    def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler:)attack, method:)command_attack))
    @actor_command_window.set_handler:)skill, method:)command_skill))
    @actor_command_window.set_handler:)guard, method:)command_guard))
    @actor_command_window.set_handler:)item, method:)command_item))
    @actor_command_window.set_handler:)cancel, method:)prior_command))
    @actor_command_window.x = 416
    end

    def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.x = 416
    @party_command_window.set_handler:)fight, method:)command_fight))
    @party_command_window.set_handler:)escape, method:)command_escape))
    @party_command_window.unselect
    end
    end

    Code:


    The reason I'm asking for help here is that the original post of this translation is rather dead :(

    I hope you guys can help me! :)

    Thanks in advance!

    Ps: Sorry for my bad english, but I think the topic is understandable, right? :3
  2. Holy shist, you might wanna put that script in a spoiler. :p
  3. Done that lol :D
  4. Still can't figure it out...

    Maybe the path I took is completely wrong ):

    Anyone? :~