Day 5 [D&D Character Sheets]
Tags: 100daysofcode
Published: 2020-03-16 06:29:10

# Thanks
Thanks to everyone who comments, reacts or does anything that lets me know you're out there! Knowing people are watching even a little bit keeps me honest and is motivation to keep going!

# Report
Today I created a simple test view for my character sheet. First I had to write the initial schema for the character classes and races, then I created a test character to display.

```
// router/characters/index.js
router.get("/create-test", async (req, res) => {
	let race = await req.context.models.Race.create({
		name: "Test",
		stats: {
			abilityMods: {
				strength: 0,
				dexterity: 1,
				constitution: 0,
				intelligence: 1,
				wisdom: 0,
				charisma: 0
			},
			speed: 30,
			size: "medium"
		}
	});

	let player = await req.context.models.Player.findOne({
		email: "test@ephriamhenderson.dev"
	});

	let charClass = await req.context.models.Class.create({
		name: "test",
		stats: {
			abilityMods: {
				strength: 2,
				dexterity: 0,
				constitution: 0,
				intelligence: 0,
				wisdom: 0,
				charisma: 0
			}
		}
	});

	let character = await req.context.models.Character.create({
		shortName: "Zii",
		longName: "Zii",
		race: race.id,
		class: charClass.id,
		player: player.id,
		Description: "Zii",
		urlSlug: "",
		stats: {
			abilities: {
				strength: 8,
				dexterity: 8,
				constitution: 8,
				intelligence: 8,
				wisdom: 8,
				charisma: 8
			},
			speed: 30,
			proficiencyBonus: 2
		}
	});
});
```

Next I wrote a very basic view showing the name and ability scores of a character.
```
// router/characters/index.js
router.get("/:id", async (req, res) => {
	console.log(req.params.id);
	req.context.models.Character.findOne({ _id: req.params.id }).then(
		async result => {
			if (result == null) res.redirect("/404");
			console.log(result);
			res.render("characterSheet", {
				data: {
					character: result,
					player: await req.context.models.Player.findOne({
						_id: result.player
					})
				}
			});
		}
	);
});
```
```
// views/characterSheet.ejs
<h1><%= data.character.longName %></h1>
<h2><%= data.player.username %></h2>

<h3>Strength</h3>
<p><%= data.character.stats.abilities.strength %></p>
<h3>Dexterity</h3>
<p><%= data.character.stats.abilities.dexterity %></p>
<h3>Consitution</h3>
<p><%= data.character.stats.abilities.constitution %></p>
<h3>Intelligence</h3>
<p><%= data.character.stats.abilities.intelligence %></p>
<h3>Wisdom</h3>
<p><%= data.character.stats.abilities.wisdom %></p>
<h3>Charisma</h3>
<p><%= data.character.stats.abilities.charisma %><
```
It feels great to to finally see some data populate to the screen, even on this simple view! 

# Project
{% github ApproachingApathy/100days-dnd-character-sheets %}

The First project will be an app to keep D&D character sheets.

## Stack

I'll be using Node.js and building a full-stack Express app with MongoDB.
### Requirements
#### Minimum Viable 
- [ ] Present a D&D Character Sheet
    - [ ] The sheet should display all the same info as the first page of the 5e Official sheet.
- [ ] Users should be able to log in and create player-characters.
- [ ] Users should be able to edit character sheets.
- [ ] Users should be able to organize character sheets into groups (parties/tables)
- [ ] Sheets should auto calculate basic stats like ability modifiers.
    - [ ] Support Proficiency Bonuses 

### Cake
- [ ] Extend character creation to allow the user to use any of the three common stat gen methods.
    - [ ] Point Buy
    - [ ] Standard Array
    - [ ] Roll
- [ ] Extend the character sheet to all the info in the 5e official sheet.
- [ ] Allow for image uploads for character portraits.
- [ ] Allow for extended descriptions/backstories.
    - [ ] Characters should have nice full page backstories.
    - [ ] Preferably use a markdown editor.