MissingLink
09.01.2014, 18:21
Ich verstehe genau was du meinst, fühle mich aber außer Stande das ohne Anleitung hin zu bekommen.
Ich poste jetzt einfach mal den meiner Meinung nach relevanten Code. Wäre genial wenn du mir da auf die Sprünge helfen könntest.
Das ist die Update-Funktion in der weiter unten der Waffenwechsel initiiert wird.
class Scene_Map
alias :mss_map_ini_original :initialize if $MSS.nil?
def initialize
mss_map_ini_original
$MSS.ini_hud
end
alias :mss_map_update_original :update if $MSS.nil?
def update
$MSS.update if $MSS.active
mss_map_update_original
end
end
class Window_Message
alias :mss_dispose_original :dispose if $MSS.nil?
def dispose
mss_dispose_original
$MSS.dispose
end
end
class MSS
def update
return if $game_temp.message_window_showing
$game_player.direction_fix = @key.getkey_id(@key_strafe) unless @key_strafe.nil?
if @wait > 0
@wait -= 1
@hud_laden.refresh unless @hud_laden.nil?
if @wait == 0
$game_system.menu_disabled = false
@hud_laden.dispose unless @hud_laden.nil?
@hud_laden = nil
end
return
end
if @schussrate > 0
@schussrate -= 1
return
end
# Sprinten
if @sprinten_akt == true and @key.getkey_id(@key_sprinten) and @sprinten > 0
@sprinten -= 1
@hud_energie.refresh(@sprinten) if Graphics.frame_count % 2 == 0
return
elsif @sprinten_akt == true
$game_player.move_speed -= 1
@sprinten_akt = false
end
if @key.getkey_id(@key_sprinten) and @sprinten > 20
@sprinten_akt = true
$game_player.move_speed += 1
@hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max) if @sprinten == @sprinten_max
elsif @sprinten < @sprinten_max
if Graphics.frame_count % ($game_player.moving? ? 6 : 3) == 0
@sprinten += 1
@hud_energie.refresh(@sprinten)
end
elsif @sprinten == @sprinten_max and !@hud_energie.nil?
@hud_energie.dispose
@hud_energie = nil
end
# /
use_medikit if @key.getkey_id(@key_medikit)
granate_wefen if @key.getkey_id(@key_granate)
mine_legen if @key.getkey_id(@key_mine)
if @key.getkey_id(69) # E
granate_wefen(4,2)
granate_wefen(4,4)
granate_wefen(4,6)
granate_wefen(4,8)
end
if @waffe_aktuell != nil
if @waffen_atr[@waffe_aktuell['Name']]['Schussrate'].nil?
schuss if Input.trigger?(Input::C)
elsif @key.getkey_id(13) or @key.getkey_id(32)
schuss
@schussrate = @waffen_atr[@waffe_aktuell['Name']]['Schussrate']
end
end
if @option_allow_weapon_change
for taste in 0..@waffe.size - 2
if @key.getkey_id(49+taste) and @waffe[0] != taste+1
change_weapon(taste+1)
end
end
end
for taste in @nachladetasten
nachladen if @key.getkey_id(taste)
end
end
def dispose
if @hud.is_a?(MSS_HUD)
@hud.dispose
@hud = nil
end
if @hud_laden.is_a?(MSS_HUD_LADEN)
@hud_laden.dispose
@hud_laden = nil
end
if @hud_boss.is_a?(MSS_HUD_BOSS)
@hud_boss.dispose
@hud_boss = nil
end
if !@hud_energie.nil?
@hud_energie.dispose
@hud_energie = nil
end
end
def ini_hud
@hud = @option_hud_sichtbar[0] ? MSS_HUD.new : MSS_HUD_Dummy.new
boss(true,@hud_boss_active[0],@hud_boss_active[1],true) if @hud_boss_active.is_a?(Array)
@hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max, false) unless @sprinten == @sprinten_max
end
end
Und hier das Script in dem die def steht, auf die ich zugreifen möchte. Die Stelle ist etwas über der Mitte.
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
MissingLink
13.01.2014, 00:33
MSS: Initialize
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)
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
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)
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
# 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
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.