problem with stringToList

Developer discussion regarding MapTool 1.4

Moderators: dorpond, trevor, Azhrei

Forum rules
Posting now open to all registered forum users.
Post Reply
xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

problem with stringToList

Post by xavram »

So I thought this would just split the string into a list, based on the pattern. In this case the pattern is the ~ character.

Code: Select all

[h : theString = "Once per scene, when you attempt an Action Skill Roll in which failure will physically harm you, you gain a +4 to that roll. Also, at the chronicler's discretion, if the action you are attempting to perform is especially dangerous and heroic he may grant you a Die Bump to any Action Skill Roll.~~~~~~~"]
[h : list = stringToList(theString, "~")]

[h, foreach(item, list), code : {
	[broadcast(item)]
}]
So, I would thought that all the verbiage would be broadcast, then a bunch of blank lines (the "~~~~~~" section of the string).

But instead, I'm getting...

Once per scene
when you attempt an Action Skill Roll in which failure will physically harm you
you gain a +4 to that roll. Also
at the chronicler's discretion
if the action you are attempting to perform is especially dangerous and heroic he may grant you a Die Bump to any Action Skill Roll.

...so it appears to be splitting the string on the commas, rather that the tilde. Why is that?


xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

The output_seperator and/or list_seperator? I tried messing with those but didn't think it was relevant, given that the string had already been split into a list. Doesn't seem to help.

Here's the thing, If I change this to...

Code: Select all

[h : theString = "Once per scene, when you attempt an Action Skill Roll in which failure will physically harm you, you gain a +4 to that roll. Also, at the chronicler's discretion, if the action you are attempting to perform is especially dangerous and heroic he may grant you a Die Bump to any Action Skill Roll."]
[h : list = stringToList(theString, "~")]

[broadcast(listCount(list))]
...There's only one "~" in that string, so the "list" variable should only have one entry in it? right? But when I do that broadcast(listCount(list)), I get a result of 5...and there just happens to be 4 commas in that string, which would result in 5 entries.

It sure seems like the "stringToList" is using the comma as the delimiter, even though I specified a "~" character.

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

Hey, I got it to work, by totally skipping the "stringToList" call and instead just handling the parsing in the foreach loop.

[h : theString = "Once per scene, when you attempt an Action Skill Roll in which failure will physically harm you, you gain a +4 to that roll. Also, at the chronicler's discretion, if the action you are attempting to perform is especially dangerous and heroic he may grant you a Die Bump to any Action Skill Roll.~~~~~~~"]

[h, foreach(item, list, null, "~"), code : {
[broadcast(item)]
}]

Not sure if that's what you trying to get me to Wolph, but it pointed me in the right direction!


xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

I thought I had this nailed down, but I'm trying something similar and its not working...

Code: Select all

[h : longString = pasteMe]

[h : clearTable("Test")]
[h : x = 0]
[h, foreach(entry, longString, null, "~"), code : {
	[h : x = x + 1]
	[h : addTableEntry("Test",x,x,entry)]
}]
what's being pasting into the "longString" variable is a whole mess of Json objects, each one seperated by a "~".

What ends up going into the table is the name of each of the properties in the json object. So I'm REALLY confused....:)

If I pass just one of the JSON objects, it does the same thing.

{"Name":"Bypass the Shield","Brief":"With a twist you can out maneuver almost any shield.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"Melee (1 Target)","Speed":1,"AsPush":0,"Recovery":2,"ToHit":1,"DamageMod":0,"Effect":"If your opponent is wielding a shield you gain an additional +1 to hit.","TrickId":1,"NoDmg":0}

So what gets entered into the table is...
Name
Brief
Category
Targets
etc, etc,

Am I still doing something stupid?

User avatar
aliasmask
Deity
Posts: 8602
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: problem with stringToList

Post by aliasmask »

[Foreach:]
JSON Object Example
(Note that using foreach with a JSON object will result in only the keys being returned as vars).
What do you want to go in to the table?

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

The entire Json object should go into the table. When its a "~" delimited string of objects, each one should go into its own row in the table.

I'm just not understanding where in the "foreach" loop its parsing the json object on its properties, given that I'm passing "~" as the delimiter.

User avatar
aliasmask
Deity
Posts: 8602
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: problem with stringToList

Post by aliasmask »

I'm not sure where the ~ comes in to play, but if you have an array of json objects, then it should work as intended. For example:

Code: Select all

[H: data = json.append("[]",json.set("{}","name","one","data",1),json.set("{}","name","two","data",2))]

[H, foreach(entry,data), code: {
   [dialog(roll.count):{<pre>[R: json.indent(entry)]</pre>}]
}]

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

let me try tweaking things tonight. I'm getting the data from an excel spreadsheet and there's too much of it to use the maptool table import tool, so that's why I was trying to do it this way.

Let me get it into a true json array (like your example) and see what happens.

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

That did the trick, thanks AM!

User avatar
aliasmask
Deity
Posts: 8602
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: problem with stringToList

Post by aliasmask »

Just curious. What are you referring to when you say "maptool table import tool"? And how did you finally get all your data in to MapTool?

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

Someone wrote an excel file, where you could put a bunch of data into rows and then do a whole process with cut/paste to get it to replace the content.xml file of a maptool table. I've used it before, with varying degrees of success.

But what I was currently working on was pushing past the 32k limit on excel cells, so I had to come up with something else.

In this case, I was trying to get this string, from excel...

[{"Name":"Bypass the Shield","Brief":"With a twist you can out maneuver almost any shield.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"Melee (1 Target)","Speed":1,"AsPush":0,"Recovery":2,"ToHit":1,"DamageMod":0,"Effect":"If your opponent is wielding a shield you gain an additional +1 to hit.","TrickId":1,"NoDmg":0},{"Name":"Crippling Shot","Brief":"A well-placed shot you can slow almost any opponent.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"60 (1 Target)","Speed":2,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":0,"Effect":"If your attack roll also surpasses your target's fortitude, their pace is reduced by half for the remainder of the scene.","TrickId":2,"NoDmg":0},{"Name":"Crushing Blow","Brief":"Swinging upwards you catch your opponent in a venerable spot staggering them for a moment.","Category":"Base","Targets":"Avoidance ","Uses":"Might","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":1,"ToHit":0,"DamageMod":0,"Effect":"If your attack roll also surpasses your target's fortitude, advance your target's clock by push 2.","TrickId":3,"NoDmg":0},{"Name":"Darken the Sky","Brief":"Your speed and aim are nothing but remarkable.","Category":"Base","Targets":"Avoidance ","Uses":"Quickness","Range":"120 (3 or more Targets)","Speed":3,"AsPush":0,"Recovery":6,"ToHit":0,"DamageMod":0,"Effect":"You attack 3 targets for every hero tier you possess. as long as you're armed, regardless of the amount of arrows you currently possess you always have enough normal arrows to perform this weapon trick at least once per scene (these arrows cannot be sold, collected, and so on. they are provided simply for cinematic effect).","TrickId":4,"NoDmg":0},{"Name":"Dismount Opponent","Brief":"A mounted opponent can quickly find themselves on their backs.","Category":"Base","Targets":"Avoidance ","Uses":"Might","Range":"Melee (1 Target)","Speed":1,"AsPush":0,"Recovery":3,"ToHit":0,"DamageMod":0,"Effect":"Target must be mounted. the target must succeed in a dynamic ride (qu) action skill roll against your attack roll result or be dismounted.","TrickId":5,"NoDmg":0},{"Name":"Edge of the Shield","Brief":"You slam the hard edge of your shield into your opponent, dazing your foe.","Category":"Base","Targets":"Fortitude ","Uses":"Might","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":3,"ToHit":0,"DamageMod":0,"Effect":"Target is stunned and their initiative count is pushed by 5.","TrickId":6,"NoDmg":1},{"Name":"Entangle Opponent","Brief":"You entrap and entangle your target with your weapon.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"30 (1 Target)","Speed":2,"AsPush":0,"Recovery":3,"ToHit":0,"DamageMod":0,"Effect":"Your target must perform a dynamic athletics (qu) action skill roll against the result of your attack roll. if they fail, they become immobilized and prone. the target may spend two complex skill actions to work their way free regardless of the amount of active entangle opponent effects on them (for example, multiple bolas).","TrickId":7,"NoDmg":0},{"Name":"From Earth to Sky","Brief":"Turning your opponent's momentum against them you can send a charging foe flying.","Category":"Advanced","Targets":"Avoidance ","Uses":"Quickness","Range":"Melee (1 Target)","Speed":4,"AsPush":1,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"Any time you are charged, you may strike your attacker and send him sprawling onto the ground. roll your attack normally. if you hit, your target automatically fails his attack roll. if your attack roll also surpasses your target's fortitude, he is thrown 5' in a direction of your choice and is knocked prone.","TrickId":8,"NoDmg":1},{"Name":"Grasp the Blade","Brief":"The look on an opponent's face when you grab their blade mid swing, priceless.","Category":"Advanced","Targets":"Avoidance ","Uses":"Quickness","Range":"Melee (1 Target)","Speed":3,"AsPush":1,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"You may use this weapon trick in response to a melee attack against you. if you succeed in your attack, you grasp/entangle your opponent's weapon negating their attack. you retain your hold on their weapon until you release it or your opponent takes a push 2 action to pull it free.","TrickId":9,"NoDmg":1},{"Name":"Hamstring","Brief":"A slice to the legs will slow just about anyone.","Category":"Base","Targets":"Avoidance ","Uses":"Prowess","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":1,"ToHit":0,"DamageMod":0,"Effect":"If your attack roll also surpasses your target's fortitude, their pace is reduced by half until your next action.","TrickId":10,"NoDmg":0},{"Name":"Juggernauts’ Hammer","Brief":"With a mighty swing, you send your opponents flying, even though doors.","Category":"Base","Targets":"Avoidance ","Uses":"Might","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":3,"ToHit":0,"DamageMod":0,"Effect":"Target is knocked back 5' + 5' for every 5 points of damage dealt (before ar). if your attack roll also surpasses your target's fortitude, they are knocked prone. if, for any reason, your target hits a solid object when they are knocked back, you deal damage to the object equal to the damage you dealt to the target.","TrickId":11,"NoDmg":0},{"Name":"Long Strike","Brief":"With a quick extension of your swing you can reach much farther than most would expect.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"10 (1 Target)","Speed":1,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"Increases the weapon's range to 10","TrickId":12,"NoDmg":0},{"Name":"Mighty Swing","Brief":"Stepping into your swing you deliver a bone crushing strike.","Category":"Base","Targets":"Avoidance ","Uses":"Might","Range":"Melee (1 Target)","Speed":1,"AsPush":0,"Recovery":3,"ToHit":0,"DamageMod":5,"Effect":"Adds 5 to the damage done","TrickId":13,"NoDmg":0},{"Name":"Mighty Throw","Brief":"Pulling you back into your throw, your throws are bone jarring to say the least.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"60 (1 Target)","Speed":1,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":5,"Effect":"Adds 5 to the damage done and increases your weapons range increment by 10'","TrickId":14,"NoDmg":0},{"Name":"Pin Them Down!","Brief":"Stabbing at your opponent you can pin them against a wall or even the floor.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":0,"Effect":"If you successfully bypass your target's fortitude, you also pin their foot to the ground. this reduces their pace to 0 and grants them a -2 to avoidance and all action skill rolls until the weapon is removed. they may release themselves or be released by an ally as a demanding skill action.","TrickId":15,"NoDmg":0},{"Name":"Pinning Shot","Brief":"A well placed shot keeps your opponent in place.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"30 (6sq) (1 Target)","Speed":2,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":0,"Effect":"If you successfully hit, you pin the target's clothes to the nearest hard surface (which may be the floor). the target must be wearing some kind of garment. the target must use a complex skill action to pull free of the pin.","TrickId":16,"NoDmg":1},{"Name":"Point Blank Shot","Brief":"You opponents quickly learn to keep their distance.","Category":"Automatic","Targets":"Avoidance","Uses":"Prowess","Range":"15 (1 Target)","Speed":0,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"Anytime you attack a target within 15' you reduce the target's ar by 2. (to a minimum of 0)","TrickId":17,"NoDmg":0},{"Name":"Pommel Strike","Brief":"In your hands, it's not only the pointy end which hurts.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"Melee (1 Target)","Speed":0,"AsPush":0,"Recovery":1,"ToHit":0,"DamageMod":-1,"Effect":"Weapon does -1 damage and you deal bludgeoning damage instead of piercing or slashing damage.","TrickId":18,"NoDmg":0},{"Name":"Quick Reload","Brief":"With practiced hands you can reload with impressive speed.","Category":"Automatic","Targets":"None","Uses":"None","Range":"Self","Speed":0,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"You can reload your weapon quicker than most. reduce your reload time by 2.","TrickId":19,"NoDmg":0},{"Name":"Quick Set","Brief":"Setting your weapon with lighting speed charging foes quickly learn the error of their ways.","Category":"Base","Targets":"Avoidance ","Uses":"Quickness","Range":"Melee (1 Target)","Speed":0,"AsPush":1,"Recovery":3,"ToHit":0,"DamageMod":0,"Effect":"Any time you are charged, you may set your weapon to strike the incoming target. roll your attack normally. if you hit, your target misses their attack. push your clock speed by the speed of your weapon.","TrickId":20,"NoDmg":0},{"Name":"Ranged Disarm","Brief":"Yes, I can shoot a sword out of someone hand at 30 paces.","Category":"Advanced","Targets":"Avoidance ","Uses":"Quickness","Range":"30 (1 Target)","Speed":3,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":0,"Effect":"You fire at your opponent's hand in an attempt to force them to drop their weapon. you may perform a disarm maneuver at range. naturally opponents cannot take a free strike against you unless they are in melee with you.","TrickId":21,"NoDmg":0},{"Name":"Rapid Strike","Brief":"With a flick of the wrist you can strike faster than any serpent.","Category":"Base","Targets":"Avoidance ","Uses":"Quickness","Range":"Melee (1 Target)","Speed":-1,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":-3,"Effect":"Weapon does -3 damage.","TrickId":22,"NoDmg":0},{"Name":"Render Shield Worthless","Brief":"With an attack you can make a shield simply too cumbersome to use.","Category":"Advanced","Targets":"Avoidance","Uses":"Prowess","Range":"Range (1 Target)","Speed":2,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"If you successfully strike, your target's shield becomes worthless. the target is unable to defend with it or perform any weapon tricks which involve the shield. the target also suffers a penalty to avoidance equal to the shield's sp until the shield is dropped. the shield remains worthless until the weapon used in this maneuver is removed. the target or an ally of his may remove the weapon as a demanding skill action.","TrickId":23,"NoDmg":1},{"Name":"Shield Defense","Brief":"Ducking behind your shield you can weather the mightiest of attacks.","Category":"Advanced","Targets":"None","Uses":"None","Range":"Self","Speed":1,"AsPush":0,"Recovery":5,"ToHit":0,"DamageMod":0,"Effect":"Add your passive insight and vigor values to your avoidance and fortitude until your next action. any attack that would have hit you without the bonus hits your shield instead.","TrickId":24,"NoDmg":1},{"Name":"Shield Formation","Brief":"When used in formation, the true strength of the tower shield is realized.","Category":"Automatic","Targets":"None","Uses":"None","Range":"Self","Speed":0,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"If you are adjacent to any ally wielding a tower shield, you gain a +1 bonus to your ar.","TrickId":25,"NoDmg":1},{"Name":"Shield Throw","Brief":"You can send your send your shield flying.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"20 (1 Target)","Speed":1,"AsPush":0,"Recovery":0,"ToHit":0,"DamageMod":3,"Effect":"Adds 3 to the damage done","TrickId":26,"NoDmg":0},{"Name":"Shield Slam","Brief":"Stepping into the attack you send your shield crashing into your foe knocking them to the ground.","Category":"Base","Targets":"Fortitude ","Uses":"Might","Range":"Melee (1 Target)","Speed":0,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":0,"Effect":"Target is knocked prone and their clock is pushed by 3. you lose any benefit from the shield until you recover.","TrickId":27,"NoDmg":1},{"Name":"Shielding","Brief":"You can quickly bring your shield to bear","Category":"Advanced","Targets":"None","Uses":"None","Range":"Self","Speed":3,"AsPush":1,"Recovery":0,"ToHit":0,"DamageMod":0,"Effect":"You use this trick in response to an incoming melee attack. you must declare you are using this trick before any attacks are rolled. you gain +2 to avoidance against that attack. if you are using two weapons, and you know this trick with both weapons, you gain +3 to avoidance instead.","TrickId":28,"NoDmg":1},{"Name":"Slashing Disarm","Brief":"A slash to your opponent's arms sends their weapon flying.","Category":"Advanced","Targets":"None","Uses":"None","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":0,"Effect":"You do not suffer free strikes (see combat, pg. 302) when attempting to disarm a foe.","TrickId":29,"NoDmg":0},{"Name":"Snatch Object","Brief":"You can snatch things with you weapon at a distance.","Category":"Advanced","Targets":"Avoidance ","Uses":"Quickness","Range":"Melee (1 Target)","Speed":1,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":0,"Effect":"You may use this weapon to grab unattended items or grip stationary objects up to 10' away. for example, you can use the whip to grasp a candelabrum and pull it to the ground, or you may wrap your whip around a beam allowing you to swing over a 5' area.","TrickId":30,"NoDmg":1},{"Name":"Steel Rain","Brief":"With a spin, you become a storm of iron and blood.","Category":"Base","Targets":"Avoidance ","Uses":"Quickness","Range":"All targets within 20","Speed":2,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":0,"Effect":"You may throw a signal dagger at each target within range. as long as you're armed, regardless of the amount of daggers you currently possess, you always have enough normal daggers to perform this weapon trick at least once per scene. (these daggers cannot be sold, collected, and so on. they are provided simply for cinematic effect)","TrickId":31,"NoDmg":0},{"Name":"Stinging Shot","Brief":"With a shot in the right spot can you can stagger almost any opponent.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"60 (1 Target)","Speed":2,"AsPush":0,"Recovery":1,"ToHit":0,"DamageMod":0,"Effect":"If your attack roll also surpasses your target's fortitude, your target suffers push 2.","TrickId":32,"NoDmg":0},{"Name":"Stunning Strike","Brief":"With a quick shot you send your opponent's head spinning.","Category":"Base","Targets":"Avoidance ","Uses":"Might","Range":"Melee (1 Target)","Speed":2,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":0,"Effect":"If your attack roll also surpasses your target's fortitude, they are stunned.","TrickId":33,"NoDmg":0},{"Name":"Throw the Blade","Brief":"You can throw any blade with impressive accuracy.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"10 (1 Target)","Speed":0,"AsPush":0,"Recovery":2,"ToHit":0,"DamageMod":1,"Effect":"Adds 1 to damage done and you throw your sword.","TrickId":34,"NoDmg":0},{"Name":"Twin Arrows","Brief":"You can set two arrows into the same foe.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"60 (1 Target)","Speed":1,"AsPush":0,"Recovery":4,"ToHit":0,"DamageMod":100,"Effect":"You deal an additional weapon damage die. for example, if you are using a weapon that deals 1d8 (qu) in damage, roll 2d8 (qu) instead.","TrickId":35,"NoDmg":0},{"Name":"Twin throw","Brief":"With a flick of the wrist you send twin blades flying.","Category":"Base","Targets":"Avoidance","Uses":"Prowess","Range":"30 (1 or 2 Targets)","Speed":1,"AsPush":0,"Recovery":5,"ToHit":0,"DamageMod":0,"Effect":"You may throw two daggers at two different targets at range or you may attack one target with two daggers in which case you simply deal an additional weapon damage die.","TrickId":36,"NoDmg":0}]

...to go into a maptool table, with each JSON object being its own line in the table.

Code: Select all

[h : longString = pasteMe]

[h : clearTable("Test")]
[h : x = 0]
[h, foreach(entry, longString), code : {
	[h : x = x + 1]
	[h : addTableEntry("Test",x,x,entry)]
}]
That did the trick. This particular table only has 36 entries in it, but one of the ones I need is like 300+...and the json entries themselves are a lot bigger. So, needed something to eventually handle that.

User avatar
aliasmask
Deity
Posts: 8602
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: problem with stringToList

Post by aliasmask »

One method I use is to put my raw data in to a macro rather than an input or other form. Having each string per line seems like it would work for you.

viewtopic.php?f=20&t=25920

It will really kind of depend on what's easier for you build your data. I've copied raw csv tables in to a macro to parse and store. This could be helpful if excel is building your jsons and the data is too big for one excel cell.

viewtopic.php?f=20&t=27372&p=268085&hilit=excel#p268085

That's actually a slightly different method, but you could combine the 2 methods so you don't have to deal with quotes.

xavram
Dragon
Posts: 808
Joined: Tue Apr 20, 2010 8:22 pm

Re: problem with stringToList

Post by xavram »

I'll take a look, thanks!

Post Reply

Return to “MapTool 1.4”