Natürlich hast du Recht was RGSS betrifft, habe mich da laienhaft ausgedrückt.
Jedenfalls habe ich Levelwechsel usw. schon versucht um das HUD anzuzeigen.
Dies sollte der restliche relevante Teil sein:
UPDATE
Code:
class Scene_Map
alias :mss_map_ini_original :initialize if $MSS.nil?
def initialize
mss_map_ini_original
$MSS.ini_hud
end
alias :mss_map_update_original :update if $MSS.nil?
def update
$MSS.update if $MSS.active
mss_map_update_original
end
end
class Window_Message
alias :mss_dispose_original :dispose if $MSS.nil?
def dispose
mss_dispose_original
$MSS.dispose
end
end
class MSS
def update
return if $game_temp.message_window_showing
$game_player.direction_fix = @key.getkey_id(@key_strafe) unless @key_strafe.nil?
if @wait > 0
@wait -= 1
@hud_laden.refresh unless @hud_laden.nil?
if @wait == 0
$game_system.menu_disabled = false
@hud_laden.dispose unless @hud_laden.nil?
@hud_laden = nil
end
return
end
if @schussrate > 0
@schussrate -= 1
return
end
# Sprinten
if @sprinten_akt == true and @key.getkey_id(@key_sprinten) and @sprinten > 0
@sprinten -= 1
@hud_energie.refresh(@sprinten) if Graphics.frame_count % 2 == 0
return
elsif @sprinten_akt == true
$game_player.move_speed -= 1
@sprinten_akt = false
end
if @key.getkey_id(@key_sprinten) and @sprinten > 20
@sprinten_akt = true
$game_player.move_speed += 1
@hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max) if @sprinten == @sprinten_max
elsif @sprinten < @sprinten_max
if Graphics.frame_count % ($game_player.moving? ? 6 : 3) == 0
@sprinten += 1
@hud_energie.refresh(@sprinten)
end
elsif @sprinten == @sprinten_max and !@hud_energie.nil?
@hud_energie.dispose
@hud_energie = nil
end
# /
use_medikit if @key.getkey_id(@key_medikit)
granate_wefen if @key.getkey_id(@key_granate)
mine_legen if @key.getkey_id(@key_mine)
if @key.getkey_id(69) # E
granate_wefen(4,2)
granate_wefen(4,4)
granate_wefen(4,6)
granate_wefen(4,8)
end
if @waffe_aktuell != nil
if @waffen_atr[@waffe_aktuell['Name']]['Schussrate'].nil?
schuss if Input.trigger?(Input::C)
elsif @key.getkey_id(13) or @key.getkey_id(32)
schuss
@schussrate = @waffen_atr[@waffe_aktuell['Name']]['Schussrate']
end
end
if @option_allow_weapon_change
for taste in 0..@waffe.size - 2
if @key.getkey_id(49+taste) and @waffe[0] != taste+1
change_weapon(taste+1)
end
end
end
for taste in @nachladetasten
nachladen if @key.getkey_id(taste)
end
end
def dispose
if @hud.is_a?(MSS_HUD)
@hud.dispose
@hud = nil
end
if @hud_laden.is_a?(MSS_HUD_LADEN)
@hud_laden.dispose
@hud_laden = nil
end
if @hud_boss.is_a?(MSS_HUD_BOSS)
@hud_boss.dispose
@hud_boss = nil
end
if !@hud_energie.nil?
@hud_energie.dispose
@hud_energie = nil
end
end
def ini_hud
@hud = @option_hud_sichtbar[0] ? MSS_HUD.new : MSS_HUD_Dummy.new
boss(true,@hud_boss_active[0],@hud_boss_active[1],true) if @hud_boss_active.is_a?(Array)
@hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max, false) unless @sprinten == @sprinten_max
end
end
HUD
Code:
class MSS_HUD < Window_Base
def initialize
super(0, 0, 220, 85)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 155
refresh
end
def refresh
self.contents.clear
actor = $game_actors[$MSS.actor]
self.contents.font.color = Color.new (200, 204, 300, 255)
self.contents.draw_text(-1, -7, 180, 32, "HP: #{actor.hp} | #{actor.maxhp}")
if $MSS.waffe_aktuell == nil
muni = '/'
else
muni = "#{$MSS.waffe_aktuell['Magazin']} | #{$MSS.waffe_aktuell['Munition']}"
end
self.contents.draw_text(-1, 25, 180, 32, "Munition: #{muni}")
end
# def dispose
# @items.dispose
# super
# end
end
class MSS_HUD_LADEN < Window_Base
def initialize(max)
@farbe_hintergrund = Color.new(155,155,155,155)
@farbe_balken_innen = Color.new(255,0,0,255)
@farbe_balken_rand = Color.new(0,0,0,255)
super(-17, 70, 160, 50)
self.contents = Bitmap.new(width-32, height-32)
self.opacity = 0
self.contents.clear
self.contents.fill_rect(11, 2, 110, 15, @farbe_hintergrund)
@max = max
refresh
end
def refresh
lo = 100 - $MSS.wait * 100 / @max
self.contents.fill_rect(16, 4, lo, 10, @farbe_balken_innen)
self.contents.fill_rect(15, 4, 1, 11, @farbe_balken_rand)
self.contents.fill_rect(16, 4, lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16, 14, lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16 + lo, 4, 2, 11, @farbe_balken_rand)
end
def dispose
super unless self.disposed?
end
end
class MSS_HUD_ENERGIE < Window_Base
def initialize(max, new=true)
@farbe_hintergrund = Color.new(155,155,155,155)
@farbe_balken_innen = Color.new(0,0,255,255)
@farbe_balken_rand = Color.new(0,0,0,255)
super(470, 105, 160, 50)
self.contents = Bitmap.new(width-32, height-32)
self.opacity = 0
self.contents.clear
@max = max
refresh(max) if new
end
def refresh(value)
lo = value * 100 / @max
self.contents.clear
self.contents.fill_rect(11, 2, 110, 15, @farbe_hintergrund)
self.contents.fill_rect(16, 4, lo, 10, @farbe_balken_innen)
self.contents.fill_rect(15, 4, 1, 11, @farbe_balken_rand)
self.contents.fill_rect(16, 4, lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16, 14, lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16 + lo, 4, 2, 11, @farbe_balken_rand)
end
def dispose
super unless self.disposed?
end
end
class MSS_HUD_BOSS < Window_Base
def initialize(id,name)
super(175, 420, 360, 100)
self.contents = Bitmap.new(width-32, height-32)
self.opacity = 0
@farbe_hintergrund = Color.new(155,155,155,155)
@farbe_balken_rand = Color.new(0,0,0,255)
$MSS.hud_boss_active = [id,name]
@name = name
@int = $MSS.id_to_int(id)
refresh
end
def refresh
@lo = $MSS.events['Gegner'][@int]['HP'] * 300 /
$MSS.gegner_atr[$MSS.events['Gegner'][@int]['Klasse']]['HP']
ecolor = Color.new(10, 255, 10, 255) if @lo > 139 # Grün
ecolor = Color.new(250, 250, 10, 255) if @lo < 140 # Gelb
ecolor = Color.new(255, 10, 10, 255) if @lo < 60 # Rot
if @lo == 0
$MSS.boss(false,0,"",true)
return
end
self.contents.clear
self.contents.fill_rect(11, 2, 310, 25, @farbe_hintergrund)
self.contents.fill_rect(16, 4, @lo, 20, ecolor)
self.contents.fill_rect(15, 4, 1, 21, @farbe_balken_rand)
self.contents.fill_rect(16, 4, @lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16, 24, @lo, 1, @farbe_balken_rand)
self.contents.fill_rect(16+@lo, 4, 1, 21, @farbe_balken_rand)
self.contents.draw_text(0, -3, 330, 32,@name,1)
end
end
class MSS_HUD_Dummy
def update ;end
def refresh ;end
def dispose ;end
end
CODE
Code:
class MSS
attr_accessor :waffen_atr, :waffe_aktuell, :gegner_atr, :active,
:statistik, :waffe, :events, :actor, :key, :hud, :wait, :ziel,
:hud, :hud_laden, :hud_boss, :hud_boss_active, :option_events_aktivieren,
:option_allow_weapon_change, :option_quake_sounds, :option_automatisches_nachladen,
:items, :actor_graphic, :heal_power, :sprinten_max, :granate_power, :mine_power,
:movement_8_way, :skills
def schuss(taeter=$game_player,ziel='Events',abfrage=false,spezial=true)
@taeter = taeter; @ziel = ziel
@taeter = $game_map.events[@taeter] if @taeter.is_a?(Integer)
@hx = @taeter.x
@hy = @taeter.y
@hd = @taeter.direction
if @ziel == 'Events'
if not @waffe_aktuell['Magazin'] > 0
$game_system.se_play(@leere_waffe_sound)
return
end
spezschuss = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Schuss']
eval(spezschuss) unless spezschuss.nil?
$game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Schusssound'])
@statistik['Schuesse'] += 1
@waffe_aktuell['Magazin'] -= 1
@hud.refresh
if @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'] != nil
$game_player.animation_id = @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'][$game_player.direction / 2 - 1]
end
@killed = 0; @int = 0
treffer?
quake_sound
nachladen if @waffe_aktuell['Magazin'] == 0 and @option_automatisches_nachladen
elsif @ziel == 'Player'
treffer?
end
end
def quake_sound
@statistik['Multikill'] = @killed if @killed > @statistik['Multikill']
if @killed > 1 and @option_quake_sounds[0]
if @killed > @option_quake_sounds.size then sound = @option_quake_sounds.size else sound = @killed end
$game_system.se_play(@option_quake_sounds[sound-1])
end
end
def treffer?
case @hd
when 2 # Runter
start = @hy + 1
ende = $game_map.height
counter = 1
vari = 1 # Y
when 4 # Links
start = @hx - 1
ende = -1
counter = -1
vari = 0 # X
when 6 # Rechts
start = @hx + 1
ende = $game_map.width
counter = 1
vari = 0
when 8 # Hoch
start = @hy - 1
ende = -1
counter = -1
vari = 1
end
x, y = @hx, @hy
tile = start
while tile != ende
if vari == 0
x = tile
else
y = tile
end
break if $game_map.passable?(x,y,0) == false and @undurchlässiges_terrain.include?($game_map.terrain_tag(x,y)) == false
@id = $game_map.id_coordinates(x,y)
break if @events['Hindernis'].include?(@id)
if @ziel == 'Player'
if @id == 0
getroffen
return
end
tile += counter
next
end
@int = id_to_int(@id)
if @id > 0 and @int != nil and @events['Gegner'][@int] != nil and
$game_self_switches[[$game_map.map_id, @id, 'A']] == false
getroffen
break if @events['Gegner'][@int]['HP'] != nil and
not @gegner_atr[@events['Gegner'][@int]['Klasse']]['Kugeldurchlässig']
end
tile += counter
end
end
def getroffen
if @ziel == 'Player'
gegner_schlag(@taeter.id)
return
end
spezial = @events['Gegner'][@int]['Spezial']
unless spezial.nil?
eval(spezial)
return
end
spezial = @gegner_atr[@events['Gegner'][@int]['Klasse']]['Spezial']
if !spezial.nil?
aftereval = spezial.include?('!A!')
eval(spezial) unless aftereval
end
schaden = @waffen_atr[@waffe_aktuell['Name']]['Schaden']
make_damage(@id,schaden,blut_animation(@id,@hd))
@store_direction #ssssssssssssssssssssssss
eval(spezial.gsub('!A!','')) if aftereval
@restore_direction #ssssssssssssssssssssssss
end
def nachladen
return if @waffe_aktuell.nil?
magazin_max = @waffen_atr[@waffe_aktuell['Name']]['Magazin']
magazin = @waffe_aktuell['Magazin']
munition = @waffe_aktuell['Munition']
noetig = magazin_max - magazin
return if magazin == magazin_max
return if munition == 0
if munition == '/'
magazin = magazin_max
else
if munition + magazin >= magazin_max
munition -= noetig
magazin = magazin_max
else
magazin += munition
munition = 0
end
end
@waffe_aktuell['Magazin'] = magazin
@waffe_aktuell['Munition'] = munition
$game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Nachladesound'])
wait_balken(@waffen_atr[@waffe_aktuell['Name']]['Nachladezeit'])
@hud.refresh
end
def gegner_schlag(id)
int = id_to_int(id)
schaden = @gegner_atr[@events['Gegner'][int]['Klasse']]['Schaden']
$game_actors[@actor].hp -= schaden
@statistik['Verlorene HP'] += schaden
$game_player.animation_id =
@gegner_atr[@events['Gegner'][int]['Klasse']]['Trefferanimation']
end
def dead?(id)
return true if @events['Gegner'][id_to_int(id)]['HP'] == 0
return false
end
def all_dead?
ins = 0;@events['Gegner'].each { |g| ins += g['HP'] if !g['HP'].nil?}
return true if ins == 0
return false
end
def kill(id)
id = [id] if id.is_a?(Numeric)
for i in id
@events['Gegner'][id_to_int(i)]['HP'] = 0
change_local_switch(i)
end
end
def kill_all
@events['ID'].each_index {|i|int = id_to_int(i);kill(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
end
def heal(id)
id = [id] if id.is_a?(Numeric)
for i in id
int = id_to_int(i)
@events['Gegner'][int]['HP'] =
@gegner_atr[@events['Gegner'][int]['Klasse']]['HP']
change_local_switch(i,false)
end
end
def heal_all
@events['ID'].each_index {|i|int = id_to_int(i);heal(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
end
def add_ammo(name,ammo)
@waffe[find_weapon_slot(name)]['Munition'] += ammo
end
def add_weapon(name,munition=300,magazin=30,id=0,double=false)
return if !double and find_weapon_slot(name) != @waffe.size
hash = {'Name' => name, 'Munition' => munition, 'Magazin' => magazin}
if id == 0 then @waffe << hash else @waffe[id] = hash ;end
end
def remove_weapon(name)
if name.is_a?(String)
@waffe.delete_at(find_weapon_slot(name))
else
@waffe.delete_at(name)
end
end
def find_weapon_slot(name='')
name.to_s
@waffe.each_with_index do |waffe,index|
next if index < 2
return index if name == waffe['Name']
end
return @waffe.size
end
def boss(show=true,id=1,name='',menu=false)
@hud_boss.dispose if @hud_boss_active.is_a?(Array) and menu == false
if show
@hud_boss = MSS_HUD_BOSS.new(id,name)
@hud_boss_active = [id,name]
else
@hud_boss.dispose
@hud_boss = nil
@hud_boss_active = nil
end
end
def change_weapon(id=2)
unless @waffe_aktuell.nil?
spezab = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Ablegen']
eval(spezab) unless spezab.nil?
end
if @waffe[id].nil?
$game_actors[@actor].set_graphic(@actor_graphic, 0, '', 0)
else
$game_actors[@actor].set_graphic(@waffen_atr[@waffe[id]['Name']]['Spielergrafik'], 0, '', 0)
spezan = @waffen_atr[@waffe[id]['Name']]['Spezial_Anlegen']
eval(spezan) unless spezan.nil?
end
$game_system.se_play(@waffenwechselsound)
@waffe[0] = id
@waffe_aktuell = @waffe[@waffe[0]]
@hud.refresh
$game_player.refresh
end
def change_local_switch(id,value=true,switch='A',map=$game_map.map_id)
for i in id.to_a
$game_self_switches[[map, i, switch]] = value
end
$game_map.need_refresh = true
end
def option_hud_sichtbar(hud=true,balken=true)
@option_hud_sichtbar = [hud,balken]
@hud.dispose
if hud
@hud = MSS_HUD.new
else
@hud = MSS_HUD_Dummy.new
end
end
def make_saveable
dispose
@key = nil
end
def make_playable
@key = Keys.new
end
def make_damage(id,schaden,ani=0)
return if $game_self_switches[[$game_map.map_id, id, 'A']]
int = id_to_int(id)
@events['Gegner'][int]['HP'] -= schaden
@statistik['Zugefuegter Schaden'] += schaden
$game_map.events[id].animation_id = ani
if @events['Gegner'][int]['HP'] <= 0
@statistik['Zugefuegter Schaden'] += @events['Gegner'][int]['HP']
@events['Gegner'][int]['HP'] = 0
change_local_switch(id)
@statistik['Gegner'] += 1
@killed += 1
end
@hud_boss.refresh if @hud_boss_active.is_a?(Array) and @hud_boss_active[0] == id
end
def wait_balken(wait)
return if @wait > 0
@wait = wait
$game_system.menu_disabled = true
@hud_laden = @option_hud_sichtbar[1] ? MSS_HUD_LADEN.new(wait) : MSS_HUD_Dummy.new
end
def items_add(wert, key)
$MSS.items[key] += wert
@hud.refresh
end
def direction(x1,y1,x2,y2)
x, y = x2 - x1, y2 - y1
return -1 if x == 0 and y == 0
if x.abs > y.abs
return x > 0 ? 4 : 6
else
return y > 0 ? 8 : 2
end
end
def blut_animation(id,d)
blut = @gegner_atr[@events['Gegner'][id_to_int(id)]['Klasse']]['Blut']
return blut.nil? ? 0 : blut[d / 2 - 1]
end
def id_to_int(id)
return @events['ID'][id]
end
def garbage_collector
$game_map.events.each{|e|$game_map.events.delete(e[1].id) if $game_self_switches[[$game_map.map_id, e[1].id, 'A']]}
end
def debug
File.open('MSS.txt','w') {|f|f.write($MSS.inspect)}
end
end
class Game_Map
attr_reader :map
alias :mss_original_setup :setup if $MSS.nil?
def setup(map_id)
mss_original_setup(map_id)
$MSS.ini_events
end
def id_coordinates(x=0,y=0)
@events.each {|e|return e[1].id if e[1].x == x and e[1].y == y}
return 0 if $game_player.x == x and $game_player.y == y
return -1
end
def id_coordinates_mine(x=0,y=0,id=0)
@events.each {|e|return e[1].id if e[1].x == x and e[1].y == y and e[1].id != id}
return -1
end
def id_coordinates_array(x=0,y=0)
array = []
@events.each {|e|array << e[1].id if e[1].x == x and e[1].y == y}
array << 0 if $game_player.x == x and $game_player.y == y
return array
end
def id_rect(rect)
ev = []
@events.each {|e|ev << e[1].id if rect.inside?(e[1])}
return ev
end
end
class Game_Character
attr_accessor :flat
alias :mss_original_initialize :initialize if $MSS.nil?
alias :mss_original_screen_z :screen_z if $MSS.nil?
def initialize
@flat = false
mss_original_initialize
end
def screen_z(height = 0)
return 0 if @flat
mss_original_screen_z(height)
end
end
class Keys
def initialize
@GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'l','l')
@keybd_event = Win32API.new('user32', 'keybd_event', %w(l l l l), '')
end
def getkey
for i in 0..255
if @GetAsyncKeyState.call(i) != 0
return i
end
end
return 0
end
def getkey_id(id)
if @GetAsyncKeyState.call(id) != 0
return true
end
return false
end
def setkey_id_down(id)
@keybd_event.call(id,0,0,0)
end
def setkey_id_up(id)
@keybd_event.call(id,0,2,0)
end
end
class Game_Player < Game_Character
def update
last_moving = moving?
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
#==========EDIT===========#
if $MSS.movement_8_way
case Input.dir8
when 1
move_lower_left
when 2
move_down
when 3
move_lower_right
when 4
move_left
when 6
move_right
when 7
move_upper_left
when 8
move_up
when 9
move_upper_right
end
else
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
end
#==========EDIT===========#
end
last_real_x = @real_x
last_real_y = @real_y
super
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
$game_map.scroll_down(@real_y - last_real_y)
end
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
$game_map.scroll_left(last_real_x - @real_x)
end
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
$game_map.scroll_right(@real_x - last_real_x)
end
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
$game_map.scroll_up(last_real_y - @real_y)
end
unless moving?
if last_moving
result = check_event_trigger_here([1,2])
if result == false
unless $DEBUG and Input.press?(Input::CTRL)
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
#==========EDIT===========#
if $MSS.active == false or $MSS.waffe_aktuell == nil or $MSS.option_events_aktivieren
if Input.trigger?(Input::C)
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
#==========EDIT===========#
end
end
end
class Game_System
attr_accessor :mss_save
end
class Game_Character
attr_accessor :direction_fix
end
class Rect
def each
for xx in x..x + width
for yy in y..y + height
yield xx, yy
end
end
end
def inside?(ox,oy=0)
ox, oy = ox.x, ox.y unless ox.is_a?(Integer)
return (ox.between?(x, x + width)) && (oy.between?(y, y + height))
end
end
class Game_SelfSwitches
def delete(key)
@data.delete(key)
end
end
class Game_Battler
alias :mss_hpchange_original :hp= if $MSS.nil?
def hp=(hp)
mss_hpchange_original(hp)
return unless self.is_a?(Game_Actor)
$MSS.hud.refresh
$game_temp.gameover = true if @hp == 0
end
end
class Scene_Save < Scene_File
alias :mss_write_save_data_original :write_save_data if $MSS.nil?
def write_save_data(file)
$MSS.make_saveable
$game_system.mss_save = $MSS
mss_write_save_data_original(file)
$MSS.make_playable
end
end
class Scene_Load < Scene_File
alias :mss_read_save_data_original :read_save_data if $MSS.nil?
def read_save_data(file)
mss_read_save_data_original(file)
$MSS = $game_system.mss_save
$MSS.make_playable
end
end
class Scene_Title
alias :mss_title_ini_original :initialize if $MSS.nil?
def initialize
$MSS = MSS.new
mss_title_ini_original
end
end