[nWoD] exhominem'a Character Sheet Framework

MapTool campaign files that encapsulate properties, tokens, and macros for a particular ruleset or game world. "Framework" is often abbreviated "FW".

Moderators: Azhrei, dorpond, trevor, giliath, Gamerdude, jay, Mr.Ice

Forum rules
This forum is LOCKED. If a thread belongs here, use the "Report" feature of the post to let a moderator know to move it. General discussion should occur in the User Creations or MapTool forums.
qschilling
Kobold
Posts: 9
Joined: Tue Oct 26, 2010 8:28 am

Re: nWoD Character Sheet Framework

Post by qschilling »

OK, now I'm impressed. I see the light. lol. I'm sharing the below just in case they are spots that were missed. I know this is a work in progress so ignore anything that seems like a "duh" moment. btw, when did you start working on this project anyways?

Some things I noticed,

* Why are there three library tokens? why not just put one in, have everything reference that token, have it at normal token size, so they all don't get in the way during play?

* I have noticed quite a few spots where there is a text entry box that would be better suited to a drop down selection box for both point and click simplicity and for control of inputted values. observed in weapon damage bonus, or the "edit" character option. For example when adding a "weapon" what happens if a person inputs "+1" instead of "1" in the "Weapon Damage Bonus" field?

* When Clicking on Willpower, it gives you an option to spend, but not an option to make a Willpower roll. I know, rarely comes up, but it may.

* The Wounds bar on the right is pretty nice, but the red versions don't take away, they just add more(you probably already knew that. but better safe then sorry). And also, the response is sluggish so the code probably needs optimizing.

* Why does it only show some skill boxes and not others? I'm sure you have some algorithm that handles "null" values for purposes of handling the penalty for no points in a skill, but why not have it defaulted 0 so it shows 5 empty boxes and address 0 for skills? also, what happens if a character obtains 6 skill points(rare but possible for things like vampires)

I hope you don't think I'm nitpicking or negatively criticizing your work, I just have an invested interest in this project and would like to see it turn out well.

User avatar
JamzTheMan
Great Wyrm
Posts: 1872
Joined: Mon May 10, 2010 12:59 pm
Location: Chicagoland
Contact:

Re: nWoD Character Sheet Framework

Post by JamzTheMan »

Lets see if I can answer your questions. I had started on a framework early this year and there were 1 or 2 partial ones that were floating around that others were working on as well. Then in June, exhominem took one of the frameworks and incorporated another framework from another system and WoD-ified it. I jumped in and combined in my work and started going from there. I'm still cleaning up the code and removing macro's that don't make sense in WoD and are left overs from the other framework. Unfortuneatly, I haven't heard from exhominem in a while, and since he started the thread, only he can mod the top post for the most recent version. So I added a link to my signature to promote the latest builds.

RE: Token Libraries. 1, they are large to stand out as Library Tokens and easier to click on them (you click on them a lot during dev!). It shouldn't matter because during gameplay, you would never see them because you SHOULD be using different maps and never use the map for gameplay that the Lib tokens are stored on. And 2, there are 3 because the other 2 are drop-in resources that others developed. If they ever updated their code, you can replace the tokens with the macro's and bam, you are done. The WoD token is simply for MY WoD specific macro/code.

Re: Dropdown/edits. You probably are correct. Some of it may be carry over from the other framework. If you see a dialog box that would work better a different way, feel free to update it! (we'll figure out the best way to share the code)

Re: Willpower. I assume you mean the "text" and not the "Icon". I agree, it would probably be better to just kick off a Willpower roll. If you want to create a macro, I'll link it on the sheet.

Re: Wounds, ya, fixed that yesterday! :) And ya, it's slugish, mostly because I have to call a "refresh sheet" and re-renders the whole sheet. AFAIK, there is no way to refresh just part of a sheet. Probably the only way around this would be to break this sheet up into smaller mini sheets. Which would probably be better, but that's a lot to tackle. Figured I'll get the "functionality" in first then optimize.

Re: Skills.I toyed with showing empty circles, but then I had to show 5 circles (or figured it best to) for every skill. So if you had, say, firearms 3, it would be 3 solids and 2 hollow circles. Firearms 0 would be 5 hollow circles. The problem was it looked VERY busy on the sheet. I thought it best to show only solid circles for a cleaner sheet (not to mention faster rendering of the sheet). Also, the defaults for skills are -1 and -3 for mental, so if you roll a firearms 0 + dex 2, you get 1 die. And lastly, it DOES handle skills and attributes > 6, go ahead, try it! :) (I put red solid circles for 6+ and wrap on 5 dots so it should be easier to see/read.) Just click the edit icon (bottom right) and adjust a few skills/attributes and play around with it.

And finally, heck no, I don't mind the nitpicks! I'm happy to see the interest and any help is appreciated! Feel free to list any other bugs/broken macros/links. Even if I know about them already, it'll serve as a good reminder and way to track them.
-Jamz
____________________
Custom MapTool 1.4.x.x Fork: maptool.nerps.net
Custom TokenTool 2.0 Fork: tokentool.nerps.net
More information here: MapTool Nerps! Fork

qschilling
Kobold
Posts: 9
Joined: Tue Oct 26, 2010 8:28 am

Re: nWoD Character Sheet Framework

Post by qschilling »

Ok, starting off with respect! not only are you managing the application well, but your good with communication. I would like to help you and perhaps step in to fill exhominem's shoes. I would say if you don't hear from him by the time the campaign framework "1.0" is done, then another thread should be created. If I didn't notice it and I was looking, I'm sure others will have the same issue.

I never thought about leaving that map alone and just using another one. no wonder there are already race tokens created for quickly copying and pasting. I can see when it's finished there will need to be some documentation to accompany the campaign manager.

I'll be happy to help with the campaign manager optimization and if you would provide me with any links to resources, and other useful things you can provide I would be happy to bring myself up to speed so I can be more useful to the project.

As for the drop downs and willpower, happy to oblige. but that does bring up an idea, is there a flowchart of the interrelations of the called macros? probably not but it may help in seperating up work on the campaign manager so that our code does not accidentally conflict with each others. And after this post we can probably just use the forums private message options because I'm sure everyone else doesn't need a blow by blow update on the progress.

As for the mini-sheet thing, haven't explored it, but is there a "frames" setup to the sheets? if so that would be best in my opinion especially when accounting for hybrid character sheets like the on in inferno for example.(I'm sure there is more, I just haven't looked.) But then again, that may be something for a nWoD campaign manager 2.0

As for the defaults for skills, I was thinking about that, and I know that you could use -1 and -3 for for the skills respectively but that is universal in 2.0 character sheets. why not just have the -1 and -3 calculations built into the rolling macro. they have to choose which skills they are using after all. could be a matter of a simple switch case. As for the missing dots, I suppose that is just a matter of preference. To me it feels more like a WoD character sheet if it looks like one.

I am especially interested in knowing how you put together the character sheet itself, any programs used, etc..

-Quentin

User avatar
JamzTheMan
Great Wyrm
Posts: 1872
Joined: Mon May 10, 2010 12:59 pm
Location: Chicagoland
Contact:

Re: nWoD Character Sheet Framework

Post by JamzTheMan »

/agree on the new Topic/Post. I figured the same if/when it got to a 1.0 status.

/agree on documentation. Being in the IT field, documentation is ALWAYS a good thing but we developers HATE doing it lol.

Re: Willpower, no flowcharts or anything available. I pretty much follow the macros. For the calls from the Sheet, you'll want to look at the macro SupernalSheet, it contains ALL the html/macro links that make up the sheet. I tried to clean it up from the original sheet by using for/loops vs individual statements for skills/attributes. I've also tried to standarize naming of properties so they could be reused across Supernal Template types and such. Simply compare the SupernalSheet with a few of the Token Properties along with my Tables and it may start to make sense.

Also, reminds me, we need a checkbox for "Apply Willpower" to all the dice rolls to add 3 dice in. It should also subtract a willpower from the pool (and ideally only be allowed IF you have willpower left).

Re: Frames, I'm not sure. There are some good frameworks out there that I'm sure we could look at to learn from, but lets leave that for post 1.0.

Re: Skills, yes, I agree and had plan on doing the same as relying on a default field property could lead to issues (say a skill gets set back to 0 vs -1/-3 somehow), the user wouldn't really notice it. Best to include if skill<1 then... logic. For now it works as a temp solution so I haven't touched it.

Re: Dots, I'll mock up a sheet with full dots (I thought the same thing that empty dots would make it look more like a WoD sheet but to me it didn't work) and I'll post a screen shot and let you decide. If we're split, maybe I'll just make it an option somewhere, shouldn't be hard for it to it either way.

Finally, regarding programs used, nothing external, pure HTML skills and LOTS of reading/referring to the MapTool wiki (as well as search forum posts). If you are familiar with HTML code, then the SupernalSheet macro should make some sense, otherwise the internet is full of HTML guides/info.

Again though, I can't take full credit. I didn't create initial Sheet. I simply cleaned it up and changed it so it could be better "parameterized". The initial framework needed a different sheet macro for each template (mage/vampire/etc) and I came up with a scheme to allow the same sheet to be used for ANY template (so far).
-Jamz
____________________
Custom MapTool 1.4.x.x Fork: maptool.nerps.net
Custom TokenTool 2.0 Fork: tokentool.nerps.net
More information here: MapTool Nerps! Fork

User avatar
JamzTheMan
Great Wyrm
Posts: 1872
Joined: Mon May 10, 2010 12:59 pm
Location: Chicagoland
Contact:

Re: nWoD Character Sheet Framework

Post by JamzTheMan »

Ok, So I made a quick change and now torn, the extra dots don't seem as bad as I remember...
Just change the ShowDots to either "True" or "False" to show the blank dots on skills. Might as well leave it as a user preference for now, and we'll find a better place to store it outside the macro later.

Replace your SupernalSheet Macro with the following:

[spoiler=SupernalSheet Macro]

Code: Select all

[H: '<!-- WoD Character Sheet -->']

[h: ShowDots = "True"]

[h: ImgArmor = getImg("Icons", "Armor")]
[h: Imghide = tblImage("Totaltens", 0)]

[H: ImgLogo = getImg("Logo", TemplateType)]
[h: ImgInit = getImg("Icons", "Initiative")]
[h: ImgUpdateChar = getImg("Icons", "Update_Character")]

[h: ImgPlusSupernalEnergy = getImg("Icons", "Plus_"+SupernalEnergyText)]
[h: ImgMinusSupernalEnergy = getImg("Icons", "Minus_"+SupernalEnergyText)]

[h: ImgPlusWillpower = getImg("Icons", "Plus_Willpower")]
[h: ImgMinusWillpower = getImg("Icons", "Minus_Willpower")]

[H: SupernalFamilyLogo = getImg(TemplateType, SupernalFamilyText+"_"+SupernalFamily)]
[H: SupernalSocialGroupLogo = getImg(TemplateType, SupernalSocialGroupText+"_"+SupernalSocialGroup)]

[h: ImgDotFilled = getImg("Icons", "Filled_Dot")]
[h: ImgDotUnFilled = getImg("Icons", "Unfilled_Dot")]
[h: ImgDotFilledOverflow = getImg("Icons", "Filled_Dot_Overflow")]
[h: ImgDotUnFilledOverflow = getImg("Icons", "Unfilled_Dot_Overflow")]

[h: ImgHealthEmpty = getImg("HealthBoxes", "e")]
[h: ImgHealthBashing = getImg("HealthBoxes", "b")]
[h: ImgHealthLethal = getImg("HealthBoxes", "l")]
[h: ImgHealthAggravated = getImg("HealthBoxes", "a")]

[h: ImgHealthTempAdd = getImg("HealthBoxes", "Temp_Add")]
[h: ImgHealthBashingHeal = getImg("HealthBoxes", "Bashing_Heal")]
[h: ImgHealthLethalHeal = getImg("HealthBoxes", "Lethal_Heal")]
[h: ImgHealthAggravatedHeal = getImg("HealthBoxes", "Aggravated_Heal")]

[h: ImgHealthTempRemove = getImg("HealthBoxes", "Temp_Remove")]
[h: ImgHealthBashingDamage = getImg("HealthBoxes", "Bashing_Damagae")]
[h: ImgHealthLethalDamage = getImg("HealthBoxes", "Lethal_Damagae")]
[h: ImgHealthAggravatedDamage = getImg("HealthBoxes", "Aggravated_Damagae")]

<table width="100%" height="100%" cellpadding="2" align="center" border="1" bgcolor="white">
   <tr height="100%">
      <td colspan="6" width="100%">
         <TABLE BORDER="0" width="100%">
            <tr>
               <td bgcolor="white" align="center" width="20%">
                  <img src='[r: SupernalFamilyLogo]' width="50" height="50" />
               </td>
               <td bgcolor="white" align="center" width="60%" colspan="4" rowspan="2">
                  <img src='[r: ImgLogo]' width="125" height="61" />
               </td>
               <td bgcolor="white" align="center" width="20%">
                  <img src='[r: SupernalSocialGroupLogo]' width="50" height="50" />
               </td>
            </tr>
            <tr>
               <td bgcolor="white" align="center" width="20%">
                  [r: SupernalFamily]
               </td>
               <td bgcolor="white" align="center" width="20%">
                  [r: SupernalSocialGroup]
               </td>
            </tr>
         </TABLE>
      </td>

      [H: '<!-- Macro/Image Shortcut Sidebar -->']
      <td bgcolor="white" align="center" valign="middle" rowspan="9">

         Wounds
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Temp; Amount=-1", currentToken())]'>
            <img src="[r: ImgHealthTempAdd]" width="25" height="25" border="0">
         </a>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Temp; Amount=1", currentToken())]'>
            <img src="[r: ImgHealthTempRemove]" width="25" height="25" border="0">
         </a>
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Bashing; Amount=-1", currentToken())]'>
            <img src="[r: ImgHealthBashingHeal]" width="25" height="25" border="0">
         </a>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Bashing; Amount=1", currentToken())]'>
            <img src="[r: ImgHealthBashingDamage]" width="25" height="25" border="0">
         </a>
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Lethal; Amount=-1", currentToken())]'>
            <img src="[r: ImgHealthLethalHeal]" width="25" height="25" border="0">
         </a>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Lethal; Amount=1", currentToken())]'>
            <img src="[r: ImgHealthLethalDamage]" width="25" height="25" border="0">
         </a>
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Aggravated; Amount=-1", currentToken())]'>
            <img src="[r: ImgHealthAggravatedHeal]" width="25" height="25" border="0">
         </a>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Wound=Aggravated; Amount=1", currentToken())]'>
            <img src="[r: ImgHealthAggravatedDamage]" width="25" height="25" border="0">
         </a>
         <br><br>
      [r, if(SupernalEnergyText != "None"), code:
      {
         [r: SupernalEnergyText]
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=SupernalEnergy; PropText="+SupernalEnergyText+"; PropChange=1; PropMax="+SupernalEnergyMax, currentToken())]'>
            <img src="[r: ImgPlusSupernalEnergy]" width="50" height="50" border="0">
         </a>
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=SupernalEnergy; PropText="+SupernalEnergyText+"; PropChange=-1; PropMax="+SupernalEnergyMax, currentToken())]'>
            <img src="[r: ImgMinusSupernalEnergy]" width="50" height="50" border="0">
         </a>
         <br><br>
      };{
      &nbsp;
      }]
         Willpower
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=CurrentWillpower; PropText=Willpower; PropChange=1; PropMax="+MaxWillpower, currentToken())]'>
            <img src="[r: ImgPlusWillpower]" width="50" height="50" border="0">
         </a>
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=CurrentWillpower; PropText=Willpower; PropChange=-1; PropMax="+MaxWillpower, currentToken())]'>
            <img src="[r: ImgMinusWillpower]" width="50" height="50" border="0">
         </a>
         <br><br>
         Init
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","all","", currentToken())]'>
            <img src="[r: ImgInit]" width="50" height="50" border="0">
         </a>
         <br><br>
         Edit
         <br>
         <a href='[r:macroLinkText("[email protected]:WoD","gm-self","", currentToken())]'>
            <img src="[r: ImgUpdateChar]" width="50" height="50" border="0">
         </a>
      </td>
   </tr>
   <tr>
      <td valign="top" align="center" width="65%" colspan="3">
         <table width="100%" cellpadding="0" >
            <tr>
               <td width="35%" bgcolor="black" color="white" align="right" border="0"><b>Name:</b>&nbsp;</td>
               <td width="5%" height="1" border="0"><img scr="[r: Imghide]" width="1" height="1"></td>
               <td width="60%" align="Left" border="0">[r: token.name]</td>
            </tr>
            <tr>
               <td height="1" colspan="3"  border="0"><img scr="[r: Imghide]" width="1" height="1"></td>
            </tr>
            <tr>
               <td width="35%" bgcolor="black" color="white" align="right" border="0">
                  <b>Virtue / Vice:</b>&nbsp;
               </td>
               <td width="5%" height="1" border="0"><img scr="[r: Imghide]" width="1" height="1"></td>
               <td width="60%" align="Left" border="0">[r: Virtue] / [r: Vice]</td>
            </tr>
            <tr>
               <td width="35%" bgcolor="black" color="white" align="right" border="0">
                  <b>[r: SupernalMoralityText]:</b>&nbsp;
               </td>
               <td width="5%" height="1" border="0"><img scr="[r: Imghide]" width="1" height="1"></td>
               <td width="60%" align="Left" border="0">[r: SupernalMorality]</td>
            </tr>
         </table>
      </td>
      <td valign="top" align="center" width="35%" colspan="3">
         <table align="center" width="100%" height="100%" cellpadding="0">
            <tr>
               <td width="100%" bgcolor="black" color="white" align="center" border="0">
                  <b>
                     <span style="color:white">
                        [h: target=currentToken()]
                        [r: macroLink("Health", "[email protected]", "all",target, currentToken())]
                     </span>
                  </b>
               </td>
            </tr>
            <tr>
               <td width="100%" align="center" valign="center">
                  <table border=0>
                     <tr><td><image src='[r: Imghide]' width="1" height="5"></image></td></tr>
                     <tr>
                        <td align="left">
                              [h:len= length(Health)]
                              [h:status = 1]

                              [FOR(i,0,len-1,+1, ""),CODE:{
                                 [h:box = substring(Health, i, i+1)]
                                 [h,if(box!="e"&&box!="a"&&box!="l"&&box!="b"): status = 0]
                              }]
                              [h: abort(status)]
                              [FOR(i,0,len,+1, ""),CODE:{
                                 [h: i2=(i+1)/5]
                                 [h: i3=ceil((i+1)/5)]
                                 [h: i4=(i+1)/10]
                                 [h: i5=ceil((i+1)/10)]
                                 [h, IF(i2 == i3 && i > 0): ImghideWidth="7"; ImghideWidth="0"]
                                 [h, IF(i4 == i5 && i > 0): output="<br>"; output=""]
                                 
                                 [h:box = substring(Health, i, i+1)]
                                 [h,if(box=="e"):temp=4]
                                 [h,if(box=="a"):temp=3]
                                 [h,if(box=="l"):temp=2]
                                 [h,if(box=="b"):temp=1]
                                 
                                 <image src='[r: tableImage("HealthBoxes", temp)]'></image>
                                 <image src='[r: Imghide]' width="[r: ImghideWidth]" height="[r: ImghideWidth]"></image>
                                 [r: output]
                              }]
                           
                        </td>
                     </tr>
                     <tr><td><image src='[r: Imghide]' width="1" height="5"></image></td></tr>
                  </table>
               </td>
            </tr>
         </table>
      </td>
   </tr>
   [H: '<!-- Consolidated repeated HTML statements into FOR Loop - Jamz -->']
   <tr>
      <td colspan="6">
         <table width="100%" cellpadding="0">
            <tr>
            [h: attribList="Intelligence, Strength, Presence, Wits, Dexterity, Manipulation, Resolve, Stamina, Composure"]
            [h: row=0]
            [h: focus="0"]
            [FOREACH(attrib, attribList, ""),CODE:{
               [h, IF(row == 3 || row == 6): outPut="</tr><tr>"; outPut=""]
               [r: outPut]
               [h: row=row+1]
               <td width="30%" bgcolor="black" color="white" align="right" border="0">
                  <span style="color:white; font-weight:bold">
                     [h: jsonData = json.append("[]", attrib, focus, "None")]
                     [r: macroLink(attrib, "[email protected]", "all",jsonData, currentToken())]
                  </span>
               </td>
               <td border="0" width="15%" align="center" bgcolor="#dcdcdc">
                  [h: Dotlen=getProperty(attrib)]
                  [FOR(i,0,Dotlen,+1, ""),CODE:{
                     [h: i2=(i+1)/5]
                     [h: i3=ceil((i+1)/5)]
                     [h, IF(i2 == i3 && i > 0): seperator="<br>"; seperator=""]
                  
                     <image src='[r, if(i > 4): ImgDotFilledOverflow; ImgDotFilled]' width='8' height='8' />
                     [r: seperator]
                  }]
                  
                  [h: i3=ceil((Dotlen)/5)*5]
                  [FOR(i,Dotlen,i3,+1, ""),CODE:{
                     <image src='[r, if(i > 4): ImgDotUnFilledOverflow; ImgDotUnFilled]' width='8' height='8' />
                  }]
               </td>
            }]
            </tr>
         </table>
         <tr>
            <td colspan="6">
               <table width="100%" cellpadding="0">
                  <tr>
                  [h: skillList="Academics, Athletics, Animal_Ken, Computer, Brawl, Empathy, Crafts, Drive, Expression, Investigation, Firearms, Intimidation, Medicine, Larceny, Persuasion, Occult, Stealth, Socialize, Politics, Survival, Streetwise, Science, Weaponry, Subterfuge"]
                  [h: row=0]
                  [h: focus="0"]
                  [FOREACH(skill, skillList, ""),CODE:{
                     [h: row2=row/3]
                     [h: row3=ceil(row/3)]
                     [h, IF(row2 == row3 && row > 0): outPut="</tr><tr>"; outPut=""]
                     [r: outPut]
                     [h: row=row+1]
                     <td width="30%" bgcolor="black" color="white" align="right" border="0">
                        <span style="color:white; font-weight:bold">
                           [h: jsonData = json.append("[]", skill, focus, "None")]
                           [r: macroLink(skill, "[email protected]", "all",jsonData, currentToken())]
                        </span>
                     </td>
                     <td border="0" width="69%" align="center" bgcolor="#dcdcdc">
                        [h: Dotlen=getProperty(skill)]
                        [h, IF(Dotlen < 0 && ShowDots == "False"): ImgTemp=Imghide; ImgTemp=ImgDotFilled]
                        [h, IF(Dotlen < 0 && ShowDots == "False"): ImgTemp2=Imghide; ImgTemp2=ImgDotUnFilled]
                        [h, IF(Dotlen < 0): Dotlen=0]

                        [FOR(i,0,Dotlen,+1, ""),CODE:{
                           <image src='[r: ImgTemp]' width='8' height='8' />
                        }]
                        [FOR(i,Dotlen,5,+1, ""),CODE:{
                           <image src='[r: ImgTemp2]' width='8' height='8' />
                        }]
                     </td>
                     <td border="0"  width="1%" align="center" bgcolor="#dcdcdc"><span style="color:black">
                     </td>
                  }]
                  </tr>         
               </table>
            </td>
         </tr>
         <tr>
            <td valign="top" align="center" width="80%" colspan="5">
               <table width="100%" cellpadding="0">
                  <tr>
                     <td border="0"  width="40%" align="center" bgcolor="black" color="white"><span style="color:white"><b>
                        [r: macroLink("Weapon", "[email protected]", "none","", currentToken())]</b></span>
                     </td>
                     <td border="0"  width="30%" align="center" bgcolor="black" color="white"><b>Attack Roll</b>
                     </td>
                     <td border="0"  width="30%" align="center" bgcolor="black" color="white"><b>Attack Skill</b>
                     </td>
                  </tr>         
                  [h,if(json.isEmpty(Weapons)): weaponList = ""; weaponList = json.fields(Weapons)]
               
                  [foreach(wpn, weaponList, ""), code: {
                     [h: wpnDetails = json.get(Weapons, wpn)]
                     [h: wpnName = wpn]
                     [h: wpnAbil = json.get(wpnDetails, "Ability")]
                     [h: wpnSkill = json.get(wpnDetails, "Skill")]
                     [h: wpnDmg = json.get(wpnDetails, "Damage")]
                     [h: wpnrng = json.get(wpnDetails, "Range")]
                     [h: focbonus=0]
                     [h: wpnRBval = getProperty(wpnAbil)]
                     [h: wpnSKval = getProperty(wpnSkill)]
                     [h:wpnRollBonus = wpnRBval + wpnSKval + wpnDmg]

                     <tr>
                        <td border="0"  height="3" colspan="6"><img scr="[r: Imghide]" width="1" height="1">
                        </td>
                     </tr>
                     <tr>
                        <td border="0"  width="40%" align="center">
                           <span style="color:black">
                              [h:jsonData = json.append("[]", wpnName, wpnRollBonus)]
                              [r: macroLink(wpnName, "[email protected]", "all",jsonData, currentToken())]
                           </span>
                        </td>
                        <td border="0"  width="30%" align="center"> [r: wpnRollBonus]</td>
                        <td border="0"  width="30%" align="center"> [r: wpnSkill]</td>
            
                     </tr>
                     [if(wpnrng != "---" && wpnrng != ""), code: {
                        <tr>
                           <td border="0"  height="3" colspan="3"><img scr="[r: Imghide]" width="1" height="1">
                           </td>
                        </tr>
                        <tr>
                           <td border="0"  width="100%" align="center" colspan="3">
                              <span style="font-style:italic">[r: wpnrng] Range</span>
                           </td>
                        </tr>
                     };
                     {}]
                     <tr>
                        <td border="0"  height="3" colspan="3"><img scr="[r: Imghide]" width="1" height="1">
                        </td>
                     </tr>
                     <tr>
                        <td border="0"  height="1" colspan="3" bgcolor="black"><img scr="[r: Imghide]" width="1" height="1">
                        </td>
                     </tr>
                     <tr>
                        <td border="0"  height="3" colspan="3"><img scr="[r: Imghide]" width="1" height="1">
                        </td>
                     </tr>
                  }]
               </table>
            </td>
            <td valign="top" align="center" width="20%" colspan="1">
               <table width="100%" cellpadding="0">
               [r, if(SupernalTraitText != "None"), code:
               {
                  <tr>
                     <td border="0" align="center" bgcolor="Maroon" color="white" colspan="2"><b>[r:SupernalTraitText]</b></td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">[r: SupernalTrait]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="Maroon" color="white" colspan="2">
                        <span style="color:white">
                           <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=SupernalEnergy; PropText="+SupernalEnergyText+"; PropChange=2; PropMax="+SupernalEnergyMax, currentToken())]'>
                              [r: SupernalEnergyText]
                           </a>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">
                        [r: SupernalEnergy+" ("+SupernalEnergyMax+")"] / [r:SupernalEnergyPerTurn] per turn
                     </td>
                  </tr>
               };{<!-- No Trait -->}]
                  <tr>
                     <td border="0" align="center" bgcolor="Navy" color="white" colspan="2">
                        <span style="color:white">
                           <a href='[r:macroLinkText("[email protected]:WoD","all","Prop=CurrentWillpower; PropText=Willpower; PropChange=2; PropMax="+MaxWillpower, currentToken())]'>
                              Willpower
                           </a>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">[r: Willpower]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="black" color="white" colspan="2"><b>Speed</b></td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">[r: Speed]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="black" color="white" colspan="2"><b>Initiative</b></td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">[r: InitMod]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="Green" color="white" colspan="2">
                        <span style="color:white"><b>Defense</b>
                     </td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc" colspan="2">[r: Defense]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="black" color="white" colspan="2">
                        <span style="color:white">
                           <b>[r: macroLink("Armor", "[email protected]:WoD", "none", "", currentToken())]</b>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td border="0"  valign="top" align="center" bgcolor="#dcdcdc" rowspan="2">
                        <span style="color:black">
                           <img src="[r: ImgArmor]" width="40" height="40" border="0">
                        </span>
                     </td>
                     <td border="0" align="center" bgcolor="#dcdcdc">[r: Armor]</td>
                  </tr>
                  <tr>
                     <td border="0" align="center" bgcolor="#dcdcdc">
                        [r: macroLink(ArmorType, "[email protected]:WoD", "none", "", currentToken())]
                     </td>
                  </tr>
               </table>
            </td>
         </tr>
         [h,if(json.isEmpty(SpellBook)): spellList = ""; spellList = json.fields(SpellBook)]
         [if(Mana > 0), CODE: {
            <tr>
               <td colspan="6">
                  <table width="100%" cellpadding="0">
                     <tr>
                        <td border="0" align="center" bgcolor="black" color="white" width="100%" colspan="6">
                           <span style="color:white">
                              <b>[r: macroLink(SupernalPowersText, "[email protected]:WoD", "none", "", currentToken())]</b></span>
                        </td>
                     </tr>
                     <tr>      
                        <td border="0"  td align="center" width="100%">
                        [foreach(spell, spellList, ", "), code: {
                           [h: spellDetails = json.get(SpellBook, spell)]
                           [h: spellName = spell]
                           [h: spellSchool = json.get(spellDetails, "School")]
                           [h: spellType = json.get(spellDetails, "Type")]
                           [h: spellManaCost = json.get(spellDetails, "ManaCost")]
                           [h: spellCastTime = json.get(spellDetails, "CastTime")]
                           [h: spellTN = json.get(spellDetails, "TN")]
                           [h: spellTest = json.get(spellDetails, "Test")]
                           [h: spellDesc = json.get(spellDetails, "Desc")]
                           
                           <span style="color:black">
                              [h:jsonData = json.append("[]", spellName, spellSchool, spellType, spellManaCost, spellCastTime, spellTN, spellTest, spellDesc)]
                              [r: macroLink(spellName, "[email protected]", "none",jsonData, currentToken())]
                           </span>
                        }]
                        </td>
                     </tr>   
                  </table>
               </td>
            </tr>
         };{}]
         <tr>
            <td colspan="6">
               <table width="100%" cellpadding="2">
                  [h, IF(json.isEmpty(ClassTalent)): ctList = ""; ctList = json.fields(ClassTalent)]
                  <tr>
                     <td border="0"  colspan='2' align='center' bgcolor="black">
                        <span color='white'>
                           <b>[r:macroLink("Other Abilities","[email protected]", "none", "", currentToken())]</b>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td border="0"   colspan='2'>
                     [r,foreach(entry, ctList,",  "),CODE:
                     {
                        [h:ctDetail = json.get(ClassTalent,entry)]
                        [h:ctDesc = json.get(ctDetail, "ctText")]
                        <span style="color:black">
                           [h:jsonData = json.append("[]", ctDesc, entry)]
                           [r: macroLink(entry, "[email protected]", "none",jsonData, currentToken())]
                     }]
                     </td>
                  </tr>            
               </table>
            </td>
         </tr>
         <tr>
            <td colspan="6">
               <table  width="100%" cellpadding="0">
                  <tr>
                     <td border="0"  border="0"  colspan='5' align='center' bgcolor="black">
                        <span color='white'>
                           <b>[r:macroLink("Equipment","[email protected]", "self", "", currentToken())]</b>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td border="0" colspan="5" align="center">[r: Equipment]</td>
                  </tr>
               </table>
            </td>
         </tr>
      </table>
[/spoiler]
-Jamz
____________________
Custom MapTool 1.4.x.x Fork: maptool.nerps.net
Custom TokenTool 2.0 Fork: tokentool.nerps.net
More information here: MapTool Nerps! Fork

qschilling
Kobold
Posts: 9
Joined: Tue Oct 26, 2010 8:28 am

Re: nWoD Character Sheet Framework

Post by qschilling »

Ok, so I tried to show the nwod campaign tool to a friend and the application bombed out badly. when I clicked on the option to show the character sheet, it would never show. I found out later it technically was showing it, but on a screen that at the time wasn't attached. But I also noticed how bogged down and how much memory it uses. The problem with that is, how is all that information going to translate in gameplay. And although the Chicago book icons are cool, don't the sheer number of them use up valuable memory resources?

I was thinking that perhaps just an HTML form with CSS stylesheets associated with no images might do the trick better and still look good. I may have to abondon the idea of working on this project and just create a minimalistic approach to white wolf campaign. In other words, not sooooo much automation that it bogs things down.

User avatar
JamzTheMan
Great Wyrm
Posts: 1872
Joined: Mon May 10, 2010 12:59 pm
Location: Chicagoland
Contact:

Re: nWoD Character Sheet Framework

Post by JamzTheMan »

I had the same issue (sheet was on a second monitor and when I reopened the campaign, I couldn't find it!). A simple [R: resetFrame("Sheet")] will bring it back. I've included a macro Reset Sheet on the Lib Token for now. Could move it to the Campaign macros if needed.

Now, exactly how much memory was it using? It only uses about 125m on my machine. Now, if you open other maps (ie the VtR Icons) it will grow in memory. But if you double click the memory bar at the bottom, it'll clear the unused memory if that's an issue.

Also, there is NOTHING that says you have to use the Icons provided, they are simply a resource. Simply delete the maps or never click on them (I believe if you never go to the map, it does not consume memory), although deleting the maps DOES shrink the campaign size considerably and speeds up load time. I suggest doing an export of the maps and then delete (and then you can import them later if needed).

Eventually, I'll make it a repository or .rptok tokens, but it'll take forever to click and save each one individually.

If you remove those maps, does it speed things up and/or what exactly is "slow"? I'll definitely look at speeding things up if needed. Personally I run on a quad-core Windows 7 machine with 4 gb of ram. It's about 2 years old and it runs just fine on my PC. But I'm sure mileage will vary if your PC is older/slower.

Lastly, what settings do you use for Max/Min memory and Stack size? I know some Frameworks require larger stack sizes and that can affect performace. I haven't played with my settings to see what affect if any it has, but currently I'm using 1024/64/2 as my settings.
-Jamz
____________________
Custom MapTool 1.4.x.x Fork: maptool.nerps.net
Custom TokenTool 2.0 Fork: tokentool.nerps.net
More information here: MapTool Nerps! Fork

AxisMundi
Kobold
Posts: 2
Joined: Sat Jan 15, 2011 3:55 am

Re: nWoD Character Sheet Framework

Post by AxisMundi »

Hello!

First of all, great framework. Best one for NWOD I've seen yet.

Secondly, it seems that there hasn't been an update to this in a couple of months. I hope it's still going on because I'm looking forward to the "finished project".

I'm going to address a few things in Mage terms, since it's the only nwod game i'm familiar with.

Some issues I've noticed, as well as possible suggestions:
1.) supernal powers (example: mage arcana) do not show up on the character sheet. (The code seems to be in SupernalSheet, though.)
a.) It would be nice to enable a gnosis + arcanum macro for improvised spells, and an attribute + skill + arcanum roll for rote spells. (Similar to the current setup for skill rolls)
b.) relating to a.) it would be great if there were an option on the modifier prompt which would allow for covert/vulgar spell selection, and if vulgar, would prompt a paradox roll.
2.) a merits/notes section on the sheet would be nice.
3.) equipment section seems to be set to gold/silver/copper values.
4.) Willpower / Vitae macro buttons reference nonexistent library macros (although the char sheet links seem to work.)
5.) spend mana/willpower macros do not seem to affect any actual roll mechanics - they just adjust the stats and post a chat message.
6.) a token movement limiter tied to the modified speed trait would be awesome.
7.) Modifiers such as wound penalty do not seem to affect roll mechanics (similar to 5)
8.) Some health related macro buttons do not automatically update the character sheet while others do.
9.) Attack rolls - it would be great if there were a way to figure in/automatically pull a Defense modifier from a target token.
10.) A few of the wound related states of being seem to reference "vampire-specific" game terms (such as torpor) and/or use mixed up icons.
11.) Your health tracking system is GREAT.
12.) How hard would it be to make a stripped down version of the framework that doesn't reference the character sheet? It seems that there's a lot of lag when tracking health and damage and when moving tokens about the map, even on the default black map (I use a dual core PC with 3 GB ram).
a.) It would be awesome to make some of the rolls only available on the sheet into macro buttons which didn't reference the library token in order to make your framework more "modular".

I tried for about a week to work on some of these perceived issues in my own time but your macros are quite complex and my programming/html skills are not up to the task, unfortunately. :(

Otherwise, this is overall stellar work! I hope that the inactivity in this thread over the winter isn't a sign of an abandoned project!

Let me know if there's anything I can do. I'm happy to playtest any of your new versions.

Littlespoon
Kobold
Posts: 7
Joined: Tue May 04, 2010 2:51 am

Re: nWoD Character Sheet Framework

Post by Littlespoon »

I've been messing around with this campaign file and the Orpheaus one to try and learn more about maptools, since both frameworks have things i would like to see in a framework should i ever get around to using maptools.

I have a question that i'll put here as it has to do with this framework:

I have created a campaign macro called "Attack" that collects all the info via inputs and passes the correct dicepool to another macro on the lib token called "ResolveAction" that works out how many successes were achieved, now my problem is how can i call the macro addBash on the victim token and not the token that clicks the "attack" macro. Ive read about switchToken() but cant seem to get it working.

Any help about how to call addBash on another macro to damage them and not the calling token would be really helpful in me understanding more about maptools.

Thanks

AxisMundi
Kobold
Posts: 2
Joined: Sat Jan 15, 2011 3:55 am

Re: nWoD Character Sheet Framework

Post by AxisMundi »

I had an epiphany a couple of nights ago while hacking around with this framework. I was finally able to decipher the mechanics of a lot of your macros and made a few edits and changes.

I hope you don't mind me doing the things I did, or me posting this here. I can start a separate thread if you'd like, but since this is being based upon your prior work I'm posting this here.

I'm making this framework as a custom piece for a Mage: The Awakening game I'm wanting to run with friends set in Southern Appalachia, USA. This all of the work I'm doing is relating to your Mage token and Mage specific mechanics.

Here is a screenshot of what I'm working on:

Image

Here is a major list of some of the things I've done:

1.) I ditched the Character Sheet and the SupernalSheet macro. No offense, it was great work, but having it open was really bogging down the campaign's reaction time to commands. Without the sheet, the responsiveness and lag are much much better, however the downside is an external character sheet may probably end up being needed.

2.) Your health tracking system is great. I altered some of the bashing/lethal/aggravated damage and healing buttons and cleaned up some minor syntax errors.

3.) I made buttons which allow you to roll improvised and rote spells. clicking the button pulls up a menu where you can choose the appropriate attribute/skill/mage arcanum, etc. I also made some general firearms/melee/unarmed attack buttons. Wound Penalty now displays with every roll so far as well as modifies the dice pool automatically.

Here is a wish list of some things I would very much like to add to this framework, but so far lack the knowhow:

1.) I'd like to add a spend mana and a spend willpower to spell and rote rolls. I'd also like the add willpower checkbox to be applied to all possible rolls. If the check box is selected, the appropriate amount of mana/willpower will be deducted from the character's pool and tracked/displayed in boxes (see 2.) )

2.) Relating to 1.), I would like to modify the existing health tracking system to also have a system to track mana and willpower spent and gained with boxes similar to the how health works now. Also, generic add/spend mana and willpower buttons will be needed for when mana and willpower are gained through merits, roleplaying etc. Also, the appropriate mana spent/turn limit would apply so characters would not be able to add more mana to a roll than allowed.

3.) For spell/rote rolls, I want to add an option to toggle if the spell is covert or vulgar. If vulgar is selected, an additional prompt will occur calling for a paradox roll (per the mage rules). The outcome of the paradox roll would be displayed in the chat similar to how the other rolls do. Per the game mechanics, every time a paradox roll is made in a scene, the roll's dice pool increases by one. (This means a macro is needed to reset a character's paradox modifier.) Please see the Mage rules on paradox for a specific description of the paradox mechanic so I don't need to infringe on copyright by posting it all here.

4.) I'd like to add a prompt to the initiative button which asks for any temporary initiative modifiers one might have due to spells/effects before rolling.

5.) I'd like to add buttons which a character can click to "equip" certain armors (and weapons, possibly) which will automatically apply their individual modifiers to relevant rolls. For example, a "bulletproof vest" button, and a "riot armor" button" that one could click to add those armor's statistics to the character's related rolls. The "equipped" button turns a certain color to signify it's equipped, and equipping a button will automatically unequip other buttons in the group and the buttons' colors would toggle accordingly. This could be extended in a similar fashion to weapons and other roll-modifying items so that "items" in the form of buttons could easily be doled out from storyteller to player using a storyteller's master button template.

6.) Ultimately I'd like to get rid of and clean up all of the library macros and token properties which aren't being used by this specific framework, but at this point I'm loath to do so for fear of inadvertently breaking something or deleting code which could end up being useful later.

7.) I'd like to add a damage applying function to attack rolls a character/npc token makes on a targeted token, so that a successful attack roll using a certain weapon applies to the targeted token, with the token's state of being reported and the token's health boxes reported to the chat via the tracker. (also, a way to post in chat which token is being targeted at the roll would be nice. In the case of automatic firearms, a mechanic which applies the appropriate roll modifiers to multiple targets would be really cool.)

Attached is a file for the framework. Please feel free to take a look and offer opinions or modify it as you please.

If you'd like to collaborate on this more privately via email etc. please let me know.

Campaign file (sendspace): http://www.sendspace.com/file/50y7u7

JrrToshkien
Kobold
Posts: 1
Joined: Tue May 18, 2010 3:36 pm

Re: nWoD Character Sheet Framework

Post by JrrToshkien »

heya all great work on the framework for NWOD , quick question as a player how do you bring up your character sheet , at the moment i can only see the full sheet as the gm how do my players see it ?

gordona8
Kobold
Posts: 1
Joined: Mon Jul 04, 2011 8:23 pm

Re: nWoD Character Sheet Framework

Post by gordona8 »

A friend and I were just testing out the campaign file I made using your framework. I was logged in as DM and she as a player. Despite her not having ownership of the NPC characters and these being selected as 'NPCS' in the token properties, she can still see their stats and etc because I checked off the 'Character' box in the 'State' tab so I can see the NCP char sheet. Even without the 'character' box selected the player can still see the stats that pop up next to the NPCs portrait. Is this a bug? I would really, really, like to keep the character sheet available for me but make it invisible for players.

seanrpg
Kobold
Posts: 21
Joined: Mon Sep 27, 2010 2:41 pm
Location: Tidewater, VA
Contact:

Re: nWoD Character Sheet Framework

Post by seanrpg »

Is anyone still working on either of these nWoD macro packages?

Armydan
Kobold
Posts: 3
Joined: Sun May 02, 2010 5:48 pm

Re: [nWoD] exhominem'a Character Sheet Framework

Post by Armydan »

Howdy all,

Repeating the above, is there any work happening on this Framework, its awesome so far.

A quick question (or rather a few), firstly, is there any way to automate (or is there something in there) like the Use Disguise Macro etc (or a Mod or something) for the Werewolves to get all their stat boosters/changes to skills due to the shapechanging (and changing the pic)

Number 2 question. Disclipines, can someone explain all the options and what they mean to the character sheets / tokens?

Number 3 question. I seem to have occasional timeouts when opening the Character Sheet - basically hanging without causing Maptools to crash. I'm running lap top with 2 gig and all the settings on Maptools 86 up to max (1024 max, 512 stack size, 8 stacks). Wondering if this is commonplace (also seems to happen during the autosave).

Ta

Dan

Nin
Cave Troll
Posts: 51
Joined: Tue Oct 25, 2011 8:17 am

Re: [nWoD] exhominem'a Character Sheet Framework

Post by Nin »

I would love to see this Framework finished as well.

Post Reply

Return to “Campaign Frameworks”