Ich wollte mal einen Thread aufmachen, bei dem Scripts angefordert werden können und dann je nach Möglichkeit gesucht bzw. von Anderen gepostet werden.
Da ich zurzeit das Gefühl habe demnächst öfter nach kleinen Scripts, wenn nicht sogar nur nach Zeilen zu fragen, dachte ich mir, bevor ich für jede kleine Frage einen neuen Thread aufmache, mache ich lieber einen für alle Fragen gleichzeitig auf.
Diese Zeilen sollten reichen:
Wenn du also die Instanz von Game_Event hast kannst du ihr diesen Befehl übermitteln:
Solltest du Probleme damit haben die Instanz von Game_Event zu finden welche ein Event im Maker repräsentiert so musst du folgendes tun:
wobei SOME_ID die ID darstellt welche dein Event im Maker besitzt.
Hier, kopiere diese Zeilen von Code an irgendeine Stelle oberhalb von "Main" innerhalb der Scriptliste deines Projektes :
Der Befehl "get_name" wird dir den Namen eines Game_Events zurück geben und der Befehl "set_name(parameter)" wird den Namen verändern.
Wenn du den Namen eines Events erhalten willst musst du folgenden Custom_Script verwenden:
Wobei SOME_ID eine Zahl darstellt, nämlich die ID welche dein Event im Maker besitzt.
Wenn du also den Namen des ersten Events auf der Karte erhalten willst musst du dieses Custom_Script eingeben:
Die ID welche ein Event besitzt wird vom Maker festgelegt und zwar in der Reihenfolge wie die Events auf der Karte erstellt werden.
Wenn du den Namen eines Events schnell und einfach im Spiel überprüfen willst, zum Beispiel um zu testen ob der Code von mir funktioniert, dann musst du diese Zeilen als Custom script in ein Event schreiben:
Dadurch wird dir über den Print-Befehl der Name des Events ausgegeben welches gerade läuft.
Wenn du den Namen ändern willst läuft dies beinahe genauso ab:
Du benutzt das Custom_Script:
Um den Namen von dem Event mit der ID SOME_ID zu SOME_NAME zu ändern.
Als Beispiel:
Dadurch würde das Event welches gerade läuft seinen Namen zu Hanz ändern.
Hiermit würde das Event mit der ID nummer 15 seinen Namen zu Roboter Nr.5 ändern.
Ich habe dies mit dem RPG-Maker XP ausprobiert und es hat wundervoll funktioniert, mit dem RPG-Maker VX sollte es genauso funktionieren aber ich kann dies nicht mit 100% Sicherheit sagen.
Die Projektdatei welche ich von dem von dir angegebenen Link gedownloaded habe funktioniert nicht.
Das Projekt funktioniert zwar schon, allerdings nicht das Menü. Es scheint so, als ob das Spiel, bei jedem Mal wo das Menü geöffnet werden soll, auf den Titelbildschirm zurückkehrt. Somit kann ich es auch leider nicht testen.
Allerdings um dein Problem zu lösen, das Journal-Script von dir besitzt bereits eine eingebaute Funktion um das Journal direkt von der Karte aus zu öffnen, es ist derzeit auf die "L"-Taste des Makers gelegt, standardmäßig sollte dies das Q auf einer herkömmlichen deutschen Tastatur sein.
Hier ist der entsprechende Part direkt aus dem Script kopiert:
Aber das Journal sollte sich theoretisch (ich konnte es wie gesagt nicht testen) auch recht leicht in das andere Menü einbauen lassen da es so wie es scheint das Standardmenü zu immitieren versucht.
Falls das Menü-Script bei dir funktioniert dann versuche einmal folgenden Code.
Ich habe zwei Veränderungen vorgenommen, an diesen beiden Stellen:
if Input.trigger?(Input::C)
# Does stuff based on the index of @command when you pressed C
case @command.index
when 0
# Plays decision SE if there are Actors in the party, then opens item
# menu.
if $game_party.actors.size >= 1
$game_system.se_play($data_system.decision_se)
$scene = Scene_Item.new
# Plays buzzer if the party has no actors
else
$game_system.se_play($data_system.buzzer_se)
end
when 1
# Same as above, but goes into picking actor
if $game_party.actors.size >= 1
$game_system.se_play($data_system.decision_se)
@command.active = false
@status.active = true
@status.index = 0
else
$game_system.se_play($data_system.buzzer_se)
end
when 2
# Same as above, but goes into picking actor
if $game_party.actors.size >= 1
$game_system.se_play($data_system.decision_se)
@command.active = false
@status.active = true
@status.index = 0
else
$game_system.se_play($data_system.buzzer_se)
end
when 3
# Same as above, but goes into picking actor
if $game_party.actors.size >= 1
$game_system.se_play($data_system.decision_se)
@command.active = false
@status.active = true
@status.index = 0
else
$game_system.se_play($data_system.buzzer_se)
end
when 4 # journal
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to journal scene
$scene = Scene_Journal.new
when 5
# Plays buzzer SE if save is disabled, opens save if it isn't
if $game_system.save_disabled
$game_system.se_play($data_system.buzzer_se)
else
$game_system.se_play($data_system.decision_se)
$scene = Scene_Save.new
end
when 6
# Goes to the slightly modded load menu and plays decision SE
$game_system.se_play($data_system.decision_se)
$scene = Scene_LoadMenu.new
when 7
# ENDS THE GAME
$game_system.se_play($data_system.decision_se)
$scene = Scene_End.new
end
end
Dieses Stück Code aus der Update-Methode entscheided wie bei der Eingabe von "C", der "Bestätigen"-Taste im Maker, vorgegangen werden soll.
Ich habe diese Stelle:
when 4 # journal
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to journal scene
$scene = Scene_Journal.new
(kopiert aus dem Journal-Script)
An die entsprechende Stelle eingefügt.
(Zeilen 542 - 546)
Dieses Stück Code aus der Main-Methode regelt die Menü-Optionen des Command-Windows, also dem Fenster welches die Auswahl und Eingabe des Spielers ermöglicht.
Der erste String, nämlich: "044-Skill01" stellt den Namen des Bitmaps dar welches als Icon vor die Option gestellt werden soll.
Der zweite String, "Journal" stellt den Namen der Option selbst dar.
Die Zeilen hierfür sind: 411 - 415.
Versuche einmal ob es soweit funktioniert, falls nicht, solltest du vielleicht einmal ein anderes Projekt hochladen an welchem ich die Einstellungen selber testen kann.
Leider funzt es nicht so ganz. Das Enhanced Default Menu System funktioniert nur, wenn man alle Journal Scripts rausnimmt.
Dann steht nun auch das Journal in der Liste beim neuen Menü, aber ohne Journal lässt sich da natürlich nichts öffnen.
Mit Q lässt sich, sofern vorhanden das Journal aber schon öffnen (hätt ich wirklich früher merken sollen).
EDIT:
Wegen den Namen eines Events ändern... ich brauch es unbedingt so, dass der Name bleibt.
Wenn ich die Map verlasse, und wieder zurück komme, ist der Name wieder der selbe wie zuvor.
Und wer ein Script hat, welches Animationen unter einem bestimmten Terrain versteckt, dem wäre ich auch sehr dankbar.
Ich glaube nicht, dass es einfach so möglich ist den Namen eines Events permanent zu ändern da dieser nicht im Speicherstand sondern in der Karte gespeichert wird. Und wie wir wissen wird nicht für jeden Speicherstand die gesamte Menge aller Karten einmal kopiert.
Aber vielleicht erzählst du uns einmal wofür du diese Möglichkeit überhaupt brauchst und dann könnten wir dir wahrscheinlich einen besseren Weg zeigen welcher einfacher umzusetzen sein wird.
Um den Namen einer Figur im Spiel zu erfahren muss man erst dannach fragen.
Der Name steht jeweils über der Textbox und wird automatisch durch's Hermes Script über der Textbox angezeigt.
Deswegen müsste er permanent verändert werden, da der Name, der über der Textbox steht aus dem Event-Namen geholt wird.
Soll das ein Witz sein?
Verändere einfach das andere Script um den Namen manuell in der Textbox ändern zu können.
Du könntest einfach einen Hash anlegen welcher die Kombination aus Event_ID und Map_ID in einem Array als Key mit einem Namen mappt. Darüber hast du dann jederzeit vollen Zugriff darauf welche Namen für welches Event angezeigt werden würden und es wäre sehr einfach in einen Speicherstand einbaubar.
Hier, dies wäre eine Art Template für so eine Namensdatabase.
class Game_Event < Game_Character
attr_reader :map_id
attr_reader :id
end
class Database_Names
def initialize
@data_hash = {}
end
def set_name_of_event(event, value)
key = [event.map_id, event.id]
@data_hash[key] = value
end
def set_name_of_id(map_id, event_id, value)
key = [map_id, event_id]
@data_hash[key] = value
end
def get_name_of_event(event)
key = [event.map_id, event.id]
name = @data_hash[key]
if name == nil
return ""
end
return name
end
def get_name_of_id(map_id, event_id)
key = [map_id, event_id]
name = @data_hash[key]
if name == nil
return ""
end
return name
end
end
class Scene_Title
def command_new_game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Stop BGM
Audio.bgm_stop
# Reset frame count for measuring play time
Graphics.frame_count = 0
# Make each type of game object
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
$database_names = Database_Names.new
# Set up initial party
$game_party.setup_starting_members
# Set up initial map position
$game_map.setup($data_system.start_map_id)
# Move player to initial position
$game_player.moveto($data_system.start_x, $data_system.start_y)
# Refresh player
$game_player.refresh
# Run automatic change for BGM and BGS set with map
$game_map.autoplay
# Update map (run parallel process event)
$game_map.update
# Switch to map screen
$scene = Scene_Map.new
end
end
class Scene_Save < Scene_File
def write_save_data(file)
# Make character data for drawing save file
characters = []
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
characters.push([actor.character_name, actor.character_hue])
end
# Write character data for drawing save file
Marshal.dump(characters, file)
# Wrire frame count for measuring play time
Marshal.dump(Graphics.frame_count, file)
# Increase save count by 1
$game_system.save_count += 1
# Save magic number
# (A random value will be written each time saving with editor)
$game_system.magic_number = $data_system.magic_number
# Write each type of game object
Marshal.dump($game_system, file)
Marshal.dump($game_switches, file)
Marshal.dump($game_variables, file)
Marshal.dump($game_self_switches, file)
Marshal.dump($game_screen, file)
Marshal.dump($game_actors, file)
Marshal.dump($game_party, file)
Marshal.dump($game_troop, file)
Marshal.dump($game_map, file)
Marshal.dump($game_player, file)
Marshal.dump($database_names, file)
end
end
class Scene_Load < Scene_File
def read_save_data(file)
# Read character data for drawing save file
characters = Marshal.load(file)
# Read frame count for measuring play time
Graphics.frame_count = Marshal.load(file)
# Read each type of game object
$game_system = Marshal.load(file)
$game_switches = Marshal.load(file)
$game_variables = Marshal.load(file)
$game_self_switches = Marshal.load(file)
$game_screen = Marshal.load(file)
$game_actors = Marshal.load(file)
$game_party = Marshal.load(file)
$game_troop = Marshal.load(file)
$game_map = Marshal.load(file)
$game_player = Marshal.load(file)
$database_names = Marshal.load(file)
# If magic number is different from when saving
# (if editing was added with editor)
if $game_system.magic_number != $data_system.magic_number
# Load map
$game_map.setup($game_map.map_id)
$game_player.center($game_player.x, $game_player.y)
end
# Refresh party members
$game_party.refresh
end
end
Lass dich von der Größe nicht zu sehr einschüchtern. Der größte Teil hiervon ist eine Kopie der Standardfunktionen zum erstellen eines neuen Speicherstandes und dem Laden und Speichern eines Spielstandes, modifiziert damit sie eine Namensdatabase enthalten.
Der Code für die Database selbst ist lediglich dieser Teil:
class Database_Names
def initialize
@data_hash = {}
end
def set_name_of_event(event, value)
key = [event.map_id, event.id]
@data_hash[key] = value
end
def set_name_of_id(map_id, event_id, value)
key = [map_id, event_id]
@data_hash[key] = value
end
def get_name_of_event(event)
key = [event.map_id, event.id]
name = @data_hash[key]
if name == nil
return ""
end
return name
end
def get_name_of_id(map_id, event_id)
key = [map_id, event_id]
name = @data_hash[key]
if name == nil
return ""
end
return name
end
end
Und es ist auch eigentlich nicht mehr als ein Wrapper um einen Hash.
Du hast damit folgende vier Funktionen:
set_name_of_event(event, value)
Damit kannst du einem Event direkt einen Namen zuweisen.
set_name_of_id(map_id, event_id, value)
Damit kannst du einen Namen einem Event auf einer derzeit nicht geladenen Karte zuweisen, zum Beispiel gibst du die map_id 1 und die Event_id 4 an um dem vierten Event auf der ersten Karte deines Projektes einen Namen zu geben.
Equivalent zu dem speichern von Namen kannst du mit den Funktionen:
get_name_of_event(event)
und
get_name_of_id(map_id, event_id)
Den Namen eines Events wiedergeben lassen.
Ich weis natürlich nicht welche anderen Scripte du derzeit in deinem Projekt verwendest daher kann ich dir auch nicht ganz genau sagen was du zu tun hast um diese Database in dein Projekt einzubauen.
Das folgende Laufgeräusch-Script soll um einen Schritt-Sound abzuspielen
nicht mehr ablesen, wann der Held sich bewegt, sondern wann dieser von
einem zum nächsten Kästchen wechselt bzw. wann er die Position X Y wechselt.
Wer kann helfen, weil er so nett ist und Scripting drauf hat? :3
Ich brauch's, weil ein anderes Script bereits die Bewegungen des Helden eingenommen haben.
SOUND =[
RPG::AudioFile.new("SCHRITT.wav",100,100),#terrain 1
RPG::AudioFile.new("",12,110),#terrain 2
RPG::AudioFile.new("",12,110),#terrain 3
RPG::AudioFile.new("",100,100),#terrain 4
RPG::AudioFile.new("",100,100),#terrain 5
RPG::AudioFile.new("",100,100),#terrain 6
RPG::AudioFile.new("",100,100),#terrain 7
]
CHARACTER = 0
#1 = nur player
#2 = nur events
#0 = beide
class Game_Character
def lautlos
return @lautlos
end
def lautlos=(n)
@lautlos = n
end
def geraeusch
return if self.lautlos
return if terrain_tag == 0
return if CHARACTER == 2 and self.is_a?(Game_Player)
return if CHARACTER == 1 and self.is_a?(Game_Event)
$game_system.se_play(SOUND[terrain_tag-1])
end
def move_down(turn_enabled = true)
if turn_enabled
turn_down
end
if passable?(@x, @y, 2)
geraeusch
turn_down
@y += 1
increase_steps
else
check_event_trigger_touch(@x, @y+1)
end
end
def move_left(turn_enabled = true)
if turn_enabled
turn_left
end
if passable?(@x, @y, 4)
geraeusch
turn_left
@x -= 1
increase_steps
else
check_event_trigger_touch(@x-1, @y)
end
end
def move_right(turn_enabled = true)
if turn_enabled
turn_right
end
if passable?(@x, @y, 6)
geraeusch
turn_right
@x += 1
increase_steps
else
check_event_trigger_touch(@x+1, @y)
end
end
def move_up(turn_enabled = true)
if turn_enabled
turn_up
end
if passable?(@x, @y, 8)
geraeusch
turn_up
@y -= 1
increase_steps
else
check_event_trigger_touch(@x, @y-1)
end
end
end
class Game_Event
alias sound_refresh refresh
def refresh
@lautlos = false
sound_refresh
return if @list.nil?
for command in @list
if command.code == 108 or command.code == 408
@lautlos = true if command.parameters.to_s.upcase == "LAUTLOS"
end
end
end
end
class Game_Player
def lautlos
return false
end
end
Gibt es ein Script, mit dem man ein (noch nicht vorhandenes!) Event über den Helden und andere Events legen kann, sobald sie ein bestimmtes Terrain passieren, z.B. hohes Gras, um nicht diesen "Körper-bis-zu-1/3-Transparent"-Effekt verwenden zu müssen?