Battle Condenser
Printed From: Dark and Shattered Lands (DSL)
Category: Mud Client Help
Forum Name: Mac Client Scripts
Forum Description: (scripts for Mac Clients)
URL: http://www.dsl-mud.org/forum/forum_posts.asp?TID=60043
Printed Date: 17 February 2025 at 8:14am Software Version: Web Wiz Forums 10.17 - http://www.webwizforums.com
Topic: Battle Condenser
Posted By: gnome power
Subject: Battle Condenser
Date Posted: 10 March 2012 at 1:00am
Functions of this program:
1. Redirect combat spam to a miniconsole in small font, so you can tell at a glance what the combat looks like, but you aren't spammed by it in your main console window.
2. Echo condensed combat round summaries in your main console, which is robust to any number of attackers, any number of targets, any number of weapon nouns, skills etc. Reports attacker, victim, total damage, number of hits, number of attempted hits, weapon nouns, and flags.
3. Generates HP, MP, and MV visual meters that adjust in real time.
4. If under the Killing Rage status, the HP bar converts to a display that reports the total damage you have taken since raging, and the number of hp vamp flags you have inflicted since raging. This resets as soon as your rage drops.
5. Generates a tick timer meter that adjusts in real time.
6. Gags unnecessary text, such as dodges, parries, chain arcs, etc.
7. Generates an xp meter that changes in real time. (You have to type score once and let it capture your character level in order to calibrate itself.)
note: As it is, this script is subject to a couple stipulations:
a. Your prompt must be a specific format: %T-(charactername) <%h/%H %m/%M %v/%V> (%S) [%e] (%X/%x)%c
b. You can't just pick and choose parts of the script to put in, unfortunately. As it stands now, the prompt, tick timer, and condenser components are connected and removing any one will break the system.
c. This script is long, so prepare for a long post... |
Steps to install:
1. In the Triggers tab, add a new group called Battle Condenser Script, and leave it empty.
In this Triggers tab, add the following items and input the following information:
a.
name: Battle Damage Analyzer
regex field 0:
^(Your|[a-zA-Z\s\']+\'s) ([a-zA-Z]+\s?[a-zA-Z]*) (does\sGHASTLY\sthings\sto|does\sHORRID\sthings\sto|does\sDREADFUL\sthings\sto|does\sHIDEOUS\sthings\sto|does\sINDESCRIBABLE\sthings\sto|does\sUNSPEAKABLE\sthings\sto|misses|scratches|grazes|hits|injures|wounds|mauls|decimates|devastates|maims|MUTILATES|DISEMBOWELS|DISMEMBERS|MASSACRES|MANGLES|\*\*\*\sDEMOLISHES*\s\*\*\*|\*\*\*\sDEVASTATES*\s\*\*\*|\=\=\=\sOBLITERATES*\s\=\=\=|\>\>\>\sANNIHILATES\s\<\<\<|\<\<\<\sERADICATES\s\>\>\>) ([-a-zA-Z\'\s]+)([\.!])$ |
regex field 1:
^([a-zA-Z\s]+) (do[es]*\sGHASTLY\sthings\sto|do[es]*\sHORRID\sthings\sto|do[es]*\sDREADFUL\sthings\sto|do[es]*\sHIDEOUS\sthings\sto|do[es]*\sINDESCRIBABLE\sthings\sto|do[es]*\sUNSPEAKABLE\sthings\sto|miss[es]*|scratch[es]*|graze[s]*|hit[s]*|injure[s]*|wound[s]*|maul[s]*|decimate[s]*|devastate[s]*|maim[s]*|MUTILATE[S]*|DISEMBOWEL[S]*|DISMEMBER[S]*|MASSACRE[S]*|MANGLE[S]*|\*\*\*\sDEMOLISH[ES]*\s\*\*\*|\*\*\*\sDEVASTATE[S]*\s\*\*\*|\=\=\=\sOBLITERATE[S]*\s\=\=\=|\>\>\>\sANNIHILATE[S]*\s\<\<\<|\<\<\<\sERADICATE[S]*\s\>\>\>) ([-a-zA-Z\'\s]+)([\.!])$ |
(Don't forget to set both pulldown menus to perl regex)
Then add the following script to the main field:
--gnome power 3/9/12 version of battle condenser
damAssign = 0
punctuation=""
tail = ""
color = "olive_drab"
predam=""
deleteLine()
if rex.match(matches[6],"[.!]") then
attacker = matches[2]
noun = matches[3]
damVerb = matches[4]
damTarget = matches[5]
punctuation = matches[6]
else
attacker = matches[2]
noun = ""
damVerb = matches[3]
damTarget = matches[4]
punctuation = matches[5]
end
if rex.match(attacker,"'s") then
attacker = string.sub(attacker, 1, -3) -- chop two last letters off
end
if rex.match(damVerb,"scratch[es]*") then
damAssign = 2.5
color = "green"
elseif rex.match(damVerb,"graze[s]*") then
damAssign = 6.5
color = "green"
elseif rex.match(damVerb,"hit[s]*") then
damAssign = 10.5
color = "green"
elseif rex.match(damVerb,"injure[s]*") then
damAssign = 14.5
color = "green"
elseif rex.match(damVerb,"wound[s]*") then
damAssign = 18.5
color = "green"
elseif rex.match(damVerb,"maul[s]*") then
damAssign = 22.5
color = "green"
elseif rex.match(damVerb,"decimate[s]*") then
damAssign = 26.5
color = "green"
elseif rex.match(damVerb,"devastate[s]*") then
damAssign = 30.5
color = "green"
elseif rex.match(damVerb,"maim[s]*") then
damAssign = 34.5
color = "green"
elseif rex.match(damVerb,"MUTILATE[S]*") then
damAssign = 38.5
color = "yellow"
elseif rex.match(damVerb,"DISEMBOWEL[S]*") then
damAssign = 42.5
color = "yellow"
elseif rex.match(damVerb,"DISMEMBER[S]*") then
damAssign = 46.5
color = "yellow"
elseif rex.match(damVerb,"MASSACRE[S]*") then
damAssign = 50.5
color = "yellow"
elseif rex.match(damVerb,"MANGLE[S]*") then
damAssign = 54.5
color = "yellow"
elseif rex.match(damVerb,"DEMOLISH[ES]") then
damAssign = 58.5
predam = "*** "
color = "red"
tail = " ***"
if rex.match(damVerb,"DEMOLISHES") then damVerb = "DEMOLISHES"
elseif rex.match(damVerb,"DEMOLISH") then damVerb = "DEMOLISH" end
elseif rex.match(damVerb,"DEVASTATE[S]") then
damAssign = 68
predam = "*** "
color = "red"
tail = " ***"
if rex.match(damVerb,"DEVASTATES") then damVerb = "DEVASTATES"
elseif rex.match(damVerb,"DEVASTATE") then damVerb = "DEVASTATE" end
elseif rex.match(damVerb,"OBLITERATE[S]") then
damAssign = 88
predam = "=== "
color = "red"
tail = " ==="
damVerb = "OBLITERATES"
elseif rex.match(damVerb,"ANNIHILATE[S]*") then
damAssign = 113
predam = ">>> "
color = "red"
tail = " <<<"
if rex.match(damVerb,"ANNIHILATES") then damVerb = "ANNIHILATES"
elseif rex.match(damVerb,"ANNIHILATE") then damVerb = "ANNIHILATE" end
elseif rex.match(damVerb,"ERADICATE[S]") then
damAssign = 138
predam = "<<< "
color = "red"
tail = " >>>"
if rex.match(damVerb,"ERADICATES") then damVerb = "ERADICATES"
elseif rex.match(damVerb,"ERADICATE") then damVerb = "ERADICATE" end
elseif rex.match(damVerb,"GHASTLY") then
damAssign = 163
damVerb = "GHASTLY"
elseif rex.match(damVerb,"HORRID") then
damAssign = 188
damVerb = "HORRID"
elseif rex.match(damVerb,"DREADFUL") then
damAssign = 213
damVerb = "DREADFUL"
elseif rex.match(damVerb,"HIDEOUS") then
damAssign = 238
damVerb = "HIDEOUS"
elseif rex.match(damVerb,"INDESCRIBABLE") then
damAssign = 263
damVerb = "INDESCRIBABLE"
elseif rex.match(damVerb,"UNSPEAKABLE") then
damAssign = 276
damVerb = "UNSPEAKABLE"
end
cecho("battle_window",attacker .. " ".. noun .." ".. predam .."<"..color..">" ..damVerb .."<white>" .. tail .. " " .. damTarget .. punctuation .. " [ " .. damAssign .. " ]\n") --reports damage into the miniconsole
if not battle_data then
battle_data = {}
end
if not battle_data[attacker] then
battle_data[attacker]= {}
end
if not battle_data[attacker][damTarget] then
battle_data[attacker][damTarget]= {}
end
if not battle_data[attacker][damTarget][noun] then
battle_data[attacker][damTarget][noun]= {}
end
if not battle_data[attacker][damTarget][noun]["hits"] then
battle_data[attacker][damTarget][noun]["hits"]= 0
end
if not battle_data[attacker][damTarget][noun]["misses"] then
battle_data[attacker][damTarget][noun]["misses"]= 0
end
if damAssign > 0 then
battle_data[attacker][damTarget][noun]["hits"] = battle_data[attacker][damTarget][noun]["hits"] + 1
else
battle_data[attacker][damTarget][noun]["misses"] = battle_data[attacker][damTarget][noun]["misses"] + 1
end --if
if not battle_data[attacker][damTarget][noun]["total_hits"] then
battle_data[attacker][damTarget][noun]["total_hits"]=0
end
battle_data[attacker][damTarget][noun]["total_hits"] = battle_data[attacker][damTarget][noun]["total_hits"] + 1
if not battle_data[attacker][damTarget][noun]["dam"] then
battle_data[attacker][damTarget][noun]["dam"] = 0
end
battle_data[attacker][damTarget][noun]["dam"] = battle_data[attacker][damTarget][noun]["dam"] + damAssign
if tostring(promptCurrentHP) == "???" then
if not damageTaken then
damageTaken = 0
end
if rex.match(damTarget,"[Yy]ou[r]*") then
damageTaken = damageTaken + damAssign
end
else
damageTaken = 0
end
|
|
Replies:
Posted By: gnome power
Date Posted: 10 March 2012 at 1:01am
b. Add item
name: Enemy Battle Evasion Counter
regex 0 (remember to set everything to "perl regex" pulldown menu option):
^You parry ([a-zA-Z\s\']+) attack. |
regex 1:
^You block ([a-zA-Z\s\']+) attack with your shield. |
regex 2:
^You dodge ([a-zA-Z\s\']+) attack. |
(note: this doesn't count danger senses currently. The echos don't allow you to know who the attacker is, so I'm not sure how to deal with that. Suggestions are welcome.)
main script:
attacker = matches[2]if rex.match(attacker,"'s") then attacker = string.sub(attacker, 1, -3) -- chop two last letters off end --attacker = attacker:gsub("^%l", string.upper) -- uppercase first letter only if not battle_data then battle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker]["you"] then battle_data[attacker]["you"] = {} end if not battle_data[attacker]["you"]["evaded"] then battle_data[attacker]["you"]["evaded"] = {} end if not battle_data[attacker]["you"]["evaded"]["misses"] then --battle_data[attacker]["you"]["evaded"]["misses"] = {} battle_data[attacker]["you"]["evaded"]["misses"] = 0 end battle_data[attacker]["you"]["evaded"]["misses"] = battle_data[attacker]["you"]["evaded"]["misses"] + 1 |
c. New item
name: My Battle Evasion Counter
perl regex 0:
^([a-zA-Z\s\']+) dodges your attack. |
perl regex 1:
^([a-zA-Z\s\']+) parries your attack. |
perl regex 2:
^([a-zA-Z\s\']+) blocks your attack with a shield. |
perl regex 3:
^([a-zA-Z\s\']+) senses they're about to be hit and deflects the blow. |
main field:
if matches[2] ~= nil thendamTarget = matches[2] end if not battle_data then battle_data = battle_data or {} end if not battle_data["You"] then battle_data["You"] = {} end if not battle_data["You"][damTarget] then battle_data["You"][damTarget] = {} end if not battle_data["You"][damTarget]["evaded"] then battle_data["You"][damTarget]["evaded"] = {} end if not battle_data["You"][damTarget]["evaded"]["total_hits"] then --battle_data["You"][damTarget]["evaded"]["total_hits"] = {} battle_data["You"][damTarget]["evaded"]["total_hits"] = 0 end battle_data["You"][damTarget]["evaded"]["total_hits"] = battle_data["You"][damTarget]["evaded"]["total_hits"] + 1 deleteLine() |
d. new item:
name: Lightning Flag Counter
regex 0:
^([a-zA-Z\s\']+) is struck by lightning from ([a-zA-Z\s\']+) |
(Note: I haven't added the regex for getting hit by lightning flag or several other flags. If you provide these echos to me I can add them.)
main field:
if not battle_data thenbattle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker][damTarget] then battle_data[attacker][damTarget]= {} end if not battle_data[attacker][damTarget][noun] then battle_data[attacker][damTarget][noun]= {} end if not battle_data[attacker][damTarget][noun]["L"] then battle_data[attacker][damTarget][noun]["L"] = {} end battle_data[attacker][damTarget][noun]["L"] = 1 deleteLine() |
e. new item
name: flaming flag counter
perl regex 0:
^([a-zA-Z\s\']+) is burned by ([a-zA-Z\s\']+) |
f. new item
name: hp vamp flag counter
perl regex 0:
^([a-zA-Z\s\']+) draws life from ([a-zA-Z\s\']+) |
perl regex 1:
^You feel ([a-zA-Z\s\']+) drawing your life away. |
main field:
if not battle_data thenbattle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker][damTarget] then battle_data[attacker][damTarget]= {} end if not battle_data[attacker][damTarget][noun] then battle_data[attacker][damTarget][noun]= {} end if not battle_data[attacker][damTarget][noun]["H"] then battle_data[attacker][damTarget][noun]["H"] = {} end battle_data[attacker][damTarget][noun]["H"] = 1 deleteLine() if promptCurrentHP == "???" then if not hpVamps then hpVamps = 0 end if rex.match(attacker,"[Yy]ou[r]*") then hpVamps = hpVamps + 1 end else hpVamps = 0 end |
g. new item
name: Mana Vamp Flag Counter
perl regex 0:
^You feel something drawing your energy away |
perl regex 1:
^([a-zA-Z\s\']+) draws energy from ([a-zA-Z\s\']+) |
main field:
if not battle_data thenbattle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker][damTarget] then battle_data[attacker][damTarget]= {} end if not battle_data[attacker][damTarget][noun] then battle_data[attacker][damTarget][noun]= {} end if not battle_data[attacker][damTarget][noun]["M"] then battle_data[attacker][damTarget][noun]["M"] = {} end battle_data[attacker][damTarget][noun]["M"] = 1 deleteLine() |
h. new item
name: stun flag counter
perl regex 0:
^([a-zA-Z\s\']+) is knocked to the ground by ([a-zA-Z\s\']+) |
(note: This script is specifically designed not to gag the stun echo)
if not battle_data thenbattle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker][damTarget] then battle_data[attacker][damTarget]= {} end if not battle_data[attacker][damTarget][noun] then battle_data[attacker][damTarget][noun]= {} end if not battle_data[attacker][damTarget][noun]["S"] then battle_data[attacker][damTarget][noun]["S"] = {} end battle_data[attacker][damTarget][noun]["S"] = 1 |
i. new item
name: Freeze Flag Counter
perl regex 0:
^([a-zA-Z\s\']+) freezes ([a-zA-Z\s\']+) |
main field:
if not battle_data thenbattle_data = battle_data or {} end if not battle_data[attacker] then battle_data[attacker]=battle_data[attacker] or {} end if not battle_data[attacker][damTarget] then battle_data[attacker][damTarget]= {} end if not battle_data[attacker][damTarget][noun] then battle_data[attacker][damTarget][noun]= {} end if not battle_data[attacker][damTarget][noun]["F"] then battle_data[attacker][damTarget][noun]["F"] = {} end battle_data[attacker][damTarget][noun]["F"] = 1 deleteLine() |
j. new item
name: condition tracker
perl regex 0:
([a-zA-Z\s']+) is in excellent condition.[\s]*$ |
perl regex 1:
([a-zA-Z\s']+) has a few scratches.[\s]*$ |
perl regex 2:
([a-zA-Z\s']+) has some small wounds and bruises.[\s]*$ |
perl regex 3:
([a-zA-Z\s']+) has quite a few wounds.[\s]*$ |
perl regex 4:
([a-zA-Z\s']+) has some big nasty wounds and scratches.[\s]*$ |
perl regex 5:
([a-zA-Z\s']+) looks pretty hurt.[\s]*$ |
perl regex 6:
([a-zA-Z\s']+) is in awful condition.[\s]*$ |
perl regex 7:
^([a-zA-Z\s\']+) is DEAD!! |
main field:
percentage = ""wascondition = 0 conditiontext ="" if not rex.match(matches[1],"is DEAD") then isDead = 0 else isDead = 1 end if battle_data then deleteLine() outputDamage() battle_data = nil if rex.match(matches[1],"excellent condition") then percentage = " [<green>100%<white>]" wascondition = 1 conditiontext = " is in excellent condition." elseif rex.match(matches[1],"few scratches") then percentage = " [<green>90-99%<white>]" wascondition = 1 conditiontext = " has a few scratches." elseif rex.match(matches[1],"has some small wounds and bruises") then percentage = " [<green>75-89%<white>]" wascondition = 1 conditiontext = " has some small wounds and bruises." elseif rex.match(matches[1],"has quite a few wounds") then percentage = " [<green>50-74%<white>]" wascondition = 1 conditiontext = " has quite a few wounds." elseif rex.match(matches[1],"has some big nasty wounds and scratches") then percentage = " [<green>30-49%<white>]" wascondition = 1 conditiontext = " has some big nasty wounds and scratches." elseif rex.match(matches[1],"looks pretty hurt") then percentage = " [<green>15-29%<white>]" wascondition = 1 conditiontext = " looks pretty hurt." elseif rex.match(matches[1],"is in awful condition") then percentage = " [<green>0-14%<white>]" wascondition = 1 conditiontext = " is in awful condition." end end if wascondition == 1 then if isDead == 0 then cecho("<red>"..tostring(matches[2]).."<white>"..tostring(conditiontext)..tostring(percentage)) else cecho("<red>"..tostring(matches[2]).."<white>"..tostring(conditiontext)) end end cecho("battle_window","\n") --puts a space into the miniconsole if isDead == 1 then cecho("battle_window",tostring(matches[2]).." is DEAD!! \n\n") cecho("<purple>"..tostring(matches[2]).." is DEAD!! <white>\n") end |
k. new item
name: Combat Text Gag
perl regex 0:
^You parry ([a-zA-Z\s\']+) attack. |
perl regex 1:
You block ([a-zA-Z\s\']+) attack with your shield. |
perl regex 2:
You dodge ([a-zA-Z\s\']+) attack. |
perl regex 3:
^([-a-zA-Z\s\']+)dodges your attack. |
perl regex 4:
^([a-zA-Z\s\']+)parries your attack. |
perl regex 5:
^([a-zA-Z\s\']+)blocks your attack with a shield. |
perl regex 6:
^([a-zA-Z\s\']+)senses they're about to be hit and deflects the blow. |
perl regex 7:
^([a-zA-Z\s\']+)senses your attack coming and avoids its blow. |
perl regex 9:
^A lightning bolt leaps from your hand and arcs to |
perl regex 10:
You sense you're about to be hit and deflect the blow. |
perl regex 11:
You sense an attack coming and avoid its blow. |
perl regex 12:
A lightning bolt leaps from ([a-zA-Z\s\']+) hand and arcs to ([a-zA-Z\s\']+). |
|
Posted By: gnome power
Date Posted: 10 March 2012 at 1:02am
2. In triggers tab, Add Group and call it Prompt. In this folder,
a. create new item
name: Parse Prompt
perl regex 0:
^[Quiet\s]*([0-9]+):([0-9]+)([amp]+)-\(([a-zA-Z\s']+)\) \<([?\d]+)\/([?\d]+) (\d+)\/(\d+) (\d+)\/(\d+)\> \((\w+)\) \[([a-zA-Z0-9-]*)\] \((\d+)/(\d+)\) |
main script:
--prompt %T-(name) <%h/%H %m/%M %v/%V> (%S) [%e] (%X/%x)%cpromptHours = matches[2] promptMin = matches[3] promptAMPM = matches[4] promptName = matches[5] promptCurrentHP = matches[6] promptMaxHP = matches[7] promptCurrentMP = matches[8] promptMaxMP = matches[9] promptCurrentMV = matches[10] promptMaxMV = matches[11] promptStance = matches[12] promptDirs = matches[13] promptCurrentXP = matches[14] promptTotalXP = matches[15] refreshStatBars() if promptCurrentHP == "???" then if not damageTaken then damageTaken = 0 end if not hpVamps then hpVamps = 0 end setGauge("hp_bar", 1, 1,"<font color=\"white\">Dam: "..tostring(damageTaken).." V: "..tostring(hpVamps)) else setGauge("hp_bar", promptCurrentHP, promptMaxHP,"<font color=\"white\">"..promptCurrentHP.." / "..promptMaxHP.." HP") end setGauge("mana_bar", promptCurrentMP, promptMaxMP,"<font color=\"white\">"..promptCurrentMP.." / "..promptMaxMP.." MP") setGauge("end_bar", promptCurrentMV, promptMaxMV,"<font color=\"white\">"..promptCurrentMV.." / "..promptMaxMV.." MV") charLevel = charLevel or 42 setGauge("xp_bar", promptCurrentXP, (promptCurrentXP+promptTotalXP)/charLevel,"<font color=\"white\">"..promptCurrentXP.." tnl (setLevel: "..charLevel..")") if (promptMin ~= last_time) then last_time = promptMin echo("\nTick change\n") if current_tick_timer then killTimer(current_tick_timer) current_tick_timer = nil end incrementGauge("tick_bar",37,.1) --gauge name, remaining tick time, increment end -- display time to tick if less than 5 seconds if remainingTime < 5 then echo("\nTick in " .. remainingTime .. " seconds.\n") end if battle_data then outputDamage() battle_data = nil end |
b. Add Item
name: Level Up
perl regex 0:
main script:
charLevel = charLevel + 1 |
c. Add item
name: Set My Level
perl regex 0:
main script:
if charLevel ~= matches[2] thencharLevel = matches[2] echo("Level set to "..charLevel) end |
3. In "Scripts" tab, Add New Group called Battle Condenser. In this folder, paste this to main script field:
function outputDamage()if battle_data then echo("\n") end for attackers, damTargets in pairs (battle_data) do --convert "You" and "Your" to character name for attacker myName = tostring(attackers) if rex.match(tostring(attackers),"[Yy]ou[r]*") then attackerName = tostring(promptName) else attackerName = tostring(attackers) end for victims, nouns in pairs (damTargets) do hitTot = 0 totHitTot = 0 damageTot = 0 flagreport = "" nounList = nil --convert "You" and "Your" to character name for victim if rex.match(tostring(victims),"[Yy]ou[r]*") then victimName = tostring(promptName) else victimName = tostring(victims) end for nountypes, info in pairs (nouns) do --generate flag results if info["L"] == 1 then if not rex.match(tostring(flagreport),"L") then flagreport = tostring(flagreport).."<gold>L<white>" end end if info["F"] == 1 then if not rex.match(tostring(flagreport),"F") then flagreport = tostring(flagreport).."<red>F<white>" end end if info["H"] == 1 then if not rex.match(tostring(flagreport),"H") then flagreport = tostring(flagreport).."<cornsilk>H<white>" end end if info["M"] == 1 then if not rex.match(tostring(flagreport),"M") then flagreport = tostring(flagreport).."<deep_pink>M<white>" end end if info["S"] == 1 then if not rex.match(tostring(flagreport),"S") then flagreport = tostring(flagreport).."<dark_orchid>S<white>" end end if info["F"] == 1 then if not rex.match(tostring(flagreport),"F") then flagreport = tostring(flagreport).."<powder_blue>F<white>" end end if not rex.match(tostring(nountypes),"evaded") then if not rex.match(tostring(nountypes),"nil") then if not nounList then nounList = tostring(nountypes) elseif not rex.match(tostring(nountypes),tostring(Nounlist)) then nounList = tostring(nounList)..", "..tostring(nountypes) end end end --sum up the damage, hits, and total_hits if info.dam then if info.dam > 0 then damageTot = damageTot + info.dam end end if info.hits then hitTot = hitTot + info.hits end if info.total_hits then totHitTot = totHitTot + info.total_hits end end --output for specific attacker/victim combination --nounList = string.sub(nounList, 1, 3) -- chop two first letters off if hitTot > 0 then cecho("<light_blue>"..tostring(attackerName).."<white> => <red>"..tostring(victimName).."<white>: "..tostring(damageTot).." ("..tostring(hitTot).."/"..tostring(totHitTot)..") ["..tostring(nounList).."] "..tostring(flagreport).."\n") end end end end |
4. In Scripts tab, add new group called Tick Timer. Paste to main script field:
function incrementGauge(inputGauge,totalTime,timeIncrementationInput)timeIncrementation = timeIncrementationInput or 0.1 remainingTime = totalTime or 42 gauge = inputGauge if remainingTime > 0 then current_tick_timer = tempTimer(timeIncrementation, [[ remainingTime = remainingTime - timeIncrementation remainingTime = round(remainingTime,1) setGauge(gauge,remainingTime, 41, "<font color=\"white\">Tick: "..remainingTime) incrementGauge(gauge,remainingTime,timeIncrementation)]]) end end |
5. In Scripts tab, add new group called Create Gauge Bars. Paste to main script field:
function create_hp_bar(x,y)createGauge("hp_bar", 0, 0, 0, 0, nil, "red") moveGauge("hp_bar", x,y) resizeGauge("hp_bar", 150, 20) setGaugeStyleSheet("hp_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f04141, stop: 0.1 #ef2929, stop: 0.49 #cc0000, stop: 0.5 #a40000, stop: 1 #cc0000); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #bd3333, stop: 0.1 #bd2020, stop: 0.49 #990000, stop: 0.5 #700000, stop: 1 #990000); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_group_hp_bar(name, x,y) createGauge(name.."_hp_bar", 0, 0, 0, 0, nil, "red") moveGauge(name.."_hp_bar", x,y) resizeGauge(name.."_hp_bar", 100, 5) setGaugeStyleSheet(name.."_hp_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f04141, stop: 0.1 #ef2929, stop: 0.49 #cc0000, stop: 0.5 #a40000, stop: 1 #cc0000); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #bd3333, stop: 0.1 #bd2020, stop: 0.49 #990000, stop: 0.5 #700000, stop: 1 #990000); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_group_mana_bar(name,x,y) createGauge(name.."_mana_bar", 0, 0, 0, 0, nil, "blue") moveGauge(name.."_mana_bar", x,y) resizeGauge(name.."_mana_bar", 100, 5) setGaugeStyleSheet(name.."_mana_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #414df0, stop: 0.1 #1120ee, stop: 0.49 #0d17a0, stop: 0.5 #030963, stop: 1 #0d17a0); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #646bce, stop: 0.1 #454dbf, stop: 0.49 #323781, stop: 0.5 #1d1f49, stop: 1 #323781); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_mana_bar(x,y) createGauge("mana_bar", 0, 0, 0, 0, nil, "blue") moveGauge("mana_bar", x,y) resizeGauge("mana_bar", 150, 20) setGaugeStyleSheet("mana_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #414df0, stop: 0.1 #1120ee, stop: 0.49 #0d17a0, stop: 0.5 #030963, stop: 1 #0d17a0); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #646bce, stop: 0.1 #454dbf, stop: 0.49 #323781, stop: 0.5 #1d1f49, stop: 1 #323781); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_end_bar(x,y) createGauge("end_bar", 0, 0, 0, 0, nil, "green") moveGauge("end_bar", x,y) resizeGauge("end_bar", 150, 20) setGaugeStyleSheet("end_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #98f041, stop: 0.1 #8cf029, stop: 0.49 #66cc00, stop: 0.5 #52a300, stop: 1 #66cc00); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #78bd33, stop: 0.1 #6ebd20, stop: 0.49 #4c9900, stop: 0.5 #387000, stop: 1 #4c9900); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_tick_bar(x,y) createGauge("tick_bar", 0, 0, 0, 0, nil, "gray") moveGauge("tick_bar", x,y) resizeGauge("tick_bar", 300, 5) setGaugeStyleSheet("tick_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dcdde0, stop: 0.1 #bdbec1, stop: 0.49 #999a9f, stop: 0.5 #707175, stop: 1 #999a9f); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4e5055, stop: 0.1 #383a3d, stop: 0.49 #2a2b2c, stop: 0.5 #0d0d0d, stop: 1 #2a2b2c); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function create_xp_bar(x,y) createGauge("xp_bar", 0, 0, 0, 0, nil, "gray") moveGauge("xp_bar", x,y) resizeGauge("xp_bar", 150, 5) setGaugeStyleSheet("xp_bar", [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #de7ffa, stop: 0.1 #cc3cf6, stop: 0.49 #b511e4, stop: 0.5 #5a0971, stop: 1 #b511e4); border-top: 1px black solid; border-left: 1px black solid; border-bottom: 1px black solid; border-radius: 7; padding: 3px;]], [[background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e1bda3, stop: 0.1 #c98b5e, stop: 0.49 #a76739, stop: 0.5 #7a4e2e, stop: 1 #a76739); border-width: 1px; border-color: black; border-style: solid; border-radius: 7; padding: 3px;]]) end function refreshStatBars() create_hp_bar(0,550) create_mana_bar(150,550) create_end_bar(300,550) end |
(note: you can change the coordinates of create_hp_bar, create_mana_bar, and create_end_bar in function refreshStatBars() in order to put them on different pixels on your screen.)
6. in Scripts tab, add new group named Math, and paste this into main script field:
function round(num, idp)if idp and idp>0 then local mult = 10^idp return math.floor(num * mult + 0.5) / mult end return math.floor(num + 0.5) end |
7. in Scripts tab, add new group named onConnect, and paste this into main script field (NOTE: IF you already have an onConnect function from different code floating around this forum, you don't want to duplicat ethat function. Instead, just add the functions in here that you don't have already to your existing onConnect function)
function onConnect()window_w, window_h = getMainWindowSize() create_tick_bar(0,570) create_xp_bar(300,570) createConsole("battle_window", 8, 80, 25, 493, 320) refreshStatBars() global_width, global_height = getMainWindowSize() global_width = global_width - 15 global_chatPosX = global_width - global_chatWidth global_chatPosY = 0 end |
(NOTE2: you can change the position of tick bar and xp bar by adjusting the coordinates in the create_tick_bar(x,y) and create_xp_bar(x,y) functions respectively. Also, you can adjust the position and size of the battle spam miniconsole by adjusting the numbers in that function) ----
And then you're done!
Any questions and suggestions for future design adjustments are welcome.
|
Posted By: Jeckyl
Date Posted: 10 March 2012 at 1:53am
Where is a good source to learn this from scratch? :p
------------- <-- This is what happens when you try to pk with the Illuminati.
--
If we changed everything that everyone whined about, DSL would be a kitten paradise and there would be minutely copyovers. -Bioteq
|
Posted By: gnome power
Date Posted: 10 March 2012 at 1:58am
I only just learned Lua over the weekend. Just scoured google until stuff made sense. Asked a couple questions in the Mudlet forums.
|
Posted By: Jeckyl
Date Posted: 10 March 2012 at 12:39pm
import/export functionality == much easier. :p
I got it up, going to go through the code and figure it out (if I can).
Thanks!
------------- <-- This is what happens when you try to pk with the Illuminati.
--
If we changed everything that everyone whined about, DSL would be a kitten paradise and there would be minutely copyovers. -Bioteq
|
Posted By: gnome power
Date Posted: 10 March 2012 at 12:44pm
Cool, if you have any questions let me know.
I didn't do the export because I had trouble installing other people's xml files when I first got mudlet. Is there a trick to it?
|
Posted By: Ashtai
Date Posted: 15 March 2012 at 1:12pm
Is there a reason you formatted your regular expressions like that?
-------------
|
Posted By: gnome power
Date Posted: 15 March 2012 at 2:20pm
Feel free to improve it, but I made the damage specific because a more general form would catch undesirable strings.
|
Posted By: Drax
Date Posted: 15 March 2012 at 11:11pm
This topic would be improved tremendously by pictures of the script in action!
------------- http://drax.nanobit.net" rel="nofollow"> <-- Click here.
|
Posted By: gnome power
Date Posted: 15 March 2012 at 11:25pm
Gray bar is tick timer, purple bar is xp progress.
|
Posted By: Drax
Date Posted: 16 March 2012 at 6:19am
That's seriously nifty, GP. Innovative and very nicely put together, by the looks of it. 
I'm assuming the hp, mana and xp bars update with each new prompt. How often does the bar for the tick timer update?
------------- http://drax.nanobit.net" rel="nofollow"> <-- Click here.
|
Posted By: gnome power
Date Posted: 16 March 2012 at 8:42am
Drax wrote:
That's seriously nifty, GP. Innovative and very nicely put together, by the looks of it. 
I'm assuming the hp, mana and xp bars update with each new prompt. How often does the bar for the tick timer update? |
Thanks, Drax. :)
The tick-timer counts down automatically in increments of 0.1 seconds.
|
Posted By: Hedmric
Date Posted: 16 March 2012 at 10:20am
I have the ubuntu/linux version of mudlet. It should work the same eh?
|
Posted By: Ardath
Date Posted: 16 March 2012 at 10:42am
I'm not about to put my battles off to the side like that, and I made a similar health thing that is smaller... there must be a better way to send this to someone than posting 7 pages of Lua? My capture windows aren't tabbed - theres just 1 for channels, 1 for tell/gtells below it. No need to ever fiddle with it ever again unless you want to scroll up or resize the windows - those tabs got in the way when I used that script. Good luck using Mudlet, the input bar is not as usable for some features as the CMud one.
------------- It is easier for people to read your logs if you would end your prompt with "%c"
|
Posted By: gnome power
Date Posted: 16 March 2012 at 11:15am
I've got some ideas for the tabs down the line. Might want to put a character sheet in one, a control panel for my scripts (when they get more complicated and need on/off toggles) in another, etc. The combat spam was actually a requested feature because people were saying they needed to see the flow of spam to get a sense of if they just got ambushed or something. I like it there, personally, but to each his own. I can make it togglable if there's interest in that.
There's an xml exporter but when I tried using others posted here, they didn't work, so that's why I did it this way. If someone knows the secret to getting xml files off these forums to work, that would be great.
|
Posted By: Jeckyl
Date Posted: 16 March 2012 at 11:56am
Try doing an export, and host the resulting file somewhere, and provide a link to the file(s) for download. Might be easier? If you need a place to host, I can take care of that. At the very least, we can figure out how it works, and if its feasible.
------------- <-- This is what happens when you try to pk with the Illuminati.
--
If we changed everything that everyone whined about, DSL would be a kitten paradise and there would be minutely copyovers. -Bioteq
|
Posted By: gnome power
Date Posted: 16 March 2012 at 12:04pm
Yeah, that's doable. Github?
|
Posted By: Jeckyl
Date Posted: 16 March 2012 at 1:07pm
Sure, if that's where you want to put it. I have my own hosting account, and wouldn't mind hosting it there...I've been thinking about setting up a subdomain and site for dsl related stuffs. Either way works for me. I'll reset my mudlet stuff this weekend, and try to import it if you can export it.
------------- <-- This is what happens when you try to pk with the Illuminati.
--
If we changed everything that everyone whined about, DSL would be a kitten paradise and there would be minutely copyovers. -Bioteq
|
Posted By: Hedmric
Date Posted: 17 March 2012 at 7:05pm
I've copy and pasted everything you had here as per the instructions, but i'm not seeing any text. My gauges are up, showing all my info and the tick timer is working...I just can't see anything..
What am I doing wrong? Is there something else I have to do to get my windows sized correctly?
|
Posted By: Hedmric
Date Posted: 17 March 2012 at 7:18pm
These are the errors:
[ERROR:] object:<WindowResizeEvent> function:<handleWindowResizeEvent> <attempt to call a nil value> [ERROR:] object:<> function:<onConnect> <[string "function onConnect()..."]:9: attempt to perform arithmetic on global 'global_chatWidth' (a nil value)> [ERROR:] object:<Battle Damage Analyzer> function:<Trigger8> <[string "function Trigger8()..."]:25: bad argument #1 to 'match' (string expected, got nil)>
|
Posted By: Hedmric
Date Posted: 17 March 2012 at 9:19pm
well, i've got the battle text working, and I can see stuff. This is pretty awesome so far!!
|
Posted By: RayFinkle
Date Posted: 17 March 2012 at 9:45pm
Could you start working on a drunk to common translator?
------------- **I am a freemium player**
|
Posted By: gnome power
Date Posted: 17 March 2012 at 9:59pm
Hedmric wrote:
well, i've got the battle text working, and I can see stuff. This is pretty awesome so far!! |
I'm glad you like it. :)
Are you still having any issues or is everything working fine?
|
Posted By: Ashass
Date Posted: 06 May 2012 at 6:58pm
#1 thing to help make this script better (and run faster, high likelyhood) is consider which components go together, and move those off into functions. That way the entire thing doesn't need to parse, and you can more easily share parts of the code without having a giant blob.
Granted, I know you're just sharing as-is, but you'll do yourself a favor later if you ever want to modify the script by moving things out into functions.
|
Posted By: gnome power
Date Posted: 06 May 2012 at 7:04pm
Yeah, that's a good point.
I'm not a very experienced programmer, so I didn't think of it earlier.
Thanks.
|
Posted By: sifaka
Date Posted: 01 July 2012 at 4:06pm
Wow, this is great! I have the hp/mana/mv bars and the main console working properly, but I don't have the mini console, or the tick timer. I'm brand new to Lua, is createConsole a user defined function? I notice onConnect calls it, but I don't see it anywhere else in the text. Any advice is much appreciated!
|
Posted By: gnome power
Date Posted: 01 July 2012 at 4:25pm
createConsole is part of the native mudlet platform. Do you have the most updated version of mudlet? It should be the program called Mudlet-2.0-test4.
One thing you may need to do is change the position of the miniconsole. I have it set for my screen, but I find that if I change my window dimensions at all it messes up my positioning. Depending on how different your window dimensions are from mine, your miniConsole may be appearing off your monitor altogether. The way to test what dimensions you want is to make an alias that creates a miniConsole (make sure to print some text in it or you may not see it), and then fiddle with the dimensions until you can see it appear on your screen.
For the tick timer, did you change your prompt to exactly the specified format?
And, glad you like it! :D Welcome aboard.
|
Posted By: sifaka
Date Posted: 01 July 2012 at 5:34pm
Updating to 2.0-test4 fixed everything. Thanks!
|
Posted By: gnome power
Date Posted: 01 July 2012 at 6:05pm
Okay cool.
By the way, if you get a chance, check out what the script does while you battlerage. It's pretty neat, imo. :)
|
Posted By: jharel
Date Posted: 04 November 2012 at 1:12pm
I want this for Cmud.. :(
|
Posted By: gnome power
Date Posted: 04 November 2012 at 1:19pm
Convince one of the Cmud guys to write a dang Lua wrapper and it can happen.
Otherwise, just download Mudlet. It exists for most OSes.
|
Posted By: jharel
Date Posted: 15 November 2012 at 11:43pm
Too true! Downloaded a mudlet client for Win 7, a bit sluggish (or I am just not used to the format). This is a brilliant script though, congrats.
|
Posted By: gnome power
Date Posted: 16 November 2012 at 8:46am
Awesome. :)
I don't know about the slow-ness, it seems to work pretty well for me. But I'm on a different OS so maybe it's not as good on Windows.
|
Posted By: gnome power
Date Posted: 16 November 2012 at 9:27am
edit: Nevermind, was going to suggest another script but forgot I already included it into the current script.
|
Posted By: Ericka
Date Posted: 16 November 2012 at 1:54pm
Question for gnome and others: What's the best way to configure Mudlet for multiple characters that use different trigs/alises? I'm guessing I should just make different alias/trig folders for each char and enable/disable them as needed.
That's one thing I definitely miss about Atlantis. The World:Character structure was really easy to use.
------------- Aeltor OOC: 'if you werent sboosted phonivia id tear your a few new holes as a monk'
|
Posted By: Jor'Mox
Date Posted: 16 November 2012 at 1:58pm
You could do that, or you could set up your triggers/aliases to check a variable that stores your character name/class and act accordingly.
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: gnome power
Date Posted: 16 November 2012 at 3:05pm
Ericka wrote:
Question for gnome and others: What's the best way to configure Mudlet for multiple characters that use different trigs/alises? I'm guessing I should just make different alias/trig folders for each char and enable/disable them as needed.
That's one thing I definitely miss about Atlantis. The World:Character structure was really easy to use. |
My guess is it would be pretty easy to do, just based on the fact that I already use a prompt that states the character name.
Can just make a library of names you want each trigger to function for, and have it check if the current alt is on that list at the beginning of the trigger.
|
Posted By: Elathan
Date Posted: 27 March 2013 at 10:25pm
As far as the prompt goes. My current prompt has color in it and has which room I'm in named in the prompt. Is there a way to add that to the prompt you need for this script to work?
|
Posted By: Elathan
Date Posted: 27 March 2013 at 10:27pm
This is my current prompt by the way:
prompt {W({x%h{W/{x%Hhp %m{W/{x%Mm
%v{W/{x%Vmv{W){W-{C%e{W-{x%c{w({c%r{w|{y%S{w){R({W%d{R){c%t{W>{x%c
|
Posted By: gnome power
Date Posted: 27 March 2013 at 11:09pm
It would just require changing the regex.
Do you know how to do so?
|
Posted By: Elathan
Date Posted: 27 March 2013 at 11:29pm
Reply do you mean changing it from Pearl Regex to something else?
|
Posted By: Elathan
Date Posted: 27 March 2013 at 11:35pm
Posted By: Jor'Mox
Date Posted: 28 March 2013 at 7:41am
No. He means changing the regular expression so that it will match your prompt.
Oh, and colors don't matter. So I think I stripped color codes out properly, this is what I'm seeing for your prompt: prompt (%h/%Hhp %m/%Mm %v/%Vmv)-%e-%c(%r|%S)(%d)%t>%c
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: gnome power
Date Posted: 28 March 2013 at 8:27am
Unfortunately I don't have the time at this point to customize the prompt for people, I think a few things would have to change in the SmartPrompt code as well to display it properly. You'll have to comb through it yourself or use the standard prompt until I get time (which may not be for awhile, work is hectic).
|
Posted By: Jor'Mox
Date Posted: 28 March 2013 at 8:46am
Hey GP, think you can throw the parts you think will break here, so I don't have to dig them out? I have a feeling I'll have better luck fixing things than most people would.
Edit: And, yes, I know, I should try and smash this apart and reconstruct it in the framework I have been building, but my time isn't limitless, and I've been working on other stuff for now.
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: gnome power
Date Posted: 28 March 2013 at 9:13am
Hi Jor'mox, thanks!
The regex would have to change to capture the room exits.
Also, in the Parse Prompt trigger folder it would need a new variable for directions, and the cecho would need to change to reflect it.
It's not very much actually.
|
Posted By: Jor'Mox
Date Posted: 28 March 2013 at 10:02am
So, I get the regex bit, but I'm looking at the parse prompt trigger stuff... and I don't see why you are saying I would need to create a new variable for the directions. You seem to have one there already, is there some reason that this would need to change? (I know I need to change the assignment to match with the regex, but that is different.)
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: Jor'Mox
Date Posted: 28 March 2013 at 10:49am
So, first, the new regex needed to capture your prompt as specified:
Pattern 0: ^[Quiet\s]*\(([\d\?]+)/(\d+)hp (\d+)/(\d+)m (\d+)/(\d+)mv\)\-([\w\-]+)\- Pattern 1: \([\w\s\'\-]+\|(\w+)\)\([\w\s]+\)(\d+)\:(\d+)([ap]m)\>
Check the "multiline / AND Trigger" check box, and set "line delta" to 1.
And here are the new variable assignments to match your prompt for the Prompt Parsing trigger. Note that Name and both XP variables are dummy values as they are not in your prompt.
promptHours = multimatches[2][3] promptMin = multimatches[2][4] promptAMPM = multimatches[2][5] promptName = "You" promptCurrentHP = multimatches[1][2] promptMaxHP = multimatches[1][3] promptCurrentMP = multimatches[1][4] promptMaxMP = multimatches[1][5] promptCurrentMV = multimatches[1][6] promptMaxMV = multimatches[1][7] promptStance = multimatches[2][2] promptDirs = multimatches[1][8] promptCurrentXP = 0 promptTotalXP = 1 |
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: gnome power
Date Posted: 28 March 2013 at 7:01pm
Thanks, j. I forgot that it was already there. Really, i could and should make it universal by parsing number labels in any order. That will go on the to-do list.
I think the battle condenser has a minor break if name is set to "you." It will no longer know how to identify personal actions and distinguish from others, so for instance he would lose background highlighting of personal injuries. I would suggest to him to stick it in there and just leave it off the cecho.
|
Posted By: Jor'Mox
Date Posted: 28 March 2013 at 7:15pm
So... it specifically checks to be sure it isn't "You" after it replaces "You" and "Your" with the person's name? Why? Seems excessive.
------------- No price is too high to pay for the privilege of owning yourself. - Friedrich Nietzsche
|
Posted By: gnome power
Date Posted: 28 March 2013 at 7:45pm
Jor'Mox wrote:
So... it specifically checks to be sure it isn't "You" after it replaces "You" and "Your" with the person's name? Why? Seems excessive.
|
Hm, on second thought, I think you're right.
|
|