PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script Bearbeitungs Hilfe



buddysievers
30.05.2011, 19:50
hi ich brauche hilfe bei einer bearbeitung eines skripts für rmxp.
hier gibt es das script und eine demo.
http://forum.chaos-project.com/index.php/topic,1688.0.html

da mir niemand in dem forum antwortet probier ichs mal hier ^^

1.) Ich brauche einen Scriptcall für einen Conditional Branch um abzufragen ob ein bestimmtes job lv erreicht ist...
beispiel: wenn character 1 job lv 3 erreicht dann ist der branch ok (if characterID1 is warrior lv 3 then ...)

2.) Ich brauche ein Scriptcall um das Job lv von einem bestimmten character zu erhöhen oder zu senken.
beispiel: ich will das job lv von characterID1 warrior um 1 erhöhen.
oder ich will das job lv von character ID7 lancer um 2 verringern usw...


So das waren die einfachen dinge ^^
nun zum eingemachten...
hier gibt es das large party script:
http://www.rpgrevolution.com/forums/index.php?showtopic=12397
nunja im standart menü kann man alle partymember sehen auch wenn man zb 8 hat.
in dem legacy class change menü allerdings nicht, es geht zwar auch weiter runter wie bei dem standart menü
allerdings sieht man nicht die charactere fonts und co, nur ein leeren balken...
wäre echt super wenn jemand das so modifizieren könnte das man alle chars sieht.
falss das irgendwie komisch klingt, einfach mal testen !
erst das large party script alleine, fügt euerer gruppe 4 eitere oder mehr chars zur party hinzu.
geht nun ins menü und geht auf equp oder status und geht beim lezten char noch ein weiter runter und man sieht den 5ten char usw.

nun testet das ganze mal mit legacy class change...
wie gesagt man kann den 5ten bis xten char zwar einen neuen job gegen allerdings werden sie nicht angezeigt...

hoffe ich habe nicht verwirrendes zeug gschrieben, aber das passiert mir öfters hahaha
vielen dank im vorraus für jegliche hilfe
buddy

Cornix
30.05.2011, 22:08
Zu deinem ersten Problem:
Die Game_Actor class besitzt in dem Script ein array namens @class_levels[], um die Stufe einer bestimmten Klasse für einen bestimmten Charakter zu erhalten musst du also folgenden Code ausführen:

clvl = $game_actors[char_id].class_levels[class_id]
die lokale Variable "clvl" würde also auf die Stufe der Klasse mit der ID "class_id" für den Charakter mit der ID "char_id" gesetzt werden.
Bedenke dabei, dass Arrays mit dem ersten Element an der Position 0 beginnen, das heist für die dritte Klasse des ersten Charakters müssten char_id == 0 & class_id = 2 sein.

Zu deinem zweiten Problem:
Um die Stufe einer Klasse manuell zu erhöhen ist hier etwas mehr Arbeit gefragt da der Author dafür keine direkte Methode implementiert hat.
Es scheint jedoch so, dass die Stufe einer Klasse immer dann erhöht wird sobald die Stufe des Charakters steigt.
Wird die Stufe eines Charakters jedoch verringert so wird die Klassenstufe nicht mit verringert.
Außerdem werden Fähigkeiten nicht verlernt falls die Stufe verringert wird.
Behalte diese Informationen im Hinterkopf.
Wenn du das "Legacy Class Change" Script öffnest findest du an der Zeile 485 bis ca. zur Zeile 600 die Modifikationen welche an der Game_Actor Klasse vorgenommen wurden. Unter anderem das Verhalten bei einem Stufenaufstieg.
Tauscht du diese Game_Actor Klasse mit dieser Variation hier aus solltest du in der Lage sein die Klassenstufe eines Charakters individuell zu erhöhen.

class Game_Actor < Game_Battler
attr_accessor :class_levels
attr_accessor :unlocked_class
attr_accessor :unlocked_specials
#attr_accessor :locked_class
attr_accessor :learned_class_skills
attr_accessor :character_name
attr_accessor :default_charset_name
attr_accessor :battler_name
attr_accessor :default_battler_name

# modify the actor setup for Legacy Class Change
alias class_rank_level_LB setup
def setup(actor_id)
class_rank_level_LB(actor_id)

# set up the initial default graphics (used by the graphic change system)
@default_charset_name = @character_name
@default_battler_name = @battler_name

# set up the class arrays used by the class changing system.
@unlocked_class = []
@unlocked_specials = []

# initialize the array that holds the class specific skills an actor has learned
@learned_class_skills = []

# set up the class_levels
@class_levels = Array.new($data_classes.size)

@class_levels.each_index {|i|
if i == $data_actors[actor_id].class_id
@class_levels[i] = 1
else
@class_levels[i] = 0
end}

# initialize unlocked classes.
(1...$data_classes.size).each{|class_id|
unlock_class(class_id)}

end

# method used to check if an actor meets the requirements for a class, and if he
# does, it will unlock the class for that actor
def unlock_class(class_id)
if !@unlocked_class.include?(class_id)
if !LBConf::SPECIAL_CLASS.include?(class_id)
requirement = LBConf.class_requirements(class_id)
result = true
requirement.each_index {|i|
if @class_levels[i] < requirement[i]
result = false
break
end}
else
result = false
if unlocked_specials.include?(class_id)
result = true
end
end
if result
@unlocked_class.push(class_id)
@unlocked_class.sort!
end
end
end


# method used to unlock a special class for an actor.
def learn_special_class(class_id)
if !@unlocked_specials.include?(class_id)
@unlocked_specials.push(class_id)
@unlocked_specials.sort!
end
end

# method used to lock a special class for an actor.
def forget_special_class(class_id)
@unlocked_specials.delete(class_id)
@unlocked_class.delete(class_id)
@unlocked_specials.sort!
@unlocked_class.sort!
end

# modifies how levelups are assigned, so as to add to a class' level upon level
# up.
def exp=(exp)
@exp = [[exp, 9999999].min, 0].max
# Level up
while @exp >= @exp_list[@level+1] && @exp_list[@level+1] > 0
@level += 1
self.class_level_up(@class_id)
end
# Level down
while @exp < @exp_list[@level]
@level -= 1
end
# Correction if exceeding current max HP and max SP
@hp = [@hp, self.maxhp].min
@sp = [@sp, self.maxsp].min
end

def class_level_up(new_class_id = @class_id)
@class_levels[new_class_id] += 1

# modifies how skills are assigned, so that it's based on class level, rather
# than overall level.
$data_classes[new_class_id].learnings.each {|j|
if j.level == @class_levels[new_class_id]
learn_skill(j.skill_id)
if LBConf.class_spells(new_class_id).include?(j.skill_id)
@learned_class_skills.push(j.skill_id)
@learned_class_skills.sort!
end

end
}
end
end
Über diese von mir (via copy&paste eines anderen Parts des Scripts) erstellte Methode namens "class_level_up([class_id])" kannst du die Stufe für jede beliebige Klasse des Charakters erhöhen.
Allerdings kann ich nicht mit 100% Genauigkeit sagen ob es Fehlerfrei sein wird da ich nicht das gesamte Script gelesen habe. Es sollte jedoch ausreichen.
Als Parameter nimmt diese Funktion eine ganze Zahl welche die ID der Klasse darstellt dessen Stufe erhöht werden soll, wird kein Parameter übergeben wird die Klassenstufe der derzeitigen Klasse erhöht.
Um die Stufe zu verringern sollte es ausreichen einfach das jeweilige Klassenlevel manuell zu verringern, um das Verlernen von Fähigkeiten müsstest du dich jedoch nach wie vor selbst kümmern da diese Funktion bereits im normalen RPG-Maker XP System nicht automatisch erledigt wurde.
Also im Klartext als call Script:

$game_actors[char_id].class_level_up(class_id)
um die Stufe der Klasse mit der ID "class_id" für den Charakter mit der ID "char_id" um 1 zu erhöhen.
Oder:

$game_actors[char_id].class_level_up
um die Stufe der derzeitigen Klasse des Charakters mit der ID "char_id" um 1 zu erhöhen.

Um eine Stufe zu verringern müsstest du folgendes tun:

$game_actors[char_id].class_levels[class_id] -= 1
um die Stufe der Klasse mit der ID "class_id" für den Charakter mit der ID "char_id" um 1 zu verringern.
Du kannst übrigens die ID der derzeitigen Klasse eines Charakters jederzeit über den Befehl:

actor_current_class_id = $game_actors[char_id].class_id
erhalten.

Um dein letztes Problem kann ich mich leider derzeit nicht kümmern, darauf wirst du wahrscheinlich noch etwas warten müssen.

buddysievers
30.05.2011, 23:19
also ersteinmal danke das ist echt grossartig ^^
ich teste es morgen und berichte dann ob es funzt !
nun nocheinmal dazu, das level verringern will ich ja eig garnicht, war nur son gedanke das es ja auch umgekehrt gehen sollte...
und wenn man das player lv reduziert sinkt das job lv nicht mit !

nun ich habe da aber noch ein problem undzwar brauche ich eine abfrage im script die je nachdem welcher job gewählt wird ein bestimmten call ausführt.
zum beispiel wenn ich ninja sein will muss ich ja den scriptcall für ninja mode (777's multi-equip) aufrufen lassen,
und wenn ich wieder zum warrior wechsel dann sollte der ninja mode wieder deaktiviert werden.
der call in diesem beispiel wäre $game_actors[x].ignore_offhand = true/nil
nur muss hierbei auch der actor selber abgefragt werden und es sollte ebenfalls mit larger party funzen !
also es wäre klasse wenn du oder jemand anderes mir eine abfrage einabuen könnte^^

so in etwa

if actorid1
if 0 then $game_actors[x].ignore_offhand = nil
if 1 then $game_actors[x].ignore_offhand = nil
if 2 then $game_actors[x].ignore_offhand = nil
...
if 14 then $game_actors[x].ignore_offhand = true (14 ist in diesem beispiel ninja)

if actorid2
if 0 then $game_actors[x].ignore_offhand = nil
if 1 then $game_actors[x].ignore_offhand = nil
if 2 then $game_actors[x].ignore_offhand = nil
...
if 14 then $game_actors[x].ignore_offhand = true (14 ist in diesem beispiel ninja)

usw nur das der actor irgendwie anders abgefragt wird weil ich ja mehr als 4 member im team habe ^^
nochmals danke im vorraus

buddysievers
30.05.2011, 23:45
egal habs eben noch getestet ^^
also "$game_actors[char_id].class_level_up(class_id)" funz net habs mit $game_actors[0].class_level_up(0) probiert und "undefined method `class_level_up' for nil:NilClass" fehler bekommen.
bei $game_actors[char_id].class_level_up ebenfalls...
die zu verringern hab ich noch nicht getestet aber die brauch ich ja eig auch net ^^

nunja und ich weiss net recht was ich mit "clvl = $game_actors[char_id].class_levels[class_id]" machen soll ?!
ich habs in nen branch in den script part getan und auch nen error bekommen.
dann hab ics mit clvl = $game_actors[char_id].class_levels[class_id ==1 versucht und auch fehler...
sry irgendwie klappt das net ganz so wies soll hmmmmmm

Cornix
31.05.2011, 00:00
Ich habe es gerade einmal ausprobiert, es scheint so, als ob der RMXP für einfachere Bedienung (oder aus anderen Gründen) die Arrays für $game_actor und $data_classes mit 1 beginnen lässt.
Das heist, für den Charakter mit der ID 1 musst du tatsächlich die 1 verwenden.

Falls du also in deinem "Conditional_Branch" beispielsweise die Bedingung "Stufe von Klasse[1] für Charakter[1] größer/gleich 3" einbauen willst musst du folgenden custom script in das Textfeld eingeben:

$game_actors[1].class_levels[1] >= 3

Falls du die Klassenstufe des ersten Charakters um 1 erhöhen willst musst du im Call-Script folgende Zeile eingeben:

$game_actors[1].class_level_up

Ich habe beides gerade ausprobiert und es hat funktioniert.

buddysievers
31.05.2011, 00:15
sry für den doppelpost aber hab gemerkt warum das net ging hab nämlich nicht den code im script ausgetauscht nun hab ich das aber und bekommbeim start ne meldung das auf line 602 n fehler ist...

Cornix
31.05.2011, 02:04
Du musst in dem Fall wahrscheinlich etwas falsch kopiert haben, ein Fehler taucht für mich nicht auf.
Die Wahrscheinlichkeit ist groß, dass entweder ein "end" zu viel oder zu wenig vorhanden ist, aber das lässt sich nicht ohne weitere Informationen sagen. Falls du die Fehlermeldung zitieren könntest wäre es bereits ein guter Anhaltspunkt.

buddysievers
31.05.2011, 15:01
danke erstmal werds nachär mal testen muss grad ne neue graka kaufen gehen ^^
also ich schreib dann später mal obs funzt, und ja stimmt das ich wahrscheinlich ein end zuviel oder so hatte...
war schon müde wollts aber unbedingt noch testen gestern abend xD
nun zu dem mit dem callscript bei klassenwechsel, das ist wichtiger als die charanzeige im large party script,
und ich glaube auch das ich das selber lösen kann, hab da sonne idee ^^
wäre wie gesagt klasse wenn du mir dabei helfen könntest das halt die scriptcalls bei klassenwechsel aufgerufen werden >.<
thx

Cornix
31.05.2011, 15:36
Verstehe ich das richtig, dass du willst, dass bei einem Klassenwechsel der Zustand "ignore_offhand" auf true gesetzt wird falls die neue Klasse die ID 14 hat und in allen anderen Fällen soll der Zustand auf false gesetzt werden?

In diesem Fall müsstest du einfach die alte Methode:
(Zeile: 777 - 804)

def actor_class_change(actor_id, class_id)

#setup which actors' class needs to be changed.
changed_actors = LBConf.linked_actors(actor_id)
changed_actors.push actor_id

#memorize which class specific skills the actor has learned for the current
#class, then make the actor forget them
LBConf.class_spells($game_actors[actor_id].class_id).each{|skill_id|
$game_actors[actor_id].forget_skill(skill_id)}

#change the actor(s) class.
changed_actors.each{|actorz|
$game_actors[actorz].class_id = class_id

#remember any class specific spells the actor has forgotten forthe class
#they're changing to.
$game_actors[actorz].learned_class_skills.each{|skill_id|
if LBConf.class_spells($game_actors[actorz].class_id).include?(skill_id)
$game_actors[actorz].learn_skill(skill_id)
end}

#if graphic changing is enabled, change the actor's graphic.
if LBConf::CLASS_GRAPHIC_CHANGE == true
actor_graphics_change(actorz)
end}

endIn diese Version abändern:

def actor_class_change(actor_id, class_id)

#setup which actors' class needs to be changed.
changed_actors = LBConf.linked_actors(actor_id)
changed_actors.push actor_id

#memorize which class specific skills the actor has learned for the current
#class, then make the actor forget them
LBConf.class_spells($game_actors[actor_id].class_id).each{|skill_id|
$game_actors[actor_id].forget_skill(skill_id)}

#change the actor(s) class.
changed_actors.each{|actorz|
$game_actors[actorz].class_id = class_id

#remember any class specific spells the actor has forgotten forthe class
#they're changing to.
$game_actors[actorz].learned_class_skills.each{|skill_id|
if LBConf.class_spells($game_actors[actorz].class_id).include?(skill_id)
$game_actors[actorz].learn_skill(skill_id)
end}

#if graphic changing is enabled, change the actor's graphic.
if LBConf::CLASS_GRAPHIC_CHANGE == true
actor_graphics_change(actorz)
end

if class_id == 14
$game_actors[actorz].ignore_offhand = true
else
$game_actors[actorz].ignore_offhand = false
end}

endWie man erkennt liegt der einzige Unterschied in folgenden Zeilen:

if class_id == 14
$game_actors[actorz].ignore_offhand = true
else
$game_actors[actorz].ignore_offhand = false
endIch hoffe das sollte dein Problem beheben falls ich es denn richtig verstanden habe.

buddysievers
31.05.2011, 17:37
ja das ist es ^^ ich teste es gleich ^^

edit: big thx das wars ^^
funzt !!!

teste nun den rest von gestern !

buddysievers
31.05.2011, 18:06
alles funzt ^^ du bist der beste und so schnelle antworten echt respekt !

so nun das lezte problem und ein neues xD (lezteres ist easy denk ich mal ^^)

nr 1 wie schon gesagt, hier mal beispielbilder die alles erklären denk ich mal...
http://imageshack.us/photo/my-images/191/bild1mzr.png/
http://imageshack.us/photo/my-images/11/bild2bi.png/
wie man sieht keine actor grafiken oder schrift und co aber der class change funzt ^^
ist halt ne optische angelegenheit...
dachte ich bekomms selbst hin aber hab mich da pbernommen xD

nr 2 das neue problem...
ich würde gerne im main menü das level des jobs sehen also neben dem job name noch das lv...
http://imageshack.us/photo/my-images/832/bild3oo.png/

wie geil das am ende sein muss >.<

Cornix
31.05.2011, 18:43
Problem Nr. 1:
Im Legacy Script, um die Zeile 822 herum, solltest du eine Zeile finden welche so aussieht:

self.contents = Bitmap.new(width - 32, height - 32)
Tausche diese Zeile mit folgender aus:

self.contents = Bitmap.new(width - 32, 32 + $game_party.actors.size * 80)

Problem Nr. 2
Öffne das Script "Window Base", es gehört zu den Standard Klassen des RPG-Makers XP und suche in der Zeile 131 eine Methode names "draw_actor_class(actor,x,y).
Ersetze diese Methode mit folgender Methode:

def draw_actor_class(actor, x, y)
self.contents.font.color = normal_color
text = actor.class_name + " Lvl: " + actor.class_levels[actor.class_id].to_s
self.contents.draw_text(x, y, 236, 32, text)
end
der Text sollte nun in folgender Form erscheinen:
"KLASSE Lvl: KLASSENLEVEL"

buddysievers
31.05.2011, 19:21
nice thx

ich teste es gleich und sag ob es funzt

also beides funzt wunderbar du bist der abslout größte !!!
aber ein bug hat sich dadurch merkwürdiger weise eingeschlichen und das ist wirklich ein ganz praller ^^
die enter taste geht nicht mehr aber c und space sowie die maus wunderbar wie vorher !
keine ahnung warum das passiert sein könnte aber ich habe ja nur window_base und das legacy script bearbeitet bzw du ^^
nunja deshalb ist es für mich absolut unerklärbar...

nun eine allerlezte bitte hätte ich noch wenn das nicht zuviel ist >.>
kannst du das job lv system ändern das jobs durch jp aufsteigen statt durch eigene levels.
man erhält automatisch 50% der exp als jp sprich 100exp/50jp.
hierzu muss man aber beachten das ich nicht das standart ks benutze (naja wer das macht kann kein gutes spiel erwarten, da das xp ks echt scheisse ist...)
ich benutze GubiD's Tactical Battle System, hier der link:
http://www.creationasylum.net/forum/index.php?showtopic=20353
hoffe das es nicht zu schwer ist das zu machen weil dann hätte ich ein perfektes jobsystem ^^
aber wie schon gesagt alles in allem super hilfe !

edit: ah hatte vergessen zu erwähnen das die job lv genausoviel jp brauch zum lv up beispiel: 100exp für lv 2 100jp für job lv 2 aber man bekommt ja halt nur 50% der exp die man erhällt somit kann man sagen das man ca jedes zweite job lv aufsteigt.

buddysievers
01.06.2011, 17:44
ok habs auf meinem pc ohne probleme getestet auf xp x86, dann heute nochmal von meinem bruder mit win7 x64 und aufeinmal gehts...
war nurn windows bug mit der enter taste....
deshalb mag ich xp auch am liebsten selber benutz ich win 7 nur zum zocken ^^

buddysievers
05.06.2011, 18:37
ähm ich hab ein script gefunden was sowas enthällt und auch ein stat modiefier hat nur kann ich das selber nicht ausbauen und ins legacy script einbauen...
habe mal blizzard ne pm geschickt was ich beachten muss für den stat modiefier weil den bekomm ich evtl selber hin.
naja hoffe du oder irgendjemand anders kann mir eventuell helfen thx.
http://forum.chaos-project.com/index.php?topic=115.0