Krótki opis:
Skrypt pozwala zrobić skrzynkę bądź drzwi które są zamknięte.Aby je otworzyć trzeba będzie rozwiązać zagadkę, która polega na ułożeniu hasła z dostępnych liter.
Autor:
modern algebra
Tłumaczenie:
Shadow(czyli ja)
Skrypt:
Spoiler:
Kod:
#==============================================================================
# Wordlocks
# Version: 1.0
# Author: modern algebra (rmrk.net)
# Tłumaczył: Shadow
# Date: January 18, 2010
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# OPIS:
#
# Ten skrypt pozwala na tworzenie skrzynek lub drzwi które zamknięte są przez
# zagadki, i otworzą się tylko wtedy kiedy gracz odgadnie rozwiązanie zagadki.
# Możesz umieścić to w zdarzeniu -poprawna odpowiedź włączy przełącznik własny
# w zdażeniu, Skrypt bazuje na Moredhel Wordlocks z gry Betrayal at Krondor
# i jest bardzo podobny.
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Instrukcje:
#
# Umieść skrypt w osobnym slocie w Edytorze Skryptów(F11) poniżej podstawowych
# skryptów i nad Main. The Paragraph Formatter i Special Codes Formatter jest
# ZALECANY (ale nie wymagany).
#
# Następnie przejdź do OBSZARU EDYCJI do linijki 102 i skonfiguruj według
# własnego gustu. Szczegółowe instrukcje opcji znajdują się w komentarzach
# nad każdą z opcji. Pamiętaj o tym przy zmianie opcji !
#
# Teraz,kiedy stworzyłeś skrzynkę,musisz zrobić 2 rzeczy.Najpierw musisz umieścić to
# w opcji "Wywołaj skrypt":
#
# call_wordlock
#
# Pod tym ,MUSISZ umieścić komentarz gdzie umieścisz zagadkę,odpowiedź, oraz
# możliwe litery.
# Aby to zrobić należy wpisać następujące komendy w komentarzach:
#
# TREŚĆ ZAGADKI
# [RIDDLE]text[/RIDDLE]. Jeśli używasz paragraph formatter,
# możesz napisać to w ten sposób:
# [riddle]This is the riddle and it can be longer[/riddle]
#
# Jeśli nie korzystasz z paragraph formatter,muszisz dzielić zagadkę
# w następujący sposób:
# [RIDDLE][L]To jest 1 wers[/l][l]To jest 2 wers[/L]etc...[/riddle]
#
# ODPOWIEDŹ:
#
# Aby wprowadzić odpowiedź na zagadkę należy zaraz pod treścią umieścić:
# [ANSWER]text[/ANSWER]. Odpowiedź musi się składać wyłącznie z liter A-Z.
#
# KLUCZ ODPOWIEDŹI:
#
# Aby wprowadzić klucz odpowiedzi należy wpisać w komentarz pod odpowiedzią:
# [KEY]<ABCD>, <ABCD>, ..., <ABCD>[/key]. Klucz wymagany jest do każdej
# litery i pomiędzy <ABCD> znajduje się litera występująca w rozwiązaniu.
# Jeżeli nie umieścisz klucza skrypt zrobi to automatycznie.
#
# PRZYKŁAD::
# @>Skrypt: call_wordlock
# @>Komentarz:[riddle][l]He gets short when he gets old.[/l][l]He
# : :goes out when it gets cold.[/l][/riddle]
# : :[answer]CANDLE[/answer]
# : :[key]<ACQR>, <DJAU>, <NXID>, <PEID>, <LWFC>, <YNME>
# : :[/key]
#
# Odpowiedź będzie miała opcje:
# A D N P L Y
# C J X E W N
# Q A I I F M
# R U D D C E
#
# Skrzynka otworzy się kiedy gracz ułoży słowo:
# C A N D L E
#
# Kiedy gracz odgadnie rozwiązanie, Włączy się przełącznik własny A.
# NIE EDYTUJ SEKCJI PONIŻEJ CHYBA ŻE WIESZ CO ROBISZ!
#==============================================================================
class Game_System
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# * CONSTANTS
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# OBSZAR EDYCJI
#````````````````````````````````````````````````````````````````````````````
# Nazwa grafiki szkrzynki. Można zmienić w grze wywołując komendą:
# $game_system.wl_chest_bg = ""
WL_CHEST_LOCKED = "Chest"
# Nazwa grafiki otwartej szkrzynki. Można zmienić w grze wywołując komendą:
# $game_system.wl_chest_open = ""
WL_CHEST_OPEN = "Chest Open"
# Nazwa grafiki obramowania liter.
# Zależnie od windowskin'a, może nie być zbyt duży by ojąc całą ramkę
# W takim przypadku , sugeruje aby obrazek był lekko przeźroczysty
# by można było zobaczyć przy której literze znajduje się kursor.
# Można zmienić w grze wywołując komendą:
# $game_system.wl_letter_bg = ""
WL_LETTER_BG = "LetterFrame"
# Nazwa czcionki
# Gdy czcionka pierwsza nie jest zainstalowana , wyświetle się druga
# analogicznie to samo dzieje się w przypadku trzeciej i czwartej czcionki.
# Można zmienić w grze wywołując komendą:
# $game_system.wl_font_name = []
WL_FONTNAME = ["Narkisim", "Verdana", "Arial", "Times New Roman"]
# Kolor czcionki.
# Kolor może być również zapisany w ten sposób:
# [czerwony, zielony, niebieski, alpha]
# Wszystkie wartości muszą być od 0-255. alpha to przeźroczystość .
# Można zmienić w grze wywołując komendą:
# $game_system.wl_font_color = []
WL_FONTCOLOR = 15
# Miejsce gdzie mają się pojawiać litery.
# Można zmienić w grze wywołując komendą:
# $game_system.wl_answer_rect = []
# (x, y, szerokość, wysokość)
WL_ANSWER_RECT = [128, 192, 288, 32]
# Miejsce gdzie ma się pojawić tekst zagadki.
# Można zmienić w grze wywołując komendą:
# $game_system.wl_riddle_rect = []
# (x, y, szerokość, wysokość)
WL_RIDDLE_RECT = [96, 240, 352, 128]
# Dźwięk gdy zostanie zmieniona litera.
# Można zmienić w grze wywołując komendą::
# $game_system.wl_letter_se = ["SE name", Głośność, Nastrojenie]
WL_LETTER_SE = ["Cursor"]
# Dźwięk gdy poprawnie ułożono odpowiedź.
# Można zmienić w grze wywołując komendą:
# $game_system.wl_unlock_se = ["SE name", Głośność, Nastrojenie]
WL_UNLOCK_SE = ["Open3", 100, 100]
# Liczba klatek po której zostanie wyłączone okno po uzyskaniu dobrej
# odpowiedzi . 1 sekunda = 60 klatek
WL_UNLOCK_WAIT_FRAMES = 60
# Przełącznik własny który ma być uaktywniony kiedy skrzynka została otwarta.
WL_SELF_SWITCH = "A"
# JEŻELI używasz paragraph formatter , możesz sprecyzować jakie formatowanie
# chcesz użyć.Jeżeli chcesz z regularnego formatowania, usuń z każdego _SpecialCodes.
WL_PARAGRAPH_FORMATTER = Paragrapher::Formatter_SpecialCodes
WL_PARAGRAPH_ARTIST = Paragrapher::Artist_SpecialCodes
#````````````````````````````````````````````````````````````````````````````
# END EDITABLE REGION
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
attr_accessor :wl_chest_bg # Name of System graphic for Chest
attr_accessor :wl_chest_open # Name of system graphic for unlocked chest
attr_accessor :wl_letter_bg # Name of System graphic for letter background
attr_accessor :wl_font_name # Name of font used for Riddle Chest
attr_accessor :wl_font_color # Color of font used for Riddle Chest
attr_accessor :wl_answer_rect # Rect for the Answer
attr_accessor :wl_riddle_rect # Rect for riddle size
attr_accessor :wl_letter_se # The SE played when changing letters.
attr_accessor :wl_unlock_se # The SE played when unlocking
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_rdlchst_init_grphc_3wq1 initialize
def initialize (*args)
ma_rdlchst_init_grphc_3wq1 (*args)
@wl_chest_bg = WL_CHEST_LOCKED
@wl_chest_open = WL_CHEST_OPEN
@wl_letter_bg = WL_LETTER_BG
@wl_font_name = WL_FONTNAME
# Put color in array if windowskin color
if WL_FONTCOLOR.is_a? (Integer)
x, y = 64 + (WL_FONTCOLOR % 8) * 8, 96 + (WL_FONTCOLOR / 8) * 8
color = Cache.system ("Window").get_pixel(x, y)
@wl_font_color = [color.red, color.green, color.blue, color.alpha]
else
@wl_font_color = WL_FONTCOLOR
end
@wl_answer_rect = WL_ANSWER_RECT.is_a? (Array) ? Rect.new (*WL_ANSWER_RECT) : WL_ANSWER_RECT
@wl_riddle_rect = WL_RIDDLE_RECT.is_a? (Array) ? Rect.new (*WL_RIDDLE_RECT) : WL_RIDDLE_RECT
@wl_letter_se = WL_LETTER_SE
@wl_unlock_se = WL_UNLOCK_SE
end
end
#==============================================================================
# ** Game Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new method - call_wordlock
#==============================================================================
class Game_Interpreter
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Call Riddle Chest
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def call_wordlock
# Retrieve comments
i = @index + 1
return if @list.size <= i
comment = ""
while [108, 408].include? (@list[i].code)
comment += @list[i].parameters[0]
i += 1
break if @list.size <= i
end
comment[/\[RIDDLE\](.+?)\[\/RIDDLE\]/i]
riddle = $1.to_s
r2 = riddle.dup
riddle_a = []
while r2.slice! (/\[L\](.+?)\[\/L\]/i) != nil
riddle_a.push ($1.to_s)
end
riddle = riddle_a if !riddle_a.empty?
comment[/\[ANSWER\](.+?)\[\/ANSWER\]/i]
answer = $1.to_s.upcase
comment[/\[KEY\](.+?)\[\/KEY\]/i]
key_s = $1.to_s
key_a = []
while key_s.slice! (/<(\w+?)>/i) != nil
chain = $1.to_s.upcase
letters = chain.scan (/./)
key_a.push (letters)
end
$scene = Scene_RiddleChest.new (@event_id, riddle, answer, key_a)
end
end
#==============================================================================
# ** Sprite_Riddle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This sprite shows the riddle
#==============================================================================
class Sprite_Riddle < Sprite_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initializaiton
# letters : the array of letter this can show
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def initialize (riddle)
super ()
self.x, self.y = $game_system.wl_riddle_rect.x, $game_system.wl_riddle_rect.y
self.z += 20
self.bitmap = Bitmap.new ($game_system.wl_riddle_rect.width, $game_system.wl_riddle_rect.height)
self.bitmap.font.name = $game_system.wl_font_name
self.bitmap.font.color = Color.new (*$game_system.wl_font_color)
refresh (riddle)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Refresh
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh (riddle)
self.bitmap.clear
wlh = Window_Base::WLH
if riddle.is_a? (Array)
y = (self.bitmap.height - riddle.size*wlh) / 2
for line in riddle
self.bitmap.draw_text (0, y, self.bitmap.width, wlh, line, 1)
y += wlh
end
else
if self.bitmap.methods.include? ("draw_paragraph")
self.bitmap.paragraph_formatter = Game_System::WL_PARAGRAPH_FORMATTER
self.bitmap.paragraph_artist = Game_System::WL_PARAGRAPH_ARTIST
self.bitmap.draw_paragraph (0, 0, self.bitmap.width, self.bitmap.height, riddle)
else
self.bitmap.draw_text (0, (self.bitmap.height - wlh) / 2, self.bitmap.width, wlh, riddle, 1)
end
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Dispose
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def dispose (*args)
self.bitmap.dispose
super (*args)
end
end
#==============================================================================
# ** Window_RiddleAnswer
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This window displays the letters for the answer
#==============================================================================
class Window_RiddleAnswer < Window_Selectable
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def initialize (letters, answer_key)
@letters, @answer_key = letters, answer_key
rect = $game_system.wl_answer_rect
super (rect.x - 16, rect.y - 16, rect.width + 32, rect.height + 32)
self.z += 20
self.opacity = 0
self.contents.font.name = $game_system.wl_font_name
self.contents.font.color = Color.new (*$game_system.wl_font_color)
@item_max = @column_max = answer_key.size
bmp = Cache.system ($game_system.wl_letter_bg)
x_room = rect.width - (@answer_key.size*bmp.width)
@spacing = [(x_room / (@answer_key.size - 1)), 6].min
@start_x = (x_room - (@spacing*(@answer_key.size - 1))) / 2
@contents_y = (contents.height - bmp.height) / 2
@indices = []
for i in 0...@letters.size do @indices[i] = 0 end
refresh
self.index = 0
self.active = true
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Refresh
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Item Rect
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def item_rect (index)
bmp = Cache.system ($game_system.wl_letter_bg)
x = @start_x + index*(bmp.width + @spacing)
return Rect.new (x - 1, @contents_y - 1, bmp.width + 2, bmp.height + 2)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Draw Item
# index : the letter frame to draw
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def draw_item (index)
rect = item_rect (index)
contents.clear_rect (rect)
bmp = Cache.system ($game_system.wl_letter_bg)
contents.blt (rect.x + 1, @contents_y, bmp, bmp.rect)
contents.draw_text (rect, @letters[index][@indices[index]], 1)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Update
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def update
super
if Input.trigger? (Input::UP)
Sound.play_cursor
@indices[@index] = (@indices[@index] - 1) % @letters[@index].size
draw_item (@index)
elsif Input.trigger? (Input::DOWN)
Sound.play_cursor
@indices[@index] = (@indices[@index] + 1) % @letters[@index].size
draw_item (@index)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Correct?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def correct?
return @indices == @answer_key
end
end
#==============================================================================
# ** Scene_RiddleChest
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This scene handles processing for opening a riddle chest
#==============================================================================
class Scene_RiddleChest < Scene_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def initialize (event_id, riddle, answer, letters = [])
@event_id = event_id
@riddle = riddle
@answer_key = []
# If the letters are messed up, fix:
if letters.size != answer.size
@letters = []
for i in 0...answer.size
@letters[i] = []
all_letters = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z']
all_letters.delete (answer[i, 1])
k = rand (4)
@answer_key.push (k)
for j in 0...4
if j == k
@letters[i][j] = answer[i, 1]
else
@letters[i][j] = all_letters[rand (all_letters.size)]
all_letters.delete (@letters[i][j])
end
end
end
else
@letters = letters
# Make sure correct letter included
@letters.each_index { |id| @letters[id] |= [answer[id, 1]] }
# Get Answer Key
for i in 0...answer.size
for j in 0...@letters[i].size
if @letters[i][j] == answer[i, 1]
@answer_key[i] = j
break
end
end
end
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Start processing
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def start
super
# Create Background Sprite
@bg_sprite = Sprite_Base.new
@bg_sprite.bitmap = Cache.system ($game_system.wl_chest_bg)
# Create Letter Sprites
@answer_window = Window_RiddleAnswer.new (@letters, @answer_key)
# Create Riddle Sprite
@riddle_sprite = Sprite_Riddle.new (@riddle)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Termination Processing
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def terminate
super
@bg_sprite.dispose
@answer_window.dispose
@riddle_sprite.dispose
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Frame Update
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def update
super
if Input.trigger? (Input::B) # If ESC pressed
Sound.play_cancel
$scene = Scene_Map.new
else
@answer_window.update
if @answer_window.correct?
RPG::SE.new (*$game_system.wl_unlock_se).play
@bg_sprite.bitmap = Cache.system ($game_system.wl_chest_open)
# Wait a little
for i in 0...Game_System::WL_UNLOCK_WAIT_FRAMES
Graphics.update
end
# Set the Self-Switch
$game_self_switches[[$game_map.map_id, @event_id, Game_System::WL_SELF_SWITCH]] = true
$scene = Scene_Map.new
end
end
end
end
Screeny:
Spoiler:
Demo:
Dodatkowe informacje:
W demie są zawarte potrzebne grafiki i dwa dodatkowe skrypty.
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum