Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [XP]Warum funktioniert dieses Event-Script nicht?



MissingLink
07.01.2014, 18:43
Hallo Leute,

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

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

(...)

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

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

Cepanks
07.01.2014, 19:18
Ohne das ganze Script zu kennen, kann man da nichts genaues sagen.

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

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

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


class MSS # Monsta's Shoot System

def initialize

#===Optionen===#
@active = false # Ist das Schusssystem von Anfang an aktiv
@undurchlässiges_terrain = [7] # Alle Zahlen von 0-7 können im Array verwendet werden. Einzelne Terrain ID's werden wie im Array gewohnt durch ein Komma getrennt
@option_events_aktivieren = false # Mit dieser Option braucht man nicht immer die Waffe zu wechseln um ein "Push Key" Event zu starten. [x]
@option_allow_weapon_change = true # Gibt an, ob die Waffe gewechselt werden darf
@option_quake_sounds = [true,
RPG::AudioFile.new('double',100,100),
RPG::AudioFile.new('multi',100,100),
RPG::AudioFile.new('ultra',100,100),
RPG::AudioFile.new('monster',100,100)]
@option_automatisches_nachladen = true # Gibt an, ob automatisch nachgeladen werden soll, wenn das Magazin leer ist.
@option_hud_sichtbar = [false,false] # Gibt an, ob der HUD mit HP und Ammo Anzeige Sichtbar sein soll. Der 2. Wert steht für den Nachladebalken
# Die Waffenzusammenstellung die man am Anfang des Spiels hat. Der nil wert ist für Waffe wegstecken.
@waffe = [1,nil,
{'Name' => 'Pistole', 'Munition' => '/', 'Magazin' => 15},
# {'Name' => 'Deagle', 'Munition' => 30, 'Magazin' => 7},
{'Name' => 'Shotgun', 'Munition' => 300, 'Magazin' => 1}
]
@actor = 1 # Heldennummer (für z.B. HP Berechnung)
@actor_graphic = 'player_normal_SICHERUNG' # Heldengrafik, als Figur ohne Waffe
@waffenwechselsound = RPG::AudioFile.new('Waffe_wechsel',100,100)
@leere_waffe_sound = RPG::AudioFile.new('leer',100,100)
@standard_blut = [25,26,27,28]
@spinne_blut = [109,109,109,109]

@nachladetasten = [0,0,0] # "R" - "Alt" - "Shift"

@key_strafe = 65 # Strafelauf ist auf Taste A. Um Strafen zu deaktivierten nil nehmen
@key_medikit = 0 # Medikit benutzen ist auf Taste S.
@key_granate = 68 # Granate werfen ist auf Taste D.
@key_mine = 0 # Mine legen ist auf Taste Q.
@key_sprinten = 0 # Sprinten auf STRG.

@sprinten_max = 100
@sprinten = @sprinten_max
@heal_power = 50
@granate_power = [12,2] # Schaden, Radius
@mine_power = [19,3] # Schaden, Radius
@items = Hash.new(0) # Speichert zusätzliche Items. zB Medikits
@event_database = 8 # Die Map wo Events wie Granaten gespeichert sind
@movement_8_way = true

@skills = [ ['HP','$game_actors[$MSS.actor].maxhp',100,50], # Name, Wert, Preis, Steigerung
['Sprinten','$MSS.sprinten_max',50,20],
['Granatenschaden','$MSS.granate_power[0]',50,1],
['Minenschaden','$MSS.mine_power[0]',50,1] ]
#===Ini===# (Hier bitte nichts verändern, wenn ihr euch nicht mit RGSS auskennt^^
ini_waffen
ini_gegner
ini_statistik
@waffe_aktuell = @waffe[@waffe[0]]
@events = {'Gegner' => [],'Hindernis' => [], 'ID' => []}
@key = Keys.new
@wait = 0
@schussrate = 0
@hud_boss = nil
@hud_boss_active = nil
end
attr_accessor :option_hud_sichtbar
# VORSICHT!
# Diese Daten werden beim Spielstand mitgespeichert (Da man diese Werte ja auch
# während des Spiels verändern (Pimpen =) ) kann. Also Änderungen wirken sich
# nur auf Neue Spiele aus

def ini_waffen
@waffen_atr = {
'Pistole' => {
'Schaden' => 1,
'Schusssound' => RPG::AudioFile.new('Pistole',100,100),
'Nachladesound' => RPG::AudioFile.new('Pistole Nachladen',100,100),
'Nachladezeit' => 80, # Nachladezeit in Frames. Bei 40 Frames pro Sekunde also hier 2 Sekunden.
'Magazin' => 15,
'Schussrate' => nil, # Bei nicht automatischen Waffen "nil" hinschreiben. Ansonsten die Frame Wartezeit
'Spielergrafik' => 'player_pistole',
'Mündungsfeuer' => [1,2,3,29] # Wenn keine Animation sein soll einfach "nil" (ohne Anführungszeichen) schreiben! Die Zahlen im Array stehen für die Animations ID in dieser Reihenfolge: [Unten, Links, Rechts, Oben]. Die ID "0" steht für keine Animation!
},

'Deagle' => {
'Schaden' => 4,
'Schusssound' => RPG::AudioFile.new('Deagle',100,100),
'Nachladesound' => RPG::AudioFile.new('Deagle Nachladen',100,100),
'Nachladezeit' => 75,
'Magazin' => 7,
'Schussrate' => nil,
'Spielergrafik' => 'Deagle',
'Mündungsfeuer' => [5,6,7,0]
},

'MP5' => {
'Schaden' => 2,
'Schusssound' => RPG::AudioFile.new('MP5',100,100),
'Nachladesound' => RPG::AudioFile.new('MP5 Nachladen',100,100),
'Nachladezeit' => 90,
'Magazin' => 30,
'Schussrate' => 3,
'Spielergrafik' => 'MP5',
'Mündungsfeuer' => [8,9,10,0]
},

'Colt' => {
'Schaden' => 7,
'Schusssound' => RPG::AudioFile.new('Colt',100,100),
'Nachladesound' => RPG::AudioFile.new('Colt Nachladen',100,100),
'Nachladezeit' => 125,
'Magazin' => 6,
'Schussrate' => nil,
'Spielergrafik' => 'Colt',
'Mündungsfeuer' => [11,12,13,0]
},

'M4' => {
'Schaden' => 4,
'Schusssound' => RPG::AudioFile.new('M4',100,100),
'Nachladesound' => RPG::AudioFile.new('M4 Nachladen',100,100),
'Nachladezeit' => 75,
'Magazin' => 30,
'Schussrate' => 4,
'Spielergrafik' => 'M4',
'Mündungsfeuer' => [14,15,16,0]
},

'Dual' => {
'Schaden' => 1,
'Schusssound' => RPG::AudioFile.new('Pistole',100,100),
'Nachladesound' => RPG::AudioFile.new('Dual Nachladen',100,100),
'Nachladezeit' => 135,
'Magazin' => 30,
'Schussrate' => nil,
'Spielergrafik' => 'Dual',
'Mündungsfeuer' => [40,41,42,43],
'Spezial_Schuss' => 'dual_feuerwechsel'
},

'MG' => {
'Schaden' => 6,
'Schusssound' => RPG::AudioFile.new('MG',100,100),
'Nachladesound' => RPG::AudioFile.new('MG Nachladen',100,100),
'Nachladezeit' => 233,
'Magazin' => 100,
'Schussrate' => 5,
'Spielergrafik' => 'MG',
'Mündungsfeuer' => [17,18,19,0],
'Spezial_Anlegen' => 'schwere_waffe',
'Spezial_Ablegen' => 'schwere_waffe(false)'
},

'Shotgun' => {
'Schaden' => 50,
'Schusssound' => RPG::AudioFile.new('Shotgun',100,100),
'Nachladesound' => RPG::AudioFile.new('Shotgun Nachladen',100,100),
'Nachladezeit' => 65,
'Magazin' => 1,
'Schussrate' => nil,
'Spielergrafik' => 'player_shotgun',
'Mündungsfeuer' => [20,21,22,23]
}
}

end

def ini_gegner
@gegner_atr = {
'Bandit' => {
'Schaden' => 15,
'HP' => 10,
'Trefferanimation' => 4,
'Spezial' => nil, # Dieser String wird beim Treffen des Eventes mit "eval" ausgeführt
'Blut' => @standard_blut, # Ein Array mit den Blutanimationen, ähnlich dem Mündungsfeuer bei den Waffen. Weil ich oft das gleiche Blut benutze, hab ich oben einen Array mit dem Standardblut gemacht
'Kugeldurchlässig' => true
},
'Biene' => {
'Schaden' => 20,
'HP' => 4,
'Trefferanimation' => 4,
'Spezial' => '!A! hitsound("089-Attack01","089-Attack01")',
'Blut' => @spinne_blut,
'Kugeldurchlässig' => false
},
'Glas' => {
'Schaden' => 0,
'HP' => 1,
'Trefferanimation' => 4,
'Spezial' => nil,
'Blut' => nil,
'Kugeldurchlässig' => true
},
'Schiessender Gegner' => {
'Schaden' => 100,
'HP' => 10,
'Trefferanimation' => 4,
'Spezial' => nil, #"print ('Hey, du sollst mich nicht abschiessen! Ich bin nur ein Beispiel für einen Schiessenden Gegner und das Spezial Attribut ;-)');return",
'Blut' => @standard_blut, #nil,
'Kugeldurchlässig' => true
},
'Goblin' => {
'Schaden' => 1,
'HP' => 9999,
'Trefferanimation' => 4,
'Spezial' => nil,
'Blut' => @standard_blut,
'Kugeldurchlässig' => true
},

'Endgegner' => {
'Schaden' => 100,
'HP' => 300,
'Trefferanimation' => 4,
'Spezial' => nil,
'Blut' => @standard_blut,
'Kugeldurchlässig' => false
},

'Stampfi' => {
'Schaden' => 100,
'HP' => 1500,
'Trefferanimation' => 4,
'Spezial' => nil,
'Blut' => [48,49,50,51],
'Kugeldurchlässig' => false
}
}
end

def ini_statistik
@statistik = {
'Schuesse' => 0,
'Treffer' => 0, # Noch nicht programmiert!
'Gegner' => 0,
'Multikill' => 0,
'Verlorene HP' => 0,
'Zugefuegter Schaden' => 0
}
end

def ini_events # Event erkennung. Bitte nur Ändern wenn ihr euch mit RGSS auskennt^^
@events = {'Gegner' => [],'Hindernis' => [], 'ID' => []}
begin
for ev in $game_map.events.values
case $game_map.map.events[ev.id].name.downcase
when 'gegner'
if ev.list[0].code == 108
komm = $game_map.events[ev.id].list[0].parameters.pop
if @gegner_atr[komm] == nil
print ("Bei dem Gegner mit der ID #{ev.id} wurde eine Monsterklasse angegeben, die nicht existiert.") if $DEBUG
next
end
else return
end
@events['Gegner'].push({'id' => ev.id, 'Klasse' => komm,
'HP' => @gegner_atr[komm]['HP']})
@events['ID'][ev.id] = @events['Gegner'].size - 1

when 'spezial'
if ev.list[0].code == 108
komm = $game_map.events[ev.id].list[0].parameters.pop
else
print ("Bei dem Spezialevent mit der ID #{ev.id} wurde kein Spezialaufruf gefunden.") if $DEBUG
next
end
@events['Gegner'] << {'id' => ev.id, 'Spezial' => komm}
@events['ID'][ev.id] = @events['Gegner'].size - 1

when 'hindernis'
@events['Hindernis'].push(ev.id)

when 'flaches event'
$game_map.events[ev.id].flat = true
end
end
rescue StandardError, SyntaxError
p ev
end
end
end

Wenn ich deine Codezeile in die Zeile über "def initialize" (Zeile 2) einfüge erhalte ich keine Fehlermeldung mehr.
Doch das HUD erscheint nicht. Soll ich die anderen Teile des Skripts auch posten?

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

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

MissingLink
07.01.2014, 21:24
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

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

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

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