[Script] [ACE] Crafting_Table?
gdarkness98
Posts: 13Registered
in RPG Maker
Lần đầu viết script và post nên có nhiều sơ xuất mong ae lượng thứ! :rolleyes:
[align=center][size=xx-large]Crafting Table[/size][/align]
[size=x-large]Chức năng, công dụng:[/size]
Tạo item không cần phải mua từ cửa hàng mà là từ những nguyên liệu bạn có!
Thích hợp trong mọi game nhất là game sinh tồn
[size=x-large]Hướng dẫn sử dụng:
[/size]Đã có trong Script, các bạn chịu khó đọc.
Import ảnh "CraftTable.png" vào phần "Graphics/Pictures" trong "Resources Manager".
Đặt script trên main và dưới phần Materials.
[size=x-large]Script[/size]
[size=x-large]ScreenShots[/size]
[size=x-large]Credit[/size]Bạn nào sử dụng trong dự án thì xin Credit: TrnKjng hay Gdarkness đều được.
[size=x-large]Điều khoản sử dụng[/size]Có thể dùng trong mọi dự án nhưng xin Credit
[size=x-large]Demo & Resourge[/size]DEMO 1.0
[size=large]resourge[/size]
CrafTable
[align=center][size=xx-large]Crafting Table[/size][/align]
[size=x-large]Chức năng, công dụng:[/size]
Tạo item không cần phải mua từ cửa hàng mà là từ những nguyên liệu bạn có!
Thích hợp trong mọi game nhất là game sinh tồn
[size=x-large]Hướng dẫn sử dụng:
[/size]Đã có trong Script, các bạn chịu khó đọc.
Import ảnh "CraftTable.png" vào phần "Graphics/Pictures" trong "Resources Manager".
Đặt script trên main và dưới phần Materials.
[size=x-large]Script[/size]
#~ =============================
#~ Name : Crafting_Table
#~ Author: TrNKjnG
#~ Ver : 1.0
#~ =============================
#Setup_Module
module CRAFTTABLE
DATA = [] # không nên đổi nó
#THÊM MỚI:
#DATA[ID] = [Loại craft, Item xuất, Item nguyên liệu 1, Item nguyên liệu 2,...]
#Loại craft : 0 => Phải xếp item đúng trật tự;
#1 => Xếp item lung tung; ->
#2 => Xếp item mọi vị trí nhưng vẫn phải giữ kết cấu -> Rìu trong minecraft
#Item xuất: [i_Type, Id, Number]
#Item nguyên liệu : [i_Type, Id, Pos]
#i_type : 0 => item, 1 => vũ khí, 2=> giáp
#Pos
#| 0 | 1 | 2 |
#| 3 | 4 | 5 |
#| 6 | 7 | 8 |
#Ví dụ: Bạn muốn làm Quốc gỗ là "vũ khí" có id là "1" vói số lượng "1" cái
#Vói nguyên liệu là:
#-3 cái que với type là "item" và id là "1" và pos lần lượt là: 0, 1, 2
#-2 cái Gõ vói type là "item", id là "2" và pos là 4,7
#Item nguyên liệu phải đặt đúng vị trí pos của nó thì mới ra item xuất
#=> DATA[0] = [0, [1,1,1], [0,1,0], [0,1,1], [0,1,2], [0,2,4], [0,2,7] ]
#Note: "Các loại craft là 2 thì item nguyên liệu đầu tiên luôn phải đặt ở pos 0"
#Khi trong ô không có item: ấn "OK" để chon item, ấn "cancel" để hủy craft.
#Khi trong ô có item: ấn "OK" để tăng số lượng, ấn "Cancel" để giảm số lượng
#Quoc go
DATA[0] = [2, [1, 1, 1], [0, 18, 0], [0, 18, 1], [0, 18, 3], [0, 58, 4], [0, 58, 7]]
#Riu go
DATA[1] = [0, [1, 61, 1], [0, 18, 0], [0, 18, 1], [0, 18, 2], [0, 58, 4], [0, 58, 7]]
#Gay
DATA[2] = [1, [0, 58, 4], [0, 18, 0]]
#thoi vang
DATA[3] = [2, [0, 59, 1], [0, 23, 0], [0, 23, 1], [0, 23, 2], [0, 23, 3], [0, 23, 4], [0, 23, 5]]
end
#Name_Box
class CraftTable_Name_Box < Window_Base
def initialize(x, y, width)
super(x, y, width, fitting_height(1))
end
def clear
contents.clear
@item = nil
end
def set_item(item)
@item = item ? item : nil
refresh
end
def refresh
contents.clear
if @item
draw_item_name(@item, 0, 0)
else
draw_text_ex_cus(4, 0, "")
end
end
end
#Item_List
class CraftTable_Item_List < Window_Selectable
def initialize(x, y, width, height)
super
@category = :none
@data = []
end
def select(index)
super
end
def category=(category)
return if @category == category
@category = category
refresh
self.oy = 0
end
def col_max
return 2
end
def item_max
@data ? @data.size : 1
end
def item
@data && index >= 0 ? @data[index] : nil
end
def current_item_enabled?
enable?(@data[index])
end
def include?(item)
case @category
when :item
item.is_a?(RPG::Item) && !item.key_item?
when :weapon
item.is_a?(RPG::Weapon)
when :armor
item.is_a?(RPG::Armor)
when :key_item
item.is_a?(RPG::Item) && item.key_item?
else
false
end
end
def enable?(item)
return true
end
def make_item_list
@data = $game_party.all_items.select {|item| include?(item) }
@data.push(nil) if include?(nil)
end
def select_last
select(@data.index($game_party.last_item.object) || 0)
end
def draw_item(index)
item = @data[index]
if item
rect = item_rect(index)
rect.width -= 4
draw_item_name(item, rect.x, rect.y)
draw_item_number(rect, item)
end
end
def draw_item_number(rect, item)
draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
end
def nb_window=(nb_window)
@nb_window = nb_window
end
def update_help
@help_window.clear
@help_window.set_item(item)
@nb_window.clear
@nb_window.set_item(item)
end
def refresh
make_item_list
create_contents
draw_all_items
end
end
#Window_Command
class CraftTable_Cmd < Window_HorzCommand
def initialize(x, y,window_width)
@window_width = window_width
super(x, y)
end
def window_width
@window_width
end
def col_max
return 3
end
def make_command_list
add_command("Items", :item)
add_command("Weapons", :weapon)
add_command("Armors", :armor)
end
end
#Window_help
class CraftTable_Help < Window_Base
def initialize(x, y, width, line_number = 2)
super(x, y, width, fitting_height(line_number))
end
def set_text(text)
if text != @text
@text = text
refresh
end
end
def clear
set_text("")
end
def set_item(item)
set_text(item ? item.description : "")
end
def refresh
contents.clear
draw_text_ex_cus(4, 0, @text, 18)
end
end
# Create_Table
class Crafting_Table < Window_Base
attr_reader :index # cursor position
attr_reader :help_window
attr_reader :nb_window
attr_accessor :cursor_fix # fix cursor flag
attr_accessor :cursor_all # select all cursors flag
def initialize(x, y)
super(x,y,200, 390)
@index = -1
@handler = {}
@cursor_fix = false
@cursor_all = false
select(0)
config
end
def config
self.opacity = 0
@bg = Sprite.new
@bg.bitmap = Cache.picture("CraftTable")
@bg.x = self.x
@bg.y = self.y
@bitmap = Cache.system("Iconset")
setup_data_base
end
def setup_data_base
@box = []
@box_num = []
@box_item = []
@box_pos = []
@box_fake = []
for i in 0..9
@box_num[i] = 0
@box_item[i] = nil
end
end
def get_item_bitmap(item)
if item
icon_index = item.icon_index
s = Sprite.new
s.bitmap = @bitmap
s.src_rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
else
s = nil
end
s
end
#===============================================================================
def add_item_num(index, num)
free_box(9)
@box_num[index] += num if @box_num[index] != 0
if number(index) <= 0
free_box(index)
end
check_recipe if index != 9
refresh
end
def free_box(index)
@box[index].dispose if @box[index]
@box_item[index] = nil
@box_num[index] = 0
end
def number(index)
return @box_num[index]
end
def item(index)
return @box_item[index]
end
def box_set_item(index, item)
if @box[index]
free_box(index)
end
if item
@box[index] = get_item_bitmap(item)
@box[index].ox = 0
@box[index].oy = 0
@box_item[index] = item
@box_num[index] = 1
set_box_x_y(index)
check_recipe if index != 9
end
refresh
end
def call_cancel
for i in 0..8
if item(i) && number(i) > 0
$game_party.gain_item(item(i), number(i))
end
end
end
def call_ok
time = min_num
if $game_party.item_max?(item(9))
Sound.play_buzzer
else
Audio.se_play("Audio/SE/Hammer Clang.wav")
$game_party.gain_item(item(9), number(9)*time)
for i in 0..8
if item(i) && number(i) > 0
add_item_num(i, (-1)*time)
end
end
check_recipe
end
end
#================================================================================
def min_num
num = []
min = 0
for i in 0..8
if item(i) && number(i) > 0
num.push(@box_num[i]) if @box_num[i] != 0
end
end
if num != []
min = num[0]
for i in 1...num.size
min = [min, num[i]].min
end
end
return min
end
def set_font
contents.font.size = 30
end
def text_rect(index)
rect = Rect.new
if index <= 8
rect.width = 48
rect.height = 48
rect.x = index % 3 * (48 + spacing_x) + origin_x
rect.y = index / 3 * (48 + spacing_y) + origin_y + 12
else
rect.width = 72
rect.height = 72
rect.x = 49
rect.y = 298 + 18
end
rect
end
def draw_number
set_font
for i in 0..9
if i <= 8
if @box_num[i] > 0
num = sprintf("%d", @box_num[i])
draw_text(text_rect(i), num, 2)
end
else
if @box_num[i] > 0 && min_num > 0
num = sprintf("%d", @box_num[i]*min_num)
draw_text(text_rect(i), num, 2)
end
end
end
end
def get_item_by_attr(obj)
id = obj[1]
case obj[0]
when 0
return $data_items[id]
when 1
return $data_weapons[id]
when 2
return $data_armors[id]
end
end
def nomore_item?(obj, check = false)
nomore = true
allpos = [0,1,2,3,4,5,6,7,8]
start = 2
start = 0 if check
pos = []
space = []
check_obj = obj
check_obj = @box_fake if check
for i in start...check_obj.size
pos.push(check_obj[i][2])
end
space = allpos - pos
for i in 0...space.size
if number(space[i]) > 0
nomore = false
end
end
return nomore
end
def check_recipe_0?(obj)
kq = true
for i in 2...obj.size
if get_item_by_attr(obj[i]) != @box_item[obj[i][2]]
kq = false
end
end
return kq
end
def check_recipe_1?(obj)
kq = true
@box_pos.clear
@box_fake.clear
for i in 0..8
if number(i) > 0
@box_pos.push(i)
end
end
for i in 2...obj.size
@box_fake.push(get_item_by_attr(obj[i]))
end
if @box_pos != []
if @box_fake.size != @box_pos.size
return false
else
for i in 0...@box_pos.size
for j in 0...@box_fake.size
if i == @box_pos.size - 1
kq = false if @box_item[@box_pos[i]] != @box_fake[j]
else
if @box_item[@box_pos[i]] == @box_fake[j]
@box_fake.delete_at(j)
break
end
end
end
end
end
else
return false
end
return kq
end
def check_recipe_2?(obj)
kq = true
@box_pos.clear
@box_fake.clear
box_pos_0 = []
for i in 0..8
if number(i) > 0
@box_pos.push(i)
box_pos_0.push(i)
end
end
if box_pos_0 != []
delta = box_pos_0[0] - obj[2][2]
for i in 2...obj.size
@box_fake.push([obj[i][0], obj[i][1], delta+obj[i][2]])
end
for i in 0...@box_fake.size
if get_item_by_attr(@box_fake[i]) != @box_item[@box_fake[i][2]]
kq = false
end
end
else
kq = false
end
return kq
end
def check_recipe
free_box(9)
CRAFTTABLE::DATA.each do |recipe|
case recipe[0]
when 0
replace_item(get_item_by_attr(recipe[1]),
recipe[1][2]) if check_recipe_0?(recipe) && nomore_item?(recipe)
when 1
replace_item(get_item_by_attr(recipe[1]),
recipe[1][2]) if check_recipe_1?(recipe)# && nomore_item?(recipe, true)
when 2
replace_item(get_item_by_attr(recipe[1]),
recipe[1][2]) if check_recipe_2?(recipe) && nomore_item?(recipe, true)
end
end
end
def replace_item(item, number)
box_set_item(9, item)
@box_num[9] = number
refresh
end
def set_box_x_y(index)
if index <= 8
@box[index].zoom_x = 2
@box[index].zoom_y = 2
@box[index].x = index % 3 * (48 + spacing_x) + origin_x + 22
@box[index].y = index / 3 * (48 + spacing_y) + origin_y + 22
else
@box[index].zoom_x = 3
@box[index].zoom_y = 3
@box[index].x = 49 + 22
@box[index].y = 298 + 22
end
end
def origin_x
return 7
end
def origin_y
return 28
end
def spacing_x
return 6
end
def spacing_y
return 6
end
def active=(active)
super
update_cursor
end
def index=(index)
@index = index
update_cursor
end
def select(index)
self.index = index if index
end
def unselect
self.index = -1
end
def item_rect(index)
rect = Rect.new
if index <= 8
rect.width = 48
rect.height = 48
rect.x = index % 3 * (48 + spacing_x) + origin_x
rect.y = index / 3 * (48 + spacing_y) + origin_y
else
rect.width = 72
rect.height = 72
rect.x = 49
rect.y = 298
end
rect
end
def help_window=(help_window)
@help_window = help_window
call_update_help
end
def nb_window=(nb_window)
@nb_window = nb_window
call_update_help
end
def set_handler(symbol, method)
@handler[symbol] = method
end
def handle?(symbol)
@handler.include?(symbol)
end
def call_handler(symbol)
@handler[symbol].call if handle?(symbol)
end
def cursor_movable?
active && open? && !@cursor_fix && !@cursor_all
end
def cursor_down(wrap = false)
if index < 10 - 3 || (wrap && 3 == 1)
select((index + 3) % 10)
elsif index == 7 || index == 8
select(9)
end
end
def cursor_up(wrap = false)
if index >= 3 || (wrap && 3 == 1)
select((index - 3 + 10) % 10)
end
end
def cursor_right(wrap = false)
if 3 >= 2 && (index < 10 - 1 || (wrap && false))
select((index + 1) % 10)
end
end
def cursor_left(wrap = false)
if 3 >= 2 && (index > 0 || (wrap && false))
select((index - 1 + 10) % 10)
end
end
def update
super
process_cursor_move
process_handling
end
def process_cursor_move
return unless cursor_movable?
last_index = @index
cursor_down (Input.trigger?(:DOWN)) if Input.repeat?(:DOWN)
cursor_up (Input.trigger?(:UP)) if Input.repeat?(:UP)
cursor_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT)
cursor_left (Input.trigger?(:LEFT)) if Input.repeat?(:LEFT)
Sound.play_cursor if @index != last_index
call_update_help
end
def process_handling
return unless open? && active
return process_ok if ok_enabled? && Input.trigger?(:C)
return process_cancel if cancel_enabled? && Input.trigger?(:B)
end
def ok_enabled?
handle?(:ok)
end
def cancel_enabled?
handle?(:cancel)
end
def process_ok
Input.update
call_ok_handler
end
def call_ok_handler
call_handler(:ok)
end
def process_cancel
Input.update
call_cancel_handler
end
def call_cancel_handler
call_handler(:cancel)
end
def update_cursor
cursor_rect.set(item_rect(@index))
end
def call_update_help
update_help if active && @help_window
end
def update_help
@help_window.clear
@help_window.set_item(@box_item[@index])
@nb_window.clear
@nb_window.set_item(@box_item[@index])
end
def refresh
contents.clear
draw_number
end
def dispose
for i in 0..9
@box[i].bitmap.dispose if @box[i]
@box[i].dispose if @box[i]
end
@bg.bitmap.dispose
@bg.dispose
super
end
end
class Scene_Craft_Table < Scene_MenuBase
def start
super
create_all_windows
end
def create_all_windows
create_table
create_name_box
create_help
create_item_cmd
create_item_list
end
def create_item_cmd
@cmd_win = CraftTable_Cmd.new(@help_win.x, @help_win.y+@help_win.height, @help_win.width)
@cmd_win.hide.deactivate
@cmd_win.set_handler(:item, method(:cmd_item_ok))
@cmd_win.set_handler(:weapon, method(:cmd_weapon_ok))
@cmd_win.set_handler(:armor, method(:cmd_armor_ok))
@cmd_win.set_handler(:cancel, method(:cmd_cancel))
end
def create_item_list
@item_list = CraftTable_Item_List.new(@cmd_win.x, @cmd_win.y+@cmd_win.height,
@cmd_win.width,
Graphics.height - @cmd_win.y-@cmd_win.height - 13)
@item_list.hide.deactivate
@item_list.help_window = @help_win
@item_list.nb_window = @nb_win
@item_list.set_handler(:ok, method(:item_ok))
@item_list.set_handler(:cancel, method(:item_cancel))
end
def create_table
@craft_table = Crafting_Table.new(10,10)
@craft_table.show.activate
@craft_table.set_handler(:ok, method(:tb_set_ok))
@craft_table.set_handler(:cancel, method(:tb_set_cancel))
end
def create_help
@help_win = CraftTable_Help.new(@nb_win.x, @nb_win.y+@nb_win.height, @nb_win.width)
@craft_table.help_window = @help_win
end
def create_name_box
@nb_win = CraftTable_Name_Box.new(@craft_table.x + @craft_table.width + 5,
@craft_table.y,
Graphics.width - @craft_table.x - @craft_table.width - 10)
@craft_table.nb_window = @nb_win
end
#===============================================================================
#~ def add_item_num(index, num)
#~ def free_box(index)
#~ def get_out_item_num
#~ def number(index)
#~ def item(index)
#~ def box_set_item(index, item)
def tb_set_ok
@index = @craft_table.index
item = @craft_table.item(@index)
number = @craft_table.number(@index)
if @index <= 8
if item
if $game_party.has_item?(item)# have_item in bag?
Sound.play_ok
@craft_table.add_item_num(@index, 1)
$game_party.gain_item(item, -1)
@item_list.refresh
else
Sound.play_buzzer
end
else
@craft_table.deactivate
@cmd_win.show.activate
end
else
if item # index = 9
@craft_table.call_ok
else
Sound.play_buzzer
end
end
end
def cmd_item_ok
@cmd_win.deactivate
@item_list.show.activate
@item_list.category= :item
@item_list.select(0)
end
def cmd_weapon_ok
@cmd_win.deactivate
@item_list.show.activate
@item_list.category= :weapon
@item_list.select(0)
end
def cmd_armor_ok
@cmd_win.deactivate
@item_list.show.activate
@item_list.category= :armor
@item_list.select(0)
end
def cmd_cancel
@cmd_win.select(0)
@cmd_win.hide.deactivate
@craft_table.activate
end
def item_ok
item = @item_list.item
$game_party.gain_item(item, -1)
@cmd_win.hide
@item_list.refresh
@item_list.hide.deactivate
@craft_table.box_set_item(@index, item)
@craft_table.activate
end
def item_cancel
@help_win.clear
@nb_win.clear
@item_list.hide.deactivate
@cmd_win.show.activate
end
def tb_set_cancel
@index = @craft_table.index
item = @craft_table.item(@index)
number = @craft_table.number(@index)
if @index <= 8
if item
if !$game_party.item_max?(item)# have_item in bag?
Sound.play_cancel
$game_party.gain_item(item, +1)
@craft_table.add_item_num(@index, -1)
@item_list.refresh
else
Sound.play_buzzer
end
else
Sound.play_cancel
@craft_table.call_cancel
return_scene
end
else
Sound.play_cancel# index = 9
@craft_table.call_cancel
return_scene
end
end
#===============================================================================
def update
super
end
end
[size=x-large]ScreenShots[/size]
[size=x-large]Credit[/size]Bạn nào sử dụng trong dự án thì xin Credit: TrnKjng hay Gdarkness đều được.
[size=x-large]Điều khoản sử dụng[/size]Có thể dùng trong mọi dự án nhưng xin Credit
[size=x-large]Demo & Resourge[/size]DEMO 1.0
[size=large]resourge[/size]
CrafTable
Comments
:D :D :D
THAM GIA GROUP CỦA TTC TRÊN FACEBOOK
mình ngu tiếng anh , để mình cố àm 1 bộ vậy!
Sắp vô năm học mới rồi nên chắc không có thời gian rảnh đâu ạ! :s
giống minecraft :D