The Arcane Container (1.0)
- Wgląd do skrzynki -
Dzięki systemowi Arcane Container, istnieje możliwość zaglądnięcia do skrzyni i wyciągnięcia pojedynczych przedmiotów. Wsztstko posiada wygodną konfigurację i ustawienia!
Kompatybilność: RPG Maker XP i RPG Maker XPA
Jak działa The Arcane Container
The Arcane Container 1.0 oferuje pełną personalizację skrzyń - możesz przypisywać kolory do poszczególnych slotów, dźwięki dla wybranych przedmiotów, a także dokładne opisy i grafiki! Gracz może zdobywać przedmioty, broń, czy nawet konkretne wartości zmiennych za pomocą jednego systemu. Dodatkowo, skrypt pozwala na wyświetlanie tła, które wzbogaca wizualne aspekty interakcji ze skrzyniami. Dzięki temu doświadczenie staje się nie tylko funkcjonalne, ale również estetyczne.
Dla wygody, system wspiera dynamiczne opisy, które automatycznie dopasowują liczbę przedmiotów do opisu slotu, np. "Złoto x2" czy "Mikstura x5". Co więcej, dodałem możliwość przechowywania złota w skrzyniach - wystarczy użyć zmiennej "Gold" w konfiguracji, a reszta zadzieje się automatycznie!
Najważniejsze cechy:
Możliwość konfiguracji wyglądu skrzyni, ustalenie zawartości (do 8 przedmiotów), ustalenie zawartości (złoto, przedmioty z bazy danych, wartości zmiennych), ustalenie kolorów, ustalenie konkretnych dźwięków dla przedmiotów podczas ich wyciągnięcia z skrzyni, ustalenie kolorów.
Instalacja
1. Otwórz w RPG Maker XP edytor skryptu ruby (skrót: F11).
2. Przed sekcją
Main, utwórz nowy moduł i nazwij go np. ARCANECONTAINER.
3. Do utworzonego powyższego modułu ARCANECONTAINER wklej poniższy skrypt.
4. Zapisz zmiany (i skonfiguruj skrypt) i gotowe!
# Funkcja do ładowania obrazów z podkatalogów w Pictures
def load_picture_from_subfolder(subfolder, filename)
full_path = "#{subfolder}/#{filename}"
return RPG::Cache.picture(full_path)
rescue
raise "Błąd: nie udało się załadować obrazu: #{full_path}.png"
end
##########################################################
# The Arcane Container 1.0
# Haxo Game Studios
# System odpowiedzialny za zarządzanie interaktywnymi skrzyniami w grze,
# które mogą przechowywać przedmioty, broń, zbroje oraz wartości zmiennych.
# Skrypt pozwala na przypisywanie kolorów, dźwięków, opisów oraz grafik
# do slotów w skrzyni, a także na wyświetlanie tła podczas interakcji z nią.
#
# Autor: Dawid Maxymilian Tomaszewski
# Adres mailowy: haxogamestudios@gmail.com
# Skrypt przeznaczony dla silnika RPG Maker XP i RPG Maker XPAce
#
# Licencja użytkowania skryptu "The Arcane Container 1.0"
# 1. Postanowienia ogólne
# Niniejsza licencja reguluje zasady korzystania ze skryptu The Arcane Container w wersji 1.0,
# dalej zwanego "skryptem". Użytkownik, który korzysta ze skryptu, zgadza się na warunki niniejszej licencji.
#
# 2. Zezwolenia
# - Korzystanie ze skryptu zarówno w grach komercyjnych, jak i niekomercyjnych.
# - Modyfikację kodu w celu dostosowania go do specyfiki projektu, pod warunkiem zachowania warunków licencji.
#
# 3. Ograniczenia
# - Zakazuje się publikacji skryptu w tej lub zmodyfikowanej wersji na innych witrynach niż
# https://www.rpgmaker.pl/. Można uzyskać taką zgodę jedynie pisząc do mnie o udzielenie licencji
# zezwalającej na publikację w innym miejscu niż Twierdza.
# - Zakazuje się sprzedaży skryptu w jakiejkolwiek formie, zarówno oryginalnej, jak i zmodyfikowanej.
#
# 4. Informacja o autorze
# Każdy projekt korzystający ze skryptu The Arcane Container 1.0
# musi spełniać następujące warunki dotyczące uznania autorstwa:
#
# Podczas uruchamiania opcji "Nowa gra" należy wyświetlić poniższe informacje na ekranie przez
# minimum 7 sekund, pomijając czas przejścia efektów wizualnych, takich jak tzw. "smooth":
#
# [=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=]
#
# Nazwa: The Arcane Container 1.0
# Autor: Dawid Maxymilian Tomaszewski
# Studio: Haxo Game Studios
# Witryna: https://www.rpgmaker.pl/
# YouTube: HaxoGameStudiosOfficial
#
# [=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=][=]
#
# Wymagane jest również umieszczenie tej informacji w napisach końcowych gry.
#
# 5. Postanowienia końcowe
# Niniejsza licencja obowiązuje od momentu rozpoczęcia korzystania ze skryptu.
# Użytkownik nie nabywa żadnych dodatkowych praw poza określonymi w tej licencji.
# Autor skryptu zastrzega sobie prawo do zmiany warunków licencji w przyszłych wersjach skryptu.
#
#
# Personalizacja polega na wklejeniu funkcji "Skrypt" i wrzuceniu poniższego kodu:
#
# Przykładowe dane dla slotów:
#slot_variables = ["Item[1]", "Weapon[2]", "Armor[3]", "Variable[1]", 0, 0, 0, 0]
#slot_values = [1, 2, 1, 50, 0, 0, 0, 0] # Odpowiednie wartości (ilość przedmiotów, broń, zbroja lub wartość zmiennej)
#slot_graphics = ["Denar", "B-1", "Eliksir-HPC", "RZ-4", "Perfuma1", "RZ-17", "RZ-42", "0"]
#slot_descriptions = [
# "Denaty x50", "Sztylet", "Zbroja", "Zmienna x50",
# "Flakon perfum", "Gwoździe x12", "Boska tkanina x3", " "]
#slot_colors = [22, 0, 2, 0, 0, 0, 0, 0] # Przypisanie kolorów do każdego slotu
#slot_sounds = [1, 2, 0, 0, 0, 0, 0, 0] # Przypisanie dźwięków do slotów
#chest_id = 1 # Unikalny identyfikator dla tej skrzyni
#
# Opcjonalne tło (ustawienie obrazka w tle)
#background_image = "CustomBackground"
#
# Tworzymy nową skrzynię
#$scene = Scene_Chest.new(chest_id, slot_variables, slot_values, slot_graphics, background_image, slot_descriptions, slot_colors, slot_sounds)
##########################################################
class Game_System
attr_accessor :chest_states
alias initialize_with_chest_states initialize
def initialize
@chest_states = {}
initialize_with_chest_states
end
end
module ChestColors
COLORS = {
0 => Color.new(255, 255, 255), # Biały
1 => Color.new(64, 64, 64), # Ciemnoszary
2 => Color.new(255, 0, 0), # Czerwony
3 => Color.new(255, 128, 0), # Pomarańczowy
4 => Color.new(128, 255, 0), # Limonkowy zielony
5 => Color.new(0, 255, 192), # Jasny morski
6 => Color.new(0, 128, 255), # Niebieski
7 => Color.new(128, 0, 255), # Fioletowy
8 => Color.new(255, 0, 255), # Różowy
9 => Color.new(255, 255, 0), # Żółty
10 => Color.new(192, 192, 192), # Jasnoszary
11 => Color.new(0, 0, 0), # Czarny
12 => Color.new(128, 64, 0), # Brązowy
13 => Color.new(255, 255, 0), # Jasny żółty
14 => Color.new(0, 255, 0), # Zielony
15 => Color.new(0, 255, 255), # Jasnoniebieski (Cyan)
16 => Color.new(0, 128, 255), # Ciemnoniebieski
17 => Color.new(128, 0, 255), # Ciemny fiolet
18 => Color.new(255, 0, 255), # Różowy (jasny)
19 => Color.new(192, 192, 128) # Jasny beżowy
}
def self.get_color(color_id)
COLORS[color_id] || COLORS[0] # Domyślnie biały kolor, jeśli ID nie istnieje
end
end
module ChestSounds
SOUNDS = {
0 => nil, # Brak dźwięku
1 => "Sound1", # Przykładowy dźwięk 1
2 => "Sound2", # Przykładowy dźwięk 2
3 => "Sound3" # Przykładowy dźwięk 3
}
def self.get_sound(sound_id)
SOUNDS[sound_id] # Zwraca nazwę dźwięku
end
end
class ChestManager
def self.set_chest_state(chest_id, used_slots, descriptions, colors, sounds)
$game_system.chest_states[chest_id] = { "used_slots" => used_slots, "descriptions" => descriptions, "colors" => colors, "sounds" => sounds }
end
def self.get_chest_state(chest_id)
$game_system.chest_states[chest_id] || { "used_slots" => Array.new(8, false), "descriptions" => Array.new(8, ""), "colors" => Array.new(8, 0), "sounds" => Array.new(8, 0) }
end
end
class Scene_Chest
def initialize(chest_id, slot_variables = [], slot_values = [], slot_graphics = [], background_image = nil, slot_descriptions = [], slot_colors = [], slot_sounds = [], container_image = "Container01") @chest_id = chest_id
@background = Sprite.new
if background_image
@background.bitmap = RPG::Cache.picture(background_image)
else
@background.bitmap = RPG::Cache.picture("ZZZZZ-PANORAMA01")
end
if @background.bitmap
@background.x = (640 - @background.bitmap.width) / 2
@background.y = (480 - @background.bitmap.height) / 2
else
@background.x = 0
@background.y = 0
raise "Błąd: nie udało się załadować bitmapy tła"
end
@chest_graphic = Sprite.new
@chest_graphic.bitmap = load_picture_from_subfolder("Chest", container_image) # Używamy dynamicznego obrazu kontenera
if @chest_graphic.bitmap
@chest_graphic.x = (640 - @chest_graphic.bitmap.width) / 2
@chest_graphic.y = (480 - @chest_graphic.bitmap.height) / 2
else
@chest_graphic.x = 0
@chest_graphic.y = 0
raise "Błąd: nie udało się załadować bitmapy dla grafiki skrzyni"
end
@slots = []
@slot_variables = slot_variables
@slot_values = slot_values
@slot_graphics = slot_graphics
chest_state = ChestManager.get_chest_state(chest_id)
@used_slots = chest_state["used_slots"]
@saved_descriptions = chest_state["descriptions"]
@saved_colors = chest_state["colors"]
@saved_sounds = chest_state["sounds"]
@slot_descriptions = []
@saved_descriptions.each_with_index do |desc, i|
@slot_descriptions[i] = desc.empty? ? slot_descriptions[i] : desc
end
@slot_colors = []
@saved_colors.each_with_index do |color_id, i|
@slot_colors[i] = slot_colors[i].nil? ? color_id : slot_colors[i]
end
@slot_sounds = []
@saved_sounds.each_with_index do |sound_id, i|
@slot_sounds[i] = slot_sounds[i].nil? ? sound_id : slot_sounds[i]
end
8.times do |i|
slot = Sprite.new
slot_graphic = @slot_graphics[i] || "Chest/ChestSlot"
slot.bitmap = load_picture_from_subfolder("Chest", slot_graphic)
if @used_slots[i]
slot.bitmap = Bitmap.new(32, 32)
@slot_descriptions[i] = ""
end
row = i / 4
column = i % 4
slot.x = @chest_graphic.x + 8 + column * 32
slot.y = @chest_graphic.y + 39 + row * 32
@slots << slot
end
@selected_index = 0
@selection_indicator = Sprite.new
@selection_indicator.bitmap = load_picture_from_subfolder("Chest", "ChestSlotS")
update_slot_selection
@description_text = Sprite.new
@description_text.bitmap = Bitmap.new(640, 32)
@description_text.x = 0
@description_text.y = @chest_graphic.y + @chest_graphic.bitmap.height + 10
update_description_text
end
def main
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
terminate
end
def update
handle_input
end
def handle_input
if Input.trigger?(Input::B) # Klawisz ESC
$game_system.se_play($data_system.cancel_se)
save_chest_state
$scene = Scene_Map.new
terminate
return
elsif Input.trigger?(Input::C) # Klawisz potwierdzenia
confirm_selection
elsif Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
move_selection(-1, true)
elsif Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
move_selection(1, true)
elsif Input.repeat?(Input::UP)
$game_system.se_play($data_system.cursor_se)
move_selection(-4, false)
elsif Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
move_selection(4, false)
end
end
def move_selection(offset, horizontal = false)
new_index = @selected_index + offset
if horizontal
if (new_index / 4) != (@selected_index / 4)
return
end
end
if new_index >= 0 && new_index < @slots.size
@selected_index = new_index
update_slot_selection
update_description_text
end
end
def confirm_selection
unless @used_slots[@selected_index]
variable_string = @slot_variables[@selected_index]
value = @slot_values[@selected_index]
sound_id = @slot_sounds[@selected_index]
sound_name = ChestSounds.get_sound(sound_id)
Audio.se_play("Audio/SE/#{sound_name}") if sound_name
if variable_string
if variable_string =~ /Item\[(\d+)\]/
item_id = $1.to_i
if $data_items[item_id]
$game_party.gain_item(item_id, value)
$game_system.se_play($data_system.decision_se)
else
p "Błąd: Nie znaleziono przedmiotu o ID #{item_id}"
end
elsif variable_string =~ /Weapon\[(\d+)\]/
weapon_id = $1.to_i
weapon = $data_weapons[weapon_id]
if weapon
$game_party.gain_weapon(weapon.id, value)
$game_system.se_play($data_system.decision_se)
else
p "Błąd: Nie znaleziono broni o ID #{weapon_id}"
end
elsif variable_string =~ /Armor\[(\d+)\]/
armor_id = $1.to_i
armor = $data_armors[armor_id]
if armor
$game_party.gain_armor(armor.id, value)
$game_system.se_play($data_system.decision_se)
else
p "Błąd: Nie znaleziono zbroi o ID #{armor_id}"
end
elsif variable_string =~ /Variable\[(\d+)\]/
variable_id = $1.to_i
$game_variables[variable_id] += value
$game_system.se_play($data_system.decision_se)
elsif variable_string == "Gold"
$game_party.gain_gold(value)
$game_system.se_play($data_system.decision_se)
end
end
@used_slots[@selected_index] = true
@slots[@selected_index].bitmap = Bitmap.new(32, 32)
@slot_descriptions[@selected_index] = "" # Resetujemy opis
@slot_colors[@selected_index] = 0
save_chest_state
update_description_text
end
end
def update_slot_selection
@slots.each_with_index do |slot, index|
if @used_slots[index]
slot.bitmap = Bitmap.new(32, 32)
else
slot_graphic = @slot_graphics[index] || "Chest/ChestSlot"
slot.bitmap = load_picture_from_subfolder("Chest", slot_graphic)
end
end
selected_slot = @slots[@selected_index]
@selection_indicator.x = selected_slot.x
@selection_indicator.y = selected_slot.y
@selection_indicator.z = 1
end
def update_description_text
@description_text.bitmap.clear
base_description = @slot_descriptions[@selected_index] || " "
slot_value = @slot_values[@selected_index]
if @used_slots[@selected_index]
description = "" # Resetujemy opis dla użytych slotów
else
description = slot_value > 1 ? "#{base_description} x#{slot_value}" : base_description
end
color_id = @slot_colors[@selected_index] || 0
color = ChestColors.get_color(color_id)
@description_text.bitmap.font.color = color
text_width = @description_text.bitmap.text_size(description).width
x_position = (640 - text_width) / 2
@description_text.bitmap.draw_text(x_position, 0, text_width, 32, description)
end
def save_chest_state
ChestManager.set_chest_state(@chest_id, @used_slots, @slot_descriptions, @slot_colors, @slot_sounds)
end
def terminate
@background.dispose if @background
@chest_graphic.dispose if @chest_graphic
@slots.each do |slot|
slot.dispose
end
@selection_indicator.dispose if @selection_indicator
@description_text.dispose if @description_text
end
end
Konfiguracja
W skrypcie istnieją 2 miejsca do konfiguracji:
1) Domyślnie linijka 92: COLORS = [
Linijka odpowiada za numery kolorów jakie będą użyte przy czcionce przedmiotów zamieszczonych w skrzyni. Domyślnie jest 19 kolorów jak widać, jak ktoś chce dodać nowy kolor, to może sobie po prostu dopisać wzorując się na tym co jest.
2) Domyślnie linijka 121 SOUNDS
Tutaj jest zdefiniowany zestaw dźwięków, podobnie jak kolory, każdy dźwięk będzie miał swój własny numer, gdzie 0 jest nil (czyli brak dźwięku), 1 przykładowo u mnie odtwarza dźwięk Sound1, który się znajduje w folderze AUDIO/SE projektu.
Uruchomienie skrzyni (przykład i omówienie)Skrzynię tworzy się przy pomocy zdarzenia, tradycyjnie ustawiając jakąś grafikę skrzynki, a następnie poleceniami WYWOŁAJ SKRYPT, należy wprowadzić następujące polecenia (będę je też omawiał).
Krok 1: Ustawienie zawartości skrzynki
Skrzynka posiada 8 miejsc na różne przedmioty (rodzaje przedmiotów), możemy wpisać następujące warianty: "Gold", "Weapon[ID Broni]", "Armor[ID zbroi]", "Variable[ID zmiennej]", "Item[ID przedmiotu]" . Poniżej przykład na tylko 2 przedmioty jakby co.
# Ustawienie co jest w skrzyni
$slot_variables = [
"Gold",
"Item[32]",
"",
"",
"",
"",
"",
""
]
Krok 2: Ustawienie ilości/wartości
Teraz należy zaznaczyć ilość lub wartość danych przedmiotów co są w skrzyni (czyli tych przedmiotów co są w kroku 1). Pierwsza wartość to 1000, co oznacza że otrzymam 1000 złota, kolejna wartość to 1, to oznacza że otrzymam 1 przedmiot z kroku nr1, którym jest Przedmiot nr[32] z bazy danych, czyli domyślnie: 1 Owoc. Jako, że ponownie skrzynia ma mieć tylko 2 przedmioty, to resztę ustawiamy na 0.
# Ustawienie ilosci/wartosci
$slot_values = [
1000,
1,
0,
0,
0,
0,
0,
0
]
Krok 3: Ustawienie grafiki ikonek
Następnym krokiem, jest ustalenie jakie grafiki mają zostać wyświetlone w miejsca przedmiotów. Ikonki są zapisane w projekcie GRAPHICS/Pictures/Chest. W grze demo ponownie tam jest sporo grafik, więc można się rozejrzeć. Pamiętaj by mieć też grafikę dla pustych przedmiotów.
# Ustawienie grafiki (Pictures/Chest)
$slot_graphics = [
"Zloto",
"Item3",
"0",
"0",
"0",
"0",
"0",
"0"
]
Krok 4: Ustawienie wyświetlanych nazw przedmiotów
Dalej, każdy przedmiot musi mieć swój własny opis. Jest to zrobione w taki sposób, że raz można napisać pieniądze, raz złoto, raz miedziaki, albo grosze... To jest po prostu zwykły tekst sugerujący przedmiot, również dobrze może być jakiś tam miecz. Ponownie mamy tylko 2 przedmioty w naszej skrzynce, zatem reszta musi być pusta.
# Ustawienie opisu
$slot_descriptions = [
"Kasa",
"Owoc",
"",
"",
"",
"",
"",
""
]
Krok 5: Ustawienie kolorów i dźwięków
Kolejny krok konfiguracyjny, ustalamy jakie kolory mają mieć nazwy naszych przedmiotów, oraz jakie dźwięki mają być odegrane podczas ich wyciągnięcia Kolory jak i Dźwięki ustawiane są w głównym skrypcie.
# Ustawienie kolorow
$slot_colors = [3,0,0,0,0,0,0,0 ]
# Ustawienie dzwiekow
$slot_sounds = [1,3,0,0,0,0,0,0 ]
Krok 6: Ustawienie grafiki i numeru skrzyni
Kolejny krok odpowiada za grafikę naszej skrzyni. Musimy ustalić 2 grafiki: (1) panorama (tło otoczenia), (2) container (skrzynka, wnętrze skrzynki). Tło otoczenia domyślnie znajduje się w Graphics/Pictures, a container znajduje się w Graphics/Pictures/Chest, oczywiście należy wprowadzić nazwy tych plików, oraz NUMER ID skrzynki, dla przykładu tutaj podaje numer 5
# Ustawienie grafiki i nr skrzyni
$background_image = "ZZZZZ-
PANORAMA02"
$container_image = "Container02"
$chest_id = 5
Krok 7: Wywołanie
Ostatni krok odpowiada za wywołanie naszej skrzyni. Wszystkie te kroki (1-6) to tylko konfiguracja dla tej jednej konkretnej skrzynki. Ostatni krok to wywołanie.
# Wywolanie skryptu
$scene = Scene_Chest.new($chest_id,
$slot_variables, $slot_values,
$slot_graphics, nil,
$slot_descriptions, $slot_colors,
$slot_sounds)
Uwagi:
Pamiętaj, przecinki jak i spacje mają znaczenie, gdzie pominięcie może spowodować komplikacje (np. wyświetli przedmiot, niby można go wyciągnąć, ale nie zostanie dodany do ekwipynku). Skrzynia zawsze musi mieć wypisane 8 miejsc, tak jak w powyższym przykładzie. Jeżeli miejsca mają być puste, to należy odpowiednio je zadeklarować. Powyższe przykłady były brane z gry demonstracyjnej (co oznacza, że projekt musi mieć konkretne pliki dźwiękowe, graficzne w odpowiednich miejscach tak jak wyżej zostało to wypisane).
W razie wątpliwości, po prostu przejrzyj grę demonstracyjną, którą można znaleźć niżej. W niej zamieszczam skrypt w oddzielnym pliku, jak i przykład skrzyni (także w oddzielnym pliku tekstowym).
Licencja
Licencja Skrypt możecie wykorzystać w projektach komercyjnych, jak i niekomercyjnych, a także modyfikować go według własnych potrzeb. Jednak publikacja (w tej lub zmodyfikowanej formie) poza Twierdzą RPG Makera jest zabroniona, chyba że uzyskacie moją zgodę. Sprzedaż skryptu w jakiejkolwiek formie również jest zabroniona.
Każdy projekt korzystający z The Arcane Container 1.0 musi zawierać poniższą informację:
Nazwa: The Arcane Container (1.0)
Autor: Dawid Maxymilian Tomaszewski
Studio: Haxo Game Studios
Witryna: https://www.rpgmaker.pl/
YouTube: HaxoGameStudiosOfficial
Informacja ta musi być widoczna przy uruchamianiu nowej gry przez minimum 7 sekund oraz w napisach końcowych.
Autor: HGS
Email:
haxogamestudios@gmail.comPobierz:
Gra demonstracyjna: RPGXP-The Arcane Container (1.0)