Heyho heyho
Ich habe ein kleines Scriptchen geschrieben, mit dem man die Begehbarkeit von Tiles etwas einschränken kann.
Heisst: Man platziert ein Event, haut irgendwo in den Eventnamen einen String im Stil von "\s[olru]" und schon werden die entsprechenden Richtungen geblockt.
o = Oben
u = Unten
r = Rechts
l = Links
Beispiel
Würde man also in den Eventnamen schreiben:
Blockbla \s[o]
... dann wäre das etwa mit der Einstellung im alten Maker vergleichbar:
(http://zomg.ch/dir.png)
Script
Das Script ist nur schnell hingepfuscht, weil mich diese groben Einstellungen genervt haben. ;)
#==============================================================================
# ** DirectionFix
#------------------------------------------------------------------------------
# Ein kleines Script, um gewisse Richtungen zu blockieren. Wurde
# nur schnell, schnell hingepfuscht. Ich bitte um Verzeihung wegen dem
# dreckigen Code.
#
# ** Anwendung
# Im Namen des Events irgendwo \s[*] eingeben, den Stern dabei mit den Richtungen
# ersetzen, die blockiert werden sollen.
# o = von oben kann man nicht mehr auf das Event treten
# u = von unten kann man nicht mehr auf das Event treten
# l = von links kann man nicht mehr auf das Event treten
# r = von rechts kann man nicht mehr auf das Event treten
#
# ** Sample
# Heinz \s[r] => quasi rechts neben ihm ist nun eine unsichtbare Wand
#
# @author Casha/EusthEnoptEron
# @version 0.5
#==============================================================================
#==============================================================================
# Kleine Methoden um den Caller herauszufinden
#==============================================================================
def caller_method_name
parse_caller(caller(2).first).last
end
def parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
#==============================================================================
class Game_Character
alias dirfix_passable? passable?
def passable?(x, y)
#Richtung herausfinden
case caller_method_name
when 'move_down'
direction = 'o'
when 'move_up'
direction = 'u'
when 'move_left'
direction = 'r'
when 'move_right'
direction = 'l'
else
direction = nil
end
#Wenn mein Script sagt, es geht da nicht weiter, dann geht's da auch nicht
# weiter. Ansonsten wird die Antwort der normalen Methode genommen. Bei false
# wird meines gar nicht erst aufgerufen.
if dirfix_passable?(x,y) == true
return $game_map.passablefromdir?(x,y,direction)
else
return false
end
end
end
class Game_Map
#===============================================================================
# Prueft, ob der Block an (x|y) in der angegebenen Richtung beschritten werden kann.
#-------------------------------------------------------------------------------
# @param Integer x X-Koordinate des zu beschreitenen Blockes
# @param Integer y Y-Koordinate des zu beschreitenen Blockes
# @param Char direction o/u/l/r die Seite, die geblockt wird
#
# @return Boolean ob passierbar oder nicht
#===============================================================================
def passablefromdir?(x,y,direction)
#ox, oy etc. sind die Positionen des vorigen Blockes, damit er beidsietig
# blockiert wird.
ox = x
oy = y
odir = ''
case direction
when 'o'
oy -= 1
odir = 'u'
when 'u'
oy += 1
odir = 'o'
when 'l'
ox -= 1
odir = 'r'
when 'r'
ox += 1
odir = 'l'
end
defaultReturn = true
for event in events_xy(x, y) # events with matching coordinates
defaultReturn = event.passable_from(direction) unless defaultReturn == false
end
for event in events_xy(ox, oy) # events with matching coordinates
defaultReturn = event.passable_from(odir) unless defaultReturn == false
end
return defaultReturn
end
end
class Game_Event
#==============================================================================
# Gibt zurück, ob das Event von der angegebenen direction passierbar ist.
#------------------------------------------------------------------------------
# @param Char direction o/u/l/r die Seite, die geblockt wird
#
# @return Boolean ob passierbar oder nicht.
#==============================================================================
def passable_from(direction)
if direction =~ /[olru]/
name = @event.name
possibleDirs = name[/\\s\[([olru]{1,4})\]/]
if possibleDirs == nil
return true
end
possibleDirs = possibleDirs[/[olru]+/]
if possibleDirs =~ /[#{direction}]/
return false
else
return true
end
else
return true
end
end
end
Schlusswörter
Falls jemand eine bessere Methode hat, bin ich immer offen. Die ganzen Events sind auch keine wirkliche Lösung. =/
Auch wenn schon jemand sowas gemacht hat, wäre ich interessiert zu schauen, wie er es gelöst hat. Lehrreich für die persönliche Weiterentwicklung im Bereich Rubyprogrammierung. ;D
Und natürlich bei Bugs sofort melden, können wohl gut noch ein paar drin sein, da ich noch nicht wirklich Zeit hatte, das Zeug ausgiebig zu testen.