Lockpick System
Updates
17.04.2010 Script und Demo aktualisiert. Randoms + Fähigkeit hinzugefügt. *new
09.01.2010 Script aktualisiert, Demo nicht. Allerdings ist beides kompartibel.
Was macht das Script?
Es gibt dem Benutzer die Möglichkeit, ein Event mit einem Schloss zu versehen, dass zuerst geknackt werden muss, bevor es weiterläuft. Schafft man es, so wird der Selfswitch A dieses Events aktiviert. In der Demo kannst du eine Tür und eine Kiste als Beispiel anschauen.
Wie nutze ich das Script?
Als erstes sollten alle Einstellungen unter Settings eingestellt werden.
Dort könnt Ihr zum Beispiel die "Schwierigkeit" erhöhen, indem Ihr die Zeit in der der Stick oben bleibt verkürzt, oder die Soundeffekte verändern.
Um ein Event mit einem Schloss zu versehen, muss man in eine der Eventseiten einen Kommentar mit folgendem Inhalt einfügen.
SP_WORD(Settings)
und für jeden der 5 Stängel up oder down mit einem Leerzeichen getrennt schreiben.
Demo
Mediafire *new (http://www.mediafire.com/?wnj1izgymy1)
Mediafire (http://download269.mediafire.com/mdvywlvhm2yg/wjfymm5hzzn/Lockpick.rar)
Up-To (http://ul.to/d01k1r) (Keyru)
Video
Ein Video von dem Original.
http://www.youtube.com/watch?v=MogqKD_mk-E
Screenshots
So sieht das ganze mit meinen Grafiken aus.
(http://250kb.de/u/100104/p/gvWTQrq96NRH.png)
Das Script
#----------------------------------------------------------------#
# Script: Lockpick System #
# by Deity # #
#----------------------------------------------------------------#
# Description: #
# Das Script simuliert ein Lockpick (Dietrich) System, was das #
# Öffnen darstellt. #
#----------------------------------------------------------------#
# Benutzung: #
# Als erstes sollten alle Variablen unter "Settings" angeschaut #
# und definiert werden. #
# Um dieses Script richtig benutzen zu können, sollte man wissen,#
# was es genau macht. Falls man es schafft, das Schloss zu #
# öffnen, wird der Self Switch des Events, was das Schloss #
# darstellt auf ON (true) gesetzt. #
# Um ein Event mit einem Schloss zu versehen, muss man folgendes #
# tun; #
# 1. Erstellt ein Event. #
# 2. Öffnet Comments, und tippt das unter Settings definierte #
# SP_WORD ein. In die zweite Zeile folgen nun die "Schalter" #
# des Schlosses indem man für einen bereits offenen Schalter #
# up schreibt und für einen der geöffnet werden muss, down. #
# Zwischen den up und down muss ein Leerzeichen gesetzt werden#
# ein fertiger Komment könnte so aussehen: #
# SP_WORD #
# up down up down up #
# => Das Ergbniss wäre ein Schloss mit 2 Swicthes, die selber #
# umgestellt werden müssen. #
#?------------------------ Settings ----------------------------?#
# true = ja / false = nein #
module Lockpicking
# Picture Ressources (Graphics/Pictures) #
# Name des Hintergrundbildes
BACKGROUND_IAMGE_NAME = "LockBack"
# Name des Stickbildes
STICK_IMAGE_NAME = "LockStick"
# Name des Lockpickbildes
LOCKPICK_IMAGE_NAME = "Lockpick"
# Name des Fordergrundbildes
FORGROUND_IMAGE_NAME = "LockFor"
# System Settings #
# Fenstersichtbarkeit (0-255)
OPACITY = 200
# Zeit zum bestätigen (in Frames 60 Frames ~ 1 Sekunde(variert je nach Script
# und CPU))
# Setze die Mindestwartezeit und die Höchtswartezeit, da diese für jeden
# Stick per Zufall definiert wird.
WAIT_TIME_MIN = 5
WAIT_TIME_MAX = 10
# ID der Variable, die die WAIT_TIME erhöhen oder kürzen kann.
# So kann sozusagen eine SKillfähigkeit mit dieser Variable
# hinzugefügt werden.
WAIT_MOD_VARIABLE_ID = 1
# ID des Items, was den Lockpick darstellt
LOCKPICK_ID = 1
# Sind die Lockpicks zerstörbar beim Misslingen
LOCKPICK_BREAKABLE = true
# Informationstext unten
INFO_TEXT = "B: Beenden | Pfeiltasten: Steuerung | C: Schalten | Shift: Info"
# Name der Lockpicks
LOCKPICK_NAME = "Dietriche:"
# Wort das ein Event als Schloss indifiziert
SP_WORD = "Treasure"
# Soundeffects #
# Soundeffekt beim öffnen des Schlosses
SOUND_OPEN = "Close1"
# Soundeffekt beim Misslingen
SOUND_FAIL = "Bite"
# Soundeffekt beim fortbewegen des Sticks
SOUND_STICK = "Stare"
# Soundeffekt beim Aus/Einschalten der Infofenster
SOUND_INFOSWITCH = "Switch2"
end
# Alles was ab jetzt folgt, sollte nur dann geändert werden, #
# wenn man weis was man tut! #
#?-------------------------------------------------------------?#
include Lockpicking
class Scene_Lockpick < Scene_Base
def initialize(switches,event_id = 0)
@switches = switches
@controll = switches
@images = []
@sticks = []
@lockpick_index = 1
@animation = 0
@press = false
@sekunde = 0
@event_id = event_id
@normal_stick_y = 0
@wait_for_press = false
end
def start
@help = Window_Help.new
@help.opacity = OPACITY
@help.y = 416 - 56
@help.set_text(INFO_TEXT,1)
@info = Window_Base.new(0,0,544,56)
@info.opacity = OPACITY
@info.contents.draw_text(0,0,512,24,LOCKPICK_NAME,0)
@info.contents.draw_text(0,0,512,24,$game_party.item_number($data_items[LOCKPICK_ID]).to_s,2)
create_menu_background
@menuback_sprite.z -= 1
draw_scene
end
def draw_scene
@background = Sprite.new
@background.bitmap = Cache.picture(BACKGROUND_IAMGE_NAME)
@background.x = (544 - @background.width) / 2
@background.y = (416 - @background.height) / 2
@images.push(@background)
for i in 0...5
stick = Sprite.new
stick.bitmap = Cache.picture (STICK_IMAGE_NAME)
stick.x = ((544 - (stick.width*9)) / 2) + (2 * i * stick.width)
stick.y = (416 - stick.height) / 2
stick.y -= 20 if @switches[i].include? ("up")
@images.push (stick)
@sticks.push (stick)
end
@normal_stick_y = (416 - @sticks[0].height) / 2
@lockpick = Sprite.new
if $game_party.item_number($data_items[LOCKPICK_ID]) > 0
@lockpick.bitmap = Cache.picture(LOCKPICK_IMAGE_NAME)
@lockpick.x = @sticks[0].x - @lockpick.width + (@sticks[0].width / 2)
@lockpick.y = @normal_stick_y + @sticks[0].height + 5
@lockpicky = @lockpick.y
@images.push(@lockpick)
end
@forground = Sprite.new
@forground.bitmap = Cache.picture(FORGROUND_IMAGE_NAME)
@forground.x = (544 - @forground.width) / 2
@forground.y = (416 - @forground.height) / 2
@forground.z = @lockpick.z + 1
@images.push(@forground)
end
def dispose_all
for i in @images
i.dispose if i != nil
end
@help.dispose
@info.dispose
dispose_menu_background
end
def update_lockpick
@lockpick.x = @sticks[0].x - @lockpick.width + (@sticks[0].width * (2*@lockpick_index - 1.5))
end
def start_lockpick_animation
if @press == true && @switches[@lockpick_index - 1] == "down"
if @animation <= 5
@lockpick.y -= 1
@animation += 1
end
if @animation > 5 && @animation <= 10
@sticks[@lockpick_index - 1].y -= 1
@lockpick.y -= 1 if @animation <= 10
@animation += 1
end
wait_time = WAIT_TIME_MIN + rand(WAIT_TIME_MAX-WAIT_TIME_MIN)
wait_time += $game_variables[WAIT_MOD_VARIABLE_ID] unless WAIT_MOD_VARIABLE_ID < 1
wait_time = 1 if wait_time < 1
if @animation > 10 && @animation <= 25
@lockpick.y += 1 if @animation <= 21
if @switches[@lockpick_index - 1].include?("down")
@sticks[@lockpick_index - 1].y -= 1
end
@animation += 1
elsif @animation > 25 && @sekunde == 0
@wait_for_press = true
elsif @sekunde >= wait_time
@animation = 0
@sekunde = 0
@press = false
@wait_for_press = false
return_to_normal
end
else
@press = false
end
end
def set_variables_standart
@animation = 0
@sekunde = 0
@press = false
@wait_for_press = false
end
def return_to_normal
set_variables_standart
@sticks[@lockpick_index - 1].y = @normal_stick_y
@lockpick.y = @normal_stick_y + @sticks[0].height + 5
end
def stick_is_at_top
return true if @sticks[@lockpick_index - 1].y == @normal_stick_y - 20
end
def check_chest
for i in @controll
if i == "down"
return false
end
end
return true
end
def update
if $game_party.item_number($data_items[LOCKPICK_ID]) < 1
@lockpick.visible = false
end
if Input.trigger?(Input::A)
Audio.se_play("Audio/SE/"+SOUND_INFOSWITCH, 100, 150)
@info.visible = !@info.visible
@help.visible = !@help.visible
end
if @info.visible == true
@info.contents.clear
@info.contents.draw_text(0,0,512,24,LOCKPICK_NAME,0)
@info.contents.draw_text(0,0,512,24,$game_party.item_number($data_items[LOCKPICK_ID]),2)
end
if check_chest
Audio.se_play("Audio/SE/"+SOUND_OPEN, 100, 150)
$game_map.events[@event_id].open=(true)
key = [$game_map.events[@event_id].map_id, @event_id, "A"]
$game_self_switches[key] = true
$scene = Scene_Map.new
dispose_all
end
@sekunde += 1 if @wait_for_press == true
if Input.trigger?(Input::LEFT) && @press == false && $game_party.item_number($data_items[LOCKPICK_ID]) > 0
@lockpick_index -= 1
if @lockpick_index < 1
@lockpick_index = 1
end
update_lockpick
end
if Input.trigger?(Input::RIGHT) && @press == false && $game_party.item_number($data_items[LOCKPICK_ID]) > 0
@lockpick_index += 1
if @lockpick_index > 5
@lockpick_index = 5
end
update_lockpick
end
if Input.trigger?(Input::UP) && @press == false && $game_party.item_number($data_items[LOCKPICK_ID]) > 0
@press = true
Audio.se_play("Audio/SE/"+SOUND_STICK, 100, 100) if @switches[@lockpick_index - 1] != "up"
end
start_lockpick_animation if @press == true && $game_party.item_number($data_items[LOCKPICK_ID]) > 0
if Input.trigger?(Input::C) && $game_party.item_number($data_items[LOCKPICK_ID]) > 0
if stick_is_at_top && @wait_for_press == true
set_variables_standart
@switches[@lockpick_index - 1] = "up"
@controll[@lockpick_index - 1] = "up" if @controll[@lockpick_index - 1].include?("down")
else
@sticks[@lockpick_index - 1].y = @normal_stick_y if @switches[@lockpick_index - 1] == "down"
Audio.se_play("Audio/SE/"+SOUND_FAIL, 100, 100) if @switches[@lockpick_index - 1] == "down"
return_to_normal if @switches[@lockpick_index - 1] == "down"
$game_party.lose_item($data_items[LOCKPICK_ID], 1, true) if LOCKPICK_BREAKABLE == true
end
@animation = 0
@press = false
@wait_for_press = false
end
if Input.trigger?(Input::B)
Sound.play_cancel
dispose_all
return_scene
end
end
def return_scene
$scene = Scene_Map.new
end
end
class Game_Event
attr_accessor :open
attr_reader :map_id
alias initialize_lockpick initialize
def initialize(map_id, event)
initialize_lockpick(map_id, event)
@open = false if $game_self_switches[[map_id, event.id, "A"]] == false
end
alias refresh_lockpick refresh
def refresh
refresh_lockpick
if @open == true
key = [@map_id, @event.id, "A"]
$game_self_switches[key] = true
end
end
end
class Game_Interpreter
alias execute_command_lockpick execute_command
def execute_command (*args)
if @index < @list.size-1 && @list[@index].code == 108 && @list[@index].parameters[0].include?(SP_WORD)
sticks = @list[@index + 1].parameters[0].split
$scene = Scene_Lockpick.new (sticks, @event_id)
@index += 1
return false
end
return execute_command_lockpick (*args)
end
end
Schlusswort
Bitte meldet alle Bugs, so kann das System optimiert werden. Bevor ich es vergesse, die Idee für das System stamm von den Machern von The Elder Scrolls IV (Oblivion).
"modern algebra" hat mir eine kleine Veränderrung vorgeschlagen, die übernommen wurde.
MfG
Deity