Ergebnis 1 bis 5 von 5

Thema: [XP]Warum funktioniert dieses Event-Script nicht?

  1. #1

    [XP]Warum funktioniert dieses Event-Script nicht?

    Hallo Leute,

    ich benutze Monstas Shoot System. Am anfang des Scripts gibt es folgende Stelle:

    "
    class MSS # Monsta's Shoot System
    def initialize
    #===Optionen===#
    @active = false # Ist das Schusssystem von Anfang an aktiv

    (...)

    @option_hud_sichtbar = [false,false] # Gibt an, ob der HUD mit HP und Ammo Anzeige Sichtbar sein soll. Der 2. Wert steht für den Nachladebalken
    "

    Mit dem Event-Script: "$MSS.active = true" lässt sich das System aktivieren.
    Wenn ich aber: "$MSS.option_hud_sichtbar = [true,true]" aufrufe bekomme ich die Fehlermeldung: "undefined method for option_hud_sichtbar".
    Kann mir jemand einen Ratschlag geben wie ich das HUD ein und ausschalten kann?

  2. #2
    Ohne das ganze Script zu kennen, kann man da nichts genaues sagen.

    Wahrscheinlich ist, dass @option_hud_sichtbar = [false, false] so gedacht ist, nur einmalig für das komplette Spiel entweder aktiviert oder deaktiviert zu sein (das sind ja, so wie ich das verstehe, nur Zusatzanzeigen) und deshalb nur im Script selbst geändert werden kann. Wenn du die Optionen durch ein Call Script ändern willst, musst du die Instanzvariable für außerhalb sichtbar machen, indem du im Script außerhalb einer Methode die Zeile attr_accessor :option_hud_sichtbar hinzufügst.

    Sollte das nicht helfen, wäre es wirklich nicht verkehrt, das komplette Script zu posten

  3. #3
    Erst einmal vielen Dank für die schnelle Antwort.
    Ich verstehe genau was du meinst, allerdings kenne ich mich in RGSS nicht besonders gut aus.
    Hier erst einmal das relevante Script. insgesamt besteht es aus 4 Teilen.

    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,false] # 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]
        
        @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 = 8 # 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
          },
          '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
    Wenn ich deine Codezeile in die Zeile über "def initialize" (Zeile 2) einfüge erhalte ich keine Fehlermeldung mehr.
    Doch das HUD erscheint nicht. Soll ich die anderen Teile des Skripts auch posten?

  4. #4
    Das hat mit RGSS nichts zu tun, sondern mit Ruby. Nur um die Vokabeln klar zu stellen. RGSS ist die Bibliothek, welche von dem Maker verwendet wird, also die Grafik-, Sound- und Utilityklassen.

    Der von dir gezeigte Code reicht noch nicht aus um eine qualifizierte Lösung deines Problems vor zu schlagen; aber wenn ich schätzen müsste, dann würde ich sagen, dass diese Variablen nur einmal zu Beginn, oder vielleicht nur sehr selten, ausgelesen und berücksichtigt werden. Vielleicht bei jedem Kartenwechsel, oder zu wann immer sonst das HUD neu erstellt wird.
    Möglicherweise wird es einen Weg geben das HUD zu refreshen um eine Änderung der Variablenwerte wirksam zu machen.

  5. #5
    Natürlich hast du Recht was RGSS betrifft, habe mich da laienhaft ausgedrückt.
    Jedenfalls habe ich Levelwechsel usw. schon versucht um das HUD anzuzeigen.
    Dies sollte der restliche relevante Teil sein:

    UPDATE
    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
    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,155)
        @farbe_balken_innen = Color.new(255,0,0,255)
        @farbe_balken_rand = Color.new(0,0,0,255)
        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
    CODE
    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

Berechtigungen

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