Register to post in forums, or Log in to your existing account
 

Play RetroMUD
Post new topic  Reply to topic     Home » Forums » zMUD General Discussion
blondi
Beginner


Joined: 06 Apr 2003
Posts: 15

PostPosted: Sat Jun 07, 2003 2:20 am   

optimizing macros
 
Hi there

i have 2 macros which take a long time to run, so i want wo ask you if you can see any thing which can be optimized:


Macro one:
Trigger: (*):({ weit entfernt von| noch laengst nicht| bald schon| fast|})({ absolut superuebel| superuebel| sehr sehr uebel| sehr uebel| uebel| sehr sehr schlecht| sehr schlecht| schlecht| maessig| durchschnittlich| befriedigend| sehr befriedigend| recht gut| ganz gut| gut| sehr gut| ausgezeichnet| hervorragend| perfekt| absolut perfekt})$

an the macor is:

#GAG
ks_abzug=0
ks3=%trimleft( %2)
ks4=%trimleft( %3)
ks2=%1
#if (@ks3="weit entfernt von") {ks_abzug=4}
#if (@ks3="noch laengst nicht") {ks_abzug=3}
#if (@ks3="bald schon") {ks_abzug=2}
#if (@ks3="fast") {ks_abzug=1}
ks_base=0
#if (@ks4="absolut perfekt") {ks_base=100}
#if (@ks4="perfekt") {ks_base=95}
#if (@ks4="hervorragend") {ks_base=90}
#if (@ks4="ausgezeichnet") {ks_base=85}
#if (@ks4="sehr gut") {ks_base=80}
#if (@ks4="gut") {ks_base=75}
#if (@ks4="ganz gut") {ks_base=70}
#if (@ks4="recht gut") {ks_base=65}
#if (@ks4="sehr befriedigend") {ks_base=60}
#if (@ks4="befriedigend") {ks_base=55}
#if (@ks4="durchschnittlich") {ks_base=50}
#if (@ks4="maessig") {ks_base=45}
#if (@ks4="schlecht") {ks_base=40}
#if (@ks4="sehr schlecht") {ks_base=35}
#if (@ks4="sehr sehr schlecht") {ks_base=30}
#if (@ks4="uebel") {ks_base=25}
#if (@ks4="sehr uebel") {ks_base=20}
#if (@ks4="sehr sehr uebel") {ks_base=15}
#if (@ks4="superuebel") {ks_base=10}
#if (@ks4="absolut superuebel") {ks_base=5}
#MATH ks_gesamt @ks_base-@ks_abzug
#SAY @ks2: @ks_gesamt% ~(@ks3 @ks4)
#COLOR 23

This script runs about a half secon on my zMUD 6.40 on an athlon 700 with 256MB ram
The problem is that there are more than 20 lines the trigger will fire, und run for ech line the macro.

The second macro.
Here it can bee that the macor runs fpr over 5 Sekond und block zMUD complete. No othertrigger fires, und Windows thinks zMUD is not reponding

Here is the piece of code:



;----------------------------------
; Lps in %
#IF (@s_speicher =~ "*ist absolut fit und ist damit*") {schaetz_abs=10}
#IF (@s_speicher =~ "*ist leicht geschwaecht und ist damit*") {schaetz_abs=9}
#if (@s_speicher =~ "*fuehlte sich auch schon besser und ist damit*") {schaetz_abs=8}
#if (@s_speicher =~ "*ist leicht angekratzt und ist damit*") {schaetz_abs=7}
#if (@s_speicher =~ "*ist nicht mehr taufrisch und ist damit*") {schaetz_abs=6}
#if (@s_speicher =~ "*sieht recht mitgenommen aus und ist damit*") {schaetz_abs=5}
#if (@s_speicher =~ "*wankt bereits bedenklich und ist damit*") {schaetz_abs=4}
#if (@s_speicher =~ "*ist in keiner guten Verfassung und ist damit*") {schaetz_abs=3}
#if (@s_speicher =~ "*braucht dringend einen Arzt und ist damit*") {schaetz_abs=2}
#if (@s_speicher =~ "*steht auf der Schwelle des Todes und ist damit*") {schaetz_abs=1}
;-------------------------------------------------------------
; Lps relativ zum Caster
#IF (@s_speicher =~ "*und ist damit absolut, unglaublich schwaecher als Du.*") {
schaetz_rel_min = 0
#MATH schaetz_rel_max @HP-199
}
#IF (@s_speicher =~ "*und ist damit unglaublich schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-199
#MATH schaetz_rel_max @HP-150
}
#IF (@s_speicher =~ "*und ist damit sehr viel schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-149
#MATH schaetz_rel_max @HP-110
}
#IF (@s_speicher =~ "*und ist damit viel schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-109
#MATH schaetz_rel_max @HP-80
}
#IF (@s_speicher =~ "*und ist damit deutlich schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-79
#MATH schaetz_rel_max @HP-50
}
#IF (@s_speicher =~ "*und ist damit schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-49
#MATH schaetz_rel_max @HP-30
}
#IF (@s_speicher =~ "*und ist damit etwas schwaecher als Du.*") {
#MATH schaetz_rel_min @HP-29
#MATH schaetz_rel_max @HP-20
}
#IF (@s_speicher =~ "*und ist damit fast so stark wie Du.*") {
#MATH schaetz_rel_min @HP-19
#MATH schaetz_rel_max @HP-10
}
#IF (@s_speicher =~ "*und ist damit etwa genauso stark wie Du.*") {
#MATH schaetz_rel_min @HP-9
#MATH schaetz_rel_max @HP+10
}
#IF (@s_speicher =~ "*und ist damit ein klein wenig staerker als Du.*") {
#MATH schaetz_rel_min @HP+11
#MATH schaetz_rel_max @HP+20
}
#IF (@s_speicher =~ "*und ist damit etwas staerker als Du.*") {
#MATH schaetz_rel_min @HP+21
#MATH schaetz_rel_max @HP+30
}
#IF (@s_speicher =~ "*und ist damit staerker als Du.*") {
#MATH schaetz_rel_min @HP+31
#MATH schaetz_rel_max @HP+50
}
#IF (@s_speicher =~ "*und ist damit deutlich staerker als Du.*") {
#MATH schaetz_rel_min @HP+51
#MATH schaetz_rel_max @HP+80
}
#IF (@s_speicher =~ "*und ist damit viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+81
#MATH schaetz_rel_max @HP+120
}
#IF (@s_speicher =~ "*und ist damit sehr viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+121
#MATH schaetz_rel_max @HP+180
}
#IF (@s_speicher =~ "*und ist damit sehr sehr viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+181
#MATH schaetz_rel_max @HP+250
}
#IF (@s_speicher =~ "*und ist damit ueberaus sehr viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+251
#MATH schaetz_rel_max @HP+350
}
#IF (@s_speicher =~ "*und ist damit gewaltig staerker als Du.*") {
#MATH schaetz_rel_min @HP+351
#MATH schaetz_rel_max @HP+500
}
#IF (@s_speicher =~ "*und ist damit unglaublich staerker als Du.*") {
#MATH schaetz_rel_min @HP+501
#MATH schaetz_rel_max @HP+1000
}
#IF (@s_speicher =~ "*und ist damit wahnsinnig viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+1001
#MATH schaetz_rel_max @HP+2000
}
#IF (@s_speicher =~ "*und ist damit weghiermaessig viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+2001
#MATH schaetz_rel_max @HP+3000
}
#IF (@s_speicher =~ "*und ist damit jenseits aller Grenzen viel staerker als Du.*") {
#MATH schaetz_rel_min @HP+3000
schaetz_rel_max=oo
}
;---------------------------------------------------------------
; Hands oder Waffe, welche DTs werden damit verursacht?
schaetz_weapon="???"
schaetz_weapon_dt="???"
#IF (@s_speicher =~ "* (%w) macht folgenden Schaden: (*).*") {
schaetz_weapon=%%1
schaetz_weapon_dt=%%2
}
#IF (@s_speicher =~ "*{Er|Sie|Es} macht damit folgenden Schaden: (*).*") {
schaetz_weapon="Hands"
schaetz_weapon_dt=%%1
}
#IF (@s_speicher =~ "* hat {ein|eine|einen} (*) gezueckt.*") {
schaetz_weapon=%%1
}
#IF (@s_speicher =~ "*Er kaempft mit blossen Haenden.*") {
schaetz_weapon="Hände"
}
#IF (@s_speicher =~ "*Er kaempft mit blossen, aber kraeftigen, Haenden.*") {
schaetz_weapon="kräftige Hände"
}
#IF (@s_speicher =~ "*{Er|Sie|Es} kaempft mit {seinem|seiner} (%w).*") {
schaetz_weapon=%%1}
;---------------------------------------------------------
;Wie gut ist die Waffe des Targets? (-6 bis +10)
weapon_qual="???"
weapon_qual_temp=""
#IF (@s_speicher =~ "*Damit kaempft {er|sie|es} (*) {als|wie} Du.*") {
weapon_qual_temp=%%1
#IF (@weapon_qual_temp = "unglaublich viel viel schlechter") {weapon_qual=-6}
#IF (@weapon_qual_temp = "sehr viel schlechter") {weapon_qual=-5}
#IF (@weapon_qual_temp = "viel schlechter") {weapon_qual=-4}
#IF (@weapon_qual_temp = "deutlich schlechter") {weapon_qual=-3}
#IF (@weapon_qual_temp = "schlechter") {weapon_qual=-2}
#IF (@weapon_qual_temp = "etwas schlechter") {weapon_qual=-1}
#IF (@weapon_qual_temp = "etwa genauso gut") {weapon_qual=" 0"}
#IF (@weapon_qual_temp = "etwas besser") {weapon_qual="+1"}
#IF (@weapon_qual_temp = "besser") {weapon_qual="+2"}
#IF (@weapon_qual_temp = "deutlich besser") {weapon_qual="+3"}
#IF (@weapon_qual_temp = "viel besser") {weapon_qual="+4"}
#IF (@weapon_qual_temp = "sehr viel besser") {weapon_qual="+5"}
#IF (@weapon_qual_temp = "sehr sehr viel besser") {weapon_qual="+6"}
#IF (@weapon_qual_temp = "ueberaus sehr viel besser") {weapon_qual="+7"}
#IF (@weapon_qual_temp = "wahnsinnig viel besser") {weapon_qual="+8"}
#IF (@weapon_qual_temp = "unbeschreiblich viel besser") {weapon_qual="+9"}
#IF (@weapon_qual_temp = "jenseits aller Grenzen viel besser") {weapon_qual=10}
}
;-----------------------
;Grösse
#IF (@s_speicher =~ "*ist etwa (%d)cm gross.") {
s_size=%%1}
;-------------------------------------------------------------------
; Ist das Target nicht mehr absolut fit, rechnen wir mal hoch, wieviel er
; ungefaehr haette...
#if (@schaetz_abs != "10") {
#if (@schaetz_rel_max = "oo") {
#MATH schaetz_calc_temp (@schaetz_rel_min*10)/@schaetz_abs
schaetz_calc_100 " -> Leben~(10): " @schaetz_calc_temp " - oo"
}
#if (@schaetz_rel_max != "oo") {
#MATH schaetz_calc_temp (@schaetz_rel_min*10)/@schaetz_abs
schaetz_calc_100=" -> Leben~(10): " @schaetz_calc_temp " - "
#MATH schaetz_calc_temp (@schaetz_rel_max*10)/@schaetz_abs
schaetz_calc_100=@schaetz_calc_100 @schaetz_calc_temp
}
}
;------------------------------------------------------------------------
; Wie gut ist das Target geschuetzt? (-6 bis +13)
body_qual="??"
#IF (@s_speicher =~ "*Damit ist {er|sie|es} (*) {als|wie} Du geschuetzt.*") {
body_qual_temp=%%1
#IF (@body_qual_temp = "unglaublich viel viel schlechter") {
body_qual="-6"}
#IF (@body_qual_temp = "sehr viel schlechter") {
body_qual="-5"}
#IF (@body_qual_temp = "viel schlechter") {
body_qual="-4"}
#if (@body_qual_temp = "deutlich schlechter") {
body_qual="-3"}
#if (@body_qual_temp = "schlechter") {
body_qual="-2"}
#if (@body_qual_temp = "etwas schlechter") {
body_qual="-1"}
#if (@body_qual_temp = "genauso gut") {
body_qual="+0"}
#if (@body_qual_temp = "ein kleines bisschen besser") {
body_qual="+1"}
#if (@body_qual_temp = "etwas besser") {
body_qual="+2"}
#if (@body_qual_temp = "besser") {
body_qual="+3"}
#if (@body_qual_temp = "deutlich besser") {
body_qual="+4"}
#if (@body_qual_temp = "viel besser") {
body_qual="+5"}
#if (@body_qual_temp = "sehr viel besser") {
body_qual="+6"}
#if (@body_qual_temp = "viel viel besser") {
body_qual="+7"}
#if (@body_qual_temp = "sehr sehr viel besser") {
body_qual="+8"}
#if (@body_qual_temp = "ueberaus sehr viel besser") {
body_qual="+9"}
#if (@body_qual_temp = "unglaublich viel besser") {
body_qual="10"}
#if (@body_qual_temp = "wahnsinnig viel besser") {
body_qual="11"}
#if (@body_qual_temp = "unbeschreiblich viel besser") {
body_qual="12"}
#if (@body_qual_temp = "jenseits aller Grenzen viel besser") {
body_qual="13"}
}
#if (@s_speicher =~ "*ungewoehnlich dicke Haut, bzw. Fell*") {
schaetz_high_body="!("} {schaetz_high_body=" ("}
;-------------------------------------------------------------------------
#SAY @s_target ~(@s_size cm) geschaetzt:
#IF (@schaetz_abs = "10") {
#SAY Leben~(@schaetz_abs): @schaetz_rel_min - @schaetz_rel_max
}
#IF (@schaetz_abs != "10") {
#SAY Leben~(@schaetz_abs): @schaetz_rel_min - @schaetz_rel_max @schaetz_calc_100
}
#SAY Waffe~(@weapon_qual): @schaetz_weapon ~(@schaetz_weapon_dt)
#SAY Body@schaetz_high_body@body_qual):


an example string for 's_speicher' is:
"Liantra ist absolut fit und ist damit etwa genauso stark wie Du. Sie kaempft
mit blossen Haenden. Damit kaempft sie viel schlechter als Du. Liantra traegt
eine Wolldecke, eine Locke aus Merisas Haar, einen Guertel,
einen Mithrilring, eine traumhafte Wespentaille, ein Stuetzkorsett. Damit ist
sie viel schlechter als Du geschuetzt.
Liantra ist etwa 193cm gross."

It seams that the execution will take longer if the string longer is.

So how can i optimize this scripts to take less time for execution

thank you very much
Reply with quote
Vijilante
SubAdmin


Joined: 18 Nov 2001
Posts: 5182

PostPosted: Sat Jun 07, 2003 7:05 am   
 
Egads, my German sucks. Anyhow, many of the tests you are doing are mutually exclusive. This means that only one is possible and you would be better served by using #CASE in these circumstances.

For the second one change your trigger pattern so you don't have to run pattern matching on the line 4 times to get everything you want. From what I see only 3-5 words change, making those what you capture and compare should save a lot, also using an %iskey+%db, or %ismember,%item system of assigning values to your schaetz_abs and schaetz_rel varaiables should accelerate things; the accelaration is provided by only checking the values once. Look at the examples in the help and/or search the forums for some examples of usage.
Reply with quote
blondi
Beginner


Joined: 06 Apr 2003
Posts: 15

PostPosted: Sun Jun 08, 2003 1:51 am   
 
Sorry for asking but i can't see how to do it with a #CASE cause in the help the case is only with a number as index. here i need strings as index und numbers as 'commands'
you can say i nee a backward case
Reply with quote
Vijilante
SubAdmin


Joined: 18 Nov 2001
Posts: 5182

PostPosted: Sun Jun 08, 2003 3:48 am   
 
I will give you an example of what to look for in the help.

Your script portion:
; Wie gut ist das Target geschuetzt? (-6 bis +13)
body_qual="??"
#IF (@s_speicher =~ "*Damit ist {er|sie|es} (*) {als|wie} Du geschuetzt.*") {
body_qual_temp=%%1
#IF (@body_qual_temp = "unglaublich viel viel schlechter") {body_qual="-6"}
#IF (@body_qual_temp = "sehr viel schlechter") {body_qual="-5"}
#IF (@body_qual_temp = "viel schlechter") {body_qual="-4"}
#if (@body_qual_temp = "deutlich schlechter") {body_qual="-3"}
#if (@body_qual_temp = "schlechter") {body_qual="-2"}
#if (@body_qual_temp = "etwas schlechter") {body_qual="-1"}
#if (@body_qual_temp = "genauso gut") {body_qual="+0"}
#if (@body_qual_temp = "ein kleines bisschen besser") {body_qual="+1"}
#if (@body_qual_temp = "etwas besser") {body_qual="+2"}
#if (@body_qual_temp = "besser") {body_qual="+3"}
#if (@body_qual_temp = "deutlich besser") {body_qual="+4"}
#if (@body_qual_temp = "viel besser") {body_qual="+5"}
#if (@body_qual_temp = "sehr viel besser") {body_qual="+6"}
#if (@body_qual_temp = "viel viel besser") {body_qual="+7"}
#if (@body_qual_temp = "sehr sehr viel besser") {body_qual="+8"}
#if (@body_qual_temp = "ueberaus sehr viel besser") {body_qual="+9"}
#if (@body_qual_temp = "unglaublich viel besser") {body_qual="10"}
#if (@body_qual_temp = "wahnsinnig viel besser") {body_qual="11"}
#if (@body_qual_temp = "unbeschreiblich viel besser") {body_qual="12"}
#if (@body_qual_temp = "jenseits aller Grenzen viel besser") {body_qual="13"}
}

Can be replaced with:
#VAR body_quals {unglaublich viel viel schlechter|sehr viel schlechter|viel schlechter|deutlich schlechter|schlechter|etwas schlechter|genauso gut|ein kleines bisschen besser|etwas besser|besser|deutlich besser|viel besser|sehr viel besser|viel viel besser|sehr sehr viel besser|ueberaus sehr viel besser|unglaublich viel besser|wahnsinnig viel besser|unbeschreiblich viel besser|jenseits aller Grenzen viel besser}
; Wie gut ist das Target geschuetzt? (-6 bis +13)
body_qual="??"
#IF (@s_speicher =~ "*Damit ist {er|sie|es} (*) {als|wie} Du geschuetzt.*") {
body_qual_temp=%%1
body_qual=%eval(%ismember(@body_qual_temp,@body_quals)-7)
#IF (%len(@body_qual)=1) {body_qual=%concat("+",@body_qual)}

The sections that set your schaetz_abs & schaetz_rel variables should be rewritten using string lists that are matched in the pattern of the trigger. I am guessing a full line or so is captured into the s_spiecher variable, and that line might look something like this:
Blah blah blah ist leicht geschwaecht und ist damit etwa genauso stark wie Du. Blah blah blah

By using string list and the {@variable} wildcard in the pattern you can capture just the portions that need to be compared and use %ismember, with #CASE or %eval as appropiate to assign your output variables.

When you find those types of optimizations impossible you can reduce the number of test you do to reach a result by using an if-else chain. Example:
#IF (@a=1) {b=6} {
#IF (@a=3) {b=2} {
#IF (@a=7) {b=-3} {
b=21
}
}
}
Further you can develop a tree to shorten the number of tests:
#IF (%pos("develop", @a) {
#IF (@a="can develop") {b=3} {
#IF (@a="development") {b=7} {
b=2
}
}
} {
#IF (%pos("loading", @a) {
#IF (@a="unloading") {b=-1} {b=23}
} {
b=0
}
}

Those are just a few ways to do it. Trigger specificity and comparing only the data you must the fewest times possible is how you get things to go fast.
Reply with quote
blondi
Beginner


Joined: 06 Apr 2003
Posts: 15

PostPosted: Sun Jun 08, 2003 12:59 pm   
 
Thank your very much I got it the first Script is much faster an shorter:


Trigger:
(*):({ weit entfernt von| noch laengst nicht| bald schon| fast|})({ absolut superuebel| superuebel| sehr sehr uebel| sehr uebel| uebel| sehr sehr schlecht| sehr schlecht| schlecht| maessig| durchschnittlich| befriedigend| sehr befriedigend| recht gut| ganz gut| gut| sehr gut| ausgezeichnet| hervorragend| perfekt| absolut perfekt})$
with the following scipt


#GAG
ks3=%trimleft( %2)
ks4=%trimleft( %3)
ks2=%1
ks_abzug=0
ks_gesamt=%eval( (%ismember( @ks4, @skills_base)*5)-%ismember( @ks3, @skills_abzug))
#SAY @ks2: @ks_gesamt% ~(@ks3 @ks4)
#COLOR 23


The skills_base and the skills_abzug are the string lists

----
Fo the second script and the schaetz_rel_xxx vars i tried it with a Var (s_lp_rel_1):

absolut, unglaublich schwaecher=0|unglaublich schwaecher=-199|sehr viel schwaecher=-149....

and a %db(s_lp_rel_1,"sehr viel schwächer") or
%db(@s_lp_rel_1,"sehr viel schwächer")

but that give's me back an emty string
Reply with quote
blondi
Beginner


Joined: 06 Apr 2003
Posts: 15

PostPosted: Sun Jun 08, 2003 2:40 pm   
 
oh i see my error %db("sehr viel schwächer",@s_lp_rel_1) i mixed it up.

Now i have it, i put all things in stringlists
and for the schaetz_rel_xxx i made one stringlist for the patterns, get the number out ther with an %ismember, and then use the number du get the Value out of 2 other stringlists for schaetz_rel_min an _max Vars
Reply with quote
Display posts from previous:   
Post new topic   Reply to topic     Home » Forums » zMUD General Discussion All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© 2009 Zugg Software. Hosted by Wolfpaw.net