Ergebnis 1 bis 13 von 13

Thema: [XP] def richtig aufrufen

  1. #1

    [XP] def richtig aufrufen

    Servus, ich hab mal wieder eine Frage.

    In einem der Script die ich nutze findet sich dieser Abschnitt hier, der den Spieler vermutlich die Waffe wechseln lässt.

    Code:
     def change_weapon(id=2)
       unless @waffe_aktuell.nil?
         spezab = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Ablegen']
         eval(spezab) unless spezab.nil?
       end
       if @waffe[id].nil?
         $game_actors[@actor].set_graphic(@actor_graphic, 0, '', 0)
        else
         $game_actors[@actor].set_graphic(@waffen_atr[@waffe[id]['Name']]['Spielergrafik'], 0, '', 0)
         spezan = @waffen_atr[@waffe[id]['Name']]['Spezial_Anlegen']
         eval(spezan) unless spezan.nil?
       end
       $game_system.se_play(@waffenwechselsound)
       @waffe[0] = id
       @waffe_aktuell = @waffe[@waffe[0]]
       @hud.refresh
       $game_player.refresh
     end
    An einer anderen Stelle in einem anderen Script zuvor, wird der Waffenwechsel glaube ich ausgelöst.

    Code:
      if @option_allow_weapon_change
        for taste in 0..@waffe.size - 2
          if @key.getkey_id(49+taste) and @waffe[0] != taste+1
          change_weapon(taste+1)
        end
       end
      end
    Nun habe ich versucht den Waffenwechsel über ein Menü zu ermöglichen, dessen Script wiederum denen vorangestellt ist.
    Ich habe dazu die Zeile: " change_weapon(x) " eingefügt, wobei x für 0,1,2,3,49,50,51 steht. Leider bekomme ich immer den
    NoMethod-Fehler. Ich rufe die Funktion also scheinbar nicht richtig auf. Kann da jemand vielleicht etwas Licht ins Dunkel bringen?

  2. #2
    Ich nehme einmal stark an, dass die Methode "change_weapon" nicht global ist, sondern in einer Klasse vorhanden ist.
    Es könnte sein, dass du versuchst diese Methode global auf zu rufen und daher die NoMethodException geworfen bekommst.

    Näheres könnte ich dir aber nur sagen, falls du mehr von dem Script zeigen würdest.

  3. #3
    Leider ist das Script ziemlich groß. Ich glaube kaum, dass jemand nach dem Fehler suchen würde.

    Tatsächlich befinden sich beide Codeteile zwar in unterschiedlichen Scripts, aber sind beide Teil der selben Klasse.
    Ich nehme an, dass es nicht so einfach ist, dass ich die Klasse in einem anderen Script einfach aufrufen kann?

  4. #4
    Du kannst den Code nicht auf einer Klasse aufrufen, dieser Code muss auf einem Objekt aufgerufen werden. Dementsprechend bräuchtest du ersteinmal ein Objekt.
    Ich nehme an es handelt sich um Game_Actor, oder eine von diesen Klassen. In diesem Fall würde es sehr einfach sein über die globalen Variablen an ein Objekt zu kommen.

  5. #5
    Ich verstehe genau was du meinst, fühle mich aber außer Stande das ohne Anleitung hin zu bekommen.
    Ich poste jetzt einfach mal den meiner Meinung nach relevanten Code. Wäre genial wenn du mir da auf die Sprünge helfen könntest.

    Das ist die Update-Funktion in der weiter unten der Waffenwechsel initiiert wird.
    Code:
    class Scene_Map
      alias :mss_map_ini_original :initialize if $MSS.nil?
      def initialize
        mss_map_ini_original 
        $MSS.ini_hud
      end
    
      alias :mss_map_update_original :update if $MSS.nil?
      def update
        $MSS.update if $MSS.active
        mss_map_update_original
      end
    end
    
    class Window_Message
      alias :mss_dispose_original :dispose if $MSS.nil?
      def dispose
        mss_dispose_original
        $MSS.dispose
      end
    end
    
    class MSS
      def update
       return if $game_temp.message_window_showing
       $game_player.direction_fix = @key.getkey_id(@key_strafe) unless @key_strafe.nil?
       if @wait > 0
           @wait -= 1
           @hud_laden.refresh unless @hud_laden.nil?
           if @wait == 0
             $game_system.menu_disabled = false
             @hud_laden.dispose unless @hud_laden.nil?
             @hud_laden = nil
           end
           return
       end
       if @schussrate > 0
        @schussrate -= 1 
        return
      end
    
       # Sprinten
       if @sprinten_akt == true and @key.getkey_id(@key_sprinten) and @sprinten > 0
        @sprinten -= 1
        @hud_energie.refresh(@sprinten) if Graphics.frame_count % 2 == 0
        return
       elsif @sprinten_akt == true
        $game_player.move_speed -= 1
        @sprinten_akt = false
       end
      
       if @key.getkey_id(@key_sprinten) and @sprinten > 20
        @sprinten_akt = true 
        $game_player.move_speed += 1
        @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max) if @sprinten == @sprinten_max
       elsif @sprinten < @sprinten_max
        if Graphics.frame_count % ($game_player.moving? ? 6 : 3) == 0
         @sprinten += 1
         @hud_energie.refresh(@sprinten)
        end
       elsif @sprinten == @sprinten_max and !@hud_energie.nil?
        @hud_energie.dispose
        @hud_energie = nil
      end
      # /
      
      use_medikit if @key.getkey_id(@key_medikit)
      granate_wefen if @key.getkey_id(@key_granate)
      mine_legen if @key.getkey_id(@key_mine)
      
      if @key.getkey_id(69) # E
        granate_wefen(4,2)
        granate_wefen(4,4)
        granate_wefen(4,6)
        granate_wefen(4,8)
      end
      
       if @waffe_aktuell != nil
        if @waffen_atr[@waffe_aktuell['Name']]['Schussrate'].nil?
         schuss if Input.trigger?(Input::C)
       elsif @key.getkey_id(13) or @key.getkey_id(32)
        schuss
        @schussrate = @waffen_atr[@waffe_aktuell['Name']]['Schussrate']
       end
      end
    
      if @option_allow_weapon_change
        for taste in 0..@waffe.size - 2
          if @key.getkey_id(49+taste) and @waffe[0] != taste+1
          change_weapon(taste+1)
        end
       end
      end
      
       for taste in @nachladetasten
         nachladen if @key.getkey_id(taste)
       end
     end
    
     def dispose
       if @hud.is_a?(MSS_HUD)
          @hud.dispose
          @hud = nil
       end
       if @hud_laden.is_a?(MSS_HUD_LADEN)
          @hud_laden.dispose
          @hud_laden = nil
       end
       if @hud_boss.is_a?(MSS_HUD_BOSS)
          @hud_boss.dispose
          @hud_boss = nil
       end
        
       if !@hud_energie.nil?
          @hud_energie.dispose
          @hud_energie = nil 
      end
     end
     
     def ini_hud
      @hud = @option_hud_sichtbar[0] ? MSS_HUD.new : MSS_HUD_Dummy.new
      boss(true,@hud_boss_active[0],@hud_boss_active[1],true) if @hud_boss_active.is_a?(Array)
      @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max, false) unless @sprinten == @sprinten_max
     end
    end
    Und hier das Script in dem die def steht, auf die ich zugreifen möchte. Die Stelle ist etwas über der Mitte.
    Code:
    class MSS
      attr_accessor :waffen_atr, :waffe_aktuell, :gegner_atr, :active, 
      :statistik, :waffe, :events, :actor, :key, :hud, :wait, :ziel,
      :hud, :hud_laden, :hud_boss, :hud_boss_active, :option_events_aktivieren,
      :option_allow_weapon_change, :option_quake_sounds, :option_automatisches_nachladen,
      :items, :actor_graphic, :heal_power, :sprinten_max, :granate_power, :mine_power,
      :movement_8_way, :skills
      def schuss(taeter=$game_player,ziel='Events',abfrage=false,spezial=true)
       @taeter = taeter; @ziel = ziel
       @taeter = $game_map.events[@taeter] if @taeter.is_a?(Integer)
       @hx = @taeter.x
       @hy = @taeter.y
       @hd = @taeter.direction
       
       if @ziel == 'Events'
        if not @waffe_aktuell['Magazin'] > 0
         $game_system.se_play(@leere_waffe_sound)
         return
       end
        spezschuss = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Schuss']
        eval(spezschuss) unless spezschuss.nil?
        $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Schusssound'])
        @statistik['Schuesse'] += 1
        @waffe_aktuell['Magazin'] -= 1
        @hud.refresh
        if @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'] != nil
          $game_player.animation_id = @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'][$game_player.direction / 2 - 1]
        end
        @killed = 0; @int = 0
        treffer?
        quake_sound
        nachladen if @waffe_aktuell['Magazin'] == 0 and @option_automatisches_nachladen
        elsif @ziel == 'Player'
          treffer?
        end
      end
      
      def quake_sound
       @statistik['Multikill'] = @killed if @killed > @statistik['Multikill']
       if @killed > 1 and @option_quake_sounds[0]
         if @killed > @option_quake_sounds.size then sound = @option_quake_sounds.size else sound = @killed end
         $game_system.se_play(@option_quake_sounds[sound-1])
       end
      end
      
      def treffer?
        case @hd
         when 2 # Runter
          start = @hy + 1
          ende = $game_map.height
          counter = 1
          vari = 1 # Y
         when 4 # Links
          start = @hx - 1
          ende = -1
          counter = -1
          vari = 0 # X
         when 6 # Rechts
          start = @hx + 1
          ende = $game_map.width
          counter = 1
          vari = 0
         when 8 # Hoch
          start = @hy - 1
          ende = -1
          counter = -1
          vari = 1
        end
        x, y = @hx, @hy
        tile = start
        while tile != ende
          if vari == 0
            x = tile
          else
            y = tile
          end
          break if $game_map.passable?(x,y,0) == false and @undurchlässiges_terrain.include?($game_map.terrain_tag(x,y)) == false
          @id = $game_map.id_coordinates(x,y)
          break if @events['Hindernis'].include?(@id)
          if @ziel == 'Player'
           if @id == 0
             getroffen 
             return
           end
           tile += counter
           next
          end
          @int = id_to_int(@id)
          if @id > 0 and @int != nil and @events['Gegner'][@int] != nil and 
          $game_self_switches[[$game_map.map_id, @id, 'A']] == false
             getroffen
             break if @events['Gegner'][@int]['HP'] != nil and 
             not @gegner_atr[@events['Gegner'][@int]['Klasse']]['Kugeldurchlässig']
          end
          tile += counter
        end
      end
      
      def getroffen
        if @ziel == 'Player'
          gegner_schlag(@taeter.id)
          return
        end
    
        spezial = @events['Gegner'][@int]['Spezial']
        unless spezial.nil?
          eval(spezial)
          return
        end
        
        spezial = @gegner_atr[@events['Gegner'][@int]['Klasse']]['Spezial']
        if !spezial.nil?
         aftereval = spezial.include?('!A!')
         eval(spezial) unless aftereval
        end
      
       schaden = @waffen_atr[@waffe_aktuell['Name']]['Schaden']
       
       make_damage(@id,schaden,blut_animation(@id,@hd))
       @store_direction #ssssssssssssssssssssssss
       eval(spezial.gsub('!A!','')) if aftereval
       @restore_direction #ssssssssssssssssssssssss
      end
      
      def nachladen
        return if @waffe_aktuell.nil?
        magazin_max = @waffen_atr[@waffe_aktuell['Name']]['Magazin']
        magazin = @waffe_aktuell['Magazin']
        munition = @waffe_aktuell['Munition']
        noetig = magazin_max - magazin
        return if magazin == magazin_max
        return if munition == 0
        if munition == '/'
          magazin = magazin_max
        else
          if munition + magazin >= magazin_max
          munition -= noetig
          magazin = magazin_max
        else
          magazin += munition
          munition = 0
         end
        end
        @waffe_aktuell['Magazin'] = magazin
        @waffe_aktuell['Munition'] = munition
        $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Nachladesound'])
        wait_balken(@waffen_atr[@waffe_aktuell['Name']]['Nachladezeit'])
        @hud.refresh
      end
      
      def gegner_schlag(id)
    int = id_to_int(id)
        schaden = @gegner_atr[@events['Gegner'][int]['Klasse']]['Schaden']
        $game_actors[@actor].hp -= schaden
        @statistik['Verlorene HP'] += schaden
        $game_player.animation_id = 
        @gegner_atr[@events['Gegner'][int]['Klasse']]['Trefferanimation']
      end
      
      def dead?(id)
        return true if @events['Gegner'][id_to_int(id)]['HP'] == 0
        return false
      end
      
      def all_dead?
        ins = 0;@events['Gegner'].each { |g| ins += g['HP'] if !g['HP'].nil?}
        return true if ins == 0
        return false
      end
      
      def kill(id)
        id = [id] if id.is_a?(Numeric) 
        for i in id
         @events['Gegner'][id_to_int(i)]['HP'] = 0
         change_local_switch(i)
        end
      end
      
      def kill_all
       @events['ID'].each_index {|i|int = id_to_int(i);kill(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
      end
      
      def heal(id)
        id = [id] if id.is_a?(Numeric)
        for i in id
         int = id_to_int(i)
         @events['Gegner'][int]['HP'] = 
         @gegner_atr[@events['Gegner'][int]['Klasse']]['HP']
         change_local_switch(i,false)
        end
      end
      
      def heal_all
        @events['ID'].each_index {|i|int = id_to_int(i);heal(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
      end
      
      def add_ammo(name,ammo)
        @waffe[find_weapon_slot(name)]['Munition'] += ammo
      end
      
      def add_weapon(name,munition=300,magazin=30,id=0,double=false)
        return if !double and find_weapon_slot(name) != @waffe.size
        hash = {'Name' => name, 'Munition' => munition, 'Magazin' => magazin}
        if id == 0 then @waffe << hash else @waffe[id] = hash ;end
      end
      
      def remove_weapon(name)
        if name.is_a?(String)
         @waffe.delete_at(find_weapon_slot(name))
       else
         @waffe.delete_at(name)
        end
      end
      
      def find_weapon_slot(name='')
        name.to_s
        @waffe.each_with_index do |waffe,index|
          next if index < 2
          return index if name == waffe['Name']
        end
        return @waffe.size
      end
      
      def boss(show=true,id=1,name='',menu=false)
        @hud_boss.dispose if @hud_boss_active.is_a?(Array) and menu == false
        if show
         @hud_boss = MSS_HUD_BOSS.new(id,name)
         @hud_boss_active = [id,name]
        else
         @hud_boss.dispose
         @hud_boss = nil
         @hud_boss_active = nil
       end
     end
     
      def change_weapon(id=2)
       unless @waffe_aktuell.nil?
         spezab = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Ablegen']
         eval(spezab) unless spezab.nil?
       end
       if @waffe[id].nil?
         $game_actors[@actor].set_graphic(@actor_graphic, 0, '', 0)
        else
         $game_actors[@actor].set_graphic(@waffen_atr[@waffe[id]['Name']]['Spielergrafik'], 0, '', 0)
         spezan = @waffen_atr[@waffe[id]['Name']]['Spezial_Anlegen']
         eval(spezan) unless spezan.nil?
       end
       $game_system.se_play(@waffenwechselsound)
       @waffe[0] = id
       @waffe_aktuell = @waffe[@waffe[0]]
       @hud.refresh
       $game_player.refresh
     end 
     
     def change_local_switch(id,value=true,switch='A',map=$game_map.map_id)
      for i in id.to_a
       $game_self_switches[[map, i, switch]] = value
      end
      $game_map.need_refresh = true
     end
    
      def option_hud_sichtbar(hud=true,balken=true)
        @option_hud_sichtbar = [hud,balken]
        @hud.dispose
        if hud
          @hud = MSS_HUD.new
        else
          @hud = MSS_HUD_Dummy.new
        end
      end
      
      def make_saveable
        dispose
        @key = nil
      end
      
      def make_playable
        @key = Keys.new
      end
       
      def make_damage(id,schaden,ani=0)
        return if $game_self_switches[[$game_map.map_id, id, 'A']]
        int = id_to_int(id)
        @events['Gegner'][int]['HP'] -= schaden
        @statistik['Zugefuegter Schaden'] += schaden
        $game_map.events[id].animation_id = ani
        if @events['Gegner'][int]['HP'] <= 0
         @statistik['Zugefuegter Schaden'] += @events['Gegner'][int]['HP']
         @events['Gegner'][int]['HP'] = 0
         change_local_switch(id)
         @statistik['Gegner'] += 1
         @killed += 1
       end
       @hud_boss.refresh if @hud_boss_active.is_a?(Array) and @hud_boss_active[0] == id
     end
      
      def wait_balken(wait)
        return if @wait > 0
        @wait = wait
        $game_system.menu_disabled = true
        @hud_laden = @option_hud_sichtbar[1] ? MSS_HUD_LADEN.new(wait) : MSS_HUD_Dummy.new
      end
      
      def items_add(wert, key)
        $MSS.items[key] += wert
        @hud.refresh
      end
      
      def direction(x1,y1,x2,y2)
        x, y = x2 - x1, y2 - y1
        return -1 if x == 0 and y == 0
        if x.abs > y.abs
         return x > 0 ? 4 : 6
        else
         return y > 0 ? 8 : 2
       end
      end
     
      def blut_animation(id,d)
       blut = @gegner_atr[@events['Gegner'][id_to_int(id)]['Klasse']]['Blut']
       return blut.nil? ? 0 : blut[d / 2 - 1]
      end
     
      def id_to_int(id)
        return @events['ID'][id]
      end
     
      def garbage_collector
       $game_map.events.each{|e|$game_map.events.delete(e[1].id) if $game_self_switches[[$game_map.map_id, e[1].id, 'A']]}
      end
      
      def debug
       File.open('MSS.txt','w') {|f|f.write($MSS.inspect)}
      end
    end
    
    class Game_Map
      attr_reader   :map
      alias :mss_original_setup :setup if $MSS.nil?
      def setup(map_id)
        mss_original_setup(map_id)
        $MSS.ini_events
      end
      
      def id_coordinates(x=0,y=0)
        @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y}
        return 0 if $game_player.x == x and $game_player.y == y
        return -1
      end
      
      def id_coordinates_mine(x=0,y=0,id=0)
        @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y and e[1].id != id}
        return -1
      end
      
      def id_coordinates_array(x=0,y=0)
        array = []
        @events.each {|e|array << e[1].id if e[1].x == x and e[1].y == y}
        array << 0 if $game_player.x == x and $game_player.y == y
        return array
      end
      
      def id_rect(rect)
        ev = []
        @events.each {|e|ev << e[1].id if rect.inside?(e[1])}
        return ev
      end
    end
    
    class Game_Character
     attr_accessor :flat
     alias :mss_original_initialize :initialize if $MSS.nil?
     alias :mss_original_screen_z :screen_z if $MSS.nil?
     def initialize
       @flat = false
       mss_original_initialize
     end
     def screen_z(height = 0)
        return 0 if @flat
        mss_original_screen_z(height)
      end
    end
    
    class Keys
      def initialize
        @GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'l','l')
        @keybd_event = Win32API.new('user32', 'keybd_event', %w(l l l l), '')
      end
      def getkey
        for i in 0..255
          if @GetAsyncKeyState.call(i) != 0
            return i
          end
        end
        return 0
      end
      def getkey_id(id)
         if @GetAsyncKeyState.call(id) != 0
           return true
         end
         return false
      end
      def setkey_id_down(id)
        @keybd_event.call(id,0,0,0)
      end
        def setkey_id_up(id)
        @keybd_event.call(id,0,2,0)
      end
    end
    
    class Game_Player < Game_Character
      def update
        last_moving = moving?
        unless moving? or $game_system.map_interpreter.running? or
               @move_route_forcing or $game_temp.message_window_showing
        #==========EDIT===========#
        if $MSS.movement_8_way
          case Input.dir8
          when 1
            move_lower_left
          when 2
            move_down
          when 3
            move_lower_right
          when 4
            move_left
          when 6
            move_right
          when 7
            move_upper_left
          when 8
            move_up
          when 9
            move_upper_right
          end
        else
          case Input.dir4
          when 2
            move_down
          when 4
            move_left
          when 6
            move_right
          when 8
            move_up
          end
        end
        #==========EDIT===========#
        end
        last_real_x = @real_x
        last_real_y = @real_y
        super
        if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
          $game_map.scroll_down(@real_y - last_real_y)
        end
        if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
          $game_map.scroll_left(last_real_x - @real_x)
        end
        if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
          $game_map.scroll_right(@real_x - last_real_x)
        end
        if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
          $game_map.scroll_up(last_real_y - @real_y)
        end
        unless moving?
          if last_moving
            result = check_event_trigger_here([1,2])
            if result == false
              unless $DEBUG and Input.press?(Input::CTRL)
                if @encounter_count > 0
                  @encounter_count -= 1
                end
              end
            end
          end
        #==========EDIT===========#
        if $MSS.active == false or $MSS.waffe_aktuell == nil or $MSS.option_events_aktivieren
          if Input.trigger?(Input::C)
            check_event_trigger_here([0])
            check_event_trigger_there([0,1,2])
            end
          end
        #==========EDIT===========#
        end
      end
    end
    
    class Game_System
      attr_accessor :mss_save
    end
    
    class Game_Character
      attr_accessor :direction_fix
    end
    
    class Rect
      def each
        for xx in x..x + width
          for yy in y..y + height
            yield xx, yy
          end
        end
      end
      
      def inside?(ox,oy=0)
       ox, oy = ox.x, ox.y unless ox.is_a?(Integer)
       return (ox.between?(x, x + width)) && (oy.between?(y, y + height))
      end
    end
    
    class Game_SelfSwitches
      def delete(key)
        @data.delete(key)
      end
    end
    
    class Game_Battler
      alias :mss_hpchange_original :hp= if $MSS.nil?
      def hp=(hp)
        mss_hpchange_original(hp)
        return unless self.is_a?(Game_Actor)
        $MSS.hud.refresh
        $game_temp.gameover = true if @hp == 0
      end
    end
    
    class Scene_Save < Scene_File
      alias :mss_write_save_data_original :write_save_data if $MSS.nil?
      def write_save_data(file)
        $MSS.make_saveable
        $game_system.mss_save = $MSS
        mss_write_save_data_original(file)
        $MSS.make_playable
      end
    end
    
    
    class Scene_Load < Scene_File
      alias :mss_read_save_data_original :read_save_data if $MSS.nil?
      def read_save_data(file)
        mss_read_save_data_original(file)
        $MSS = $game_system.mss_save
        $MSS.make_playable
      end
    end
    
    class Scene_Title
      alias :mss_title_ini_original :initialize if $MSS.nil?
      def initialize
       $MSS = MSS.new
       mss_title_ini_original
     end
    end

  6. #6
    Nein, tut mir Leid, das ist keine der Standardklassen.

    Was du versuchen könntest wäre:
    $MSS.change_weapon(x)

    Aber ich kann dir nicht sagen, ob das funktionieren wird; das ist hier nur geraten.

  7. #7
    Jemand vielleicht noch eine Idee?

  8. #8
    Idee: Poste mal den gesamten Code der Scripts, die du eingefügt hast, nicht nur das was du für relevant hältst.

  9. #9
    MSS: Initialize
    Code:
    class MSS # Monsta's Shoot System
       
      def initialize
    
        #===Optionen===#
        @active = false # Ist das Schusssystem von Anfang an aktiv
        @undurchlässiges_terrain = [7]   # Alle Zahlen von 0-7 können im Array verwendet werden. Einzelne Terrain ID's werden wie im Array gewohnt durch ein Komma getrennt
        @option_events_aktivieren = false # Mit dieser Option braucht man nicht immer die Waffe zu wechseln um ein "Push Key" Event zu starten. [x]
        @option_allow_weapon_change = true # Gibt an, ob die Waffe gewechselt werden darf
        @option_quake_sounds = [true,
         RPG::AudioFile.new('double',100,100),
         RPG::AudioFile.new('multi',100,100),
         RPG::AudioFile.new('ultra',100,100),
         RPG::AudioFile.new('monster',100,100)]
        @option_automatisches_nachladen = true # Gibt an, ob automatisch nachgeladen werden soll, wenn das Magazin leer ist.
        @option_hud_sichtbar = [false,true] # Gibt an, ob der HUD mit HP und Ammo Anzeige Sichtbar sein soll. Der 2. Wert steht für den Nachladebalken
        # Die Waffenzusammenstellung die man am Anfang des Spiels hat. Der nil wert ist für Waffe wegstecken.
        @waffe = [1,nil,
        {'Name' => 'Pistole', 'Munition' => '/', 'Magazin' => 15},
       # {'Name' => 'Deagle', 'Munition' => 30, 'Magazin' => 7},
        {'Name' => 'Shotgun', 'Munition' => 300, 'Magazin' => 1}
        ]
        @actor = 1 # Heldennummer (für z.B. HP Berechnung)
        @actor_graphic = 'player_normal_SICHERUNG' # Heldengrafik, als Figur ohne Waffe
        @waffenwechselsound = RPG::AudioFile.new('Waffe_wechsel',100,100)
        @leere_waffe_sound = RPG::AudioFile.new('leer',100,100)
        @standard_blut = [25,26,27,28]
        @spinne_blut = [109,109,109,109]
        @robospinne_blut = [33,33,33,33]
        
        @nachladetasten = [0,0,0]  # "R" - "Alt" - "Shift"
        
        @key_strafe = 65 # Strafelauf ist auf Taste A. Um Strafen zu deaktivierten nil nehmen
        @key_medikit = 0 # Medikit benutzen ist auf Taste S.
        @key_granate = 68 # Granate werfen ist auf Taste D.
        @key_mine = 0 # Mine legen ist auf Taste Q.
        @key_sprinten = 0 # Sprinten auf STRG.
        
        @sprinten_max = 100
        @sprinten = @sprinten_max
        @heal_power = 50
        @granate_power = [12,2] # Schaden, Radius
        @mine_power = [19,3] # Schaden, Radius
        @items = Hash.new(0) # Speichert zusätzliche Items. zB Medikits
        @event_database = 134 # Die Map wo Events wie Granaten gespeichert sind
        @movement_8_way = true
        
        @skills = [ ['HP','$game_actors[$MSS.actor].maxhp',100,50],  # Name, Wert, Preis, Steigerung
        ['Sprinten','$MSS.sprinten_max',50,20],
        ['Granatenschaden','$MSS.granate_power[0]',50,1],
        ['Minenschaden','$MSS.mine_power[0]',50,1] ]
        #===Ini===# (Hier bitte nichts verändern, wenn ihr euch nicht mit RGSS auskennt^^
        ini_waffen
        ini_gegner
        ini_statistik
        @waffe_aktuell = @waffe[@waffe[0]]
        @events = {'Gegner' => [],'Hindernis' => [], 'ID' => []}
        @key = Keys.new
        @wait = 0
        @schussrate = 0
        @hud_boss = nil
        @hud_boss_active = nil
      end
          attr_accessor :option_hud_sichtbar
      # VORSICHT!
      # Diese Daten werden beim Spielstand mitgespeichert (Da man diese Werte ja auch
      # während des Spiels verändern (Pimpen =) ) kann. Also Änderungen wirken sich
      # nur auf Neue Spiele aus
      
      def ini_waffen
        @waffen_atr = {
        'Pistole' => {
          'Schaden' => 1,
          'Schusssound' => RPG::AudioFile.new('Pistole',100,100),
          'Nachladesound' => RPG::AudioFile.new('Pistole Nachladen',100,100),
          'Nachladezeit' => 80,         # Nachladezeit in Frames. Bei 40 Frames pro Sekunde also hier 2 Sekunden.
          'Magazin' => 15,
          'Schussrate' => nil,          # Bei nicht automatischen Waffen "nil" hinschreiben. Ansonsten die Frame Wartezeit
          'Spielergrafik' => 'player_pistole',
          'Mündungsfeuer' => [1,2,3,29]  # Wenn keine Animation sein soll einfach "nil" (ohne Anführungszeichen) schreiben! Die Zahlen im Array stehen für die Animations ID in dieser Reihenfolge: [Unten, Links, Rechts, Oben]. Die ID "0" steht für keine Animation!
         },
         
        'Deagle' => {
          'Schaden' => 4,
          'Schusssound' => RPG::AudioFile.new('Deagle',100,100),
          'Nachladesound' => RPG::AudioFile.new('Deagle Nachladen',100,100),
          'Nachladezeit' => 75,
          'Magazin' => 7,
          'Schussrate' => nil,
          'Spielergrafik' => 'Deagle',
          'Mündungsfeuer' => [5,6,7,0]
         },
        
        'MP5' => {
          'Schaden' => 2,
          'Schusssound' => RPG::AudioFile.new('MP5',100,100),
          'Nachladesound' => RPG::AudioFile.new('MP5 Nachladen',100,100),
          'Nachladezeit' => 90,
          'Magazin' => 30,
          'Schussrate' => 3,
          'Spielergrafik' => 'MP5',
          'Mündungsfeuer' => [8,9,10,0]
         },
         
         'Colt' => {
          'Schaden' => 7,
          'Schusssound' => RPG::AudioFile.new('Colt',100,100),
          'Nachladesound' => RPG::AudioFile.new('Colt Nachladen',100,100),
          'Nachladezeit' => 125,
          'Magazin' => 6,
          'Schussrate' => nil,
          'Spielergrafik' => 'Colt',
          'Mündungsfeuer' => [11,12,13,0]
         },
         
         'M4' => {
          'Schaden' => 4,
          'Schusssound' => RPG::AudioFile.new('M4',100,100),
          'Nachladesound' => RPG::AudioFile.new('M4 Nachladen',100,100),
          'Nachladezeit' => 75,
          'Magazin' => 30,
          'Schussrate' => 4,
          'Spielergrafik' => 'M4',
          'Mündungsfeuer' => [14,15,16,0]
         },
         
        'Dual' => {
          'Schaden' => 1,
          'Schusssound' => RPG::AudioFile.new('Pistole',100,100),
          'Nachladesound' => RPG::AudioFile.new('Dual Nachladen',100,100),
          'Nachladezeit' => 135,
          'Magazin' => 30,
          'Schussrate' => nil,
          'Spielergrafik' => 'Dual',
          'Mündungsfeuer' => [40,41,42,43],
          'Spezial_Schuss' => 'dual_feuerwechsel'
         },
         
        'MG' => {
          'Schaden' => 6,
          'Schusssound' => RPG::AudioFile.new('MG',100,100),
          'Nachladesound' => RPG::AudioFile.new('MG Nachladen',100,100),
          'Nachladezeit' => 233,
          'Magazin' => 100,
          'Schussrate' => 5,
          'Spielergrafik' => 'MG',
          'Mündungsfeuer' => [17,18,19,0],
          'Spezial_Anlegen' => 'schwere_waffe',
          'Spezial_Ablegen' => 'schwere_waffe(false)'
         },
         
         'Shotgun' => {
          'Schaden' => 50,
          'Schusssound' => RPG::AudioFile.new('Shotgun',100,100),
          'Nachladesound' => RPG::AudioFile.new('Shotgun Nachladen',100,100),
          'Nachladezeit' => 65,
          'Magazin' => 1,
          'Schussrate' => nil,
          'Spielergrafik' => 'player_shotgun',
          'Mündungsfeuer' => [20,21,22,23]
         }
        }
        
      end
      
      def ini_gegner
        @gegner_atr = {
        'Bandit' => {
          'Schaden' => 15,
          'HP' => 10,
          'Trefferanimation' => 4,
          'Spezial' => nil,            # Dieser String wird beim Treffen des Eventes mit "eval" ausgeführt
          'Blut' => @standard_blut,     # Ein Array mit den Blutanimationen, ähnlich dem Mündungsfeuer bei den Waffen. Weil ich oft das gleiche Blut benutze, hab ich oben einen Array mit dem Standardblut gemacht
          'Kugeldurchlässig' => true
          },
         'Biene' => {
          'Schaden' => 20,
          'HP' => 4,
          'Trefferanimation' => 4,
          'Spezial' => '!A! hitsound("089-Attack01","089-Attack01")',
          'Blut' => @spinne_blut,
          'Kugeldurchlässig' => false
          },
         'Robospinne' => {
          'Schaden' => 20,
          'HP' => 4,
          'Trefferanimation' => 4,
          'Spezial' => '!A! hitsound("089-Attack01","089-Attack01")',
          'Blut' => @robospinne_blut,
          'Kugeldurchlässig' => false
          },      
          'Glas' => {
          'Schaden' => 0,
          'HP' => 1,
          'Trefferanimation' => 4,
          'Spezial' => nil,
          'Blut' => nil,
          'Kugeldurchlässig' => true
          },
          'Schiessender Gegner' => {
          'Schaden' => 100,
          'HP' => 10,
          'Trefferanimation' => 4,
          'Spezial' => nil, #"print ('Hey, du sollst mich nicht abschiessen! Ich bin nur ein Beispiel für einen Schiessenden Gegner und das Spezial Attribut ;-)');return",
          'Blut' => @standard_blut, #nil,
          'Kugeldurchlässig' => true
          },
          'Goblin' => {
          'Schaden' => 1,
          'HP' => 9999,
          'Trefferanimation' => 4,
          'Spezial' => nil,
          'Blut' => @standard_blut,
          'Kugeldurchlässig' => true
          },
          
         'Endgegner' => {
          'Schaden' => 100,
          'HP' => 300,
          'Trefferanimation' => 4,
          'Spezial' => nil,
          'Blut' => @standard_blut,
          'Kugeldurchlässig' => false
          },
          
         'Stampfi' => {
          'Schaden' => 100,
          'HP' => 1500,
          'Trefferanimation' => 4,
          'Spezial' => nil,
          'Blut' => [48,49,50,51],
          'Kugeldurchlässig' => false
          }
         }
       end
       
       def ini_statistik
         @statistik = {
         'Schuesse' => 0,
         'Treffer' => 0,  # Noch nicht programmiert!
         'Gegner' => 0,
         'Multikill' => 0,
         'Verlorene HP' => 0,
         'Zugefuegter Schaden' => 0
         }
       end
       
       def ini_events # Event erkennung. Bitte nur Ändern wenn ihr euch mit RGSS auskennt^^
         @events = {'Gegner' => [],'Hindernis' => [], 'ID' => []}
         begin
         for ev in $game_map.events.values
           case $game_map.map.events[ev.id].name.downcase
            when 'gegner'
              if ev.list[0].code == 108
               komm = $game_map.events[ev.id].list[0].parameters.pop
               if @gegner_atr[komm] == nil
                  print ("Bei dem Gegner mit der ID #{ev.id} wurde eine Monsterklasse angegeben, die nicht existiert.") if $DEBUG
                  next
                end
             else return
             end
              @events['Gegner'].push({'id' => ev.id, 'Klasse' => komm,
              'HP' => @gegner_atr[komm]['HP']})
              @events['ID'][ev.id] = @events['Gegner'].size - 1
              
            when 'spezial'
              if ev.list[0].code == 108
               komm = $game_map.events[ev.id].list[0].parameters.pop
             else 
               print ("Bei dem Spezialevent mit der ID #{ev.id} wurde kein Spezialaufruf gefunden.") if $DEBUG
               next
             end
            @events['Gegner'] << {'id' => ev.id, 'Spezial' => komm}
            @events['ID'][ev.id] = @events['Gegner'].size - 1
             
            when 'hindernis'
              @events['Hindernis'].push(ev.id)
               
            when 'flaches event'
              $game_map.events[ev.id].flat = true
           end
         end
       rescue StandardError, SyntaxError
         p ev
        end
       end
     end
    MSS: Update (Hier wird change_weapon standardmäßig aufgerufen)
    Code:
    class Scene_Map
      alias :mss_map_ini_original :initialize if $MSS.nil?
      def initialize
        mss_map_ini_original 
        $MSS.ini_hud
      end
    
      alias :mss_map_update_original :update if $MSS.nil?
      def update
        $MSS.update if $MSS.active
        mss_map_update_original
      end
    end
    
    class Window_Message
      alias :mss_dispose_original :dispose if $MSS.nil?
      def dispose
        mss_dispose_original
        $MSS.dispose
      end
    end
    
    class MSS
      def update
       return if $game_temp.message_window_showing
       $game_player.direction_fix = @key.getkey_id(@key_strafe) unless @key_strafe.nil?
       if @wait > 0
           @wait -= 1
           @hud_laden.refresh unless @hud_laden.nil?
           if @wait == 0
             $game_system.menu_disabled = false
             @hud_laden.dispose unless @hud_laden.nil?
             @hud_laden = nil
           end
           return
       end
       if @schussrate > 0
        @schussrate -= 1 
        return
      end
    
       # Sprinten
       if @sprinten_akt == true and @key.getkey_id(@key_sprinten) and @sprinten > 0
        @sprinten -= 1
        @hud_energie.refresh(@sprinten) if Graphics.frame_count % 2 == 0
        return
       elsif @sprinten_akt == true
        $game_player.move_speed -= 1
        @sprinten_akt = false
       end
      
       if @key.getkey_id(@key_sprinten) and @sprinten > 20
        @sprinten_akt = true 
        $game_player.move_speed += 1
        @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max) if @sprinten == @sprinten_max
       elsif @sprinten < @sprinten_max
        if Graphics.frame_count % ($game_player.moving? ? 6 : 3) == 0
         @sprinten += 1
         @hud_energie.refresh(@sprinten)
        end
       elsif @sprinten == @sprinten_max and !@hud_energie.nil?
        @hud_energie.dispose
        @hud_energie = nil
      end
      # /
      
      use_medikit if @key.getkey_id(@key_medikit)
      granate_wefen if @key.getkey_id(@key_granate)
      mine_legen if @key.getkey_id(@key_mine)
      
      if @key.getkey_id(69) # E
        granate_wefen(4,2)
        granate_wefen(4,4)
        granate_wefen(4,6)
        granate_wefen(4,8)
      end
      
       if @waffe_aktuell != nil
        if @waffen_atr[@waffe_aktuell['Name']]['Schussrate'].nil?
         schuss if Input.trigger?(Input::C)
       elsif @key.getkey_id(13) or @key.getkey_id(32)
        schuss
        @schussrate = @waffen_atr[@waffe_aktuell['Name']]['Schussrate']
       end
      end
    
      if @option_allow_weapon_change
        for taste in 0..@waffe.size - 2
          if @key.getkey_id(49+taste) and @waffe[0] != taste+1
          change_weapon(taste+1)
        end
       end
      end
      
       for taste in @nachladetasten
         nachladen if @key.getkey_id(taste)
       end
     end
    
     def dispose
       if @hud.is_a?(MSS_HUD)
          @hud.dispose
          @hud = nil
       end
       if @hud_laden.is_a?(MSS_HUD_LADEN)
          @hud_laden.dispose
          @hud_laden = nil
       end
       if @hud_boss.is_a?(MSS_HUD_BOSS)
          @hud_boss.dispose
          @hud_boss = nil
       end
        
       if !@hud_energie.nil?
          @hud_energie.dispose
          @hud_energie = nil 
      end
     end
     
     def ini_hud
      @hud = @option_hud_sichtbar[0] ? MSS_HUD.new : MSS_HUD_Dummy.new
      boss(true,@hud_boss_active[0],@hud_boss_active[1],true) if @hud_boss_active.is_a?(Array)
      @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max, false) unless @sprinten == @sprinten_max
     end
    end
    MSS: HUD
    Code:
    class MSS_HUD < Window_Base
     def initialize
      super(0, 0, 220, 85)
        self.contents = Bitmap.new(width - 32, height - 32)
        self.back_opacity = 155
    
        refresh
      end
      
      def refresh
        self.contents.clear
        actor = $game_actors[$MSS.actor]
        self.contents.font.color = Color.new (200, 204, 300, 255)
        self.contents.draw_text(-1, -7, 180, 32, "HP: #{actor.hp} | #{actor.maxhp}")
        if $MSS.waffe_aktuell == nil
          muni = '/'
        else
          muni = "#{$MSS.waffe_aktuell['Magazin']} | #{$MSS.waffe_aktuell['Munition']}"
        end
        self.contents.draw_text(-1, 25, 180, 32, "Munition: #{muni}")
    
      end
      
     # def dispose
       # @items.dispose
       # super
     # end
    end
    
    
    
    class MSS_HUD_LADEN < Window_Base
      def initialize(max)
        @farbe_hintergrund = Color.new(155,155,155,100)
        @farbe_balken_innen = Color.new(0,0,255,160)
        @farbe_balken_rand = Color.new(20,20,20,200)
        super(-17, 70, 160, 50)
        self.contents = Bitmap.new(width-32, height-32)
        self.opacity = 0
        self.contents.clear
        self.contents.fill_rect(11, 2, 110, 15, @farbe_hintergrund)
        @max = max
        refresh
      end
      def refresh
        lo = 100 - $MSS.wait * 100 / @max
        self.contents.fill_rect(16, 4, lo, 10, @farbe_balken_innen)
        self.contents.fill_rect(15, 4, 1, 11, @farbe_balken_rand)
        self.contents.fill_rect(16, 4, lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16, 14, lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16 + lo, 4, 2, 11, @farbe_balken_rand)
      end
      
      def dispose
        super unless self.disposed?
      end
    end
    
    class MSS_HUD_ENERGIE < Window_Base
      def initialize(max, new=true)
        @farbe_hintergrund = Color.new(155,155,155,155)
        @farbe_balken_innen = Color.new(0,0,255,255)
        @farbe_balken_rand = Color.new(0,0,0,255)
        super(470, 105, 160, 50)
        self.contents = Bitmap.new(width-32, height-32)
        self.opacity = 0
        self.contents.clear
        @max = max
        refresh(max) if new
      end
      def refresh(value)
        lo = value * 100 / @max
        self.contents.clear
        self.contents.fill_rect(11, 2, 110, 15, @farbe_hintergrund)
        self.contents.fill_rect(16, 4, lo, 10, @farbe_balken_innen)
        self.contents.fill_rect(15, 4, 1, 11, @farbe_balken_rand)
        self.contents.fill_rect(16, 4, lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16, 14, lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16 + lo, 4, 2, 11, @farbe_balken_rand)
      end
      
      def dispose
        super unless self.disposed?
      end
    end
    
    class MSS_HUD_BOSS < Window_Base
      def initialize(id,name)
        super(175, 420, 360, 100)
        self.contents = Bitmap.new(width-32, height-32)
        self.opacity = 0
        @farbe_hintergrund = Color.new(155,155,155,155)
        @farbe_balken_rand = Color.new(0,0,0,255)
        $MSS.hud_boss_active = [id,name]
        @name = name
        @int = $MSS.id_to_int(id)
        refresh
      end
      def refresh
        @lo = $MSS.events['Gegner'][@int]['HP'] * 300 /
        $MSS.gegner_atr[$MSS.events['Gegner'][@int]['Klasse']]['HP']
        ecolor = Color.new(10, 255, 10, 255)  if @lo > 139   # Grün
        ecolor = Color.new(250, 250, 10, 255) if @lo < 140   # Gelb
        ecolor = Color.new(255, 10, 10, 255)  if @lo < 60    # Rot
        if @lo == 0
         $MSS.boss(false,0,"",true)
         return
        end
        self.contents.clear
        self.contents.fill_rect(11, 2, 310, 25, @farbe_hintergrund)
        self.contents.fill_rect(16, 4, @lo, 20, ecolor)
        self.contents.fill_rect(15, 4, 1, 21, @farbe_balken_rand)
        self.contents.fill_rect(16, 4, @lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16, 24, @lo, 1, @farbe_balken_rand)
        self.contents.fill_rect(16+@lo, 4, 1, 21, @farbe_balken_rand)
        self.contents.draw_text(0, -3, 330, 32,@name,1)
      end
    end
    
    class MSS_HUD_Dummy
      def update  ;end
      def refresh ;end
      def dispose ;end
    end
    MSS: Code (Hier befindet sich die def change_weapon)
    Code:
    class MSS
      attr_accessor :waffen_atr, :waffe_aktuell, :gegner_atr, :active, 
      :statistik, :waffe, :events, :actor, :key, :hud, :wait, :ziel,
      :hud, :hud_laden, :hud_boss, :hud_boss_active, :option_events_aktivieren,
      :option_allow_weapon_change, :option_quake_sounds, :option_automatisches_nachladen,
      :items, :actor_graphic, :heal_power, :sprinten_max, :granate_power, :mine_power,
      :movement_8_way, :skills
      def schuss(taeter=$game_player,ziel='Events',abfrage=false,spezial=true)
       @taeter = taeter; @ziel = ziel
       @taeter = $game_map.events[@taeter] if @taeter.is_a?(Integer)
       @hx = @taeter.x
       @hy = @taeter.y
       @hd = @taeter.direction
       
       if @ziel == 'Events'
        if not @waffe_aktuell['Magazin'] > 0
         $game_system.se_play(@leere_waffe_sound)
         return
       end
        spezschuss = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Schuss']
        eval(spezschuss) unless spezschuss.nil?
        $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Schusssound'])
        @statistik['Schuesse'] += 1
        @waffe_aktuell['Magazin'] -= 1
        @hud.refresh
        if @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'] != nil
          $game_player.animation_id = @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'][$game_player.direction / 2 - 1]
        end
        @killed = 0; @int = 0
        treffer?
        quake_sound
        nachladen if @waffe_aktuell['Magazin'] == 0 and @option_automatisches_nachladen
        elsif @ziel == 'Player'
          treffer?
        end
      end
      
      def quake_sound
       @statistik['Multikill'] = @killed if @killed > @statistik['Multikill']
       if @killed > 1 and @option_quake_sounds[0]
         if @killed > @option_quake_sounds.size then sound = @option_quake_sounds.size else sound = @killed end
         $game_system.se_play(@option_quake_sounds[sound-1])
       end
      end
      
      def treffer?
        case @hd
         when 2 # Runter
          start = @hy + 1
          ende = $game_map.height
          counter = 1
          vari = 1 # Y
         when 4 # Links
          start = @hx - 1
          ende = -1
          counter = -1
          vari = 0 # X
         when 6 # Rechts
          start = @hx + 1
          ende = $game_map.width
          counter = 1
          vari = 0
         when 8 # Hoch
          start = @hy - 1
          ende = -1
          counter = -1
          vari = 1
        end
        x, y = @hx, @hy
        tile = start
        while tile != ende
          if vari == 0
            x = tile
          else
            y = tile
          end
          break if $game_map.passable?(x,y,0) == false and @undurchlässiges_terrain.include?($game_map.terrain_tag(x,y)) == false
          @id = $game_map.id_coordinates(x,y)
          break if @events['Hindernis'].include?(@id)
          if @ziel == 'Player'
           if @id == 0
             getroffen 
             return
           end
           tile += counter
           next
          end
          @int = id_to_int(@id)
          if @id > 0 and @int != nil and @events['Gegner'][@int] != nil and 
          $game_self_switches[[$game_map.map_id, @id, 'A']] == false
             getroffen
             break if @events['Gegner'][@int]['HP'] != nil and 
             not @gegner_atr[@events['Gegner'][@int]['Klasse']]['Kugeldurchlässig']
          end
          tile += counter
        end
      end
      
      def getroffen
        if @ziel == 'Player'
          gegner_schlag(@taeter.id)
          return
        end
    
        spezial = @events['Gegner'][@int]['Spezial']
        unless spezial.nil?
          eval(spezial)
          return
        end
        
        spezial = @gegner_atr[@events['Gegner'][@int]['Klasse']]['Spezial']
        if !spezial.nil?
         aftereval = spezial.include?('!A!')
         eval(spezial) unless aftereval
        end
      
       schaden = @waffen_atr[@waffe_aktuell['Name']]['Schaden']
       
       make_damage(@id,schaden,blut_animation(@id,@hd))
       @store_direction #ssssssssssssssssssssssss
       eval(spezial.gsub('!A!','')) if aftereval
       @restore_direction #ssssssssssssssssssssssss
      end
      
      def nachladen
        return if @waffe_aktuell.nil?
        magazin_max = @waffen_atr[@waffe_aktuell['Name']]['Magazin']
        magazin = @waffe_aktuell['Magazin']
        munition = @waffe_aktuell['Munition']
        noetig = magazin_max - magazin
        return if magazin == magazin_max
        return if munition == 0
        if munition == '/'
          magazin = magazin_max
        else
          if munition + magazin >= magazin_max
          munition -= noetig
          magazin = magazin_max
        else
          magazin += munition
          munition = 0
         end
        end
        @waffe_aktuell['Magazin'] = magazin
        @waffe_aktuell['Munition'] = munition
        $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Nachladesound'])
        wait_balken(@waffen_atr[@waffe_aktuell['Name']]['Nachladezeit'])
        @hud.refresh
      end
      
      def gegner_schlag(id)
    int = id_to_int(id)
        schaden = @gegner_atr[@events['Gegner'][int]['Klasse']]['Schaden']
        $game_actors[@actor].hp -= schaden
        @statistik['Verlorene HP'] += schaden
        $game_player.animation_id = 
        @gegner_atr[@events['Gegner'][int]['Klasse']]['Trefferanimation']
      end
      
      def dead?(id)
        return true if @events['Gegner'][id_to_int(id)]['HP'] == 0
        return false
      end
      
      def all_dead?
        ins = 0;@events['Gegner'].each { |g| ins += g['HP'] if !g['HP'].nil?}
        return true if ins == 0
        return false
      end
      
      def kill(id)
        id = [id] if id.is_a?(Numeric) 
        for i in id
         @events['Gegner'][id_to_int(i)]['HP'] = 0
         change_local_switch(i)
        end
      end
      
      def kill_all
       @events['ID'].each_index {|i|int = id_to_int(i);kill(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
      end
      
      def heal(id)
        id = [id] if id.is_a?(Numeric)
        for i in id
         int = id_to_int(i)
         @events['Gegner'][int]['HP'] = 
         @gegner_atr[@events['Gegner'][int]['Klasse']]['HP']
         change_local_switch(i,false)
        end
      end
      
      def heal_all
        @events['ID'].each_index {|i|int = id_to_int(i);heal(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
      end
      
      def add_ammo(name,ammo)
        @waffe[find_weapon_slot(name)]['Munition'] += ammo
      end
      
      def add_weapon(name,munition=300,magazin=30,id=0,double=false)
        return if !double and find_weapon_slot(name) != @waffe.size
        hash = {'Name' => name, 'Munition' => munition, 'Magazin' => magazin}
        if id == 0 then @waffe << hash else @waffe[id] = hash ;end
      end
      
      def remove_weapon(name)
        if name.is_a?(String)
         @waffe.delete_at(find_weapon_slot(name))
       else
         @waffe.delete_at(name)
        end
      end
      
      def find_weapon_slot(name='')
        name.to_s
        @waffe.each_with_index do |waffe,index|
          next if index < 2
          return index if name == waffe['Name']
        end
        return @waffe.size
      end
      
      def boss(show=true,id=1,name='',menu=false)
        @hud_boss.dispose if @hud_boss_active.is_a?(Array) and menu == false
        if show
         @hud_boss = MSS_HUD_BOSS.new(id,name)
         @hud_boss_active = [id,name]
        else
         @hud_boss.dispose
         @hud_boss = nil
         @hud_boss_active = nil
       end
     end
     
     def change_weapon(id=2)
       unless @waffe_aktuell.nil?
         spezab = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Ablegen']
         eval(spezab) unless spezab.nil?
       end
       if @waffe[id].nil?
         $game_actors[@actor].set_graphic(@actor_graphic, 0, '', 0)
        else
         $game_actors[@actor].set_graphic(@waffen_atr[@waffe[id]['Name']]['Spielergrafik'], 0, '', 0)
         spezan = @waffen_atr[@waffe[id]['Name']]['Spezial_Anlegen']
         eval(spezan) unless spezan.nil?
       end
       $game_system.se_play(@waffenwechselsound)
       @waffe[0] = id
       @waffe_aktuell = @waffe[@waffe[0]]
       @hud.refresh
       $game_player.refresh
     end
     
     def change_local_switch(id,value=true,switch='A',map=$game_map.map_id)
      for i in id.to_a
       $game_self_switches[[map, i, switch]] = value
      end
      $game_map.need_refresh = true
     end
    
      def option_hud_sichtbar(hud=true,balken=true)
        @option_hud_sichtbar = [hud,balken]
        @hud.dispose
        if hud
          @hud = MSS_HUD.new
        else
          @hud = MSS_HUD_Dummy.new
        end
      end
      
      def make_saveable
        dispose
        @key = nil
      end
      
      def make_playable
        @key = Keys.new
      end
       
      def make_damage(id,schaden,ani=0)
        return if $game_self_switches[[$game_map.map_id, id, 'A']]
        int = id_to_int(id)
        @events['Gegner'][int]['HP'] -= schaden
        @statistik['Zugefuegter Schaden'] += schaden
        $game_map.events[id].animation_id = ani
        if @events['Gegner'][int]['HP'] <= 0
         @statistik['Zugefuegter Schaden'] += @events['Gegner'][int]['HP']
         @events['Gegner'][int]['HP'] = 0
         change_local_switch(id)
         @statistik['Gegner'] += 1
         @killed += 1
       end
       @hud_boss.refresh if @hud_boss_active.is_a?(Array) and @hud_boss_active[0] == id
     end
      
      def wait_balken(wait)
        return if @wait > 0
        @wait = wait
        $game_system.menu_disabled = true
        @hud_laden = @option_hud_sichtbar[1] ? MSS_HUD_LADEN.new(wait) : MSS_HUD_Dummy.new
      end
      
      def items_add(wert, key)
        $MSS.items[key] += wert
        @hud.refresh
      end
      
      def direction(x1,y1,x2,y2)
        x, y = x2 - x1, y2 - y1
        return -1 if x == 0 and y == 0
        if x.abs > y.abs
         return x > 0 ? 4 : 6
        else
         return y > 0 ? 8 : 2
       end
      end
     
      def blut_animation(id,d)
       blut = @gegner_atr[@events['Gegner'][id_to_int(id)]['Klasse']]['Blut']
       return blut.nil? ? 0 : blut[d / 2 - 1]
      end
     
      def id_to_int(id)
        return @events['ID'][id]
      end
     
      def garbage_collector
       $game_map.events.each{|e|$game_map.events.delete(e[1].id) if $game_self_switches[[$game_map.map_id, e[1].id, 'A']]}
      end
      
      def debug
       File.open('MSS.txt','w') {|f|f.write($MSS.inspect)}
      end
    end
    
    class Game_Map
      attr_reader   :map
      alias :mss_original_setup :setup if $MSS.nil?
      def setup(map_id)
        mss_original_setup(map_id)
        $MSS.ini_events
      end
      
      def id_coordinates(x=0,y=0)
        @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y}
        return 0 if $game_player.x == x and $game_player.y == y
        return -1
      end
      
      def id_coordinates_mine(x=0,y=0,id=0)
        @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y and e[1].id != id}
        return -1
      end
      
      def id_coordinates_array(x=0,y=0)
        array = []
        @events.each {|e|array << e[1].id if e[1].x == x and e[1].y == y}
        array << 0 if $game_player.x == x and $game_player.y == y
        return array
      end
      
      def id_rect(rect)
        ev = []
        @events.each {|e|ev << e[1].id if rect.inside?(e[1])}
        return ev
      end
    end
    
    class Game_Character
     attr_accessor :flat
     alias :mss_original_initialize :initialize if $MSS.nil?
     alias :mss_original_screen_z :screen_z if $MSS.nil?
     def initialize
       @flat = false
       mss_original_initialize
     end
     def screen_z(height = 0)
        return 0 if @flat
        mss_original_screen_z(height)
      end
    end
    
    class Keys
      def initialize
        @GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'l','l')
        @keybd_event = Win32API.new('user32', 'keybd_event', %w(l l l l), '')
      end
      def getkey
        for i in 0..255
          if @GetAsyncKeyState.call(i) != 0
            return i
          end
        end
        return 0
      end
      def getkey_id(id)
         if @GetAsyncKeyState.call(id) != 0
           return true
         end
         return false
      end
      def setkey_id_down(id)
        @keybd_event.call(id,0,0,0)
      end
        def setkey_id_up(id)
        @keybd_event.call(id,0,2,0)
      end
    end
    
    class Game_Player < Game_Character
      def update
        last_moving = moving?
        unless moving? or $game_system.map_interpreter.running? or
               @move_route_forcing or $game_temp.message_window_showing
        #==========EDIT===========#
        if $MSS.movement_8_way
          case Input.dir8
          when 1
            move_lower_left
          when 2
            move_down
          when 3
            move_lower_right
          when 4
            move_left
          when 6
            move_right
          when 7
            move_upper_left
          when 8
            move_up
          when 9
            move_upper_right
          end
        else
          case Input.dir4
          when 2
            move_down
          when 4
            move_left
          when 6
            move_right
          when 8
            move_up
          end
        end
        #==========EDIT===========#
        end
        last_real_x = @real_x
        last_real_y = @real_y
        super
        if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
          $game_map.scroll_down(@real_y - last_real_y)
        end
        if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
          $game_map.scroll_left(last_real_x - @real_x)
        end
        if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
          $game_map.scroll_right(@real_x - last_real_x)
        end
        if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
          $game_map.scroll_up(last_real_y - @real_y)
        end
        unless moving?
          if last_moving
            result = check_event_trigger_here([1,2])
            if result == false
              unless $DEBUG and Input.press?(Input::CTRL)
                if @encounter_count > 0
                  @encounter_count -= 1
                end
              end
            end
          end
        #==========EDIT===========#
        if $MSS.active == false or $MSS.waffe_aktuell == nil or $MSS.option_events_aktivieren
          if Input.trigger?(Input::C)
            check_event_trigger_here([0])
            check_event_trigger_there([0,1,2])
            end
          end
        #==========EDIT===========#
        end
      end
    end
    
    class Game_System
      attr_accessor :mss_save
    end
    
    class Game_Character
      attr_accessor :direction_fix
    end
    
    class Rect
      def each
        for xx in x..x + width
          for yy in y..y + height
            yield xx, yy
          end
        end
      end
      
      def inside?(ox,oy=0)
       ox, oy = ox.x, ox.y unless ox.is_a?(Integer)
       return (ox.between?(x, x + width)) && (oy.between?(y, y + height))
      end
    end
    
    class Game_SelfSwitches
      def delete(key)
        @data.delete(key)
      end
    end
    
    class Game_Battler
      alias :mss_hpchange_original :hp= if $MSS.nil?
      def hp=(hp)
        mss_hpchange_original(hp)
        return unless self.is_a?(Game_Actor)
        $MSS.hud.refresh
        $game_temp.gameover = true if @hp == 0
      end
    end
    
    class Scene_Save < Scene_File
      alias :mss_write_save_data_original :write_save_data if $MSS.nil?
      def write_save_data(file)
        $MSS.make_saveable
        $game_system.mss_save = $MSS
        mss_write_save_data_original(file)
        $MSS.make_playable
      end
    end
    
    
    class Scene_Load < Scene_File
      alias :mss_read_save_data_original :read_save_data if $MSS.nil?
      def read_save_data(file)
        mss_read_save_data_original(file)
        $MSS = $game_system.mss_save
        $MSS.make_playable
      end
    end
    
    class Scene_Title
      alias :mss_title_ini_original :initialize if $MSS.nil?
      def initialize
       $MSS = MSS.new
       mss_title_ini_original
     end
    end
    MSS: Spezial
    Code:
    # Hier kann man die Methoden reinschreiben, die bei einem beschossenem 
    # Spezialevent aufgerufen werden sollen. Dies dient ausschließlich der Übersicht.
    # Die hier vorgegebenen Codes sind nur Beispiele und können verändert oder gelöscht
    # werden, dürfen aber natürlich auch einfach benutzt werden :D
    
    class MSS  
      def licht_ausschießen
        change_local_switch(@id)
        Audio.se_play('Audio/SE/glassbreak', 85, 100)
        c = $game_screen.tone
        $game_screen.start_tone_change(Tone.new(c.red-10,c.green-10,c.blue-10,c.gray),0)
      end
      
      def hitsound(sound,kill=nil)
        if dead?(@id)
          $game_system.se_play(RPG::AudioFile.new(kill,100,100)) unless kill.nil?
        else
          $game_system.se_play(RPG::AudioFile.new(sound,100,100))
        end
      end
      
      def explosives_fass
        change_local_switch(@id)
        $game_map.events[@id].animation_id = 29
        explosion(@id,2)
      end
      
      def explosion(id,rad,damage=9)
        @killed = 0
        ev = $game_map.events[id]
        rect = Rect.new(ev.x - rad, ev.y - rad, rad * 2 + 1,rad * 2) # Explosionsradius - Rechteck
        $game_map.id_rect(rect).each do |e|
          next if e == id
         case $game_map.map.events[e].name.downcase
          when 'gegner'
            make_damage(e,damage,blut_animation(e,direction($game_map.map.events[e].x,$game_map.map.events[e].y,ev.x,ev.y))) # id, schaden, animation
          when 'spezial'
    
          end
        end
        quake_sound
      end
      
      def create_rect(rad)
        return 
      end
      
      def schwere_waffe(status=true)
        $game_player.move_speed = status ? $game_player.move_speed - 1 : $game_player.move_speed + 1
      end
      
      def dual_feuerwechsel
        f = @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer']
        f = f[0] == 40 ? [44,45,46,47] : [40,41,42,43]
        @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'] = f
      end
      
      def granate_wefen(wurfweite=8,d=$game_player.direction)
        if $MSS.items['Granate'] < 1
         $game_system.se_play($data_system.buzzer_se)
         @wait = 10
         return
        end
        $MSS.items['Granate'] -= 1
        $game_system.se_play(RPG::AudioFile.new('016-Jump02',70,100))
        id = $game_map.add_event(134,1,$game_player.x,$game_player.y) 
        $game_map.need_refresh = true
        $scene.spriteset.refresh
        x,y = granate_entfernung(wurfweite,d)
        $game_map.events[id].jump(x,y)
        wait_balken(40)
        @hud.refresh
      end
      
      def granate_entfernung(wurfweite,d)
        vari = [2,8].include?(d) ? 1 : 0
        counter = [2,6].include?(d) ? 1 : -1
        x,y = $game_player.x, $game_player.y
        while $game_map.passable?(x,y,0)
          if vari == 0 then x += counter else y += counter end
          wurfweite -= 1
          break if wurfweite == 0
        end
        x = vari == 0 ? x - ($game_player.x + counter) : 0
        y = vari == 1 ? y - ($game_player.y + counter) : 0
        return x, y
      end
       
      def use_medikit
        if $MSS.items['Medikit'] < 1 or $game_actors[@actor].hp == $game_actors[@actor].maxhp
         $game_system.se_play($data_system.buzzer_se)
         @wait = 10
         return
        end
        $game_actors[@actor].hp += @heal_power
        $game_player.animation_id = 31
        $MSS.items['Medikit'] -= 1
        @hud.refresh
        wait_balken(20)
      end
      
      def mine_legen
        return if $game_map.id_coordinates_mine($game_player.x,$game_player.y) > 0
        if $MSS.items['Mine'] < 1
         $game_system.se_play($data_system.buzzer_se)
         @wait = 10
         return
        end
        $MSS.items['Mine'] -= 1
        $game_system.se_play(RPG::AudioFile.new('005-System05',70,100))
        id = $game_map.add_event(@event_database,6,$game_player.x,$game_player.y)
        $game_map.need_refresh = true
        $scene.spriteset.refresh
        wait_balken(20)
        @hud.refresh
      end
    end

  10. #10
    Und welcher Teil davon ist das Menü, wo du das eingefügt hast?

  11. #11
    Danke fürs drüber schaun.
    Ganz unten, letzte def:

    Code:
    class Scene_waffen
      def main
        @actor= $game_party.actors[0]
        $data_weapons[@actor.weapon_id]
        @data= []
        @icon_name = []
        @name= []
        @description=[]
        
       get_equip
          @status = Window_status_ausrüstung.new(@actor)
        #  @status.active=false
        @command_window = Window_Ring_Command.new(1,$game_player.screen_x-30, $game_player.screen_y-50, @icon_name, 60)
        @beschreibung_window = Window_beschreibung.new(@name,@description)
        @beschreibung_window.z = 400
        @spriteset = Spriteset_Map.new
        # Main loop
        Graphics.transition
        loop do
          # Update game screen
          Graphics.update
          # Update input information
          Input.update
          # Frame update
          update
          # Abort loop if screen is changed
          if $scene != self
            break
          end
        end
            Graphics.freeze
        # Dispose of command window
        @command_window.dispose
        @beschreibung_window.dispose
        @spriteset.dispose
        @status.dispose
       
      end
      def update
        @command_window.update
        @beschreibung_window.update
      if Input.trigger?(Input::B)
          # Play cancel SE
          $game_system.se_play($data_system.cancel_se)
          # Switch to map screen
          $scene = Scene_Map.new 
          return
        end
    ausrüsten(0)
    if Input.repeat?(Input::	LEFT )
      @command_window.move_left
        $game_system.se_play($data_system.cursor_se)
    unless @command_window.index == 0
        equip
        end
        
      end
      if @command_window.index == 0
        @status.set_new_parameters(nil, nil, nil)
        end
    if Input.repeat?(Input::RIGHT)
     @command_window.move_right
        $game_system.se_play($data_system.cursor_se)
       unless @command_window.index == 0
        equip
        end
      end
      if Input.trigger? (Input::UP)
      $scene = Scene_ausrüstung_body.new
    end
    if Input.trigger? (Input::DOWN)
          $scene = Scene_Menu.new
      end
     #       case Input.dir4
    #  when 4 then @command_window.move_left
     #   $game_system.se_play($data_system.cancel_se)
     # when 6 then @command_window.move_right
     #   $game_system.se_play($data_system.cancel_se)
    
    #end
    #@index = 0
    #while @command_window.index != @index and @command_window.index !=0
     # @index= @command_window.index
    end    
     def equip
       item1=@data[0]
        item2 = @data[@command_window.index]
          @actor.equip(0, @data[@command_window.index].id)
          # Get parameters for after equipment change
          new_atk = @actor.atk
          new_pdef = @actor.pdef
          new_mdef = @actor.mdef
          # Return equipment
          if @data[0] == "nix"
            @actor.equip(2,0)
          else
          @actor.equip(2,item1.id)
          
          end
          # Draw in left window
          @status.set_new_parameters(new_atk, new_pdef, new_mdef)
        #@item1=$data_weapons[@actor.weapon_id]
        #
          #@actor.equip(0, @data[@command_window.index].id)
         
    #    end
          
        end 
        def update_icons
          @data.clear
        @icon_name.clear    
        @name.clear
        @description.clear
        get_equip
        @command_window.update_icons(@icon_name) 
        end
        def get_equip
          if $data_weapons[@actor.weapon_id] == nil
            @data.push("nix")
        @icon_name.push("nix")
        @name.push("")
        @description.push("")
        else
        @data.push($data_weapons[@actor.weapon_id])
        @icon_name.push($data_weapons[@actor.weapon_id].icon_name)
        @name.push($data_weapons[@actor.weapon_id].name)
        @description.push($data_weapons[@actor.weapon_id].description)
        end
        weapon_set = $data_classes[@actor.class_id].weapon_set 
        for i in 1...$data_weapons.size
            if $game_party.weapon_number(i) > 0 and weapon_set.include?(i) and $data_weapons[i] != $data_weapons[@actor.weapon_id] 
              @data.push($data_weapons[i])
              @icon_name.push($data_weapons[i].icon_name)
              @name.push($data_weapons[i].name)
              @description.push($data_weapons[i].description)     
            end
          end
    
          
      
        end
        def ausrüsten(type)
          if Input.trigger?(Input::C)
            $MSS.change_weapon(1)
            $game_system.se_play($data_system.equip_se)
            @actor.equip(type, @data[@command_window.index].id)
          update_icons
          @status.refresh
        end
        end
      end
    Im Endeffekt möchte ich abhängig von der ausgerüsteten Waffe $MSS.change_weapon(ausgerüstete Waffe) aufrufen.
    Ginge also auch über ein Common Event, nicht nur über dieses Menü.

  12. #12
    1. Bitte bitte bitte hör auf, Methoden als "defs" zu bezeichnen, nur weil def das Keyword ist. Danke,

    2. Hast du $MSS.change_weapon denn schon mal einzeln getestet? Sprich du packst es in ein Event auf der Map (Scriptbefehl) und laberst das an.
    2a. Wieso hast du da überhaupt noch ein se_play in ausrüsten (Umlaute in Methodennamen, urgh.), change_weapon sollte doch eh schon einen Sound abspielen, wenn du es aufrufst (was gleichzeitig ein guter Check ist, ob es überhaupt aufgerufen wurde).

  13. #13
    1. Wenn man nicht weiß, dass das Keyword für eine Methode "def" ist, wie soll man es dann richtig bezeichnen?
    Danke, danke, danke fürs Verständnis :P

    2. Hätte man echt auch selbst drauf kommen können das zu probieren, aber jedenfalls klappt es als Script im Event aufgerufen wunderbar.
    Danke vielmals für deine Hilfe!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •