Snugglebit

Krieger

  • »Snugglebit« ist der Autor dieses Themas

Motto: Menschen sind doof, Tiere sind doof, Pflanzen sind doof... Steine sind okay.

  • Nachricht senden

1

Freitag, 15. September 2017, 14:55

Ortsspezifisches Item

Und wieder stehe ich vor einem Problem ^^
Dieses Mal betrifft es ein Item, welches man nur in bestimmten Maps verwenden darf á la Fahrrad in Pokemon.
Es handelt sich dabei um einen Hexenbesen, auf dem man fliegen kann, um sich schneller fortzubewegen und über Hindernisse, wie z. b. Flüsse zu kommen. Alles in allem ist es das Luftschiff, nur dass man es eben aus dem Itemmenü heraus aktiviert.
Jetzt kommt es natürlich ein bisschen blöd, wenn man in einem Haus auf seinem Besen fliegt. Daher meine Frage: Wie kann ich verhindern, dass das Item in bestimmten Maps verwendet werden kann?

Klar könnte ich in dem Common Event des Items erst einmal abfragen, in welcher Map man sich befindet - wie das in der Theorie ginge weiß ich.
Nur würde das zu einer galaktischen Verschachtelung von Bedingungen kommen, wenn man bedenkt, wie viele Indoor-Maps es geben wird. Daher dachte ich, dass es vielleicht eine einfachere Lösung geben könnte, das Item in bestimmten Maps zu verbieten - vielleicht sogar in Skriptform?

Dann wäre da noch eine Kleinigkeit, die ich gern ändern würde: und zwar die Geschwindigkeit des Luftschiffes. Ich würde sie gern ein klein wenig senken. Kann man das irgendwo ändern?
Was lebt, das kann man töten. Was tot ist, das kann man essen.
--------------------------------------------------------------------------
:map: Mapping: :star::star::star::star::star:
:compile: Scripting: :star-empty::star-empty::star-empty::star-empty::star-empty:
:system-monitor: Event: :star::star::star::star::star:
:doc: Story: :star::star::star::star::star-empty:
:pencil: Zeichnen: :star::star::star::star::star:
:palette: Pixeln: :star::star::star-half::star-empty::star-empty:
:music-beam-16: Musik & Sounds: :star::star::star::star-empty::star-empty:
--------------------------------------------------------------------------
Bevorzugter Maker: :ace:
Ebenfalls im Besitzt: :rmxp: :rmvx: :rmmv:

2

Freitag, 15. September 2017, 18:55

Du könntest in deine Maps in das Notizfeld eine Markierung schreiben, zum Beispiel <besen-erlaubt:ja>

Und wenn Du VXaceDEM verwendest (siehe unten) kannst Du in deinem CommonEvent einfach abfragen:

  • @>Bedingte Abfrage: Script: $game_map.meta['besen-erlaubt'] == 'ja'
    • @> Kommentar: Besen kann benutzt werden
  • : Befehlsende


Das wäre so der simpelste Vorschlag. Die alternative wäre schon im Itemmenü zu prüfen, ob das Item gerade verwendbar ist.

Dann müsste man hier ansetzen:

Ruby Quellcode

1
2
3
4
5
6
7
8
class Game_Party
  #--------------------------------------------------------------------------
  # * Determine Skill/Item Usability
  #--------------------------------------------------------------------------
  def usable?(item)
    members.any? {|actor| actor.usable?(item) }
  end
end
und abfragen, ob das betrachtete Item der Besen ist und dann eine besondere Entscheidung treffen.

Spoiler: VXaceDEM

Dieses Script (VXaceDEM -v1.0) darf gerne in nicht-kommerziellen Projekten verwendet werden. Bitte nicht woanders posten, sondern stattdessen hierher verlinken. Für kommerzielle Nutzung einfach mal bei Playm nach einer Lizenz fragen.


Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#==============================================================================
# ** RPG Maker VX Ace Database Entry Metadata (VXaceDEM Version:1.0) by Playm
#------------------------------------------------------------------------------
#  Based of the JS implementation in RPG Maker MV Standard Scripts
#------------------------------------------------------------------------------
#  The [Note] field found in each item of the database can be used to define 
#  unique data used with each custom script.
#    <name:data>
#  In this way, data which has been written in a fixed format will be 
#  automatically developed inside a "meta" variable.
#  In the case above, the following conditions will be met.
#    object.meta['name'] == 'data'
#  
#  The dynamic meta attribute is included in
#    Game_Map    (e.g. $game_map.meta for the current map)
#    RPG::Item   (e.g. $data_items[1].meta for the metadata of your favorite
#                 potion)
#    RPG::Weapon (e.g. $data_weapons[1].meta for the metadata of your favorite
#                 sword)
#    RPG::Armor  (e.g. $data_armors[1].meta for the metadata of your favorite
#                 helmet)
#    RPG::Skill  (e.g. $data_skills[1].meta)
#    RPG::Actor  (e.g. $data_actors[1].meta)
#    RPG::Enemy  (e.g. $data_enemy[1].meta)
#    RPG::State  (e.g. $data_states[1].meta)
#==============================================================================
module DataManager
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def self.load_database
    if $BTEST
      load_battle_test_database
    else
      load_normal_database
      check_player_location
    end
    [ $data_actors, $data_classes, $data_skills, $data_items, $data_weapons,
      $data_armors, $data_enemies, $data_states ].each do |db|
       db.each do |entry|
         if entry
           self.extractMetadata(entry)
         end
       end
    end
  end
  #--------------------------------------------------------------------------
  # * Extrace Metadata
  #--------------------------------------------------------------------------
  def self.extractMetadata( object )
    unless object.respond_to?(:note) and object.respond_to?(:meta)
      raise ArgumentError, "Can't extract metadata from this object. '#{object.class}'"
    end
    re = /<([^<>:]+)(:?)([^>]*)>/
    object.meta = {}
    object.note.scan( re ).each do |match|
      if match[1] == ':'
        object.meta[ match[0] ] = match[2]
      else
        object.meta[ match[0] ] = true
      end
    end
  end
end
#==============================================================================
# ** Preparing Databaseentrys with a :meta attribute
#==============================================================================
module RPG
  class Map
    attr_accessor :meta
  end
  class RPG::BaseItem
    attr_accessor :meta
  end
end
#==============================================================================
# ** Game_Map reads its meta data from the current RPG::Map Object
#==============================================================================
class Game_Map
  attr_reader :meta
  alias_method( :org_setup_wo_metadata, :setup ) unless $!
  def read_metadata
    DataManager.extractMetadata( @map )
    @meta = @map.meta
  end
  def setup(*args)
    org_setup_wo_metadata(*args)
    read_metadata
  end
end
zum Lesen den Text mit der Maus markieren


Edit Achja, Du hattest ja auch noch wegen dem Luftschiff gefragt.
Als neues Script über Main einfügen und eine kleinere Ganzzahl statt der 5 eintragen:

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#==============================================================================
# ** Game_Vehicle Edit
#------------------------------------------------------------------------------
#  Change initial move speed of airships
#==============================================================================
class Game_Vehicle
  #--------------------------------------------------------------------------
  # * Initialize Move Speed
  #--------------------------------------------------------------------------
  alias_method( :org_init_move_speed_wo_broomex, :init_move_speed ) unless $!
  def init_move_speed(*args)
    org_init_move_speed_wo_broomex(*args)
    @move_speed = 5 if @type == :airship
  end
end

Social Bookmarks