Skip to content

Commit 595239e

Browse files
committed
Add app version 0.1.0
Adding in source code for being able to run the README instructions on the current version with no migrations files committed intentionally. This should be ready to run for any fresh instances.
1 parent 65307c0 commit 595239e

File tree

20 files changed

+260512
-0
lines changed

20 files changed

+260512
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
db.sqlite3
2+
*.pyc
3+
.vscode/
4+
CharacterCreator/migrations/*.py
5+

CharacterCreator/__init__.py

Whitespace-only changes.

CharacterCreator/admin.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.contrib import admin
2+
from .models import *
3+
4+
# Register your models here.
5+
admin.site.register(Dice)
6+
admin.site.register(Event)
7+
admin.site.register(EventRoll)
8+
admin.site.register(CharacterEventRoll)
9+
admin.site.register(NPCEvent)
10+
admin.site.register(NPCEventRoll)
11+
admin.site.register(Role)
12+
admin.site.register(Character)
13+
admin.site.register(Statistic)
14+
admin.site.register(Skill)
15+
admin.site.register(CharacterStatistic)
16+
admin.site.register(CharacterSkill)

CharacterCreator/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class CharactercreatorConfig(AppConfig):
5+
name = 'CharacterCreator'

CharacterCreator/migrations/__init__.py

Whitespace-only changes.

CharacterCreator/models.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
from django.db import models
2+
#from django.core.validators import MinValueValidator, MaxValueValidator
3+
4+
class Dice(models.Model):
5+
string = models.CharField(max_length=50, null=True)
6+
quantity = models.IntegerField(default=1)
7+
sides = models.IntegerField(default=2)
8+
offset = models.IntegerField(default=0)
9+
10+
def __str__(self):
11+
if self.offset < 0:
12+
return str(self.quantity) + 'd' + str(self.sides) + ' - ' + str((-1)*self.offset)
13+
elif self.offset == 0:
14+
return str(self.quantity) + 'd' + str(self.sides)
15+
elif self.offset > 0:
16+
return str(self.quantity) + 'd' + str(self.sides) + ' + ' + str(self.offset)
17+
18+
19+
class Event(models.Model):
20+
name = models.CharField(max_length=50)
21+
dice = models.ForeignKey(Dice, null=True, on_delete=models.CASCADE)
22+
rerollevent = models.ForeignKey('self', null=True, on_delete=models.CASCADE, related_name='RerollEvent')
23+
nextevent = models.ForeignKey('self', null=True, on_delete=models.CASCADE, related_name='NextEvent')
24+
25+
def __str__(self):
26+
return self.name
27+
28+
29+
class EventRoll(models.Model):
30+
roll = models.IntegerField(null=True)
31+
outcome = models.CharField(max_length=300, null=True)
32+
npc = models.CharField(max_length=50, null=True)
33+
rerollcount = models.IntegerField(default=1)
34+
mainevent = models.ForeignKey(Event, null=True, on_delete=models.CASCADE, related_name='MainEvent')
35+
rollevent = models.ForeignKey(Event, null=True, on_delete=models.CASCADE, related_name='RollEvent')
36+
37+
def __str__(self):
38+
if self.outcome:
39+
return self.mainevent.name + ' (' + str(self.roll) + '): ' + self.outcome
40+
elif self.rollevent:
41+
return self.mainevent.name + ' (' + str(self.roll) + ') -> ' + self.rollevent.name
42+
else:
43+
return self.mainevent.name + ' (' + str(self.roll) + ')'
44+
45+
class NPCEvent(models.Model):
46+
current = models.ForeignKey(Event, null=True, on_delete=models.CASCADE, related_name='CurrentNPCEvent')
47+
next = models.ForeignKey(Event, null=True, on_delete=models.CASCADE, related_name='NextNPCEvent')
48+
49+
def __str__(self):
50+
return self.current.name + ' -> ' + self.next.name
51+
52+
53+
class Statistic(models.Model):
54+
name = models.CharField(max_length=50, unique=True)
55+
minimum = models.IntegerField(null=True)
56+
maximum = models.IntegerField(null=True)
57+
58+
def __str__(self):
59+
return self.name + ' (' + str(self.minimum) + '->' + str(self.maximum) + ')'
60+
61+
62+
class Skill(models.Model):
63+
name = models.CharField(max_length=50)
64+
minimum = models.IntegerField()
65+
maximum = models.IntegerField()
66+
statistic = models.ForeignKey(Statistic, null=True, on_delete=models.CASCADE)
67+
68+
def __str__(self):
69+
return '[' + self.statistic.name + '] ' + self.name + ' (' + str(self.minimum) + '->' + str(self.maximum) + ')'
70+
71+
72+
class Role(models.Model):
73+
name = models.CharField(max_length=50)
74+
special_skills = models.ManyToManyField(Skill, related_name='SpecialSkill')
75+
common_skills = models.ManyToManyField(Skill, related_name='CommonSkill')
76+
77+
def __str__(self):
78+
return self.name
79+
80+
81+
class Character(models.Model):
82+
name = models.CharField(default='', unique=True, max_length=50)
83+
role = models.ForeignKey(Role, null=True, on_delete=models.CASCADE)
84+
stat_points = models.IntegerField(default=0)
85+
role_points = models.IntegerField(default=0)
86+
other_points = models.IntegerField(default=0)
87+
88+
def __str__(self):
89+
return self.role.name + ': ' + self.name
90+
91+
92+
class CharacterEventRoll(models.Model):
93+
character = models.ForeignKey(Character, null=True, on_delete=models.CASCADE)
94+
eventroll = models.ForeignKey(EventRoll, null=True, on_delete=models.CASCADE)
95+
96+
def __str__(self):
97+
return str(self.eventroll)
98+
99+
100+
class NPCEventRoll(models.Model):
101+
npc = models.ForeignKey(Character, null=True, on_delete=models.CASCADE, related_name='NPC')
102+
character = models.ForeignKey(Character, null=True, on_delete=models.CASCADE, related_name='PlayerCharacter')
103+
eventroll = models.ForeignKey(EventRoll, null=True, on_delete=models.CASCADE)
104+
105+
def __str__(self):
106+
# return str(self.npc) + ': ' + str(self.eventroll)
107+
return str(self.eventroll)
108+
109+
110+
class CharacterStatistic(models.Model):
111+
character = models.ForeignKey(Character, null=True, on_delete=models.CASCADE)
112+
statistic = models.ForeignKey(Statistic, null=True, on_delete=models.CASCADE)
113+
current = models.IntegerField(blank=True)
114+
115+
def __str__(self):
116+
return self.statistic.name + ': ' + str(self.current)
117+
118+
119+
class CharacterSkill(models.Model):
120+
character = models.ForeignKey(Character, null=True, on_delete=models.CASCADE)
121+
skill = models.ForeignKey(Skill, null=True, on_delete=models.CASCADE)
122+
current = models.IntegerField(blank=True)
123+
124+
def __str__(self):
125+
return '[' + self.skill.statistic.name + '] ' + self.skill.name + ': ' + str(self.current)
126+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<h1>{{ character }}</h1>
2+
3+
<li>Statistic Points: {{ character.stat_points }}</li>
4+
<li>Role Skill Points: {{ character.role_points }}</li>
5+
<li>Other Skill Points: {{ character.other_points }}</li>
6+
7+
<h2>Statistics</h2>
8+
{% if stats %}
9+
<ul>
10+
{% for s in stats %}
11+
<li>{{ s }}</li>
12+
{% endfor %}
13+
</ul>
14+
{% else %}
15+
<p>No character statistics are available.</p>
16+
{% endif %}
17+
18+
<h2>Skills</h2>
19+
{% if skills %}
20+
<ul>
21+
{% for s in skills %}
22+
{% if s.current > 0 %}
23+
<li>{{ s }}</li>
24+
{% endif %}
25+
{% endfor %}
26+
</ul>
27+
{% else %}
28+
<p>No character skills are available.</p>
29+
{% endif %}
30+
31+
<h2>History</h2>
32+
{% if history %}
33+
<ul>
34+
{% for h in history %}
35+
<li>{{ h }}</li>
36+
{% endfor %}
37+
</ul>
38+
{% else %}
39+
<p>No character history available.</p>
40+
{% endif %}
41+
42+
<h2>Related NPC's</h2>
43+
{% if npcs %}
44+
<ul>
45+
{% for n in npcs %}
46+
{% ifchanged n.npc %}
47+
<h3><a href="{% url 'npc' n.npc.id %}">{{ n.npc }}</a></h3>
48+
{% endifchanged %}
49+
<li>{{ n }}</li>
50+
{% endfor %}
51+
</ul>
52+
{% else %}
53+
<p>No NPC's available.</p>
54+
{% endif %}
55+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{% if character_list %}
2+
<ul>
3+
{% for c in character_list %}
4+
<li><a href="{% url 'character' c.id %}">{{ c }}</a></li>
5+
{% if npc_list %}
6+
<ul>
7+
{% for npc in npc_list %}
8+
{% for h in npc_history %}
9+
{% if h.npc == npc and h.character == c %}
10+
{% ifchanged npc %}
11+
<li><a href="{% url 'npc' npc.id %}">{{ npc }}</a></li>
12+
{% endifchanged %}
13+
{% endif %}
14+
{% endfor %}
15+
{% endfor %}
16+
</ul>
17+
{% endif %}
18+
{% endfor %}
19+
</ul>
20+
{% else %}
21+
<p>No characters are available.</p>
22+
{% endif %}
23+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<h1>{{ character }}</h1>
2+
3+
<li>Statistic Points: {{ character.stat_points }}</li>
4+
<li>Role Skill Points: {{ character.role_points }}</li>
5+
<li>Other Skill Points: {{ character.other_points }}</li>
6+
7+
<h2>Statistics</h2>
8+
{% if stats %}
9+
<ul>
10+
{% for s in stats %}
11+
<li>{{ s }}</li>
12+
{% endfor %}
13+
</ul>
14+
{% else %}
15+
<p>No character statistics are available.</p>
16+
{% endif %}
17+
18+
<h2>Skills</h2>
19+
{% if skills %}
20+
<ul>
21+
{% for s in skills %}
22+
{% if s.current > 0 %}
23+
<li>{{ s }}</li>
24+
{% endif %}
25+
{% endfor %}
26+
</ul>
27+
{% else %}
28+
<p>No character skills are available.</p>
29+
{% endif %}
30+
31+
<h2>History</h2>
32+
{% if history %}
33+
<ul>
34+
{% for h in history %}
35+
<li>{{ h }}</li>
36+
{% endfor %}
37+
</ul>
38+
{% else %}
39+
<p>No character history available.</p>
40+
{% endif %}
41+

CharacterCreator/tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.

0 commit comments

Comments
 (0)