Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×

Another rolltemplate question

Ok,   So I'm making custom sheets for my game.  Got some good feedback previously.  Got most things working, however, having an issue with ^ notation not working for  some reason. Here's what I'm trying to do :  Attack has 2 components : Roll 1d100 vs target based on range.  If the roll is more than 10 below the target number, then it's a full hit.  If it's below the target, but by 10 or less, then it's a graze, and does graze damage.  I've built the following button... <button  type="roll"  value="&{template:attack}  {{title=ATTACK!}}  {{subtitle=@{weapon}}}  {{color=red}}  {{Point Blank=@{pbrange}}}  {{Short=@{shortrange}}}  {{Medium=@{medrange}}}  {{Long=@{longrange}}}  {{Extreme=@{extrange}}}  {{Graze Damage=@{Graze}}}  {{Roll=[[1d100]]}}  {{Damage=[[@{damagedice}d10+@{damagepip}]]}}  {{target=[[@{weapontohit}]]}}  {{isattack=true}}  {{pbtarget=[[@{weapontohit}+15]]}}  {{mtarget=[[@{weapontohit}-15]]}}  {{ltarget=[[@{weapontohit}-30]]}}  {{etarget=[[@{weapontohit}-45]]}}  {{pbgtarget=[[@{weapontohit}+5]]}}  {{gtarget=[[@{weapontohit}-10]]}}  {{mgtarget=[[@{weapontohit}-25]]}}  {{lgtarget=[[@{weapontohit}-40]]}}  {{egtarget=[[@{weapontohit}-55]]}}"  name="roll_ATT"  class="d10-dice-att rollmod-no"  style="padding: 0px 0px;"> </button> To clarify what each of these things are :  {{title=ATTACK!}} --> Title in chat window {{subtitle=@{weapon}}} --> Name of weapon from char sheet {{color=red}} --> Color of chat window header {{Point Blank=@{pbrange}}} --> Point Blank range from sheet (Always 1, only populated for ranged weapons) {{Short=@{shortrange}}} --> Short range from sheet (Always populated for ranged attacks) {{Medium=@{medrange}}} --> Medium Range (not populated for scatter weapons) {{Long=@{longrange}}} --> Long Range (Not populated for scatter weapons) {{Extreme=@{extrange}}} --> Extreme Range (not populated for scatter weapons) {{Graze Damage=@{Graze}}} --> Amount of damage to apply if attack grazed target (fixed, only for certain weapons) {{Roll=[[1d100]]}} --> Attack Roll {{Damage=[[@{damagedice}d10+@{damagepip}]]}} --Damage of weapon, for grazing weapons, it's 0d10+###, with Graze some fraction of ### {{target=[[@{weapontohit}]]}} --> Base target number to hit with weapon (Short range target #) {{isattack=true}} --> Indicates this is an attack (may not be needed) {{pbtarget=[[@{weapontohit}+15]]}} -->Target # for point blank shots (15 point bonus to hit) {{mtarget=[[@{weapontohit}-15]]}} -->Target # for Medium Range (-15 pt penalty) {{ltarget=[[@{weapontohit}-30]]}} --> Target # for Long Range (-30 pt penalty) {{etarget=[[@{weapontohit}-45]]}} --> Target # for Extreme Range (-45 pt penalty) {{pbgtarget=[[@{weapontohit}+5]]}} --> Graze Target # for Point Blank Range (10 less than pb target) {{gtarget=[[@{weapontohit}-10]]}} --> Graze Target # for Short Range (10 less than target) {{mgtarget=[[@{weapontohit}-25]]}} --> Graze Target # for medium Range (10 less than m target) {{lgtarget=[[@{weapontohit}-40]]}} --> Graze Target # for long Range (10 less than l target) {{egtarget=[[@{weapontohit}-55]]}}" --> Graze Target # for extreme Range (10 less than e target) Now that that is out of the way, I built a custom rolltemplate for attacks based off of Jakob's <rolltemplate class="sheet-rolltemplate-attack"> <div class="sheet-container sheet-color-{{color}}"> <div class="sheet-header"> {{#title}}<div class="sheet-title">{{title}}</div>{{/title}} {{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}} </div> <!-- <div class="sheet-content"> {{#allprops() title subtitle desc color}} <div class="sheet-key">{{key}}</div> <div class="sheet-value">{{value}}</div> {{/allprops() title subtitle desc color}} </div> --> <div class="sheet-content"> {{#^Point Blank}} <!--If no Point Blank is passed, we assume it's a melee, straight check--> <!--No Graze Check as there's no grazing with melee--> <div class="sheet-content"> {{#allprops() title subtitle desc color}} <div class="sheet-key">{{key}}</div> <div class="sheet-value">{{value}}</div> {{/allprops() title subtitle desc color}} </div> {{#^rollGreater() Roll target}} <div class="sheet-key-succ">Attack Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll target}} {{#rollGreater() Roll target}} <div class="sheet-key-fail">FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll target}} {{/#^Point Blank}} {{#Point Blank}} <!--If Point Blank is Passed, we assume it's a ranged attack--> {{#^rollGreater() Roll pbtarget}} {{#Graze Damage}} {{#^rollGreater() Roll pbgtarget}} <div class="sheet-key-succ">Point Blank Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll pbgtarget}} {{#rollGreater() Roll pbgtarget}} <div class="sheet-key-succ">Point Blank Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll pbgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Point Blank Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll pbtarget}} {{#rollGreater() Roll pbtarget}} <div class="sheet-key-fail">Point Blank FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll pbtarget}} {{/Point Blank}} {{#Short}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll target}} {{#Graze Damage}} {{#^rollGreater() Roll gtarget}} <div class="sheet-key-succ">Short Range {{Short}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll gtarget}} {{#rollGreater() Roll gtarget}} <div class="sheet-key-succ">Short Range {{Short}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll gtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Short Range {{Short}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll target}} {{#rollGreater() Roll target}} <div class="sheet-key-fail">Short Range {{Short}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll target}} {{/Short}} {{#Medium}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll mtarget}} {{#Graze Damage}} {{#^rollGreater() Roll mgtarget}} <div class="sheet-key-succ">Medium Range {{Medium}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll mgtarget}} {{#rollGreater() Roll mgtarget}} <div class="sheet-key-succ">Medium Range {{Medium}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll mgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Medium Range {{Medium}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll mtarget}} {{#rollGreater() Roll mtarget}} <div class="sheet-key-fail">Medium Range {{Medium}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll mtarget}} {{/Medium}} {{#Long}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll ltarget}} {{#Graze Damage}} {{#^rollGreater() Roll lgtarget}} <div class="sheet-key-succ">Long Range {{Long}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll lgtarget}} {{#rollGreater() Roll lgtarget}} <div class="sheet-key-succ">Long Range {{Long}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll lgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Long Range {{Long}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll ltarget}} {{#rollGreater() Roll ltarget}} <div class="sheet-key-fail">Long Range {{Long}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll ltarget}} {{/Long}} {{#Extreme}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll etarget}} {{#Graze Damage}} {{#^rollGreater() Roll egtarget}} <div class="sheet-key-succ">Extreme Range {{Extreme}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll egtarget}} {{#rollGreater() Roll egtarget}} <div class="sheet-key-succ">Extreme Range {{Extreme}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll egtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Extreme Range {{Extreme}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll etarget}} {{#rollGreater() Roll etarget}} <div class="sheet-key-fail">Extreme Range {{Extreme}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll etarget}} {{/Extreme}} </div> </div> </rolltemplate> So, the logic here is this :  If Point Blank is not populated, then this is a melee attack.  Don't bother with the ranges or even looking at them, and just do an attack/damage check, simple hit or not hit, no grazing, etc. If Point Blank is populated, then this is a ranged attack.  Compare the roll to the target number for each range, and determine if the attack hit at each range, and if so, what damage was done.  If Graze Damage is populated, then we have to check to see if it hit or just grazed.  If there's no graze damage, then it's just a standard ranged attack, compare at each range. Output should look something like this :  (Melee Attack) Attack! Claws! Attack Successful!  Damage 18 (Ranged Attack, no Grazing) Attack! Laser Pistol! Point Blank Successful!  Damage 18 Short Range 5 squares Successful! Damage 18 Medium Range 20 squares Successful!  Damage 18 Long Range 40 squares FAILURE!  NO DAMAGE Extreme Range 80 squares FAILURE! NO DAMAGE (Ranged Attack, with Grazing) Attack! Plasma Pistol! Point Blank Successful!  Damage 100 Short Range 5 squares Successful!  Damage 100 Medium Range 20 squares GRAZED!  Damage 40 Long Range 40 squares FAILURE!  NO DAMAGE Extreme Range 80 squares FAILURE!  NO DAMAGE The above code works just fine for Grazing, that is, if everything is populated, it works exactly like what I expect, if I have a target # for Medium of 50, and a graze # for Medium of 40, and I roll a 45, I get the above message (Success at PB and S, Graze at M, fail at L and E). However, the melee and non-graze don't work.  The code in the <#^Graze Damage> and <#^Point Blank> blocks never gets called, even when those fields are not populated because the sheet doesn't have the values.  So it doesn't work.  As near as I can tell, I've done the ^'s correct (The #^RollGreater() roll target) blocks work just fine.  So... what am I missing? Matt
1603875684
mrianmerry
Pro
Sheet Author
{{#^Point Blank}} <!--If no Point Blank is passed, we assume it's a melee, straight check--> <!--No Graze Check as there's no grazing with melee--> <div class="sheet-content"> {{#allprops() title subtitle desc color}} <div class="sheet-key">{{key}}</div> <div class="sheet-value">{{value}}</div> {{/allprops() title subtitle desc color}} </div> {{#^rollGreater() Roll target}} <div class="sheet-key-succ">Attack Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll target}} {{#rollGreater() Roll target}} <div class="sheet-key-fail">FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll target}} {{/^Point Blank}} You need to get rid of the `#` from your closing statements, and it should be fine. See above for the change to your melee segment. That said, for a field to report as "not" I believe it needs to have no content whatsoever - make sure you're passing an empty value into the roll template in those instances. Even a space character counts as a value, so it needs to literally be "" and that's it.  Sorry for the double-post, but Roll20 seems to have had a fit and not allowed me to leave the Code block, lol.
Forum ate my reply. :( Thanks for that catch, it resolves an issue, but not the base issue.   Sending in an empty field (I uncommented the allprops and wrapped the value in "'s to show if there were spaces, no spaces).   Even tried changing the logic from ^Point Blank to ^Point_Blank (and resent it in in case the space was the issue).  Also tried ^rollGreater Point_Blank 0, and that didn't work either.  It's like the helpers can't do anything with the parameter if it's passed in empty, they just choke on it.  I suspect it would work just fine if Point_Blank were not passed in at all.   Is there a way to check if a field is empty in the button Value string and pass in a flag (like {{ismelee=((If pointblank="" then 1 else 0))}} or something? Matt
1603881144

Edited 1603881663
Ok, I resolved it.  *blech* ^<attribute> is borked in roll20.  Ignore what's in the wiki articles  it won't work.             {{% if #Point_Blank == '' %}}                 <!--If no Point Blank is passed, we assume it's a melee, straight check-->                 <!--No Graze Check as there's no grazing with melee-->                 <!--                 <div class="sheet-content">                     {{#allprops() title subtitle desc color}}                     <div class="sheet-key">{{key}}</div>                     <div class="sheet-value">{{value}}</div>                     {{/allprops() title subtitle desc color}}                 </div>                 -->                 <div class="sheet-key-succ">Attack Roll</div>                 <div class="sheet-value">{{Roll}}</div>                 <div class="sheet-key-succ">To-Hit Target</div>                 <div class="sheet-value">{{target}}</div>                 {{#^rollGreater() Roll target}}                     <div class="sheet-key-succ">Attack Successful!</div>                     <div class="sheet-value">{{Damage}} Damage</div>                 {{/^rollGreater() Roll target}}                 {{#rollGreater() Roll target}}                     <div class="sheet-key-fail">FAILURE!</div>                     <div class="sheet-value">No Damage</div>                 {{/rollGreater() Roll target}}             {{% endif %}} You can use plain old if/endif HTML, just wrap it in extra {}'s so the interpreter knows how to interpret.   So now just need to alter my rolltemplate to use the if/endif logic for everything.  Yay...  BTW: Forum would *NOT* let me post in screenshots today via copy/paste, had to save them to files and attach as images for some reason. *sigh* Matt Thanks all
1603884437
GiGs
Pro
Sheet Author
API Scripter
What??? This works in a rolltemplate? {{% if #Point_Blank == '' %}} Thats definitely undocumented, and pretty exciting if it does work. Note the NOT operator ^ does work - I use it a lot - but if used without a logic function, the thing youre checking has to not exist at all within the roll. Its best used with a logic function, like rollGreater(), but in such cases you must coerce the value into a number with inline roll brackets. They dont work with strings.
Yep, it works in a roll template. <rolltemplate class="sheet-rolltemplate-attack"> <div class="sheet-container sheet-color-{{color}}"> <div class="sheet-header"> {{#title}}<div class="sheet-title">{{title}}</div>{{/title}} {{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}} </div> <!-- <div class="sheet-content"> {{#allprops() title subtitle desc color}} <div class="sheet-key">{{key}}</div> <div class="sheet-value">"{{value}}"</div> {{/allprops() title subtitle desc color}} </div> --> <div class="sheet-content"> {{% if #Point_Blank == '' %}} <!--If no Point Blank is passed, we assume it's a melee, straight check--> <!--No Graze Check as there's no grazing with melee--> <!-- <div class="sheet-content"> {{#allprops() title subtitle desc color}} <div class="sheet-key">{{key}}</div> <div class="sheet-value">{{value}}</div> {{/allprops() title subtitle desc color}} </div> --> <div class="sheet-key-succ">Attack Roll</div> <div class="sheet-value">{{Roll}}</div> <div class="sheet-key-succ">To-Hit Target</div> <div class="sheet-value">{{target}}</div> {{#^rollGreater() Roll target}} <div class="sheet-key-succ">Attack Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll target}} {{#rollGreater() Roll target}} <div class="sheet-key-fail">FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll target}} {{% endif %}} {{#Point_Blank}} <!--If Point Blank is Passed, we assume it's a ranged attack--> {{#^rollGreater() Roll pbtarget}} {{#Graze Damage}} {{#^rollGreater() Roll pbgtarget}} <div class="sheet-key-succ">Point Blank Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll pbgtarget}} {{#rollGreater() Roll pbgtarget}} <div class="sheet-key-succ">Point Blank Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll pbgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Point Blank Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll pbtarget}} {{#rollGreater() Roll pbtarget}} <div class="sheet-key-fail">Point Blank FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll pbtarget}} {{/Point_Blank}} {{#Short}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll target}} {{#Graze Damage}} {{#^rollGreater() Roll gtarget}} <div class="sheet-key-succ">Short Range {{Short}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll gtarget}} {{#rollGreater() Roll gtarget}} <div class="sheet-key-succ">Short Range {{Short}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll gtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Short Range {{Short}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll target}} {{#rollGreater() Roll target}} <div class="sheet-key-fail">Short Range {{Short}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll target}} {{/Short}} {{#Medium}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll mtarget}} {{#Graze Damage}} {{#^rollGreater() Roll mgtarget}} <div class="sheet-key-succ">Medium Range {{Medium}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll mgtarget}} {{#rollGreater() Roll mgtarget}} <div class="sheet-key-succ">Medium Range {{Medium}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll mgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Medium Range {{Medium}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll mtarget}} {{#rollGreater() Roll mtarget}} <div class="sheet-key-fail">Medium Range {{Medium}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll mtarget}} {{/Medium}} {{#Long}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll ltarget}} {{#Graze Damage}} {{#^rollGreater() Roll lgtarget}} <div class="sheet-key-succ">Long Range {{Long}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll lgtarget}} {{#rollGreater() Roll lgtarget}} <div class="sheet-key-succ">Long Range {{Long}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll lgtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Long Range {{Long}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll ltarget}} {{#rollGreater() Roll ltarget}} <div class="sheet-key-fail">Long Range {{Long}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll ltarget}} {{/Long}} {{#Extreme}} <!--If Short is Passed, we assume it's a ranged attack, short is always straight target #--> {{#^rollGreater() Roll etarget}} {{#Graze Damage}} {{#^rollGreater() Roll egtarget}} <div class="sheet-key-succ">Extreme Range {{Extreme}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^rollGreater() Roll egtarget}} {{#rollGreater() Roll egtarget}} <div class="sheet-key-succ">Extreme Range {{Extreme}} Graze!</div> <div class="sheet-value">{{Graze Damage}} Damage</div> {{/rollGreater() Roll egtarget}} {{/Graze Damage}} {{#^Graze Damage}} <div class="sheet-key-succ">Extreme Range {{Extreme}} squares Successful!</div> <div class="sheet-value">{{Damage}} Damage</div> {{/^Graze Damage}} {{/^rollGreater() Roll etarget}} {{#rollGreater() Roll etarget}} <div class="sheet-key-fail">Extreme Range {{Extreme}} squares FAILURE!</div> <div class="sheet-value">No Damage</div> {{/rollGreater() Roll etarget}} {{/Extreme}} </div> </div> </rolltemplate> This is my full rolltemplate (Notice in the first part, where the if statement is).  Has to be wrapped in {{ instead of { like normal html, but it works.   And yeah, the ^ does work if the tag isn't passed in at all, but not if it's passed in but empty.  The wiki says it works if it's empty, but it doesn't.  It only works if it's not present at all. Matt
Hmmm,   Ok, so, if works if it's actually empty.  However, if it's got something in it, it fires off anyway.  So... blech... now my rolltemplate works for everything but the stuff that grazes.  *sigh*   Back to the drawing board... Matt
I think I'm just going to have to bite the bullet and put in 3 sections on the gear sheet for weapons, 1 for melee, 1 for modern weapons, and 1 for archaic weapons, and then have 3 buttons and 3 roll templates.  Then I won't have to have the complicated if/then/else type logic.  *sigh*
Resolved. Don't try to do logic in rolltemplate.  If you need logic, use multiple roll templates, because limited is limited. :) Got it working how I need it to now, just have to have 3 sections on the gear page to accomodate modern and archaic ranged weapons, and melee weapons.   Gotta love coming up with a character sheet for a system that hasn't been in production since the 1980's. :P
1603900002
Kraynic
Pro
Sheet Author
Matthew T. said: Gotta love coming up with a character sheet for a system that hasn't been in production since the 1980's. :P My first sheet was for a game system that started in the 80's, but went out of print (another edition came along) in the 90's.  Sometimes those are just the best kind... 
Well, it has always been one of my favorites (FASA Star Trek), but it's outdated both for the canon and the original had some rather serious typos/issues (FASA was good, but their editing was a joke).   I ended up retyping the entire thing into a google doc, put in updated (and corrected for typos!) tables, and my gaming group is starting up a new game as of last weekend.  Having a char sheet that works is a major bonus. There's a FASA Trek character sheet in roll20, but it's got some major bugs in it (like, the background/gear/skills textarea is missing an attribute so it loses it every time you type something in). ;P  Plus no buttons or rolling, just skill lists (and there's an 'away team' bit that auto calculates everything incorrectly).