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
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
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
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
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
# 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
Foren-Regeln