From 62654102b8979f631fc920dfc9355722997ef5d2 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Fri, 6 May 2016 15:59:18 -0400 Subject: [PATCH] Changed project structure to have the root page into main and subbed out the pages into their own folder --- client/home/home.jsx | 29 +++ client/{naturalCrit => }/home/home.less | 13 ++ client/homebrew/brewRenderer/brewRenderer.jsx | 14 ++ .../homebrew/brewRenderer/brewRenderer.less | 3 + client/homebrew/homebrew.jsx | 6 +- client/homebrew/homebrew.less | 3 +- .../{ => pages}/editPage/editPage.jsx | 8 +- .../{ => pages}/editPage/editPage.less | 0 .../{ => pages}/homePage/homePage.jsx | 10 +- .../{ => pages}/homePage/homePage.less | 0 .../{ => pages}/homePage/welcome_msg.txt | 0 .../{ => pages}/sharePage/sharePage.jsx | 4 +- .../{ => pages}/sharePage/sharePage.less | 0 client/{naturalCrit => main}/favicon.ico | Bin client/main/main.jsx | 46 ++++ client/main/main.less | 178 +++++++++++++++ .../combatManager/combatManager.jsx | 165 -------------- .../combatManager/combatManager.less | 8 - .../combatManager/encounter/encounter.jsx | 162 -------------- .../combatManager/encounter/encounter.less | 36 ---- .../monsterCard/attackSlot/attackSlot.jsx | 101 --------- .../monsterCard/attackSlot/attackSlot.less | 71 ------ .../encounter/monsterCard/monsterCard.jsx | 202 ------------------ .../encounter/monsterCard/monsterCard.less | 129 ----------- .../combatManager/sidebar/CODE Bold.otf | Bin 24108 -> 0 bytes .../combatManager/sidebar/CODE Light.otf | Bin 22920 -> 0 bytes .../combatManager/sidebar/dmDice/dmDice.jsx | 59 ----- .../combatManager/sidebar/dmDice/dmDice.less | 32 --- .../sidebar/encounters/encounters.jsx | 100 --------- .../sidebar/encounters/encounters.less | 53 ----- .../combatManager/sidebar/sidebar.jsx | 76 ------- .../combatManager/sidebar/sidebar.less | 90 -------- client/naturalCrit/home/bulldozer.png | Bin 13937 -> 0 bytes client/naturalCrit/home/home.jsx | 55 ----- client/naturalCrit/logo.svg.jsx | 0 client/naturalCrit/naturalCrit.jsx | 37 ---- client/naturalCrit/naturalCrit.less | 39 ---- client/template.dot | 26 +-- gulpfile.js | 7 +- server.js | 4 +- server/homebrew.server.js | 2 +- .../naturalcrit}/splitPane/splitPane.jsx | 0 .../naturalcrit}/splitPane/splitPane.less | 0 43 files changed, 320 insertions(+), 1448 deletions(-) create mode 100644 client/home/home.jsx rename client/{naturalCrit => }/home/home.less (92%) create mode 100644 client/homebrew/brewRenderer/brewRenderer.jsx create mode 100644 client/homebrew/brewRenderer/brewRenderer.less rename client/homebrew/{ => pages}/editPage/editPage.jsx (86%) rename client/homebrew/{ => pages}/editPage/editPage.less (100%) rename client/homebrew/{ => pages}/homePage/homePage.jsx (88%) rename client/homebrew/{ => pages}/homePage/homePage.less (100%) rename client/homebrew/{ => pages}/homePage/welcome_msg.txt (100%) rename client/homebrew/{ => pages}/sharePage/sharePage.jsx (84%) rename client/homebrew/{ => pages}/sharePage/sharePage.less (100%) rename client/{naturalCrit => main}/favicon.ico (100%) create mode 100644 client/main/main.jsx create mode 100644 client/main/main.less delete mode 100644 client/naturalCrit/combatManager/combatManager.jsx delete mode 100644 client/naturalCrit/combatManager/combatManager.less delete mode 100644 client/naturalCrit/combatManager/encounter/encounter.jsx delete mode 100644 client/naturalCrit/combatManager/encounter/encounter.less delete mode 100644 client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.jsx delete mode 100644 client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.less delete mode 100644 client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.jsx delete mode 100644 client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.less delete mode 100644 client/naturalCrit/combatManager/sidebar/CODE Bold.otf delete mode 100644 client/naturalCrit/combatManager/sidebar/CODE Light.otf delete mode 100644 client/naturalCrit/combatManager/sidebar/dmDice/dmDice.jsx delete mode 100644 client/naturalCrit/combatManager/sidebar/dmDice/dmDice.less delete mode 100644 client/naturalCrit/combatManager/sidebar/encounters/encounters.jsx delete mode 100644 client/naturalCrit/combatManager/sidebar/encounters/encounters.less delete mode 100644 client/naturalCrit/combatManager/sidebar/sidebar.jsx delete mode 100644 client/naturalCrit/combatManager/sidebar/sidebar.less delete mode 100644 client/naturalCrit/home/bulldozer.png delete mode 100644 client/naturalCrit/home/home.jsx delete mode 100644 client/naturalCrit/logo.svg.jsx delete mode 100644 client/naturalCrit/naturalCrit.jsx delete mode 100644 client/naturalCrit/naturalCrit.less rename {client/homebrew => shared/naturalcrit}/splitPane/splitPane.jsx (100%) rename {client/homebrew => shared/naturalcrit}/splitPane/splitPane.less (100%) diff --git a/client/home/home.jsx b/client/home/home.jsx new file mode 100644 index 000000000..21c20251e --- /dev/null +++ b/client/home/home.jsx @@ -0,0 +1,29 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + + + + +//var Icon = require('naturalcrit/icon.svg.jsx'); +//var Logo = require('naturalcrit/logo/logo.jsx'); + +//var HomebrewIcon = require('naturalcrit/homebrewIcon.svg.jsx'); +//var CombatIcon = require('naturalcrit/combatIcon.svg.jsx'); + +var Home = React.createClass({ + + navigate : function(){ + + }, + + render : function(){ + return( +
+ +
+ ); + } +}); + +module.exports = Home; diff --git a/client/naturalCrit/home/home.less b/client/home/home.less similarity index 92% rename from client/naturalCrit/home/home.less rename to client/home/home.less index 165d5f3bc..ec028095a 100644 --- a/client/naturalCrit/home/home.less +++ b/client/home/home.less @@ -1,3 +1,16 @@ +@import 'naturalcrit/styles/reset.less'; +//@import 'naturalcrit/styles/elements.less'; +@import 'naturalcrit/styles/animations.less'; +@import 'naturalcrit/styles/colors.less'; +@import 'naturalcrit/styles/tooltip.less'; + +html,body, #reactContainer{ + min-height: 100vh; + height: 100vh; + margin: 0; + font-family : 'Open Sans', sans-serif; +} + .home{ height : 100vh; diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx new file mode 100644 index 000000000..b1647ec46 --- /dev/null +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -0,0 +1,14 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var COM = React.createClass({ + + render : function(){ + return
+ COM Ready! +
+ } +}); + +module.exports = COM; diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less new file mode 100644 index 000000000..6bb4bdf5e --- /dev/null +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -0,0 +1,3 @@ +.COM{ + +} \ No newline at end of file diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 94ebe55f7..8bb19e0ed 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -4,9 +4,9 @@ var cx = require('classnames'); var CreateRouter = require('pico-router').createRouter; -var HomePage = require('./homePage/homePage.jsx'); -var EditPage = require('./editPage/editPage.jsx'); -var SharePage = require('./sharePage/sharePage.jsx'); +var HomePage = require('./pages/homePage/homePage.jsx'); +var EditPage = require('./pages/editPage/editPage.jsx'); +var SharePage = require('./pages/sharePage/sharePage.jsx'); var Router; var Homebrew = React.createClass({ diff --git a/client/homebrew/homebrew.less b/client/homebrew/homebrew.less index 9fe5e252a..231bd3fec 100644 --- a/client/homebrew/homebrew.less +++ b/client/homebrew/homebrew.less @@ -9,7 +9,6 @@ html,body, #reactContainer{ height: 100vh; margin: 0; font-family : 'Open Sans', sans-serif; - //overflow: hidden; } .homebrew{ @@ -26,7 +25,7 @@ html,body, #reactContainer{ .content{ flex: auto; position: relative; - height: calc(~"100% - 29px"); + height: calc(~"100% - 29px"); //Navbar height } } diff --git a/client/homebrew/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx similarity index 86% rename from client/homebrew/editPage/editPage.jsx rename to client/homebrew/pages/editPage/editPage.jsx index ad3188cda..2496bcc24 100644 --- a/client/homebrew/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -2,11 +2,11 @@ var React = require('react'); var _ = require('lodash'); var cx = require('classnames'); -var Statusbar = require('../statusbar/statusbar.jsx'); -var PageContainer = require('../pageContainer/pageContainer.jsx'); -var Editor = require('../editor/editor.jsx'); +var Statusbar = require('../../statusbar/statusbar.jsx'); +var PageContainer = require('../../pageContainer/pageContainer.jsx'); +var Editor = require('../../editor/editor.jsx'); -var FullClassGen = require('../editor/snippets/fullclass.gen.js'); +var FullClassGen = require('../../editor/snippets/fullclass.gen.js'); var request = require("superagent"); diff --git a/client/homebrew/editPage/editPage.less b/client/homebrew/pages/editPage/editPage.less similarity index 100% rename from client/homebrew/editPage/editPage.less rename to client/homebrew/pages/editPage/editPage.less diff --git a/client/homebrew/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx similarity index 88% rename from client/homebrew/homePage/homePage.jsx rename to client/homebrew/pages/homePage/homePage.jsx index becfa05a8..0297c5ab5 100644 --- a/client/homebrew/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -3,23 +3,23 @@ var _ = require('lodash'); var cx = require('classnames'); //var Statusbar = require('../statusbar/statusbar.jsx'); -var PageContainer = require('../pageContainer/pageContainer.jsx'); +//var PageContainer = require('../pageContainer/pageContainer.jsx'); //var Editor = require('../editor/editor.jsx'); var Nav = require('naturalcrit/nav/nav.jsx'); -var Navbar = require('../navbar/navbar.jsx'); +var Navbar = require('../../navbar/navbar.jsx'); -var RedditShare = require('../navbar/redditShare.navitem.jsx'); +var RedditShare = require('../../navbar/redditShare.navitem.jsx'); -var SplitPane = require('../splitPane/splitPane.jsx'); +var SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); //var CodeEditor = require('naturalcrit/codeEditor/codeEditor.jsx'); -var Editor = require('../editor/editor.jsx'); +var Editor = require('../../editor/editor.jsx'); diff --git a/client/homebrew/homePage/homePage.less b/client/homebrew/pages/homePage/homePage.less similarity index 100% rename from client/homebrew/homePage/homePage.less rename to client/homebrew/pages/homePage/homePage.less diff --git a/client/homebrew/homePage/welcome_msg.txt b/client/homebrew/pages/homePage/welcome_msg.txt similarity index 100% rename from client/homebrew/homePage/welcome_msg.txt rename to client/homebrew/pages/homePage/welcome_msg.txt diff --git a/client/homebrew/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx similarity index 84% rename from client/homebrew/sharePage/sharePage.jsx rename to client/homebrew/pages/sharePage/sharePage.jsx index a097ed7b0..b5a9bdfd9 100644 --- a/client/homebrew/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -2,9 +2,9 @@ var React = require('react'); var _ = require('lodash'); var cx = require('classnames'); -var Statusbar = require('../statusbar/statusbar.jsx'); +var Statusbar = require('../../statusbar/statusbar.jsx'); -var PageContainer = require('../pageContainer/pageContainer.jsx'); +var PageContainer = require('../../pageContainer/pageContainer.jsx'); var SharePage = React.createClass({ getDefaultProps: function() { diff --git a/client/homebrew/sharePage/sharePage.less b/client/homebrew/pages/sharePage/sharePage.less similarity index 100% rename from client/homebrew/sharePage/sharePage.less rename to client/homebrew/pages/sharePage/sharePage.less diff --git a/client/naturalCrit/favicon.ico b/client/main/favicon.ico similarity index 100% rename from client/naturalCrit/favicon.ico rename to client/main/favicon.ico diff --git a/client/main/main.jsx b/client/main/main.jsx new file mode 100644 index 000000000..54bd35dab --- /dev/null +++ b/client/main/main.jsx @@ -0,0 +1,46 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var Router = require('pico-router'); + +var Main = React.createClass({ + + render : function(){ + return
+ + + +
+ +

Top-tier tools for the discerning DM

+
+ +
+ + {/* Replace with anchor tag */} + +
+
+ {/**/} +

The Homebrewery

+

Make authentic-looking 5e homebrews using Markdown

+
+
+ + {/* +
+
+ +

Combat Manager

+

Easily create and manage complex encouters for your party

+
+
+ */} +
+ +
+ } +}); + +module.exports = Main; diff --git a/client/main/main.less b/client/main/main.less new file mode 100644 index 000000000..66d0da3a9 --- /dev/null +++ b/client/main/main.less @@ -0,0 +1,178 @@ +@import 'naturalcrit/styles/reset.less'; +//@import 'naturalcrit/styles/elements.less'; +@import 'naturalcrit/styles/animations.less'; +@import 'naturalcrit/styles/colors.less'; +@import 'naturalcrit/styles/tooltip.less'; + +html,body, #reactContainer{ + min-height: 100vh; + height: 100vh; + margin: 0; + font-family : 'Open Sans', sans-serif; +} + + +.main{ + height : 100vh; + background-color : white; + .top{ + .fadeInTop(1s); + .delay(0.5); + margin-bottom : 100px; + padding-top : 100px; + text-align : center; + .logo{ + font-size : 4em; + color : black; + svg{ + fill : black; + } + } + p{ + margin-top : 10px; + font-size : 1.3em; + font-style : italic; + color : @grey; + } + } + .tools{ + width : 100%; + text-align : center; + .toolContainer{ + .sequentialDelay(0.5s, 1s); + .fadeInDown(1s); + .keep(); + display : inline-block; + cursor : pointer; + opacity : 0; + text-align : center; + border-right : 1px solid #333; + &:last-child{ + border : none; + } + .content{ + .addSketch(360px); + .animateAll(0.5s); + position : relative; + width : 500px; + padding : 40px; + &:hover{ + svg, h2{ + .transform(scale(1.3)); + } + } + h2{ + .animateAll(0.5s); + font-family : 'CodeBold'; + font-size : 2em; + } + p{ + max-width : 300px; + margin : 20px auto; + line-height : 1.5em; + } + svg{ + .animateAll(0.5s); + height : 10em; + } + } + //Proejct specific styles + &.homebrew{ + .content:hover{ + background-color : fade(@teal, 20%); + } + } + &.combat{ + .content:hover{ + background-color : fade(@red, 20%); + } + } + //Under Construction styles + &.underConstruction{ + cursor : initial; + .content{ + &:hover{ + svg, h2{ + .transform(scale(1.0)); + } + } + svg, h2{ + opacity : 0.3; + } + &:after{ + .animateAll(); + content : "Under Construction"; + position : absolute; + display : block; + top : 120px; + left : 0px; + width : 100%; + padding : 10px 0px; + //opacity : 0; + background-color : fade(@grey, 50%); + font-size : 2em; + font-weight : 800; + text-align : center; + text-transform : uppercase; + } + &:before{ + content : ""; + position : absolute; + display : block; + top : 130px; + right : 30px; + height : 50px; + width : 40px; + //opacity : 0; + background-image : url('/assets/naturalCrit/home/bulldozer.png'); + background-repeat : no-repeat; + background-size : contain; + animation-iteration-count : infinite; + } + } + } + } + } +} +.addSketch(@length, @color : black){ + path, line, polyline, circle, rect, polygon { + .sketch(@length, @color, 4s); + stroke-dasharray : @length; + stroke-dashoffset : 0px; + stroke : @color; + stroke-width : 0.5px; + fill : @color; + //.animateAll(3s); + } +} +.sketch(@length, @color : black, @duration : 3s, @easing : @defaultEasing){ + .createAnimation(sketch, @duration, @easing); + .sketchKeyFrames(){ + 0% { stroke-dashoffset : @length; fill: transparent;} + 50% { stroke-dashoffset : @length; fill: transparent;} + 80% { stroke-dashoffset : 0px; fill: transparent;} + 100% { stroke-dashoffset : 0px; fill:@color;} + } + @-webkit-keyframes sketch {.sketchKeyFrames();} + @-moz-keyframes sketch {.sketchKeyFrames();} + @-ms-keyframes sketch {.sketchKeyFrames();} + @-o-keyframes sketch {.sketchKeyFrames();} + @keyframes sketch {.sketchKeyFrames();} +} +/* +.sketch(@length, @color : black, @duration : 3s, @easing : @defaultEasing){ + .createAnimation(bounce, @duration, @easing); + .sketchKeyFrames(){ + 0% { stroke-dashoffset : 0px; fill:@color;} + 15% { stroke-dashoffset : 0px; fill : transparent} + 50% { stroke-dashoffset : @length; fill: transparent} + 85% { stroke-dashoffset : 0px; fill:transparent;} + 100% { stroke-dashoffset : 0px; fill:@color;} + } + @-webkit-keyframes bounce {.sketchKeyFrames();} + @-moz-keyframes bounce {.sketchKeyFrames();} + @-ms-keyframes bounce {.sketchKeyFrames();} + @-o-keyframes bounce {.sketchKeyFrames();} + @keyframes bounce {.sketchKeyFrames();} +} +*/ \ No newline at end of file diff --git a/client/naturalCrit/combatManager/combatManager.jsx b/client/naturalCrit/combatManager/combatManager.jsx deleted file mode 100644 index fbb8c6404..000000000 --- a/client/naturalCrit/combatManager/combatManager.jsx +++ /dev/null @@ -1,165 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var Sidebar = require('./sidebar/sidebar.jsx'); -var Encounter = require('./encounter/encounter.jsx'); - -var encounters = [ - { - name : 'The Big Bad', - desc : 'The big fight!', - reward : 'gems', - enemies : ['goblin', 'goblin'], - reserve : ['goblin'], - }, - { - name : 'Demon Goats', - desc : 'Gross fight', - reward : 'curved horn, goat sac', - enemies : ['demon_goat', 'demon_goat', 'demon_goat'], - unique : { - demon_goat : { - "hp" : 140, - "ac" : 16, - "attr" : { - "str" : 8, - "con" : 8, - "dex" : 8, - "int" : 8, - "wis" : 8, - "cha" : 8 - }, - "attacks" : { - "charge" : { - "atk" : "1d20+5", - "dmg" : "1d8+5", - "type" : "bludge" - } - }, - "abilities" : ["charge"], - } - } - }, - -]; - -var defaultMonsterManual = require('naturalcrit/defaultMonsterManual.js'); - -var attrMod = function(attr){ - return Math.floor(attr/2) - 5; -} - - -var Store = require('naturalcrit/combat.store'); -var Actions = require('naturalcrit/combat.actions'); - - - -var CombatManager = React.createClass({ - mixins : [Store.mixin()], - - - getInitialState: function() { - var self = this; - return { - selectedEncounterIndex : 0, - encounters : JSON.parse(localStorage.getItem('encounters')) || encounters, - monsterManual : JSON.parse(localStorage.getItem('monsterManual')) || defaultMonsterManual, - - players : localStorage.getItem('players') || 'jasper 13\nzatch 19', - - - }; - }, - - onStoreChange : function(){ - console.log('STORE CAHNGE', Store.getInc()); - this.setState({ - inc : Store.getInc() - }) - }, - - - handleEncounterJSONChange : function(encounterIndex, json){ - this.state.encounters[encounterIndex] = json; - this.setState({ - encounters : this.state.encounters - }) - localStorage.setItem("encounters", JSON.stringify(this.state.encounters)); - }, - handleMonsterManualJSONChange : function(json){ - this.setState({ - monsterManual : json - }); - localStorage.setItem("monsterManual", JSON.stringify(this.state.monsterManual)); - }, - handlePlayerChange : function(e){ - this.setState({ - players : e.target.value - }); - localStorage.setItem("players", e.target.value); - }, - handleSelectedEncounterChange : function(encounterIndex){ - console.log(encounterIndex); - this.setState({ - selectedEncounterIndex : encounterIndex - }); - }, - handleRemoveEncounter : function(encounterIndex){ - this.state.encounters.splice(encounterIndex, 1); - this.setState({ - encounters : this.state.encounters - }); - localStorage.setItem("encounters", JSON.stringify(this.state.encounters)); - }, - - renderSelectedEncounter : function(){ - var self = this; - - if(this.state.selectedEncounterIndex != null && this.state.encounters[this.state.selectedEncounterIndex]){ - var selectedEncounter = this.state.encounters[this.state.selectedEncounterIndex] - return - } - - return null; - }, - - temp : function(){ - Actions.setInc(++this.state.inc); - }, - - - render : function(){ - var self = this; - return( -
- - - - {this.renderSelectedEncounter()} - - - -
- ); - } -}); - -module.exports = CombatManager; diff --git a/client/naturalCrit/combatManager/combatManager.less b/client/naturalCrit/combatManager/combatManager.less deleted file mode 100644 index 63bb1214a..000000000 --- a/client/naturalCrit/combatManager/combatManager.less +++ /dev/null @@ -1,8 +0,0 @@ -.combatManager{ - - .encounterContainer{ - display: inline-block; - vertical-align: top; - } - -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/encounter/encounter.jsx b/client/naturalCrit/combatManager/encounter/encounter.jsx deleted file mode 100644 index 406a4324d..000000000 --- a/client/naturalCrit/combatManager/encounter/encounter.jsx +++ /dev/null @@ -1,162 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var Store = require('naturalcrit/combat.store.js'); - -var MonsterCard = require('./monsterCard/monsterCard.jsx'); - - - -var attrMod = function(attr){ - return Math.floor(attr/2) - 5; -} - -var Encounter = React.createClass({ - mixins : [Store.mixin()], - getInitialState: function() { - return { - enemies: this.createEnemies(this.props) - }; - }, - - onStoreChange : function(){ - var players = Store.getplayersText(); - - }, - - getDefaultProps: function() { - return { - name : '', - desc : '', - reward : '', - enemies : [], - players : '', - unique : {}, - - monsterManual : {} - }; - }, - - - - componentWillReceiveProps: function(nextProps) { - this.setState({ - enemies : this.createEnemies(nextProps) - }) - }, - - createEnemies : function(props){ - var self = this; - return _.indexBy(_.map(props.enemies, function(type, index){ - return self.createEnemy(props, type, index) - }), 'id') - }, - - createEnemy : function(props, type, index){ - var stats = props.unique[type] || props.monsterManual[type]; - if(!stats) return; - return _.extend({ - id : type + index, - name : type, - currentHP : stats.hp, - initiative : _.random(1,20) + attrMod(stats.attr.dex) - }, stats); - }, - - - updateHP : function(enemyId, newHP){ - this.state.enemies[enemyId].currentHP = newHP; - this.setState({ - enemies : this.state.enemies - }); - }, - removeEnemy : function(enemyId){ - delete this.state.enemies[enemyId]; - this.setState({ - enemies : this.state.enemies - }); - }, - - - getPlayerObjects : function(){ - return _.reduce(this.props.players.split('\n'), function(r, line){ - var parts = line.split(' '); - if(parts.length != 2) return r; - r.push({ - name : parts[0], - initiative : parts[1] * 1, - isPC : true - }) - return r; - },[]) - }, - - - renderEnemies : function(){ - var self = this; - - var sortedEnemies = _.sortBy(_.union(_.values(this.state.enemies), this.getPlayerObjects()), function(e){ - if(e && e.initiative) return -e.initiative; - return 0; - }); - - return _.map(sortedEnemies, function(enemy){ - if(enemy.isPC){ - return - } - - return - }) - }, - - render : function(){ - var self = this; - - var reward; - if(this.props.reward){ - reward =
- Rewards: {this.props.reward} -
- } - - return( -
-
-

{this.props.name}

-

{this.props.desc}

- {reward} -
- -
- {this.renderEnemies()} -
-
- ); - } -}); - -module.exports = Encounter; - - -var PlayerCard = React.createClass({ - - getDefaultProps: function() { - return { - name : '', - initiative : 0 - }; - }, - render : function(){ - return
- {_.startCase(this.props.name)} - {this.props.initiative} -
- }, - -}) \ No newline at end of file diff --git a/client/naturalCrit/combatManager/encounter/encounter.less b/client/naturalCrit/combatManager/encounter/encounter.less deleted file mode 100644 index e458274cd..000000000 --- a/client/naturalCrit/combatManager/encounter/encounter.less +++ /dev/null @@ -1,36 +0,0 @@ - -.mainEncounter{ - box-sizing : border-box; - overflow : hidden; - width : auto; - - &>.info{ - - margin-left: 10px; - padding-bottom : 10px; - border-bottom: 1px solid #ddd; - h1{ - font-size: 2em; - font-weight: 800; - margin-bottom: 5px; - } - p{ - margin-left: 10px; - font-size: 0.8em; - line-height: 1.5em; - max-width: 600px; - } - .reward{ - font-size: 0.8em; - font-weight: 800; - margin-top: 5px; - i{ - margin-right: 5px; - } - } - - } - - - -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.jsx b/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.jsx deleted file mode 100644 index 274cd2930..000000000 --- a/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.jsx +++ /dev/null @@ -1,101 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var RollDice = require('naturalcrit/rollDice'); - -var AttackSlot = React.createClass({ - getDefaultProps: function() { - return { - name : '', - uses : null - }; - }, - - getInitialState: function() { - return { - lastRoll: {}, - usedCount : 0 - }; - }, - - rollDice : function(key, notation){ - var res = RollDice(notation); - this.state.lastRoll[key] = res - this.state.lastRoll[key + 'key'] = _.uniqueId(key); - this.setState({ - lastRoll : this.state.lastRoll - }) - }, - - renderUses : function(){ - var self = this; - if(!this.props.uses) return null; - - return _.times(this.props.uses, function(index){ - var atCount = index < self.state.usedCount; - return - }) - }, - updateCount : function(used){ - this.setState({ - usedCount : this.state.usedCount + (used ? -1 : 1) - }); - }, - - renderNotes : function(){ - var notes = _.omit(this.props, ['name', 'atk', 'dmg', 'uses', 'heal']); - return _.map(notes, function(text, key){ - return
{key + ': ' + text}
- }); - }, - - renderRolls : function(){ - var self = this; - - return _.map(['atk', 'dmg', 'heal'], function(type){ - if(!self.props[type]) return null; - return
- - - {self.state.lastRoll[type]} -
- }) - - }, - - - render : function(){ - var self = this; - return( -
-
-
{this.props.name}
-
- {this.renderUses()} -
-
- {this.renderNotes()} -
- -
-
- {this.renderRolls()} -
-
- ); - } -}); - -module.exports = AttackSlot; diff --git a/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.less b/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.less deleted file mode 100644 index 0a5ee42ad..000000000 --- a/client/naturalCrit/combatManager/encounter/monsterCard/attackSlot/attackSlot.less +++ /dev/null @@ -1,71 +0,0 @@ - -.attackSlot{ - //border : 1px solid black; - border-bottom: 1px solid #eee; - margin-bottom : 5px; - font-size : 0.8em; - .info, .rolls{ - display : inline-block; - vertical-align : top; - } - .info{ - width : 40%; - .name{ - font-weight : 800; - margin-bottom: 3px; - } - .notes{ - font-size : 0.8em; - } - .uses{ - cursor : pointer; - //font-size: 0.8em; - //margin-top: 3px; - } - } - .rolls{ - .roll{ - margin-bottom : 2px; - &>span{ - font-weight: 800; - .fadeInLeft(); - } - button{ - width : 70px; - margin-right : 5px; - cursor : pointer; - font-size : 0.7em; - font-weight : 800; - text-align : left; - border : none; - outline : 0; - i{ - width : 15px; - margin-right : 5px; - border-right : 1px solid white; - } - &:hover{ - //text-align: right; - } - } - &.atk{ - button{ - background-color : fade(@blue, 40%); - i { border-color: @blue} - } - } - &.dmg{ - button{ - background-color : fade(@red, 40%); - i { border-color: @red} - } - } - &.heal{ - button{ - background-color : fade(@green, 40%); - i { border-color: @green} - } - } - } - } -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.jsx b/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.jsx deleted file mode 100644 index fdded9439..000000000 --- a/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.jsx +++ /dev/null @@ -1,202 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var AttackSlot = require('./attackSlot/attackSlot.jsx'); - -var MonsterCard = React.createClass({ - getDefaultProps: function() { - return { - name : '', - hp : 1, - currentHP : 1, - ac: 1, - move : 30, - attr : { - str : 8, - con : 8, - dex : 8, - int : 8, - wis : 8, - cha : 8 - }, - attacks : {}, - spells : {}, - abilities : [], - items : [], - - updateHP : function(){}, - remove : function(){}, - }; - }, - - getInitialState: function() { - return { - status : 'normal', - usedItems : [], - lastRoll : { }, - mousePos : null, - tempHP : 0 - }; - }, - - componentDidMount: function() { - window.addEventListener('mousemove', this.handleMouseDrag); - window.addEventListener('mouseup', this.handleMouseUp); - }, - - handleMouseDown : function(e){ - this.setState({ - mousePos : { - x : e.pageX, - y : e.pageY, - } - }); - e.stopPropagation() - e.preventDefault() - }, - handleMouseUp : function(e){ - if(!this.state.mousePos) return; - - - this.props.updateHP(this.props.currentHP + this.state.tempHP); - this.setState({ - mousePos : null, - tempHP : 0 - }); - }, - - handleMouseDrag : function(e){ - if (!this.state.mousePos) return; - var distance = Math.sqrt(Math.pow(e.pageX - this.state.mousePos.x, 2) + Math.pow(e.pageY - this.state.mousePos.y, 2)); - var mult = (e.pageY > this.state.mousePos.y ? -1 : 1) - - this.setState({ - tempHP : Math.floor(distance * mult/25) - }) - }, - - addUsed : function(item, shouldRemove){ - if(!shouldRemove) this.state.usedItems.push(item); - if(shouldRemove) this.state.usedItems.splice(this.state.usedItems.indexOf(item), 1); - - this.setState({ - usedItems : this.state.usedItems - }); - }, - - - renderHPBox : function(){ - var self = this; - - var tempHP - if(this.state.tempHP){ - var sign = (this.state.tempHP > 0 ? '+' : ''); - tempHP = {['(',sign,this.state.tempHP,')'].join('')} - } - - return
-
- {tempHP} {this.props.currentHP} -
- {self.renderStats()} -
- }, - - renderStats : function(){ - var stats = { - 'fa fa-shield' : this.props.ac, - //'fa fa-hourglass-2' : this.props.initiative, - } - return _.map(stats, function(val, icon){ - return
{val}
- }) - }, - - renderAttacks : function(){ - var self = this; - return _.map(this.props.attacks, function(attack, name){ - return - }) - }, - - renderSpells : function(){ - var self = this; - return _.map(this.props.spells, function(spell, name){ - return - }) - }, - - renderAbilities : function(){ - return _.map(this.props.abilities, function(text, name){ - return
- {name}: {text} -
- }); - }, - - renderItems : function(){ - var self = this; - var usedItems = this.state.usedItems.slice(0); - return _.map(this.props.items, function(item, index){ - var used = _.contains(usedItems, item); - if(used){ - usedItems.splice(usedItems.indexOf(item), 1); - } - return - {item} - - }); - }, - - render : function(){ - var self = this; - var condition = '' - if(this.props.currentHP + this.state.tempHP > this.props.hp) condition='overhealed'; - if(this.props.currentHP + this.state.tempHP <= this.props.hp * 0.5) condition='hurt'; - if(this.props.currentHP + this.state.tempHP <= this.props.hp * 0.2) condition='last_legs'; - if(this.props.currentHP + this.state.tempHP <= 0) condition='dead'; - - - return( -
-
-
- - - {this.renderHPBox()} -
- {this.props.name} -
- -
- {this.renderAttacks()} -
-
- {this.renderSpells()} -
- -
- {this.renderAbilities()} -
-
- - {this.renderItems()} -
-
- ); - } -}); - -module.exports = MonsterCard; - -/* - - -{this.props.initiative} - - -*/ \ No newline at end of file diff --git a/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.less b/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.less deleted file mode 100644 index fd8226346..000000000 --- a/client/naturalCrit/combatManager/encounter/monsterCard/monsterCard.less +++ /dev/null @@ -1,129 +0,0 @@ - -@marginSize : 10px; -.playerCard{ - display : inline-block; - box-sizing : border-box; - margin : @marginSize; - padding : 10px; - background-color : white; - border : 1px solid #bbb; - .name{ - margin-right : 20px; - } - .initiative{ - font-size : 0.8em; - i{ - font-size : 0.8em; - } - } - &:nth-child(5n + 1){ background-color: fade(@blue, 25%); } - &:nth-child(5n + 2){ background-color: fade(@purple, 25%); } - &:nth-child(5n + 3){ background-color: fade(@steel, 25%); } - &:nth-child(5n + 4){ background-color: fade(@green, 25%); } - &:nth-child(5n + 5){ background-color: fade(@orange, 25%); } -} -.monsterCard{ - position : relative; - display : inline-block; - vertical-align : top; - box-sizing : border-box; - width : 220px; - margin : @marginSize; - padding : 10px; - background-color : white; - border : 1px solid #bbb; - .healthbar{ - position : absolute; - top : 0px; - left : 0px; - z-index : 50; - height : 3px; - max-width : 100%; - background-color : @green; - } - .overhealbar{ - position : absolute; - top : 0px; - left : 0px; - z-index : 100; - height : 3px; - max-width : 100%; - background-color : @blueLight; - } - &.hurt{ - .healthbar{ - background-color : orange; - } - } - &.last_legs{ - background-color : lighten(@red, 49%); - .healthbar{ - background-color : red; - } - } - &.dead{ - opacity : 0.3; - } - &>.info{ - margin-bottom : 10px; - .name{ - margin-right : 10px; - font-size : 1.5em; - } - .stat{ - margin-right : 5px; - font-size : 0.7em; - i{ - font-size : 0.7em; - } - } - } - .hpBox{ - .noselect(); - position : absolute; - top : 5px; - right : 5px; - cursor : pointer; - text-align : right; - .currentHP{ - font-size : 2em; - font-weight : 800; - line-height : 0.8em; - .tempHP{ - vertical-align : top; - font-size : 0.4em; - line-height : 0.8em; - } - } - .stat{ - font-size : 0.8em; - } - .hpText{ - font-size : 0.6em; - font-weight : 800; - } - } - .abilitiesContainer{ - margin-top : 10px; - .ability{ - font-size: 0.7em; - .name{ - font-weight: 800; - } - } - } - .itemContainer{ - margin-top : 10px; - i{ - font-size : 0.7em; - } - span{ - margin-right : 5px; - cursor : pointer; - font-size : 0.7em; - &.used{ - text-decoration : line-through; - } - } - } -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/sidebar/CODE Bold.otf b/client/naturalCrit/combatManager/sidebar/CODE Bold.otf deleted file mode 100644 index 50dd77d237ee7b62a76a179604d23b52037794f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24108 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 bt~#$?(Aph_;Cl-lnzLP3%`!v9Z%qCd6ZvXE diff --git a/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.jsx b/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.jsx deleted file mode 100644 index c5773f7e5..000000000 --- a/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.jsx +++ /dev/null @@ -1,59 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var RollDice = require('naturalcrit/rollDice'); - -var DmDice = React.createClass({ - - getInitialState: function() { - return { - lastRoll:{ }, - diceNotation : { - a : "1d20", - b : "6d6 + 3", - c : "1d20 - 1" - } - - }; - }, - - roll : function(id){ - this.state.lastRoll[id] = RollDice(this.state.diceNotation[id]); - this.setState({ - lastRoll : this.state.lastRoll - }); - }, - handleChange : function(id, e){ - this.state.diceNotation[id] = e.target.value; - this.setState({ - diceNotation : this.state.diceNotation - }); - - e.stopPropagation(); - e.preventDefault(); - }, - - renderRolls : function(){ - var self = this; - return _.map(['a', 'b', 'c'], function(id){ - return
- - - {self.state.lastRoll[id]} -
- }) - }, - - render : function(){ - var self = this; - return( -
-

DM Dice

- {this.renderRolls()} -
- ); - } -}); - -module.exports = DmDice; diff --git a/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.less b/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.less deleted file mode 100644 index e3428c535..000000000 --- a/client/naturalCrit/combatManager/sidebar/dmDice/dmDice.less +++ /dev/null @@ -1,32 +0,0 @@ -.dmDice{ - - h3{ - color : white; - background-color: @teal; - } - - .roll{ - cursor: pointer; - .noselect(); - input[type="text"]{ - margin-left: 10px; - margin-bottom: 6px; - margin-top: 6px; - width : 60px; - font-family: monospace; - padding : 5px; - } - i.fa-random{ - font-size: 0.8em; - margin: 0 10px; - } - span{ - font-weight: 800; - .fadeInLeft(); - } - - &:hover{ - background-color: fade(@teal, 20%); - } - } -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/sidebar/encounters/encounters.jsx b/client/naturalCrit/combatManager/sidebar/encounters/encounters.jsx deleted file mode 100644 index 5bcf83934..000000000 --- a/client/naturalCrit/combatManager/sidebar/encounters/encounters.jsx +++ /dev/null @@ -1,100 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var JSONFileEditor = require('naturalcrit/jsonFileEditor/jsonFileEditor.jsx'); - -//var GetRandomEncounter = require('naturalcrit/randomEncounter.js'); - -var Store = require('naturalcrit/combat.store.js'); -var Actions = require('naturalcrit/combat.actions.js'); - - -var Encounters = React.createClass({ - mixins : [Store.mixin()], - onStoreChange : function(){ - this.setState({ - encounters : Store.getEncounters(), - selectedEncounter : Store.getSelectedEncounterIndex() - }); - }, - getInitialState: function() { - return { - encounters : Store.getEncounters(), - selectedEncounter : Store.getSelectedEncounterIndex() - }; - }, - /* - getDefaultProps: function() { - return { - encounters : [], - selectedEncounter : 0, - - onJSONChange : function(encounterIndex, json){}, - onSelectEncounter : function(encounterIndex){}, - onRemoveEncounter : function(encounterIndex){} - }; - }, - */ - handleJSONChange : function(encounterIndex, json){ - //this.props.onJSONChange(encounterIndex, json); - Actions.updateEncounter(encounterIndex, json); - }, - handleSelectEncounter : function(encounterIndex){ - //this.props.onSelectEncounter(encounterIndex); - Actions.selectEncounter(encounterIndex); - }, - handleRemoveEncounter : function(encounterIndex){ - //this.props.onRemoveEncounter(encounterIndex); - Actions.removeEncounter(encounterIndex); - }, - addRandomEncounter : function(){ - Actions.addEncounter(); - }, - - - renderEncounters : function(){ - var self = this; - return _.map(this.state.encounters, function(encounter, index){ - - var isSelected = self.state.selectedEncounter == index; - return
- - - - - - - -
- }) - }, - - render : function(){ - var self = this; - return( -
-

- Encounters - -

- {this.renderEncounters()} - -
- -
-
- ); - } -}); - -module.exports = Encounters; diff --git a/client/naturalCrit/combatManager/sidebar/encounters/encounters.less b/client/naturalCrit/combatManager/sidebar/encounters/encounters.less deleted file mode 100644 index 371ec5732..000000000 --- a/client/naturalCrit/combatManager/sidebar/encounters/encounters.less +++ /dev/null @@ -1,53 +0,0 @@ - -.encounters{ - margin-bottom : 20px; - h3{ - background-color : @red; - color : white; - button{ - .animate(color); - float : right; - cursor : pointer; - background-color : transparent; - border : none; - outline : none; - &:hover{ - color : white; - } - } - } - .encounter{ - position : relative; - padding-left : 15px; - border-left : 0px solid @teal; - .animateAll(); - &:hover{ - i.remove{ - opacity : 1; - } - } - i.remove{ - .animate(opacity); - position : absolute; - top : 3px; - right : 3px; - cursor : pointer; - opacity : 0; - font-size : 0.6em; - color : #333; - &:hover{ - color : @red; - } - } - i.select{ - cursor : pointer; - } - .jsonFileEditor{ - display : inline-block; - } - &.selected{ - //background-color : fade(@green, 30%); - border-left : 8px solid @teal; - } - } -} \ No newline at end of file diff --git a/client/naturalCrit/combatManager/sidebar/sidebar.jsx b/client/naturalCrit/combatManager/sidebar/sidebar.jsx deleted file mode 100644 index c5daa374e..000000000 --- a/client/naturalCrit/combatManager/sidebar/sidebar.jsx +++ /dev/null @@ -1,76 +0,0 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var JSONFileEditor = require('naturalcrit/jsonFileEditor/jsonFileEditor.jsx'); - -var DMDice = require('./dmDice/dmDice.jsx'); -var Encounters = require('./encounters/encounters.jsx'); - -var Store = require('naturalcrit/combat.store.js'); -var Actions = require('naturalcrit/combat.actions.js'); - - -var Sidebar = React.createClass({ - mixins : [Store.mixin()], - - getInitialState: function() { - return { - hide : false, - - monsterManual : Store.getMonsterManual(), - players : Store.getPlayersText() - }; - }, - - onStoreChange : function(){ - this.setState({ - players : Store.getPlayersText(), - monsterManual : Store.getMonsterManual() - }) - }, - - handleLogoClick : function(){ - this.setState({ - hide : !this.state.hide - }) - }, - handleMonsterManualChange : function(json){ - Actions.updateMonsterManual(json); - }, - handlePlayerChange : function(e){ - Actions.updatePlayers(e.target.value); - }, - - render : function(){ - var self = this; - return( -
-
- - -
NaturalCrit
- Combat Manager -
-
-
-
- -
- -
-

Players

-