diff --git a/layout.sty b/layout.sty
index 8bfe36097e19678ac4ed9314c0434a2a3679e5d3..8366c5bf2a57d2c02eede3cb317e3d700d91b33e 100644
--- a/layout.sty
+++ b/layout.sty
@@ -969,10 +969,43 @@ Roll & Result \\
 
 %%%%% Character Sheet Commands
 
+\newcounter{statCircles}
+\newcounter{statDots}
+
 \newcommand\statCircle{\ding{109}}
+\newcommand\statDot{\ding{108}}
+\newcommand\currentCircle{}
 \newcommand{\weeline}{\line(1,0){30} \hspace{.6cm}}
-\newcommand{\attributecircles}{\raisebox{0pt}{--} \Repeat{4}{\statCircle}\raisebox{-2pt}{\Large\statCircle}\Repeat{4}{\statCircle}\raisebox{0pt}{ +}}
-\newcommand{\skill}[1]{#1 \dotfill & \Repeat{3}{\statCircle}\\
+
+\newcommand\attributeDisplay[2]{
+\setcounter{enc}{-5}
+\setcounter{statDots}{\value{#2}}
+#1 &
+\raisebox{2pt}{--}
+\Repeat{9}{&
+\ifnum\value{enc}<\value{statDots}\renewcommand\currentCircle{\statDot}\else\renewcommand\currentCircle{\statCircle}\fi% This decides to use either a statDot (showing a stat value) or an empty statCircle (showing a potential dot)
+\ifnum\value{enc}=-1\Large\currentCircle\else\raisebox{2pt}{\currentCircle}\fi% Most circles need a raisebox to appear nicely on a line. The dot representing '0' is large, and doesn't need raised.
+\stepcounter{enc}
+}%
+&\raisebox{2pt}{+}
+\\
+}
+\newcommand{\attributecircles}[1][-5]{\raisebox{0pt}{--}%
+\setcounter{statDots}{#1}
+\setcounter{statCircles}{0}%
+\addtocounter{statCircles}{-#1}%
+\ifnum#1>-1%
+\Repeat{4}{\statDot}%
+\else%
+\Repeat{\value{statDots}}{\statDot}%
+\Repeat{\value{statCircles}}{\statCircle}%
+\fi%
+\raisebox{-2pt}{\Large\ifnum#1>-1\statDot\else\statCircle\fi}%
+\Repeat{4}{\statCircle}\raisebox{0pt}{ +}}
+\newcommand{\skill}[2][0]{
+  \setcounter{statCircles}{3}
+  \addtocounter{statCircles}{-#1}
+  #2 \dotfill & \Repeat{#1}{\statDot}\Repeat{\value{statCircles}}{\statCircle}\\
 }
 
 \newcommand\hint[1]{\small\textcolor{gray}{(#1)}}