じ☆ve冰风 发表于 2026-8-3 10:53:11

N.A.S.T.Y Extra Stats

N.A.S.T.Y. Extra Stats(Version 1.1)





By: Nelderson





Updated: 3/27/12



Introduction

This script gives actors and enemies extra stats that you can use anywhere in your game!

Features

- New Stats for your game.

- Define a formula for each new stat you make.

- Use these new stats in skill formulas, or whatever else you feel like.

- See your extra stats on the Status screen (Up to 6).

- Equipment can increase these stats with a notetag.

How to Use

The instructions on the script itself has everything you need!

Demo

I'll make one if you guys want one!

Script

Spoiler#===============================================================================
#                                                N.A.S.T.Y. Extra Stats
#                                  Nelderson's Awesome Scripts To You
# By: Nelderson
# Made On: 12/19/2011
# Last Updated : 3/27/2012
#===============================================================================
# Update History:
# - Version 1.1- Cleaned up some , and added enemies xstats for Enemies!
# - Version 1.0- Initial release, made for theof it
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
#===============================================================================
# *Notes:
# - This script can be used to make all sorts of stats that can derive from
#   an actor's level, and base stats.
#
# - This thing can be a pain to set up, but once it's done, it can be a very
#   powerful way to include new stats into your game!
#
# - Made a quick edit to the status screen to show up to 6 stats!
#
# *Usage
#
# -First is the STATS section.This is an array that holds all the new
#stats that everything else gets info from.
#
# - Next fill out the Default Level formula(Use Example Below as a guide)
#   *ANYTHING that an actor has, you can base it off of (Except other XSTATS!)
#           (level, hp, mp, atk, spi, agi, maxhp, etc.)
#
# -You can use the ACTOR and ENEMY NOTETAGS to customize
#the formulas for each actor.
#
#Examples:
#   Place the following in an actor's notebox(You must make one for each stat):
#               <xstat>
#               :str => '(level/3.5) + 16',
#               :con => '(level/5.6) + 12',
#               :dex => '(level/5.25) + 15 + agi',
#               :int => '(level/10.5) + 10',
#               :wis => '(level/10.5) + 10',
#               :cha => '(level/10.5) + 10',
#               <xstat_end>
#
#   Or you can place this in an actor's/enemy's notebox
#               <xstat>
#               :str => 15,
#               :con => 14,
#               :dex => 13,
#               :int => 12,
#               :wis => 11,
#               :cha => 0,
#               <xstat_end>
#
# - This script also uses notetags for weapons and armors to increase xstats
#   if you want.Just place in a notebox:
#
#               <weapon_xstat: STAT x> , where STAT is th name of the new stat
#
#           Ex. <weapon_xstat: str 5> , would raise the actor's str +5
#
#*For Scripters
#
#-If you want to access the stats, just use:
#                actor.xstat.STAT - Where STAT is the name of the new stat
#          
#           Ex. $game_actors.xstat.str , will return actor 1's str
#
#===============================================================================
# Credits:
# -Nelderson and Zetu
#Original Script was made by Zetu, and I spiced theout of it!
#===============================================================================

module Z26

STATS = [:str,:con,:dex,:int,:wis,:cha]

#Default xstat formulas for ACTORS
DEFAULT_LEVEL_FORMULA =
                {
                  :str => '(level/3.5) + 16 + atk',
                  :con => '(level/5.6) + 12',
                  :dex => '(level/5.25) + 15 + agi',
                  :int => '(level/10.5) + 10',
                  :wis => '(level/10.5) + 10',
                  :cha => '(level/10.5) + 10',
                }

#Default xstat formulas for ENEMIES          
DEFAULT_FOR_ENEMIES =
                {
                  :str => 0,
                  :con => 0,
                  :dex => 0,
                  :int => 0,
                  :wis => 0,
                  :cha => 0,
                }

   def self.actor_level_formulas(actor_id)
          jhh = ""
          strin = $data_actors.get_start_end_cache
          strin.each do |i|
                jhh += i
          end
          return DEFAULT_LEVEL_FORMULA if strin == "" or strin == []
          return eval("{#{jhh}}")
        end

        def self.enemy_stats(enemy_id)
          jhh = ""
          strin = $data_enemies.get_start_end_cache
          strin.each do |i|
                jhh += i
          end
          return DEFAULT_FOR_ENEMIES if strin == "" or strin == []
          return eval("{#{jhh}}")
        end

#=============================================================================
SYMBOLS = []
for stat in STATS
        SYMBOLS.push(stat)
end
Xstats = Struct.new(*SYMBOLS)
end

class Game_Enemy < Game_Battler
attr_accessor :xstat

alias z26_enemy_set initialize unless $@
def initialize(*args)
        z26_enemy_set(*args)
        @xstat = Z26::Xstats.new(*(*Z26::STATS.size))
        for stat in Z26::STATS
          z26variate_stats(stat)
        end
end

def z26variate_stats(stat)
        return if Z26.enemy_stats(@enemy_id).nil?
        if Z26.enemy_stats(@enemy_id).is_a?(String)
          set_in = eval(Z26.enemy_stats(@enemy_id)).to_i
          eval("@xstat.#{stat} += #{set_in}")
        else
          set_in = Z26.enemy_stats(@enemy_id)
          @xstat += set_in
        end
end
end

class Game_Actor < Game_Battler
attr_accessor :xstat

alias z26_s setup unless $@
def setup(actor_id)
        z26_s(actor_id)
        @xstat = Z26::Xstats.new(*(*Z26::STATS.size))
        for item in equips.compact
          z26variate_equip(item)
        end
        for stat in Z26::STATS
          z26variate_stats(stat, @level)
        end
end

alias z26_change_equip change_equip
def change_equip(equip_type, item, test = false)
        last_item = equips
        z26_change_equip(equip_type, item)
        z26variate_equip(item)
        z26variate_equip(last_item, false)
end

#=====================#
##EDITED BY NELDERSON##
#=====================#
def z26variate_equip(item, adding = true)
        return if item.nil?
        for line in item.note.split(/[\r\n]+/).each{ |a|
          case a
          when /<weapon_xstat:[ ](.*)[ ](\d+)>/i
                  if Z26::STATS.include?(eval(":" + $1))
                        if adding
                          eval("@xstat.#{$1} += #{$2}")
                        else
                        eval("@xstat.#{$1} -= #{$2}")
                  end
                end
          end
          }
        end
end

def z26variate_stats(stat, level, adding = true)
        return if Z26.actor_level_formulas(@actor_id).nil?
        if Z26.actor_level_formulas(@actor_id).is_a?(String)
          amount = eval(Z26.actor_level_formulas(@actor_id)).to_i
        else
          amount = Z26.actor_level_formulas(@actor_id)
        end
        if adding
          eval("@xstat.#{stat} += #{amount}")
        else
          eval("@xstat.#{stat} -= #{amount}")
        end
end

alias z26level_up level_up unless $@
def level_up
        for stat in Z26::STATS
          z26variate_stats(stat, @level, false)
        end
        z26level_up
        for stat in Z26::STATS
          z26variate_stats(stat, @level)
        end
end
end

class Window_Status < Window_Selectable
def draw_block3(y)
        draw_parameters(0, y)
        draw_equipments(344, y)#288
        draw_xstat_parameters(172, y)
end

def draw_xstat_parameters(x, y)
        @actor.xstat.size.times {|i|
        draw_actor_xstat_param(@actor, x, y + line_height * i, i) }
end
end

class Window_Base < Window
def draw_actor_xstat_param(actor, x, y, param_id)
        id = Z26::STATS
        change_color(system_color)
        draw_text(x, y, 120, line_height, id.capitalize)
        change_color(normal_color)
        draw_text(x + 120, y, 36, line_height, actor.xstat, 2)
end
end

class RPG::BaseItem
def get_start_end_cache
        record = false
        temp = []
        self.note.split(/[\r\n]+/).each do |line|
          if line =~ /<xstat>/i
                record = true
          elsif line =~ /<xstat_end>/i
                record = false
          end
          if record
                temp << line
          end
        end
        return nil if temp == ""
        temp.delete_at(0)
        temp
end
end

                Code:       






FAQ

Q: What does N.A.S.T.Y. stand for?

A: Nelderson's Awesome Scripts to You!

Credit and Thanks

- Nelderson

- Zetu, for her original script, and showing me the value of Structs <3


本贴来自国际rpgmaker官方论坛作者:Nelderson处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/n-a-s-t-y-extra-stats.998/
页: [1]
查看完整版本: N.A.S.T.Y Extra Stats