*This script has been taken down due to some major bugs. It is being rewritten and this thread will be revived once it is complete*
Grid Inventory
Version: 1.0
Author: modern algebra
Date: Novemeber 3, 2007
Version History
- Version 1.0 - Original; all current features
Description
This script does multiple things. First: it gives each actor their own inventory. Second: that inventory is displayed through a grid, with each item taking up a specific amount of squares. How many squares is completely customizable for each and every item. You are also able to set a maximum number of instances of that item each slot can hold. This means that for each item, say for instance, arrows, you can define how many arrows could fit into one displayed slot of arrows. See the demo for clarification. You can also set a picture graphic for each item, though it is not necessary. Beyond that, you can easily set up permanent storage events, each of which are easy to set up and save what items are stored in them at any given time. Items will be automatically distributed amongst the party. If, upon gaining an item, you cannot fit that item or items into the party member's inventories, it will call up a loot inventory and you can decide which items to discard and which to keep. As well, you can customize the size of each actor's inventory and you can modify that at any time with a simple script call. A good system to compare this to is the system from Betrayal at Krondor, as that is what it was based on, but as that is not very well known, this system is similar to the item system of the Diablo series.
Features
- Limited Inventory
- Each actor has his own inventory, and the size of his inventory can be changed at any time, to a maximum of 12 x 12 slots
- The inventory is displayed on a grid. Through this grid, you can move, discard, equip, use, transfer items to another player, and view detailed information on each item.
- You can customize the exact number of squares each item takes up, as well as the maximum stack size. You can even set a picture to represent that item in the inventory.
- You can set permanent storage chests which can not only come with items for the party to retrieve, but also allows the party to store their excess items. You can also set the exact size of these storage boxes.
- In battle, each actor can only use what items are in his inventory, thus adding some strategy to any battle system
- And much more...
Screenshots
Aluxes' Inventory
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg68.imageshack.us%2Fimg68%2F1345%2Fgridscreenshot2nw1.png&hash=b928a798699d1fae41ed0cb065955fe7a0bc87b7)
The command options
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg222.imageshack.us%2Fimg222%2F1492%2Fgridscreenshot4zz5.png&hash=02819c68a477891d6000ec64cbe59c5a37d7c378)
The other command options
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg221.imageshack.us%2Fimg221%2F5448%2Fgridscreenshot3ln4.png&hash=ef9e4ba278f95263a4d6ba51aae215733d678982)
Moving an Item
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg221.imageshack.us%2Fimg221%2F2535%2Fgridscreenshot7ty4.png&hash=4400da319e6919ca5bf4e044d7febc3906ab54c3)
The Item Details Window
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg68.imageshack.us%2Fimg68%2F3439%2Fgridscreenshot1iw7.png&hash=af9631fd376aabf76d1b90cf83b3af00fac1fbd2)
Transferring an Item
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg221.imageshack.us%2Fimg221%2F1776%2Fgridscreenshot5zc1.png&hash=6a08146adeba6298f17f67214e35434b99b8ef72)
Discarding a battle axe
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg221.imageshack.us%2Fimg221%2F5792%2Fgridscreenshot6ex1.png&hash=4be6017742f15fbbdbf014592d720149a70e8656)
Instructions
It's pretty simple. Basically, you need to put the script provided above main. Then, get my Paragraph Formatter (http://rmrk.net/index.php/topic,22215.0.html) and put it above this script. It is important that you get that! The script will throw errors at you without it. Get the facade as well. It is in the topic right underneat the script. Then, you will notice at the top of the script there are three Constants to be set, ELEMENTAL_ICON_ARRAY, DEFAULT_GRID_WIDTH, and DEFAULT_GRID_HEIGHT. Set those as you please. The more difficult part comes with defining the widths, heights, and maximum stack sizes of the items. This is done through a text document called Item Data. You can do this in two ways.
(1) By using the Item Data Generator attached. This is a visual way of seeing what you are doing. Download it and instructions are inside. This way iss best if you need to define a majority of the items. Basically, all you need to do is copy your databases into the Item Data Generator and run it, setting input where it is necessary. I used cybersam's keyboard script for the input of it, so thank him when you are using it.
(2) Manually, by modifying the text document itself. This is best for minor revisions and additions. Basically, the text document is set up like this:
Items
100,200,100,
1,1,5,
1.2,5,
...
Weapons
150,240,35,
1,4,1,scimitar.png
1,4,1,
...
Armors
100,100,100,
3,4,1,
4,3,1,
...
What does that mean? Basically, the headings Items, Armors, and Weapons signify that the numbers below it will correspond to Items, Weapons, or Armors. The next three numbers are the color you associate with that type of item. The first number is red, the second is green, the third is blue. You can experiment with these colours to determine which ones should represent which grouping of items. All the lines following that and before the next header (or the end of the file in the case of Armors), correspond to each item, weapon or armor ID. Therefore, the line immediately following the colour corresponds to Item # 1, the next to Item #2, etc... Basically, the first number in each line is the width of the item (in squares, not in pixels), the next number is the height, the third number is how many of that type of item can fit into one stack, and then, you can put the name of the picture to associate with that item. If you leave that blank, then it will just use the icon. Any picture name you put there should have the extension, and the file ought to be in the pictures folder of the graphics folder. If not, you will get errors. Also, there should be three commas on each line, or else you might get an error. Always put it like this:
1,2,1,
and never
1, 2, 1
The text file should be named Item Data. If it is not, you will get an error. A sample Item Data text file is included in the attachment at the bottom of this post. I recommend you follow that as a guide whenever you manually edit your Item Data text file.
You also need to have a png called Loot Bitmap in your pictures folder. I will eventually release a full pack of item pictures, and include a few good ones for loot, storage, etc...
Script
Too long. See attached.
Credit
Support
Contact me here or at RMRevolution for support on this script. I will fix any bugs for you, and I am willing to integrate the script into any CMS you might have. I likely will not write anything extra that you may suggest, unless it is something I can use for my game. I already have a few parts of this script I am not releasing, because I plan on having them in my game.
Known Compatibility Issues
No known compatibility issues, but probably some exotic CMSes, CBSes, and the SDK. I have not tested it with any of those though. This will not work for old save games.
Demo
See Attached.
As well, there are a few sample item pictures, a sample Item Data.txt, and the Item Data Generator included. The demo includes instructions on some of the functions of the script, like storage boxes and resizing actor inventories.
Heh, I see you finally got it done :D
I might check this out in my game soon ;) Rep + to you my friend :P
Question, to do you have to use pictures for it, (I mean like not the icons) because I want to use the pictures space for something else.
And if I do, is the picture limit really 50? And if it is, can I expand it?
Umm... eh?
Well, the system does not require pictures. It will use the icon of the respective item if you do not set a picture to it.
I think you are confused a little though. There is a 50 picture limit when displaying pictures through events. However, the pictures folder can contain any number of pictures without any negative effects. And as this is a script, it is not restricted by any picture limits. This script will not inhibit your ability to display pictures through events in any way.
Omg, this is hawt.
Great work.
Thanks.
Hmm... I am thinking of a few minor revisions to the script, primarily in what is saved in the placements of the script (it currently saves item, as in the entire RPG::Item or RPG::Weapon or RPG::Armor) and I figure that is kind of pointless since for the few situations where I need all that stuff, if I saved item_id and type I would be able to access it.
The other thing, somewhat inspired by Forcystus' question, is to give the pictures you use for this script their own folder in Graphics. The reason is not because there is any limit to how many pictures can go in the Pictures folder, but rather just to remove that clutter for when you want to display pictures normally. Basically, you wouldn't need to look through a ton of item pictures in order to find the one you want to display. It would reduce clutter. The downside to this is that you would lose the ability to import them through the Resource Manager, meaning you would need to set transparency manually. What do you guys think is the better option?
Ooooh, so I COULD have 10000000 pictures, but I can only use 50 in events?
And the others I just use in the inventory script?
You can only display 50 pictures through events at any single moment. But if you wanted to you could display 50 pictures in one moment, and 50 entirely different pictures in another moment, and so on. And yeah, you can have any amount of pictures that you want in the folder, accessible to all events.
You just made a huge problem I was having with pictures go away, you are awesome. I love this script.
EDIT: Where do I put the item data?
Friggin' sweet.
You did good! :D
Im so proud of you!
Quote from: Brick Shitter on November 10, 2007, 03:49:51 AM
You just made a huge problem I was having with pictures go away, you are awesome. I love this script.
EDIT: Where do I put the item data?
The text file just goes in the project folder, where the exe, Graphics, Audio, Data folders all are.
Quote from: Arkbennett on November 10, 2007, 07:55:33 AM
Friggin' sweet.
You did good! :D
Im so proud of you!
Thanks :lol:. I'm glad you like it
I love the script, its pure awesome, and thanks for the help
One huge word:AWESOME!
+Rep
Thanks everyone.
Next version, after I develop a Mouse Interaction Tool for Zeriab's Scripting Contest, I will add possible mouse functionality. It will be pretty cool :). Naturally, you could turn it off.
I think I will actually wait for VX before I make any major modifications though, and then I will rewrite the entire thing.
OMFG
I had a diablo-style inventory previously, but this one kicks its ASS!
This is one of the greatest scripts I've seen, and I'm definintaly going to use it.
To anyone: It is very easy to get the grahics, all I did was for the chests Google image search for wooden chest. For sword? Sword, sheild sheild, ect. Very easy to jsut go into paint and change the backround color so you can import it.
I am not that good at scripting but am a writer, if anyone could please tell me the code that will open the storage system (like the chest in the actually tutorial)? Please would someone held me ???
Well, the demo is open I believe. If you take a look at the chest, you will see the code is like this:
i = [[1,1,2],[0,5,8],[1,5,3]]
s = [7,7]
n = 'Wooden Chest'
b = "Loot Bitmap.png"
$game_system.item_storage.open(0, i,
s, n, b)
What each of the letters is is explained inside the chest event through comments. In short, s is the size, x by y. n is the name, b is the picture, i are the items.
Each item is represented by a 3 element array designed like this: [type, item_id, amount], where for type: 0 => Item, 1 => Weapon, 2=> Armor, and the item id is the ID of it.
The first number when you open the chest is the ID of the chest.
@pliio I am glad you like it.
I keep getting a wierd error here is the text "Script 'Window_BackPackInfo' line 194:NoMethodError occured
unidentified method 'new_paragraph' for #<bitmap:0x1ef1eb0>
That happens when I open my 'wooden chest' or as I call it stash or storage and it also happens when I look over an unequipted item?
Was it a part of my 'Item Data' text doc. ?
What did I do wrong? (could someone please awnser?) (i'm horrible at scripting :-\ ) (lol)
Did you copy the Paragraph Formatter script into your game?
Yes, and it's right above those bunch of scripts that make the grid inventory. But I didn't copy those .DOC files that were in the demo's folder into my game's folder...is that the reason. Or maybe it could be the fact that my 'item data' text document only has 'items' writen in it. Is it one of those?
Nah, it's the Paragraph Formatter. Copy the version that is in the folder into your game and replace the one you have now. I changed the PF a little bit.
As to the Item Data, you should add the Weapons and Armors in. It's not causing this error, but it will cause an error if you try to access data for a weapon or armor.
Thank you very very very very very much for the help... 8)
*EDIT:There is already stuff inside the storage,can I change it so it starts with nothing in it?
*EDIT:Thank you for the help...
I am sorry to bother you again modern :-\ but I just put a new script that has an options menu, so they had to replace the menu.It is sweeet, but isn't compatible with this awsome inventory, I was wondering if you could help me make them compatible. I have already made it so that the script can load the inventory or wooden chest. But the problem is whenever I unequip a piece of gear or anything goes into either the inventory of the player or the wooden chest it will have an error that says "Script 'Grid Inventory' line 142: NoMethodError occurred. undefined method 'width' for nil:NilClass". I'm sorry for being a trouble but could you please help me compatiblize the script?
All four parts of the script are:
#===============================================================================
# ** Registry
#-------------------------------------------------------------------------------
# This class reads the windows registry.
#===============================================================================
module Win32
class Registry
module Constants
HKEY_CLASSES_ROOT = 0x80000000
HKEY_CURRENT_USER = 0x80000001
HKEY_LOCAL_MACHINE = 0x80000002
HKEY_USERS = 0x80000003
HKEY_PERFORMANCE_DATA = 0x80000004
HKEY_PERFORMANCE_TEXT = 0x80000050
HKEY_PERFORMANCE_NLSTEXT = 0x80000060
HKEY_CURRENT_CONFIG = 0x80000005
HKEY_DYN_DATA = 0x80000006
REG_NONE = 0
REG_SZ = 1
REG_EXPAND_SZ = 2
REG_BINARY = 3
REG_DWORD = 4
REG_DWORD_LITTLE_ENDIAN = 4
REG_DWORD_BIG_ENDIAN = 5
REG_LINK = 6
REG_MULTI_SZ = 7
REG_RESOURCE_LIST = 8
REG_FULL_RESOURCE_DESCRIPTOR = 9
REG_RESOURCE_REQUIREMENTS_LIST = 10
REG_QWORD = 11
REG_QWORD_LITTLE_ENDIAN = 11
STANDARD_RIGHTS_READ = 0x00020000
STANDARD_RIGHTS_WRITE = 0x00020000
KEY_QUERY_VALUE = 0x0001
KEY_SET_VALUE = 0x0002
KEY_CREATE_SUB_KEY = 0x0004
KEY_ENUMERATE_SUB_KEYS = 0x0008
KEY_NOTIFY = 0x0010
KEY_CREATE_LINK = 0x0020
KEY_READ = STANDARD_RIGHTS_READ |
KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
KEY_WRITE = STANDARD_RIGHTS_WRITE |
KEY_SET_VALUE | KEY_CREATE_SUB_KEY
KEY_EXECUTE = KEY_READ
KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK
REG_OPTION_RESERVED = 0x0000
REG_OPTION_NON_VOLATILE = 0x0000
REG_OPTION_VOLATILE = 0x0001
REG_OPTION_CREATE_LINK = 0x0002
REG_OPTION_BACKUP_RESTORE = 0x0004
REG_OPTION_OPEN_LINK = 0x0008
REG_LEGAL_OPTION = REG_OPTION_RESERVED |
REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK |
REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK
REG_CREATED_NEW_KEY = 1
REG_OPENED_EXISTING_KEY = 2
REG_WHOLE_HIVE_VOLATILE = 0x0001
REG_REFRESH_HIVE = 0x0002
REG_NO_LAZY_FLUSH = 0x0004
REG_FORCE_RESTORE = 0x0008
MAX_KEY_LENGTH = 514
MAX_VALUE_LENGTH = 32768
end
include Constants
include Enumerable
class Error < ::StandardError
FormatMessageA=Win32API.new('kernel32.dll','FormatMessageA','LPLLPLP','L')
def initialize(code)
@code = code
msg = "\0" * 1024
len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0)
super msg[0, len].tr("\r", '').chomp
end
attr_reader :code
end
class PredefinedKey < Registry
def initialize(hkey, keyname)
@hkey = hkey
@parent = nil
@keyname = keyname
@disposition = REG_OPENED_EXISTING_KEY
end
def close
raise Error.new(5)
end
def class
Registry
end
Constants.constants.grep(/^HKEY_/) do |c|
Registry.const_set c, new(Constants.const_get(c), c)
end
end
module API
[
%w/RegOpenKeyExA LPLLP L/,
%w/RegCreateKeyExA LPLLLLPPP L/,
%w/RegEnumValueA LLPPPPPP L/,
%w/RegEnumKeyExA LLPPLLLP L/,
%w/RegQueryValueExA LPLPPP L/,
%w/RegSetValueExA LPLLPL L/,
%w/RegFlushKey L L/,
%w/RegCloseKey L L/,
%w/RegQueryInfoKey LPPPPPPPPPPP L/,
].each do |fn|
const_set fn[0].intern, Win32API.new('advapi32.dll', *fn)
end
module_function
def check(result)
raise Error, result, caller(2) if result != 0
end
def packdw(dw)
[dw].pack('V')
end
def unpackdw(dw)
dw +=
- .pack('V')
dw.unpack('V')[0]
end
def packqw(qw)
[ qw & 0xFFFFFFFF, qw >> 32 ].pack('VV')
end
def unpackqw(qw)
qw = qw.unpack('VV')
(qw[1] << 32) | qw[0]
end
def OpenKey(hkey, name, opt, desired)
result = packdw(0)
check RegOpenKeyExA.call(hkey, name, opt, desired, result)
unpackdw(result)
end
def CreateKey(hkey, name, opt, desired)
result = packdw(0)
disp = packdw(0)
check RegCreateKeyExA.call(hkey, name, 0, 0, opt, desired,
0, result, disp)
[ unpackdw(result), unpackdw(disp) ]
end
def EnumValue(hkey, index)
name = ' ' * Constants::MAX_KEY_LENGTH
size = packdw(Constants::MAX_KEY_LENGTH)
check RegEnumValueA.call(hkey, index, name, size, 0, 0, 0, 0)
name[0, unpackdw(size)]
end
def EnumKey(hkey, index)
name = ' ' * Constants::MAX_KEY_LENGTH
size = packdw(Constants::MAX_KEY_LENGTH)
wtime = ' ' * 8
check RegEnumKeyExA.call(hkey, index, name, size, 0, 0, 0, wtime)
[ name[0, unpackdw(size)], unpackqw(wtime) ]
end
def QueryValue(hkey, name)
type = packdw(0)
size = packdw(0)
check RegQueryValueExA.call(hkey, name, 0, type, 0, size)
data = ' ' * unpackdw(size)
check RegQueryValueExA.call(hkey, name, 0, type, data, size)
[ unpackdw(type), data[0, unpackdw(size)] ]
end
def SetValue(hkey, name, type, data, size)
check RegSetValueExA.call(hkey, name, 0, type, data, size)
end
def FlushKey(hkey)
check RegFlushKey.call(hkey)
end
def CloseKey(hkey)
check RegCloseKey.call(hkey)
end
def QueryInfoKey(hkey)
subkeys = packdw(0)
maxsubkeylen = packdw(0)
values = packdw(0)
maxvaluenamelen = packdw(0)
maxvaluelen = packdw(0)
secdescs = packdw(0)
wtime = ' ' * 8
check RegQueryInfoKey.call(hkey, 0, 0, 0, subkeys, maxsubkeylen, 0,
values, maxvaluenamelen, maxvaluelen, secdescs, wtime)
[ unpackdw(subkeys), unpackdw(maxsubkeylen), unpackdw(values),
unpackdw(maxvaluenamelen), unpackdw(maxvaluelen),
unpackdw(secdescs), unpackqw(wtime) ]
end
end
def self.expand_environ(str)
str.gsub(/%([^%]+)%/) { ENV[$1] || $& }
end
@@type2name = { }
%w[
REG_NONE REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD
REG_DWORD_BIG_ENDIAN REG_LINK REG_MULTI_SZ
REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR
REG_RESOURCE_REQUIREMENTS_LIST REG_QWORD
].each do |type|
@@type2name[Constants.const_get(type)] = type
end
def self.type2name(type)
@@type2name[type] || type.to_s
end
def self.wtime2time(wtime)
Time.at((wtime - 116444736000000000) / 10000000)
end
def self.time2wtime(time)
time.to_i * 10000000 + 116444736000000000
end
private_class_method :new
def self.open(hkey, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED)
subkey = subkey.chomp('\\')
newkey = API.OpenKey(hkey.hkey, subkey, opt, desired)
obj = new(newkey, hkey, subkey, REG_OPENED_EXISTING_KEY)
if block_given?
begin
yield obj
ensure
obj.close
end
else
obj
end
end
def self.create(hkey, subkey, desired = KEY_ALL_ACCESS, opt = 0x0000)
newkey, disp = API.CreateKey(hkey.hkey, subkey, opt, desired)
obj = new(newkey, hkey, subkey, disp)
if block_given?
begin
yield obj
ensure
obj.close
end
else
obj
end
end
@@final = proc { |hkey| proc { API.CloseKey(hkey[0]) if hkey[0] } }
def initialize(hkey, parent, keyname, disposition)
@hkey = hkey
@parent = parent
@keyname = keyname
@disposition = disposition
@hkeyfinal = [ hkey ]
ObjectSpace.define_finalizer self, @@final.call(@hkeyfinal)
end
attr_reader :hkey, :parent, :keyname, :disposition
def created?
@disposition == REG_CREATED_NEW_KEY
end
def open?
!@hkey.nil?
end
def name
parent = self
name = @keyname
while parent = parent.parent
name = parent.keyname + '\\' + name
end
name
end
def inspect
"\#<Win32::Registry key=#{name.inspect}>"
end
def _dump(depth)
raise TypeError, "can't dump Win32::Registry"
end
def open(subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED, &blk)
self.class.open(self, subkey, desired, opt, &blk)
end
def create(subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED, &blk)
self.class.create(self, subkey, desired, opt, &blk)
end
def close
API.CloseKey(@hkey)
@hkey = @parent = @keyname = nil
@hkeyfinal[0] = nil
end
def each_value
index = 0
while true
begin
subkey = API.EnumValue(@hkey, index)
rescue Error
break
end
begin
type, data = read(subkey)
rescue Error
next
end
yield subkey, type, data
index += 1
end
index
end
alias each each_value
def each_key
index = 0
while true
begin
subkey, wtime = API.EnumKey(@hkey, index)
rescue Error
break
end
yield subkey, wtime
index += 1
end
index
end
def keys
keys_ary = []
each_key { |key,| keys_ary << key }
keys_ary
end
def read(name, *rtype)
type, data = API.QueryValue(@hkey, name)
unless rtype.empty? or rtype.include?(type)
string = "Type mismatch (expect #{rtype.inspect} but #{type} present)"
raise TypeError, string
end
case type
when REG_SZ, REG_EXPAND_SZ
[ type, data.chop ]
when REG_MULTI_SZ
[ type, data.split(/\0/) ]
when REG_BINARY
[ type, data ]
when REG_DWORD
[ type, API.unpackdw(data) ]
when REG_DWORD_BIG_ENDIAN
[ type, data.unpack('N')[0] ]
when REG_QWORD
[ type, API.unpackqw(data) ]
else
raise TypeError, "Type #{type} is not supported."
end
end
def [](name, *rtype)
type, data = read(name, *rtype)
case type
when REG_SZ, REG_DWORD, REG_QWORD, REG_MULTI_SZ
data
when REG_EXPAND_SZ
Registry.expand_environ(data)
else
raise TypeError, "Type #{type} is not supported."
end
end
def read_s(name)
read(name, REG_SZ)[1]
end
def read_s_expand(name)
type, data = read(name, REG_SZ, REG_EXPAND_SZ)
if type == REG_EXPAND_SZ
Registry.expand_environ(data)
else
data
end
end
def read_i(name)
read(name, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD)[1]
end
def read_bin(name)
read(name, REG_BINARY)[1]
end
def write(name, type, data)
case type
when REG_SZ, REG_EXPAND_SZ
data = data.to_s + "\0"
when REG_MULTI_SZ
data = data.to_a.join("\0") + "\0\0"
when REG_BINARY
data = data.to_s
when REG_DWORD
data = API.packdw(data.to_i)
when REG_DWORD_BIG_ENDIAN
data = [data.to_i].pack('N')
when REG_QWORD
data = API.packqw(data.to_i)
else
raise TypeError, "Unsupported type #{type}"
end
API.SetValue(@hkey, name, type, data, data.length)
end
def []=(name, rtype, value = nil)
if value
write name, rtype, value
else
case value = rtype
when Integer
write name, REG_DWORD, value
when String
write name, REG_SZ, value
when Array
write name, REG_MULTI_SZ, value
else
raise TypeError, "Unexpected type #{value.class}"
end
end
value
end
def write_s(name, value)
write name, REG_SZ, value.to_s
end
def write_i(name, value)
write name, REG_DWORD, value.to_i
end
def write_bin(name, value)
write name, REG_BINARY, value.to_s
end
def flush
API.FlushKey @hkey
end
def info
API.QueryInfoKey(@hkey)
end
%w[
num_keys max_key_length
num_values max_value_name_length max_value_length
descriptor_length wtime
].each_with_index do |s, i|
eval <<-__END__
def #{s}
info[#{i}]
end
__END__
end
end
end
=begin -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Aleworks Options Menu(AO)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Created by: Aleworks
Version: 2.50
Date: 26/12/06
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
History of the version:
-1.00
First version
-2.00
Better code
New interface
More options
-2.10
Font changing improved
Game speed bug fixed
Autosaving bug fixed
Lag reduction
-2.50
Font changing improved
Autosaving improved
Windowskin change bug fixed
Scene_Options improved
New options: Font Color, Font Brightness, Font Opacity, Windowskin Color,
Brightness, Battle Animations, Difficulty
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*** How to use ***
- For call the menu use:
$scene = Scene_AOptions.new($scene)
- For edit the initial options and the menu options see ** Editable options **
and ** Types of options **
- For refer to AOptions use: $ao
- For edit the values of AO, while playing the game, use:
$ao.something
something can be a method or a variable
For a list of the editable variables see the attr_accessors down the AOptions.
- For add a new option, see in the script, there are the instructions.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*** AO RGSS Classes and Modules definitions edits ***
*** Color ***
replace: initialize
*** Font ***
alias: initialize; alias name: aleworks_optionsmenu_font_initialize
*** RPG::Cache ***
replace: self.windowskin
*** Win32::Registry ***
add: value_time_index
*** Game_Enemy ***
replace: base_maxhp
replace: base_maxsp
replace: base_str
replace: base_dex
replace: base_agi
replace: base_int
replace: base_atk
replace: base_pdef
replace: base_mdef
replace: base_eva
*** Game_System ***
replace: bgm_play
replace: bgs_play
replace: me_play
replace: se_play
*** Sprite_Battler ***
replace: update
*** Window_Base ***
alias: normal_color, alias name: aleworks_optionsmenu_window_base_normal_color
replace: initialize
replace: dispose
replace: update
add: hue_to_color
*** Window_SaveFile ***
replace: initialize
replace: refresh
*** Scene_Title ***
replace: main
*** Scene_Map ***
alias: update; alias name: aleworks_optionsmenu_scene_map_update
alias: transfer_player; alias name: aleworks_optionsmenu_scene_map_transfer
*** Scene_Load ***
alias: on_decision; alias name: aleworks_optionsmenu_load_on_decision
*** Scene_File ***
replace: main
replace: update
replace: make_filename
add: make_name
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# *** AO class ***
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
class AOptions
attr_accessor :options
attr_accessor :font_size_range
attr_accessor :audio_volume_range
attr_accessor :audio_speed_range
attr_accessor :game_speed_range
attr_accessor :opacity_range
attr_accessor :color_range
attr_accessor :brightness_range
attr_accessor :fonts
attr_accessor :font_name
attr_accessor :font_size
attr_accessor :font_color
attr_accessor :font_brightness
attr_accessor :font_opacity
attr_accessor :winskin
attr_accessor :windowskin_color
attr_accessor :window_opacity
attr_accessor :winskin_rtp
attr_accessor :brightness
attr_accessor :brightness_class
attr_accessor :bgm_volume
attr_accessor :bgs_volume
attr_accessor :me_volume
attr_accessor :se_volume
attr_accessor :bgm_speed
attr_accessor :bgs_speed
attr_accessor :me_speed
attr_accessor :se_speed
attr_accessor :game_speed
attr_accessor :auto_save
attr_accessor :auto_save_count
attr_accessor :auto_save_file
attr_accessor :auto_save_status
attr_accessor :window_autosave
attr_accessor :window_autosave_timer
attr_accessor :battle_animations
attr_accessor :difficulty
attr_accessor :difficulty_values
attr_accessor :difficulty_names
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** AO initilize **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def initialize
$data_system = load_data('Data/System.rxdata')
@options = []
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Editable options **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Menu groups options *
# @options - =[A, [[B,C],etc]]]
# - @options - , where # determinates the number of the group of options
# - A is the name of the group of options
# - [B,C] is a option of the group of options
# - B is the name of the option
# - C is the type of option (See Type of options for more info)
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@options[0] = ['Visual', [ ['Font', 0],
['Letters Size', 1],
['Letters Color', 10],
['Letters Brightness', 11],
['Letters Opacity', 12],
['Windowskin', 2],
['Windowskin Color', 13],
['Window Opacity', 3],
['Brightness', 14]
] ]
@options[1] = ['Audio', [ ['Music volume', 4],
['Sound volume', 5],
['Music Speed', 6],
['Sound speed', 7]
] ]
@options[2] = ['Game', [ ['Game speed', 9],
['Autosave', 8],
['Battle Animations', 15],
['Difficulty', 16]
] ]
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# If it is true AO, will include the 001-Blue01.png skin of the Standart RTP
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@winskin_rtp = true
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Selectable fonts *
# You have to put the names of the selectable fonts here.
# If you want that all font be selectable, put:
# @fonts = fonts_entries
# If you want to specify the fonts put an Array. It may be like this:
# @fonts = ['Comic Sans MS', 'Lucida Sans', 'Times New Roman']
# ~~~~~ Warning ~~~~~~
# If you use 'fonts_entries', some fonts maybe dont work well, and in some
# systems, maybe the script cant read the fonts.
# Tested only in Window XP.
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@fonts = ['Comic Sans MS', 'Lucida Sans', 'Times New Roman']
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Selectable Ranges => [Min,Max] *
# ~~~~~ Warning ~~~~~~
# It may throw errors, if the ranges are out of the max. and min.
# All the defaults ranges will not throw errors.
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@font_size_range = [6, 36] # Letter Size Min = 6 Max = 96
@audio_volume_range = [0, 150] # Audio Volume(in %) Min = 0 Max = 150
@audio_speed_range = [1, 500] # Audio Speed(in %) Min = 0 Max = ?
@game_speed_range = [10, 120] # Game Speed(in frames) Min = 10 Max = 120
@opacity_range = [0, 100] # Opacity Min = 0 Max = 100
@color_range = [-1, 360] # Hue color Min = 0 Max = 360
@brightness_range = [-255, 255] # Brightness Min = -255 Max = 255
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Auto save options *
# There are two types of autosaving, one that save after some time and one
# that save after somes changes of maps.
# For the first form, use:
# @auto_save = ['map', #]
# - Where # is the number of map changes for save.
# For the second form, use:
# @auto_save = ['time', #]
# - Where # is the number of seconds that need to pass for save.
# You can put too, any other thing like nil, and call the autosave when
# you want.
# It may be like:
# @auto_save = [nil, 0]
# And dor call autosave:
# $ao.autosave
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@auto_save = ['map', 2]
@auto_save_file = 'Autosave.rxdata' # Name of thme autosave file.
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Dificulty options *
# @difficulty_values
# This values are the percentage of the atributes of the enemies.
# @difficulty_names
# This are the names of the corresponding percentages of @difficulty_values
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@difficulty_values = [60, 85, 100, 115, 130, 200]
@difficulty_names = ['Very Easy', 'Easy', 'Normal', 'Hard', 'Hardest',
'Imposible']
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Initials values of the options *
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@font_name = "Lucida Console" # Font name
@font_size = 22 # Size of the letters
@font_color = -1 # Color of the Window_Base normal_color (-1 = Normal Color)
@font_brightness = 0 # Brightness of the letters
@font_opacity = 100 # Opacity of the letters
@winskin = $data_system.windowskin_name # Windowskin
@window_opacity = 100 # Opacity of windows
@windowskin_color = -1 # Color of the windows (-1 = Normal Color)
@brightness = 0 # Brightness of all sprites
@bgm_volume = 80 # Volume of BGM
@bgs_volume = 100 # Volume of BGS
@me_volume = 80 # Volume of ME
@se_volume = 100 # Volume of SE
@bgm_speed = 100 # Speed of BGM
@bgs_speed = 100 # Speed of BGS
@me_speed = 100 # Speed of ME
@se_speed = 100 # Speed of SE
@auto_save_status = false # The status of the autosave
@game_speed = 40 # Speed of the game(Frames)
@battle_animations = true # Animations of Battle
@difficulty = 100 # Difficulty of the game
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Internal variables **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$defaultfonttype = $fontface = $fontname=Font.default_name = @font_name
$defaultfontsize = $fontsize = Font.default_size = @font_size
@brightness_class = Brightness.new(@brightness)
@auto_save_count = @auto_save[1]
@window_autosave = nil
@window_autosave_timer = 0
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Types of options **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# For easy editing, the AO options are divided by types. You can edit, add
# or remove types for your own options.
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def win_options(e)
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Types values *
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Here you can edit the value that each type of option shows.
# options.push([i[0],A])
#
# You only need to edit A, options.push and i[0], have to be ever the same
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
options = []
for i in e
case i[1]
when 0 # Type 0 (Font)
options.push([i[0], @font_name])
when 1 # Type 1 (Size of letters)
options.push([i[0], @font_size])
when 2 # Type 2 (Windoskin)
options.push([i[0], @winskin])
when 3 # Type 3 (Opacity of windows)
options.push([i[0], "#{@window_opacity} %"])
when 4 # Type 4 (BGM & ME volume)
options.push([i[0], "#{@bgm_volume} %"])
when 5 # Type 5 (BGS & SE volume)
options.push([i[0], "#{@bgs_volume} %"])
when 6 # Type 6 (BGM & ME speed)
options.push([i[0], "#{@bgm_speed} %"])
when 7 # Type 7 (BGS & SE speed)
options.push([i[0], "#{@bgs_speed} %"])
when 8 # Type 8 (Autosave)
if @auto_save_status
a = 'ON'
else
a = 'OFF'
end
options.push([i[0], a])
when 9 # Type 9 (Game speed)
options.push([i[0], @game_speed])
when 10 # Type 10 (Font Color)
a = @font_color
a = 'Normal' if @font_color == -1
options.push([i[0], a])
when 11 # Type 11 (Font Brightness)
a = "- #{@font_brightness.abs}" if @font_brightness < 0
a = 'Normal' if @font_brightness == 0
a = "+ #{@font_brightness}" if @font_brightness > 0
options.push([i[0], a])
when 12 # Type 12 (Font Opacity)
options.push([i[0], "#{@font_opacity} %"])
when 13 # Type 13 (Windowskin Color)
a = @windowskin_color
a = 'Normal' if @windowskin_color == -1
options.push([i[0], a])
when 14 # Type 14 (Brightness)
a = '- #{@brightness.abs}' if @brightness < 0
a = 'Normal' if @brightness == 0
a = '+ #{@brightness}' if @brightness > 0
options.push([i[0], @brightness])
when 15 # Type 15 (Battle Animations)
if @battle_animations
a = 'ON'
else
a = 'OFF'
end
options.push([i[0], a])
when 16 # Type 16 (Game Difficulty)
a = @difficulty_names[@difficulty_values.index(@difficulty)]
options.push([i[0], a])
end
end
return options
end
def command_options(index, index_com, type)
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# * Types effect *
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Here you can edit what each type will do when the player change it.
# - If your option is a switch, you can put:
# if @switch
# @switch = false
# else
# @switch = true
# end
# - If your option is a range of numbers
# @variable = range(@variable, [min, max], type)
# For more info see range
# - If your option has differents strings values, like the font type, use:
# if @option_value == nil or Arraywithstrings.include?(@option_value) == false
# @font_name = Arraywithstrings[0]
# return
# end
# if type == -1
# if @option_value == Arraywithstrings[0]
# @option_value = Arraywithstrings[Arraywithstrings.size - 1]
# else
# @option_value = Arraywithstrings[Arraywithstrings.index(@option_value) - 1]
# end
# elsif type == 1
# if @option_value == Arraywithstrings[Arraywithstrings.size - 1]
# @option_value = Arraywithstrings[0]
# else
# @option_value = Arraywithstrings[Arraywithstrings.index(@option_value) + 1]
# end
# end
# - If your option need to refresh the options group window use:
# $scene.command_left.refresh
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
case @options[index][1][index_com][1]
when 0 # Type 0 (Font)
return nil if type < -1 and type > 1 or type == 0
if @font_name == nil or @fonts.include?(@font_name) == false
@font_name = @fonts[0]
return
end
if type == -1
if @font_name == @fonts[0]
@font_name = @fonts[@fonts.size - 1]
else
@font_name = @fonts[@fonts.index(@font_name) - 1]
end
elsif type == 1
if @font_name == @fonts[@fonts.size - 1]
@font_name = @fonts[0]
else
@font_name = @fonts[@fonts.index(@font_name) + 1]
end
end
$defaultfonttype = $fontface = $fontname=Font.default_name = @font_name
$scene.command_left_refresh
when 1 # Type 1 (Size of letters)
return nil if type == 0
@font_size = range(@font_size, @font_size_range, type)
$defaultfontsize = $fontsize = Font.default_size = @font_size
$scene.command_left_refresh
when 2 # Type 2 (Windoskin)
return nil if type < -1 and type > 1 or type == 0
w = ws_entries
w.push('001-Blue01') if @winskin_rtp == true
winskin=@winskin
if ws_entries.size == 0
@winskin = winskin
return
end
if type == -1 and w.size >= 1
if @winskin == nil or w.include?(@winskin) == false or @winskin == w[0]
winskin = w[w.size - 1] unless w[w.size - 1] == nil
elsif w[w.index(@winskin)-1] != nil
winskin = w[w.index(@winskin) - 1]
end
elsif type == 1 and w.size >= 1
if @winskin == nil or w.include?(@winskin) == false or
@winskin == w[w.size - 1]
winskin=w[0] unless w[0] == nil
elsif w[w.index(@winskin) + 1] != nil
winskin=w[w.index(@winskin) + 1]
end
end
@winskin = winskin
when 3 # Type 3 (Opacity of windows)
return nil if type == 0
@window_opacity = range(@window_opacity, @opacity_range, type)
$scene.command_left_refresh
when 4 # Type 4 (BGM & ME volume)
return nil if type == 0
@bgm_volume = range(@bgm_volume, @audio_volume_range, type)
@me_volume = range(@me_volume, @audio_volume_range, type)
$game_system.bgm_memorize
$game_system.bgm_restore
when 5 # Type 5 (BGS & SE volume)
return nil if type == 0
@bgs_volume = range(@bgs_volume, @audio_volume_range, type)
@se_volume = range(@se_volume, @audio_volume_range, type)
$game_system.bgs_memorize
$game_system.bgs_restore
when 6 # Type 6 (BGM & ME speed)
return nil if type == 0
@bgm_speed = range(@bgm_speed, @audio_speed_range, type)
@me_speed = range(@me_speed, @audio_speed_range, type)
$game_system.bgm_memorize
$game_system.bgm_restore
when 7 # Type 7 (BGS & SE speed)
return nil if type == 0
@bgs_speed = range(@bgs_speed, @audio_speed_range, type)
@se_speed = range(@se_speed, @audio_speed_range, type)
$game_system.bgs_memorize
$game_system.bgs_restore
when 8 # Type 8 (Autosave)
return nil if type != 0
if @auto_save_status
@auto_save_status = false
else
@auto_save_status = true
end
when 9 # Type 9 (Game speed)
return nil if type == 0
@game_speed = range(@game_speed , @game_speed_range, type)
Graphics.frame_rate = @game_speed
when 10 # Type 10 (Font Color)
return nil if type == 0
@font_color = range(@font_color , @color_range, type)
$scene.command_left_refresh
when 11 # Type 11 (Font Brightness)
return nil if type == 0
@font_brightness = range(@font_brightness , @brightness_range, type)
$scene.command_left_refresh
when 12 # Type 12 (Font Opacity)
return nil if type == 0
@font_opacity = range(@font_opacity , @opacity_range, type)
$scene.command_left_refresh
when 13 # Type 13 (Windowskin Color)
return nil if type == 0
@windowskin_color = range(@windowskin_color , @color_range, type)
when 14 # Type 14 (Brightness)
return nil if type == 0
@brightness = range(@brightness , @brightness_range, type)
@brightness_class.refresh
when 15 # Type 15 (Battle Animations)
return nil if type != 0
if @battle_animations
@battle_animations = false
else
@battle_animations = true
end
when 16 # Type 16 (Game Difficulty)
return nil if type < -1 and type > 1 or type == 0
d = @difficulty_values
difficulty = @difficulty
if d.size == 0
@difficulty = difficulty
return
end
if type == -1 and d.size >= 1
if @difficulty == d[0]
difficulty = d[d.size - 1] unless d[d.size - 1] == nil
elsif d[d.index(@difficulty)-1] != nil
difficulty = d[d.index(@difficulty) - 1]
end
elsif type == 1 and d.size >= 1
if @difficulty == nil or d.include?(@difficulty) == false or
@difficulty == d[d.size - 1]
difficulty = d[0] unless d[0] == nil
elsif d[d.index(@difficulty) + 1] != nil
difficulty = d[d.index(@difficulty) + 1]
end
end
@difficulty = difficulty
end
return true
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Range **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# range(value,range,cant)
# - value is the actual value of the variable
# - range is the min and the max value of the range
# - cant is the cant that will be modified. The AO menu, use for the right
# and left arrowkey +1 and -1, and for the R and L buttons, +10 and -10.
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def range(value, range, cant)
value += cant
if cant < -1 and value < range[0] and value != range[0] + cant
value = range[0]
elsif cant > 1 and value > range[1] and value != range[1] + cant
value = range[1]
elsif value < range[0]
value = range[1]
elsif value > range[1]
value = range[0]
end
return value
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Windowskin entries **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Return the name of all the windowskins
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def ws_entries
skin = Dir.entries('Graphics/Windowskins')
skin.delete_at(0)
skin.delete_at(0)
skin.sort!
c = 0
for i in 0..skin.size - 1
n=File.extname(skin[i - c])
if n != '.bmp' and n != '.png' and n != '.jpg' and n != '.jpge' and
n != '.jif'
skin.delete_at(i - c)
c += 1
end
end
for i in 0..skin.size - 1
size = File.extname(skin).size
skin.slice!(skin.size - size, size)
end
return skin
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Autosave **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def load_game(file)
if @auto_save[0] == 'map' or @auto_save[0] == 'time'
@auto_save_count = @auto_save[1]
end
@auto_save_count *= @game_speed if @auto_save[0] == 'time'
end
def autosave
return if @auto_save_file == nil
@auto_save_count = @auto_save[1]
@auto_save_count *= @game_speed if @auto_save[0] == 'time'
scene = $scene
a = Scene_Save.new
file = File.open(@auto_save_file, 'wb')
a.write_save_data(file)
file.close
$scene = scene
@window_autosave = Window_Help.new
@window_autosave.x = 505
@window_autosave.y = -16
@window_autosave.width = 160
@window_autosave.height = 64
@window_autosave.opacity = 0
@window_autosave.back_opacity = 0
@window_autosave.set_text('Autosaving')
@window_autosave_timer = @game_speed * 2.5
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Fonts entries **
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Return the name of all fonts
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def fonts_entries
fonts = []
dir = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
Win32::Registry::HKEY_LOCAL_MACHINE.open(dir) do |reg|
entries_count = reg.each_value { | | }
for index in 0..entries_count-1
fonts.push(reg.value_time_index(index))
end
end
c=0
for i in 0..fonts.size-1
n = fonts.scan(/ (TrueType)/)
if n == nil
fonts.delete_at(i - c)
c += 1
end
end
for i in 0..fonts.size - 1
fonts.slice!(fonts.size - 11,11)
end
return fonts.sort
end
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# *** Load/Save options data ***
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
module AO
def AO.load
file=File.open('Options.rxdata', 'rb')
$ao = Marshal.load(file)
file.close
Graphics.frame_rate = $ao.game_speed
$defaultfonttype = $fontface = $fontname = Font.default_name = $ao.font_name
$defaultfontsize = $fontsize = Font.default_size = $ao.font_size
$ao.brightness_class = Brightness.new($ao.brightness)
end
def AO.save
$ao.brightness_class.dispose
$ao.brightness_class = nil
file = File.open('Options.rxdata', 'wb')
Marshal.dump($ao, file)
file.close
$ao.brightness_class = Brightness.new($ao.brightness)
end
end
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# *** Menu of Options ***
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
class Scene_AOptions
attr_accessor :command_left
attr_accessor :index
attr_accessor :scene
def initialize(scene)
@scene = scene
end
def main
o = []
for i in $ao.options
o.push(i[0])
end
@command_left = Window_Command.new(140, o)
@command_left.width = 140
@command_left.height = o.size * 32 + 32
@command_left.x = 0
@command_left.y = 0
@index = 0
@window_right = Window_AOptions.new
options = $ao.win_options($ao.options[@command_left.index][1])
@window_right.refresh(options, @index)
@window_right.cursor_rect.set(0, -32, 16, 16)
Graphics.transition
while $scene == self
Graphics.update
Input.update
update_left if @command_left.active
update_right if @command_left.active == false
end
Graphics.freeze
AO.save
@command_left.dispose
@window_right.dispose
end
def update_left
@command_left.update
options = $ao.win_options($ao.options[@command_left.index][1])
@window_right.refresh(options, @index)
@window_right.cursor_rect.set(0, -32, 16, 16)
if Input.trigger?(Input::C)
@command_left.active = false
$game_system.se_play($data_system.decision_se)
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = @scene
end
end
def update_right
@window_right.update
@command_left.update
options_size = $ao.options[@command_left.index][1].size - 1
if Input.trigger?(Input::C)
sound = $ao.command_options(@command_left.index, @index, 0)
$game_system.se_play($data_system.decision_se) if sound == true
options = $ao.win_options($ao.options[@command_left.index][1])
@window_right.refresh(options, @index)
return
end
if Input.repeat?(Input::UP)
if Input.trigger?(Input::UP) or @index > 0
$game_system.se_play($data_system.cursor_se)
if @index == 0
@index = options_size
else
@index -= 1
end
options = $ao.win_options($ao.options[@comman
I'll look into it, but I have to do exams first. Please use code tags as well.
I'm fine until then, but don't know how to use tags. Next time I write a code out I'll search for it in the Post Reply page.
Well, still, put this one in code tags because it is unreadable otherwise. To use code tags, just frame the text with [*code][*/code], without the *. Also, it might be too long, so put it in a spoiler too [*spoiler][*/spoiler]
i have a problem! it says
NoMethodError occurred while running script.
undefined method 'item_storage' for #<Game_System:0x14aca17>
whenever i try and open a storage box...
I suggest that you attach the code in a text (.txt) file as well.
Click on the Additional Options... and attach it.
It is not only that the code becomes unreadable. Some of the code is removed since it fits as BBCode and thus one can't copy directly. Also some of the code seems to be lost, yet again most likely due to the lack of tags.
Just do which one is the easiest for you ^_^
@ryuu: Have you added any scripts? Also, what is the line number of the error? My bet is that you are loading a save game from before you put the script in. That will not work on it's own, as the chests initialize at the beginning of the game. Once you start a new game, then there will be no more problems I should think.
Try starting a new game and see if it works then.
Also, for anyone who is interested, this script will be getting a new version, but not for a little while. It will have only a few extra features, like mouse compatibility, but it will be better code. I suspect it will be about 500-1000 lines shorter. I am rewriting the script for VX, and I have decided I will not hardcode the size of my scenes, so we will see how that goes. In any case, don't expect it for a while. I will have to revise my Paragraph Formatter before I finish it anyway.
Never mind modern i'm going to leave the inventory system maybe until another game because this is my first game and I don't want to get to complicated for me...and anyway I can get new scripts if I take this one out,sorry...
Well, you can get new scripts regardless. I am sure that whatever the error is, it is not difficult to fix, but do as you please.
Scratch that, I will use it but not yet i'm gonna get all my other scripts first to make sure no errors occurr. When I put your scripts back in at the end I will find fixes to all of my problems. (I was wondering Modern if for free [got no money for this] be my script compatibilizer) I will give you credit for whatever scripts I have of yours [I will even if you don't] and credit you as Darkland's Script compatibilizer.
ex. I send you any errors and the script that caused it and you tell me if there is a possible way to fix the compat. and you tell me what to do to fix it if there is a possible way.
Just a suggestion because I am working alone,this is my first game and that this is my biggest problem... ???
Yeah, it's no problem. Just post them in the Scripts Help section and whenever I have time I will be happy to make them compatible, as long as it doesn't require massive editing.
Thanks modern... ;D
@modern, i do have other scripts, but none of them affect the menu, one does affect items, but i don't think it will affect it, it dosen't have a line number, i just copied the text from the error box the one that affects items is here, is that providing an error?http://rmrk.net/index.php/topic,20156.0.html (http://rmrk.net/index.php/topic,20156.0.html)
Maybe, but did you try seeing if it was just an old save file that was causing the error? The Item Storage variable initializes with Game_System. Game_System initializes when you start a new game. Therefore, if this is an old save file, then the item storage will not initialize and you would get the error that you have now. I think that's why the error appears.
dont worry, i managed to get it working, i copied it all from the demo, when that gave me a different error, i messed around with the call script event and fixed it, thanks for the help!
Hey i'm finally back posting in this topic ;D, lol. Sorry but i've gotten another error this item hasn't been set up in the Item Data, but it isn't about that. My game goes non-responsive when I use an item ???. I am not sure what this error is (probably compatibility) there an error with your script or my compatibility? I'd be thankful if you or someone else could help Modern.
*EDIT*: Also I just did the error again purposefully and for some odd reason it plays the cancel SE...
send me the project please so I can see the error?
Before you do though, set it up in the Item Data. That could cause such an error.
I don't know how to set it up in item data yet but it still displays the items icon. Please don't use any of my enemy names...
EDIT: I am such a newbie at this forum, could you please tell me how to add a file to a personal message, because i'll send it to you that way so you can have an unencrypted copy. So nobody can take any of my ideas ect.
Don't worry, I won't take any of your enemy names :police:
To send a PM, go up to the My Messages Tab at the top of the page. Once you go into that, you will see that on the left there is a menu that has on it the option 'New Message'. Click that and type my name (modern algebra) in quotation marks. You'll need to upload your file to sendspace or another file hosting site however, since you cannot attach them to PMs. I sent you a message to which you can reply if you choose.
OH SHIZ-Fickle!!! This is so awseome... Like Diobloz...2 and 1! I need to party now, Latre
This is a really, really good question. Just wondering what controls are used in the Item Data Generator? I'd be thankful if someone could please help me.
EDIT: Never mind, editing the Item Data.txt looks much easier, due to the fact it already has the colours I want for red, green, and blue.
Never mind, it'll take me forever to compatabilize and my game is already taken 3 months and i'm not done scripting :P. I'll get a more compatible inventory system (not compatabilized with Ring Menu, Other things that use Window_Item [fixed], Multi-Slot Equipment).
I apologize, but due to some major bugs I am going to take this down for the time being. Once I have rewritten the script I will re-release it. If anybody finds any problems with the version they have, then please be patient and wait for the release of the new version.
USE PROPER ENGLISH DAMNIT. I read two words and then decided to stop reading your post.
No power to ban people, sorry :P
Anyway, yeah, there have been some bugs that have been found - the one you are encountering is likely due to the fact that I changed the Paragraph Formatter in a minor way before the release of this script, and so the version of the facade that this script expects is not in the Paragraph Formatter I added to the file. Presto Error if you took the script from the folder and not the demo.
Anyway, as the post above yours says:
QuoteI apologize, but due to some major bugs I am going to take this down for the time being. Once I have rewritten the script I will re-release it. If anybody finds any problems with the version they have, then please be patient and wait for the release of the new version.
I now realize I neglected to actually take it down, but I will rectify that soon.
Anyway, as for the screenshots - I based the layout on Betrayal at Krondor, an old computer game (maybe the first one to appear on CD too, I can't remember). As for the item graphics, they are just filler - the script intends for people to make their own item/weapon/armor graphics and the script allows them to make them any size they want. So it depends on the game designer how large or small weapons are.
But thanks for your input, it is useful. I am thinking about revising the layout, but I've never played Golden Sun so I wouldn't count on it looking anything like that.
That's a pity, I have a problem with anyone who can't even learn to type English. I saw one period in the huge paragraph, and you clearly have never seen the shift key. Make some effort to write legibly, and we'll have no problem.
For the love of God, someone please lock this thread until MA rewrites the script.
Done, Modern has the power to unlock it whenever he wants.
...When did anybody say anything remotely racist? If anything we have reason to believe that, based on that little outburst, YOU are here to do nothing but start problems.