diff --git a/public/main.js b/public/main.js index 01d057804784f7ff3603cfaa4db705b4edc401fc..46dae53e0e46a9d5256d0d9e29836699017d2a1c 100644 --- a/public/main.js +++ b/public/main.js @@ -5159,7 +5159,19 @@ var $elm$core$Task$perform = F2( A2($elm$core$Task$map, toMessage, task))); }); var $elm$browser$Browser$document = _Browser_document; -var $author$project$Creation$new = {freebie: 15, spheres: 6}; +var $author$project$Stats$Mental = {$: 'Mental'}; +var $author$project$Stats$Physical = {$: 'Physical'}; +var $author$project$Stats$Social = {$: 'Social'}; +var $author$project$Creation$new = { + attributes: { + primary: 7, + priority: _Utils_Tuple3($author$project$Stats$Physical, $author$project$Stats$Social, $author$project$Stats$Mental), + secondary: 5, + tertiary: 3 + }, + freebie: 15, + spheres: 6 +}; var $author$project$Stats$Arete = {$: 'Arete'}; var $author$project$BoundedInt$new = F3( function (value, min, max) { @@ -5170,6 +5182,17 @@ var $author$project$Stats$newArete = { name: 'Arete', statType: $author$project$Stats$Arete }; +var $author$project$Stats$Attribute = function (a) { + return {$: 'Attribute', a: a}; +}; +var $author$project$Stats$newAttribute = F2( + function (category, name) { + return { + dots: A3($author$project$BoundedInt$new, 1, 1, 5), + name: name, + statType: $author$project$Stats$Attribute(category) + }; + }); var $author$project$Stats$Sphere = {$: 'Sphere'}; var $author$project$Stats$newSphere = function (name) { return { @@ -5189,7 +5212,16 @@ var $author$project$Stats$new = _List_fromArray( $author$project$Stats$newSphere('Prime'), $author$project$Stats$newSphere('Spirit'), $author$project$Stats$newSphere('Time'), - $author$project$Stats$newArete + $author$project$Stats$newArete, + A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Strength'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Dexterity'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Stamina'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Charisma'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Manipulation'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Appearance'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Perception'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Intelligence'), + A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Wits') ]); var $author$project$Character$new = {creationPoints: $author$project$Creation$new, name: 'Default Name', stats: $author$project$Stats$new}; var $elm$core$Platform$Cmd$batch = _Platform_batch; @@ -5305,35 +5337,38 @@ var $author$project$Stats$spheresInList = function (stats) { var $author$project$Character$changeStat = F2( function (character, stat) { var _v0 = stat.statType; - if (_v0.$ === 'Sphere') { - var spheres = $author$project$Stats$spheresInList(character.stats); - var maybeOldDots = A2($author$project$Stats$dotsOfStatInList, spheres, stat.name); - var arete = $author$project$Stats$areteInList(character.stats); - var difference = function () { + switch (_v0.$) { + case 'Arete': + return character; + case 'Sphere': + var spheres = $author$project$Stats$spheresInList(character.stats); + var maybeOldDots = A2($author$project$Stats$dotsOfStatInList, spheres, stat.name); + var arete = $author$project$Stats$areteInList(character.stats); + var difference = function () { + if (maybeOldDots.$ === 'Nothing') { + return 0; + } else { + var oldDots = maybeOldDots.a; + return (_Utils_cmp(stat.dots.value, arete.dots.value) > 0) ? (arete.dots.value - oldDots.value) : (stat.dots.value - oldDots.value); + } + }(); if (maybeOldDots.$ === 'Nothing') { - return 0; + return character; } else { var oldDots = maybeOldDots.a; - return (_Utils_cmp(stat.dots.value, arete.dots.value) > 0) ? (arete.dots.value - oldDots.value) : (stat.dots.value - oldDots.value); + var buyAmount = A2($elm$core$Basics$min, difference, character.creationPoints.spheres); + return _Utils_update( + character, + { + creationPoints: A2($author$project$Creation$buySphere, character.creationPoints, buyAmount), + stats: A2( + $author$project$Stats$changeStatInList, + character.stats, + A2($author$project$Stats$changeDotsTo, stat, oldDots.value + buyAmount)) + }); } - }(); - if (maybeOldDots.$ === 'Nothing') { + default: return character; - } else { - var oldDots = maybeOldDots.a; - var buyAmount = A2($elm$core$Basics$min, difference, character.creationPoints.spheres); - return _Utils_update( - character, - { - creationPoints: A2($author$project$Creation$buySphere, character.creationPoints, buyAmount), - stats: A2( - $author$project$Stats$changeStatInList, - character.stats, - A2($author$project$Stats$changeDotsTo, stat, oldDots.value + buyAmount)) - }); - } - } else { - return character; } }); var $author$project$Main$modalValue = F2( @@ -5388,22 +5423,99 @@ var $author$project$Main$update = F2( } }); var $author$project$Main$Name = {$: 'Name'}; +var $author$project$Stats$isAttribute = function (stat) { + var _v0 = stat.statType; + if (_v0.$ === 'Attribute') { + return true; + } else { + return false; + } +}; +var $author$project$Stats$attributesInList = function (stats) { + return A2($elm$core$List$filter, $author$project$Stats$isAttribute, stats); +}; var $elm$html$Html$div = _VirtualDom_node('div'); var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; -var $author$project$Main$OpenModal = function (a) { - return {$: 'OpenModal', a: a}; -}; -var $elm$json$Json$Encode$string = _Json_wrap; -var $elm$html$Html$Attributes$stringProperty = F2( - function (key, string) { +var $author$project$Stats$isAttributeOfCategory = F2( + function (category, stat) { + return _Utils_eq( + stat.statType, + $author$project$Stats$Attribute(category)); + }); +var $author$project$Stats$attributesOfCategoryInList = F2( + function (category, stats) { return A2( - _VirtualDom_property, - key, - $elm$json$Json$Encode$string(string)); + $elm$core$List$filter, + $author$project$Stats$isAttributeOfCategory(category), + stats); + }); +var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$core$String$fromFloat = _String_fromNumber; +var $elm$svg$Svg$Attributes$height = _VirtualDom_attribute('height'); +var $elm$core$List$map3 = _List_map3; +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$sqrt = _Basics_sqrt; +var $elm$svg$Svg$trustedNode = _VirtualDom_nodeNS('http://www.w3.org/2000/svg'); +var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg'); +var $author$project$Main$toDotPosition = F4( + function (size, gap, offset, id) { + var marginalIncrease = (size + gap) / 2; + return _Utils_Tuple2((id * marginalIncrease) + offset, (((id + 1) % 2) * marginalIncrease) + offset); + }); +var $author$project$Main$ChangeStat = function (a) { + return {$: 'ChangeStat', a: a}; +}; +var $author$project$Main$boolAsIntString = function (bool) { + return bool ? '1' : '0'; +}; +var $elm$core$String$concat = function (strings) { + return A2($elm$core$String$join, '', strings); +}; +var $elm$svg$Svg$Attributes$fill = _VirtualDom_attribute('fill'); +var $elm$svg$Svg$Attributes$fillOpacity = _VirtualDom_attribute('fill-opacity'); +var $elm$core$List$intersperse = F2( + function (sep, xs) { + if (!xs.b) { + return _List_Nil; + } else { + var hd = xs.a; + var tl = xs.b; + var step = F2( + function (x, rest) { + return A2( + $elm$core$List$cons, + sep, + A2($elm$core$List$cons, x, rest)); + }); + var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl); + return A2($elm$core$List$cons, hd, spersed); + } + }); +var $elm$core$Tuple$mapBoth = F3( + function (funcA, funcB, _v0) { + var x = _v0.a; + var y = _v0.b; + return _Utils_Tuple2( + funcA(x), + funcB(y)); + }); +var $elm$core$Tuple$mapFirst = F2( + function (func, _v0) { + var x = _v0.a; + var y = _v0.b; + return _Utils_Tuple2( + func(x), + y); + }); +var $elm$core$Tuple$mapSecond = F2( + function (func, _v0) { + var x = _v0.a; + var y = _v0.b; + return _Utils_Tuple2( + x, + func(y)); }); -var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); -var $elm$html$Html$i = _VirtualDom_node('i'); var $elm$virtual_dom$VirtualDom$Normal = function (a) { return {$: 'Normal', a: a}; }; @@ -5421,7 +5533,167 @@ var $elm$html$Html$Events$onClick = function (msg) { 'click', $elm$json$Json$Decode$succeed(msg)); }; -var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$svg$Svg$Attributes$points = _VirtualDom_attribute('points'); +var $elm$svg$Svg$polygon = $elm$svg$Svg$trustedNode('polygon'); +var $elm$core$Tuple$second = function (_v0) { + var y = _v0.b; + return y; +}; +var $elm$svg$Svg$Attributes$stroke = _VirtualDom_attribute('stroke'); +var $elm$svg$Svg$Attributes$strokeWidth = _VirtualDom_attribute('stroke-width'); +var $author$project$Main$tupleToString = function (tuple) { + var second = $elm$core$String$fromFloat(tuple.b); + var first = $elm$core$String$fromFloat(tuple.a); + return first + (',' + second); +}; +var $author$project$Main$valueOrReset = F2( + function (dots, value) { + return _Utils_eq(dots.value, value) ? dots.min : value; + }); +var $author$project$Main$viewDot = F6( + function (stat, size, strokeWidth, isFilled, id, position) { + return A2( + $elm$svg$Svg$polygon, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$points( + $elm$core$String$concat( + A2( + $elm$core$List$intersperse, + ' ', + A2( + $elm$core$List$map, + $author$project$Main$tupleToString, + A2( + $elm$core$List$map, + $elm$core$Tuple$mapSecond( + $elm$core$Basics$add(position.b)), + A2( + $elm$core$List$map, + $elm$core$Tuple$mapFirst( + $elm$core$Basics$add(position.a)), + A2( + $elm$core$List$map, + A2( + $elm$core$Tuple$mapBoth, + $elm$core$Basics$mul(size), + $elm$core$Basics$mul(size)), + _List_fromArray( + [ + _Utils_Tuple2(0.5, 0.0), + _Utils_Tuple2(1.0, 0.5), + _Utils_Tuple2(0.5, 1.0), + _Utils_Tuple2(0.0, 0.5) + ])))))))), + $elm$svg$Svg$Attributes$fill('var(--bulma-body-color)'), + $elm$svg$Svg$Attributes$fillOpacity( + $author$project$Main$boolAsIntString(isFilled)), + $elm$svg$Svg$Attributes$stroke('var(--bulma-body-color)'), + $elm$svg$Svg$Attributes$strokeWidth( + $elm$core$String$fromFloat(strokeWidth)), + $elm$html$Html$Events$onClick( + $author$project$Main$ChangeStat( + _Utils_update( + stat, + { + dots: A2( + $author$project$BoundedInt$changeTo, + stat.dots, + A2($author$project$Main$valueOrReset, stat.dots, id + 1)) + }))) + ]), + _List_Nil); + }); +var $elm$svg$Svg$Attributes$width = _VirtualDom_attribute('width'); +var $author$project$Main$viewDots = function (stat) { + var rangeList = A2($elm$core$List$range, 0, stat.dots.max - 1); + var isFilledList = A2( + $elm$core$List$map, + $elm$core$Basics$gt(stat.dots.value), + rangeList); + var dotSize = 12; + var dotOutline = 0.05 * dotSize; + var svgOutlineMargin = $elm$core$Basics$sqrt( + 2 * A2($elm$core$Basics$pow, dotOutline, 2)) / 2; + var dotGap = 4; + var marginalIncrease = (dotSize + dotGap) / 2; + return A2( + $elm$svg$Svg$svg, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$width( + $elm$core$String$fromFloat((dotSize + (marginalIncrease * (stat.dots.max - 1))) + (2 * svgOutlineMargin))), + $elm$svg$Svg$Attributes$height( + $elm$core$String$fromFloat((dotSize + marginalIncrease) + (2 * svgOutlineMargin))) + ]), + A4( + $elm$core$List$map3, + A3($author$project$Main$viewDot, stat, dotSize, dotOutline), + isFilledList, + rangeList, + A2( + $elm$core$List$map, + A3($author$project$Main$toDotPosition, dotSize, dotGap, svgOutlineMargin), + rangeList))); +}; +var $author$project$Main$viewStat = function (stat) { + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(stat.name) + ])), + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $author$project$Main$viewDots(stat) + ])) + ])); +}; +var $author$project$Main$viewStats = function (stats) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$map, $author$project$Main$viewStat, stats)); +}; +var $author$project$Main$viewAttributes = function (stats) { + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Physical'), + $author$project$Main$viewStats( + A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Physical, stats)), + $elm$html$Html$text('Social'), + $author$project$Main$viewStats( + A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Social, stats)), + $elm$html$Html$text('Mental'), + $author$project$Main$viewStats( + A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Mental, stats)) + ])); +}; +var $author$project$Main$OpenModal = function (a) { + return {$: 'OpenModal', a: a}; +}; +var $elm$json$Json$Encode$string = _Json_wrap; +var $elm$html$Html$Attributes$stringProperty = F2( + function (key, string) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$string(string)); + }); +var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); +var $elm$html$Html$i = _VirtualDom_node('i'); var $author$project$Main$viewEditableText = F2( function (modalType, content) { return A2( @@ -5648,207 +5920,13 @@ var $author$project$Main$viewModal = function (model) { ])); } }; -var $elm$core$String$fromFloat = _String_fromNumber; -var $elm$svg$Svg$Attributes$height = _VirtualDom_attribute('height'); -var $elm$core$List$map3 = _List_map3; -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$sqrt = _Basics_sqrt; -var $elm$svg$Svg$trustedNode = _VirtualDom_nodeNS('http://www.w3.org/2000/svg'); -var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg'); -var $author$project$Main$toDotPosition = F4( - function (size, gap, offset, id) { - var marginalIncrease = (size + gap) / 2; - return _Utils_Tuple2((id * marginalIncrease) + offset, (((id + 1) % 2) * marginalIncrease) + offset); - }); -var $author$project$Main$ChangeStat = function (a) { - return {$: 'ChangeStat', a: a}; -}; -var $author$project$Main$boolAsIntString = function (bool) { - return bool ? '1' : '0'; -}; -var $elm$core$String$concat = function (strings) { - return A2($elm$core$String$join, '', strings); -}; -var $elm$svg$Svg$Attributes$fill = _VirtualDom_attribute('fill'); -var $elm$svg$Svg$Attributes$fillOpacity = _VirtualDom_attribute('fill-opacity'); -var $elm$core$List$intersperse = F2( - function (sep, xs) { - if (!xs.b) { - return _List_Nil; - } else { - var hd = xs.a; - var tl = xs.b; - var step = F2( - function (x, rest) { - return A2( - $elm$core$List$cons, - sep, - A2($elm$core$List$cons, x, rest)); - }); - var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl); - return A2($elm$core$List$cons, hd, spersed); - } - }); -var $elm$core$Tuple$mapBoth = F3( - function (funcA, funcB, _v0) { - var x = _v0.a; - var y = _v0.b; - return _Utils_Tuple2( - funcA(x), - funcB(y)); - }); -var $elm$core$Tuple$mapFirst = F2( - function (func, _v0) { - var x = _v0.a; - var y = _v0.b; - return _Utils_Tuple2( - func(x), - y); - }); -var $elm$core$Tuple$mapSecond = F2( - function (func, _v0) { - var x = _v0.a; - var y = _v0.b; - return _Utils_Tuple2( - x, - func(y)); - }); -var $elm$svg$Svg$Attributes$points = _VirtualDom_attribute('points'); -var $elm$svg$Svg$polygon = $elm$svg$Svg$trustedNode('polygon'); -var $elm$core$Tuple$second = function (_v0) { - var y = _v0.b; - return y; -}; -var $elm$svg$Svg$Attributes$stroke = _VirtualDom_attribute('stroke'); -var $elm$svg$Svg$Attributes$strokeWidth = _VirtualDom_attribute('stroke-width'); -var $author$project$Main$tupleToString = function (tuple) { - var second = $elm$core$String$fromFloat(tuple.b); - var first = $elm$core$String$fromFloat(tuple.a); - return first + (',' + second); -}; -var $author$project$Main$valueOrReset = F2( - function (dots, value) { - return _Utils_eq(dots.value, value) ? dots.min : value; - }); -var $author$project$Main$viewDot = F6( - function (stat, size, strokeWidth, isFilled, id, position) { - return A2( - $elm$svg$Svg$polygon, - _List_fromArray( - [ - $elm$svg$Svg$Attributes$points( - $elm$core$String$concat( - A2( - $elm$core$List$intersperse, - ' ', - A2( - $elm$core$List$map, - $author$project$Main$tupleToString, - A2( - $elm$core$List$map, - $elm$core$Tuple$mapSecond( - $elm$core$Basics$add(position.b)), - A2( - $elm$core$List$map, - $elm$core$Tuple$mapFirst( - $elm$core$Basics$add(position.a)), - A2( - $elm$core$List$map, - A2( - $elm$core$Tuple$mapBoth, - $elm$core$Basics$mul(size), - $elm$core$Basics$mul(size)), - _List_fromArray( - [ - _Utils_Tuple2(0.5, 0.0), - _Utils_Tuple2(1.0, 0.5), - _Utils_Tuple2(0.5, 1.0), - _Utils_Tuple2(0.0, 0.5) - ])))))))), - $elm$svg$Svg$Attributes$fill('var(--bulma-body-color)'), - $elm$svg$Svg$Attributes$fillOpacity( - $author$project$Main$boolAsIntString(isFilled)), - $elm$svg$Svg$Attributes$stroke('var(--bulma-body-color)'), - $elm$svg$Svg$Attributes$strokeWidth( - $elm$core$String$fromFloat(strokeWidth)), - $elm$html$Html$Events$onClick( - $author$project$Main$ChangeStat( - _Utils_update( - stat, - { - dots: A2( - $author$project$BoundedInt$changeTo, - stat.dots, - A2($author$project$Main$valueOrReset, stat.dots, id + 1)) - }))) - ]), - _List_Nil); - }); -var $elm$svg$Svg$Attributes$width = _VirtualDom_attribute('width'); -var $author$project$Main$viewDots = function (stat) { - var rangeList = A2($elm$core$List$range, 0, stat.dots.max - 1); - var isFilledList = A2( - $elm$core$List$map, - $elm$core$Basics$gt(stat.dots.value), - rangeList); - var dotSize = 12; - var dotOutline = 0.05 * dotSize; - var svgOutlineMargin = $elm$core$Basics$sqrt( - 2 * A2($elm$core$Basics$pow, dotOutline, 2)) / 2; - var dotGap = 4; - var marginalIncrease = (dotSize + dotGap) / 2; - return A2( - $elm$svg$Svg$svg, - _List_fromArray( - [ - $elm$svg$Svg$Attributes$width( - $elm$core$String$fromFloat((dotSize + (marginalIncrease * (stat.dots.max - 1))) + (2 * svgOutlineMargin))), - $elm$svg$Svg$Attributes$height( - $elm$core$String$fromFloat((dotSize + marginalIncrease) + (2 * svgOutlineMargin))) - ]), - A4( - $elm$core$List$map3, - A3($author$project$Main$viewDot, stat, dotSize, dotOutline), - isFilledList, - rangeList, - A2( - $elm$core$List$map, - A3($author$project$Main$toDotPosition, dotSize, dotGap, svgOutlineMargin), - rangeList))); -}; -var $author$project$Main$viewStat = function (stat) { - return A2( - $elm$html$Html$div, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(stat.name) - ])), - A2( - $elm$html$Html$span, - _List_Nil, - _List_fromArray( - [ - $author$project$Main$viewDots(stat) - ])) - ])); -}; -var $author$project$Main$viewStats = function (stats) { - return A2( - $elm$html$Html$div, - _List_Nil, - A2($elm$core$List$map, $author$project$Main$viewStat, stats)); -}; var $author$project$Main$view = function (model) { return { body: _List_fromArray( [ A2($author$project$Main$viewEditableText, $author$project$Main$Name, model.character.name), + $author$project$Main$viewAttributes( + $author$project$Stats$attributesInList(model.character.stats)), $author$project$Main$viewStats( $author$project$Stats$spheresInList(model.character.stats)), $author$project$Main$viewStat( diff --git a/src/Character.elm b/src/Character.elm index ff02f240e95b996a4dadb33087c6380e7e472d84..ec80334ea843726e3c4fa2c6af066a83241a248e 100644 --- a/src/Character.elm +++ b/src/Character.elm @@ -27,6 +27,7 @@ changeName character newName = changeStat : Character -> Stat -> Character changeStat character stat = case stat.statType of + Stats.Arete -> character Stats.Sphere -> let spheres = Stats.spheresInList character.stats @@ -50,4 +51,5 @@ changeStat character stat = | creationPoints = Creation.buySphere character.creationPoints buyAmount , stats = Stats.changeStatInList character.stats ( Stats.changeDotsTo stat ( oldDots.value + buyAmount ) ) } - Stats.Arete -> character \ No newline at end of file + Stats.Attribute _ -> + character \ No newline at end of file diff --git a/src/Creation.elm b/src/Creation.elm index 242ba6ad446c1771a5348ea477b9356238a6edc0..796e009d50d04711ce2c4a8167a61c03d3bf46fe 100644 --- a/src/Creation.elm +++ b/src/Creation.elm @@ -1,14 +1,36 @@ module Creation exposing (..) +import Stats exposing (AttributeCategory) + type alias CreationPoints = { freebie : Int , spheres : Int + , attributes : + { primary : Int + , secondary : Int + , tertiary : Int + , priority : + ( AttributeCategory + , AttributeCategory + , AttributeCategory + ) + } } new : CreationPoints new = { freebie = 15 , spheres = 6 + , attributes = + { primary = 7 + , secondary = 5 + , tertiary = 3 + , priority = + ( Stats.Physical + , Stats.Social + , Stats.Mental + ) + } } cost : diff --git a/src/Main.elm b/src/Main.elm index e2addf73390f1b6128117a64a5f4acec851b6ceb..a9019745612a443a5426f2e66318cbfa2d8d5a85 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -83,6 +83,7 @@ view model = { title = "Character Sheet" , body = [ viewEditableText Name model.character.name + , viewAttributes ( Stats.attributesInList model.character.stats ) , viewStats ( Stats.spheresInList model.character.stats ) , viewStat ( Stats.areteInList model.character.stats ) , viewModal model @@ -107,6 +108,17 @@ viewEditableText modalType content = ] ] +viewAttributes : List Stat -> Html Msg +viewAttributes stats = + div [] + [ text "Physical" + , viewStats ( Stats.attributesOfCategoryInList Stats.Physical stats ) + , text "Social" + , viewStats ( Stats.attributesOfCategoryInList Stats.Social stats ) + , text "Mental" + , viewStats ( Stats.attributesOfCategoryInList Stats.Mental stats ) + ] + viewStats : List Stat -> Html Msg viewStats stats = div [] ( List.map viewStat stats ) diff --git a/src/Stats.elm b/src/Stats.elm index e6dafb40415220ad7984d57cb3efac0a302646c1..bd392f327474a074eb2a017ac14840012a073ef4 100644 --- a/src/Stats.elm +++ b/src/Stats.elm @@ -11,6 +11,12 @@ type alias Stat = type StatType = Sphere | Arete + | Attribute AttributeCategory + +type AttributeCategory + = Physical + | Social + | Mental new : List Stat new = @@ -24,6 +30,15 @@ new = , newSphere "Spirit" , newSphere "Time" , newArete + , newAttribute Physical "Strength" + , newAttribute Physical "Dexterity" + , newAttribute Physical "Stamina" + , newAttribute Social "Charisma" + , newAttribute Social "Manipulation" + , newAttribute Social "Appearance" + , newAttribute Mental "Perception" + , newAttribute Mental "Intelligence" + , newAttribute Mental "Wits" ] newSphere : String -> Stat @@ -40,6 +55,13 @@ newArete = , statType = Arete } +newAttribute : AttributeCategory -> String -> Stat +newAttribute category name = + { name = name + , dots = BoundedInt.new 1 1 5 + , statType = Attribute category + } + spheresInList : List Stat -> List Stat spheresInList stats = List.filter isSphere stats @@ -61,6 +83,24 @@ isArete : Stat -> Bool isArete stat = stat.statType == Arete +attributesInList : List Stat -> List Stat +attributesInList stats = + List.filter isAttribute stats + +isAttribute : Stat -> Bool +isAttribute stat = + case stat.statType of + Attribute _ -> True + _ -> False + +attributesOfCategoryInList : AttributeCategory -> List Stat -> List Stat +attributesOfCategoryInList category stats = + List.filter ( isAttributeOfCategory category ) stats + +isAttributeOfCategory : AttributeCategory -> Stat -> Bool +isAttributeOfCategory category stat = + stat.statType == Attribute category + dotsOfStatInList : List Stat -> String -> Maybe BoundedInt dotsOfStatInList stats name = let