Basic Properties question(s)
Moderators: dorpond, trevor, Azhrei
Forum rules
PLEASE don't post images of your entire desktop, attach entire campaign files when only a single file is needed, or generally act in some other anti-social behavior.
PLEASE don't post images of your entire desktop, attach entire campaign files when only a single file is needed, or generally act in some other anti-social behavior.

-
- Kobold
- Posts: 4
- Joined: Thu Jun 30, 2011 4:41 am
Basic Properties question(s)
Is there a way to display the result of calculations done in properties when someone views their token's properties sheet, instead of only when hovering the mouse over their token? As in, if someone wants to check their accuracy, and I had put Accuracy:{Dex * 3} in the sheet, can I make sure they'll see 21 (Assuming dex is 7) instead of just the math being used?
Also, can HP/MaxHP be done with a dual number line, or is that more an issue of formatting? I'd much rather have it say HP: 20/32 than have it show two separate fields on mouseover
Also, can HP/MaxHP be done with a dual number line, or is that more an issue of formatting? I'd much rather have it say HP: 20/32 than have it show two separate fields on mouseover
Re: Basic Properties question(s)
Try this:
*@Accuracy: [R: DEX*3]
HP: 0
HPMax: 0
*@HealthPoints/Max: [R: HP]+"/"+[R: HPMax]
I am not positive on whether it requires plus signs or ampersands between the HP and HPMax, but you get the idea.
*@Accuracy: [R: DEX*3]
HP: 0
HPMax: 0
*@HealthPoints/Max: [R: HP]+"/"+[R: HPMax]
I am not positive on whether it requires plus signs or ampersands between the HP and HPMax, but you get the idea.
-
- Kobold
- Posts: 4
- Joined: Thu Jun 30, 2011 4:41 am
Re: Basic Properties question(s)
neofax wrote:Try this:
*@Accuracy: [R: DEX*3]
HP: 0
HPMax: 0
*@HealthPoints/Max: [R: HP]+"/"+[R: HPMax]
I am not positive on whether it requires plus signs or ampersands between the HP and HPMax, but you get the idea.
The former still just shows Accuracy: [R: DEX*3] when the token is double clicked and the Properties are viewed; it works fine when moused over, but I only want HP to be displayed there
I'm probably going to make it calculated in macros and then displayed there, have it be a local variable during attacks since it's completely reliant on Dex
The latter completely broke MapTools with both pluses and ampersands, as a dialog box (with a blank body, like it was literally empty) that said "Input Value for (token)" when I hovered over one, and wouldn't go away when I X'd it out, even multiple times.
Re: Basic Properties question(s)
CharlieTVS wrote:neofax wrote:Try this:
*@Accuracy: [R: DEX*3]
HP: 0
HPMax: 0
*@HealthPoints/Max: [R: HP]+"/"+[R: HPMax]
I am not positive on whether it requires plus signs or ampersands between the HP and HPMax, but you get the idea.
The former still just shows Accuracy: [R: DEX*3] when the token is double clicked and the Properties are viewed; it works fine when moused over, but I only want HP to be displayed there
I'm probably going to make it calculated in macros and then displayed there, have it be a local variable during attacks since it's completely reliant on Dex
The latter completely broke MapTools with both pluses and ampersands, as a dialog box (with a blank body, like it was literally empty) that said "Input Value for (token)" when I hovered over one, and wouldn't go away when I X'd it out, even multiple times.
you mean you wan this: *@Accuracy: [R: Accuracy = DEX*3]
GETTING STARTED WITH MAPTOOLS - TUTORIALS, DOCS, VIDEOS, TOOLS, ETC
DISCORD (the new MT forum!)
My stuff
Excel Tools: Table and Light editors
MT Tools: Bag of Tricks: Tools for Maptool, Dungeon Builder I, Dungeon Builder II,onMouseOverEvent.
Frameworks: Dark Heresy, Rogue Trader, Deathwatch, Black Crusade, Only War, SET Card Game, RoboRally
Wiki: Debugging Tutorial, Speed Up Your Macros, Working With Two CODE Levels, Shortcut Keys, Avoiding Stack Overflow, READ THIS
DISCORD (the new MT forum!)
My stuff
Excel Tools: Table and Light editors
MT Tools: Bag of Tricks: Tools for Maptool, Dungeon Builder I, Dungeon Builder II,onMouseOverEvent.
Frameworks: Dark Heresy, Rogue Trader, Deathwatch, Black Crusade, Only War, SET Card Game, RoboRally
Wiki: Debugging Tutorial, Speed Up Your Macros, Working With Two CODE Levels, Shortcut Keys, Avoiding Stack Overflow, READ THIS
- jfrazierjr
- Deity
- Posts: 5176
- Joined: Tue Sep 11, 2007 7:31 pm
Re: Basic Properties question(s)
wolph42 wrote:CharlieTVS wrote:neofax wrote:Try this:
*@Accuracy: [R: DEX*3]
HP: 0
HPMax: 0
*@HealthPoints/Max: [R: HP]+"/"+[R: HPMax]
I am not positive on whether it requires plus signs or ampersands between the HP and HPMax, but you get the idea.
The former still just shows Accuracy: [R: DEX*3] when the token is double clicked and the Properties are viewed; it works fine when moused over, but I only want HP to be displayed there
I'm probably going to make it calculated in macros and then displayed there, have it be a local variable during attacks since it's completely reliant on Dex
The latter completely broke MapTools with both pluses and ampersands, as a dialog box (with a blank body, like it was literally empty) that said "Input Value for (token)" when I hovered over one, and wouldn't go away when I X'd it out, even multiple times.
you mean you wan this: *@Accuracy: [R: Accuracy = DEX*3]
CharlieTVS, what wolph notes will work, however, there is a very subtle issue with the above that may arise depending on how your game system works. If DEX is ever increased in some way, Accuracy will not change because it is now just a number, which defeats the purpose of auto calculations. If you want the auto calculations, but don't want it showing on mouse over, your best bet is to create a character sheet frame yourself and having your players click on a macro to show it as needed OR since it is a frame, they can set it to dock and/or hide with any other open frames they have(won't work in full screen mode though!!!) This approach gives you the best of both worlds at a small price of having to do a bit of coding. However, the wiki has extremely detailed examples of how to create frames which range from fairly simple to more detailed character sheets.
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Re: Basic Properties question(s)
I do something like this:
This will set the value once and then you can control when it needs to be updated when you make changes by doing this:
All the stat.___ are only used for output purposes where my actual stats are stored using another method (one json prop with all my stats).
Here's an example of my token props: [spoiler=||| Basic Props |||][/spoiler] [spoiler=||| Example Output |||] [/spoiler] [spoiler=||| Reset Stat Sheet |||][/spoiler]
Here's some random code I use as an example of what I'm talking about. The following is code I use to enter/update stats and other stuff: [spoiler=||| Edit Core |||][/spoiler] [spoiler=||| Output Example |||] [/spoiler]
keywords: stalker, statsheet
Code: Select all
*@stat.accuracy(Accuracy):[r: stat.accuracy = DEX * 3]
This will set the value once and then you can control when it needs to be updated when you make changes by doing this:
Code: Select all
[H: resetProperty("stat.accuracy")]
All the stat.___ are only used for output purposes where my actual stats are stored using another method (one json prop with all my stats).
Here's an example of my token props: [spoiler=||| Basic Props |||]
Code: Select all
*@sheet.life (Life):[r: sheet.life = strformat("%{life.lifepoints} / %{damage.awareness} - %{life.status}")]]
*@sheet.damage (Damage):[r: sheet.damage = strformat("Wounds/Burn (%{damage.wounds}/%{damage.burn}); Stun/Shock (%{damage.stun}/%{damage.shock})")]
*@sheet.armor (Armor):[r: sheet.armor = strformat("Armor (%{armor.armor}/%{armor.padding}/%{armor.plating}); Helmet (%{armor.helmet}/%{armor.lining}/%{armor.hardening})")]
*@sheet.resistance (Resists):[r: sheet.resistance = if(resistance.chemical,"Chemical "+resistance.chemical+"; ","")+if(resistance.energy,"Energy "+resistance.energy+"; ","")+if(resistance.fire,"Fire "+resistance.fire+"; ","")+if(resistance.psi,"Psi "+resistance.psi+"; ","")]
*@sheet.radiation (Radiation):[r: sheet.radiation = "Exposure "+floor(damage.exposure * 100)+"%"]
*@sheet.body (Body):[r: sheet.body = strformat("Strength %{stat.strength}, Agility %{stat.agility}, Vitality %{stat.vitality}")]
*@sheet.mind (Mind):[r: sheet.mind = strformat("Alertness {stat.alertness}, Intelligence {stat.intelligence}, Willpower {stat.willpower}")]
*@sheet.initiative (Initiative)
*sheet.fof:[H, if(isNPC()): setState("Foe",!state.Friend); setState("Friend",1) + setState("Foe",0)][r: sheet.fof = ""]
*@sheet.plot (Plot Points):[r: sheet.plot = points.plotpoints]
points.plotpoints:0
stat.strength (Strength):0
stat.agility (Agility):0
stat.vitality (Vitality):0
stat.intelligence (Intelligence):0
stat.alertness (Alertness):0
stat.willpower (Willpower):0
life.lifepoints:0
life.status:"Awake"
damage.awareness:0
damage.wounds:0
damage.burn:0
damage.stun:0
damage.shock:0
damage.exposure:0
damage.radiation:0
armor.armor:0
armor.padding:0
armor.plating:0
armor.helmet:0
armor.lining:0
armor.hardening:0
resistance.chemical:0
resistance.energy:0
resistance.fire:0
resistance.psi:0
resistance.radiation:0
Code: Select all
[H: statsheetProps = "sheet.life,sheet.damage,sheet.armor,sheet.resistance,sheet.radiation,sheet.body,sheet.mind,sheet.initiative,sheet.fof,sheet.plot"]
[H, foreach(sheet,statsheetProps): resetProperty(sheet)]
Here's some random code I use as an example of what I'm talking about. The following is code I use to enter/update stats and other stuff: [spoiler=||| Edit Core |||]
Code: Select all
<!-- Define and declare local variables to be used -->
[H: mods.token = am.stalker.defaultObj.local("stalker.mods")]
[H: stats.token = am.stalker.defaultObj.local("stalker.stats")]
[H: life.token = am.stalker.defaultObj.local("stalker.life")]
[H: am.stalker.namesObj.local("stalker.stats")]
[H: armor.token = am.stalker.defaultObj.local("stalker.armor")]
[H: am.stalker.namesObj.local("stalker.armor")]
[H: resistance.token = am.stalker.defaultObj.local("stalker.resistance")]
[H: am.stalker.namesObj.local("stalker.resistance")]
[H: points.token = am.stalker.defaultObj.local("stalker.points")]
[H: am.stalker.namesObj.local("stalker.points")]
<!-- format the input form -->
[H: inputStr = json.append("","tab.stats|<html><b><font color=blue>STATS</font></b></html>|| TAB",am.stalker.getHeaderText("Edit Stats"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><b>%{points.startingstatpoints}</b></html>|<html><b><font color=blue>Max Stat Points</font></b></html>|LABEL"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><b>%{points.statpoints}</b></html>|<html><b><font color=blue>Stat Points Used</font></b></html>|LABEL"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><font size=+1><b>STATS</b></font></html>||LABEL|SPAN=TRUE"))]
[H, foreach(stat,stats.token): inputStr = json.append(inputStr,strformat("%{stat}|{%{stat}}|<html><b><font color=blue>{%{stat}.name}</b></font></html>|TEXT|WIDTH=6"))]
[H: inputStr = json.append(inputStr,"tab.armor|<html><b><font color=blue>ARMOR</font></b></html>|| TAB",am.stalker.getHeaderText("Edit Armor"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><font size=+1><b>ARMOR</b></font></html>||LABEL|SPAN=TRUE"))]
[H, foreach(armor,armor.token): inputStr = json.append(inputStr,strformat("%{armor}|{%{armor}}|<html><b><font>{%{armor}.name}</b></font></html>|TEXT|WIDTH=6"))]
[H: inputStr = json.append(inputStr,"tab.resistances|<html><b><font color=blue>RESISTANCES</font></b></html>|| TAB",am.stalker.getHeaderText("Edit Resistances"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><font size=+1><b>RESISTANCES</b></font></html>||LABEL|SPAN=TRUE"))]
[H, foreach(resistance,resistance.token): inputStr = json.append(inputStr,strformat("%{resistance}|{%{resistance}}|<html><b><font color=red>{%{resistance}.name}</b></font></html>|TEXT|WIDTH=6"))]
[H: inputStr = json.append(inputStr,"tab.points|<html><b><font color=blue>POINTS</font></b></html>|| TAB",am.stalker.getHeaderText("Edit Points"))]
[H: inputStr = json.append(inputStr,strformat("tip|<html><font size=+1><b>POINTS</b></font></html>||LABEL|SPAN=TRUE"))]
[H, if(isGM()), code: {
[H, foreach(points,points.token): inputStr = json.append(inputStr,strformat("%{points}|{%{points}}|<html><b><font color=red>{%{points}.name}</b></font></html>|TEXT|WIDTH=6"))]
};{
[H, foreach(points,points.token): inputStr = json.append(inputStr,strformat("%{points}|{%{points}}|<html><b><font color=red>{%{points}.name}</b></font></html>|LABEL"))]
}]
<!-- plug in the variables to the input form -->
[H: inputStr = json.evaluate(inputStr)]
[H: hasInput = input(json.toList(inputStr,"##"))]
<!-- save changes to stats -->
[H, if(hasInput), code: {
[H: points.statpoints = 0]
[H, foreach(stat,stats.token): points.statpoints = points.statpoints+ number("0"+eval(stat))]
[H: setProperty("stalker.points",am.stalker.calcObj.local("stalker.points"))]
[H: setProperty("stalker.stats",am.stalker.calcObj.local("stalker.stats"))]
[H: setProperty("stalker.life",am.stalker.calcObj.local("stalker.life"))]
[H: setProperty("stalker.armor",am.stalker.calcObj.local("stalker.armor"))]
[H: setProperty("stalker.resistance",am.stalker.calcObj.local("stalker.resistance"))]
}; {}]
<!-- Update the stat sheet -->
[H: am.stalker.resetStatSheet()]
keywords: stalker, statsheet
Downloads:
- Notepad++ MapTool addon
- RPEdit details (v1.3)
- Coding Tips: Modularity and Design
- Videos: Macro Writing Tools
-
- Kobold
- Posts: 4
- Joined: Thu Jun 30, 2011 4:41 am
Re: Basic Properties question(s)
[quote"aliasmask"]*@sheet.life (Life):[r: sheet.life = strformat("%{life.lifepoints} / %{damage.awareness} - %{life.status}")][/quote]
This is EXACTLY what I was looking for, but I'm curious, what do the percent symbols actually tell the statement to do? I'm so used to horrible Java that I associate it with modulus
This is EXACTLY what I was looking for, but I'm curious, what do the percent symbols actually tell the statement to do? I'm so used to horrible Java that I associate it with modulus
Re: Basic Properties question(s)
CharlieTVS wrote:aliasmask wrote:*@sheet.life (Life):[r: sheet.life = strformat("%{life.lifepoints} / %{damage.awareness} - %{life.status}")]
This is EXACTLY what I was looking for, but I'm curious, what do the percent symbols actually tell the statement to do? I'm so used to horrible Java that I associate it with modulus
Take a look at [wfunc]strformat[/wfunc]. I usually just use %s for a string substitution or %{varName} to insert a variable's value. When I use {%{varName}} then the varName value is a dynamic variable name I later resolve with [wfunc]json.evaluate[/wfunc], because I put my output in to a json array (see [wfunc]json.append[/wfunc]).
Last edited by aliasmask on Fri Jul 01, 2011 9:34 am, edited 1 time in total.
Downloads:
- Notepad++ MapTool addon
- RPEdit details (v1.3)
- Coding Tips: Modularity and Design
- Videos: Macro Writing Tools
- jfrazierjr
- Deity
- Posts: 5176
- Joined: Tue Sep 11, 2007 7:31 pm
Re: Basic Properties question(s)
BTW AM, that is one neat little trick you are using...kuddo's. I can't wait to see what type of stuff you can come with in javascript with a much more robust macro system in 1.4.
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Re: Basic Properties question(s)
At last beginning to code my own Framework, I tried to use the initialisation trick on a lib token. It took me a few hours to discover getLibProperty() doesn't evaluate a property's default value (again fully told in the wiki
)
All is working perfectly well since I use getProperty() instead (seeing both getProperty() and getLibProperty() existed I came to the false thought that they were specialised and the former wouldn't work on a lib token… till I tried).
Now this brings to me a question: as [wfunc]getRawProperty[/wfunc] and [wfunc]getLibProperty[/wfunc] seem to behave in the same way, why is there two of them? Or what is the difference?

All is working perfectly well since I use getProperty() instead (seeing both getProperty() and getLibProperty() existed I came to the false thought that they were specialised and the former wouldn't work on a lib token… till I tried).
Now this brings to me a question: as [wfunc]getRawProperty[/wfunc] and [wfunc]getLibProperty[/wfunc] seem to behave in the same way, why is there two of them? Or what is the difference?
- jfrazierjr
- Deity
- Posts: 5176
- Joined: Tue Sep 11, 2007 7:31 pm
Re: Basic Properties question(s)
My understanding is that getRawProperty will NOT evaluate any contained code.. ie, its just a string...while getLibProperty will evaluate and return the results of any contained code.
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..
Re: Basic Properties question(s)
CharlieTVS wrote:...can HP/MaxHP be done with a dual number line, or is that more an issue of formatting? I'd much rather have it say HP: 20/32 than have it show two separate fields on mouseover
I've always treated HP as a custom formatted list, using "/" as the separator. and then use slightly more complex macro code to handle the math aspects of that property. Makes for an easier to read display, but a harder to code macro.
- Dave "The Milk Man" Derry
AKA
- Omen
"Shyt Happens - Learn to flush"
"The best thing to be is unpredictable"
AKA
- Omen
"Shyt Happens - Learn to flush"
"The best thing to be is unpredictable"
- JonathanTheBlack
- Dragon
- Posts: 544
- Joined: Mon Jun 28, 2010 12:12 pm
- Location: I'm the worm...
Re: Basic Properties question(s)
CurrentHP: 10
MaxHP: 20
Hit Points: {CurrentHP} / {MaxHP}
Simple and easy.
MaxHP: 20
Hit Points: {CurrentHP} / {MaxHP}
Simple and easy.
Re: Basic Properties question(s)
jfrazierjr wrote:My understanding is that getRawProperty will NOT evaluate any contained code.. ie, its just a string...while getLibProperty will evaluate and return the results of any contained code.
Wanting to sort out what was to me unexpected results, I did the following tests:
In my Campaign Properties, I changed a property to:
Code: Select all
HeureNaissance (HN):[r: Fatigue = floor((FORCE + AGILITE) / 2)]
where FORCE and AGILITE have default values and Fatigue is empty and have no default.
Then, creating a lib token with correct Token Type, I ran the following macro on it:
Code: Select all
[e: Test = function("HeureNaissance")]
[r: Test]
where function was getRawProperty(), then getLibProperty(), then getProperty() and finaly eval().
I ran a second time changing the macro to:
Code: Select all
[e: Test = function(HeureNaissance)]
[r: Test]
Then, in the Campaign Properties, I erased the HeureNaissance's default value and copied it as its actual value in a new lib token. And I ran the two macro sets again.
Here are the tests results:
Code: Select all
Quoted Actual value Default value
Evaluated ! Returned Evaluated ! Returned
getRawProperty NO YES NO NO
getLibProperty NO YES NO NO
getProperty YES YES YES YES
eval YES YES YES YES
Code: Select all
Unquoted Actual value Default value
Evaluated ! Returned Evaluated ! Returned
getRawProperty YES NO YES NO
getLibProperty YES NO YES NO
getProperty YES NO YES NO
eval YES YES YES YES
- Evaluated results mean the Fatigue property is updated.
- Returned unavaluated results mean the Test variable gets the raw code in HeureNaissance.
First, I can see no difference between getRawProperty() and getLibPropery(), except the latter only runs on lib tokens if I get it right.
Second, the Quoted versions seem to behave according to the wiki, but the Unquoted ones,executing the code but returning nothing , look like traps.
Anyone could explain this to me?
Re: Basic Properties question(s)
JML wrote:Second, the Quoted versions seem to behave according to the wiki, but the Unquoted ones,executing the code but returning nothing , look like traps.
When you use a property name unquoted, MT automatically retrieves the value stored in the property. Since you're calling the functions that access properties, the retrieval process is happening twice. So using getProperty(Fred) becomes getProperty("[r: ...]") which of course returns an empty string.