• Login

Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Snugglebit

Krieger

  • "Snugglebit" started this thread

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

  • Send private message

1

Friday, September 15th 2017, 2:55pm

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:

Playm

RPG Studio Webmaster

  • Send private message

2

Friday, September 15th 2017, 6:55pm

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 Source code

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 Source code

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
highlight to read


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 Source code

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