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