diff --git a/app/admin.py b/app/admin.py index a0cee05..3a0901a 100644 --- a/app/admin.py +++ b/app/admin.py @@ -16,6 +16,7 @@ admin.site.register(charmSolar) admin.site.register(charmLunar) admin.site.register(charmLunarShape) admin.site.register(charmEvocation) +admin.site.register(charmMartialArt) admin.site.register(merit) diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py index ba244ae..07d9ff9 100644 --- a/app/migrations/0001_initial.py +++ b/app/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.5 on 2020-04-13 00:12 +# Generated by Django 3.0.5 on 2020-04-15 20:45 import app.models from django.db import migrations, models @@ -90,6 +90,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', app.models.DescriptionField(blank=True, max_length=1000, verbose_name='Description')), ('intensity', app.models.SingleChoiceField(blank=True, choices=[('Minor', 'Minor'), ('Major', 'Major'), ('Defining', 'Defining')], max_length=100, verbose_name='Intensity')), + ('character', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='intimacy_set', to='app.characterBase', verbose_name='Character')), ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_app.intimacybase_set+', to='contenttypes.ContentType')), ], options={ @@ -144,6 +145,7 @@ class Migration(migrations.Migration): ('motesPersonal', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Current Personal Motes')), ('motesPeripheralMax', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Maximum Peripheral Motes')), ('motesPeripheral', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Current Peripheral Motes')), + ('motesCommitted', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Committed Motes')), ('limitTrigger', models.TextField(blank='False', max_length=1000, verbose_name='Limit Trigger')), ('limitBreak', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Limit Break')), ('experienceExaltedTotal', app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Total Exalted Experience')), @@ -375,6 +377,18 @@ class Migration(migrations.Migration): }, bases=('app.characterexaltbase',), ), + migrations.CreateModel( + name='charmEvocation', + fields=[ + ('charmbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.charmBase')), + ('key', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.itemBase', verbose_name='Artifact')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('app.charmbase',), + ), migrations.CreateModel( name='charmLunar', fields=[ @@ -517,24 +531,11 @@ class Migration(migrations.Migration): bases=('app.ownershipbase',), ), migrations.CreateModel( - name='ownershipIntimacyTie', + name='ownershipCharmSolar', fields=[ ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), - ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipIntimacyTie_set', to='app.characterBase', verbose_name='Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipIntimacyTieTarget_set', to='app.intimacyTie', verbose_name='Tie')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('app.ownershipbase',), - ), - migrations.CreateModel( - name='ownershipIntimacyPrincipal', - fields=[ - ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), - ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipIntimacyPrincipal_set', to='app.characterBase', verbose_name='Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipIntimacyPrincipalTarget_set', to='app.intimacyPrincipal', verbose_name='Principal')), + ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmSolar_set', to='app.characterExaltSolar', verbose_name='Solar Exalted Owner')), + ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmSolarTarget_set', to='app.charmSolar', verbose_name='Solar Charm')), ], options={ 'abstract': False, @@ -547,33 +548,7 @@ class Migration(migrations.Migration): fields=[ ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmMartialArt_set', to='app.characterExaltBase', verbose_name='Exalted Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmMartialArtTarget_set', to='app.characterExaltBase', verbose_name='Martial Arts Charm')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('app.ownershipbase',), - ), - migrations.CreateModel( - name='ownershipCharmEvocation', - fields=[ - ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), - ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmEvocation_set', to='app.characterExaltBase', verbose_name='Exalted Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmEvocationTarget_set', to='app.characterExaltBase', verbose_name='Evocation')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('app.ownershipbase',), - ), - migrations.CreateModel( - name='ownershipCharmSolar', - fields=[ - ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), - ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmSolar_set', to='app.characterExaltSolar', verbose_name='Solar Exalted Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmSolarTarget_set', to='app.characterExaltSolar', verbose_name='Solar Charm')), + ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmMartialArtTarget_set', to='app.charmMartialArt', verbose_name='Martial Arts Charm')), ], options={ 'abstract': False, @@ -586,7 +561,7 @@ class Migration(migrations.Migration): fields=[ ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunarShape_set', to='app.characterExaltLunar', verbose_name='Lunar Exalted Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunarShapeTarget_set', to='app.characterExaltLunar', verbose_name='Lunar Shape')), + ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunarShapeTarget_set', to='app.charmLunarShape', verbose_name='Lunar Shape')), ], options={ 'abstract': False, @@ -599,7 +574,7 @@ class Migration(migrations.Migration): fields=[ ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunar_set', to='app.characterExaltLunar', verbose_name='Lunar Exalted Owner')), - ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunarTarget_set', to='app.characterExaltLunar', verbose_name='Lunar Charm')), + ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmLunarTarget_set', to='app.charmLunar', verbose_name='Lunar Charm')), ], options={ 'abstract': False, @@ -608,15 +583,16 @@ class Migration(migrations.Migration): bases=('app.ownershipbase',), ), migrations.CreateModel( - name='charmEvocation', + name='ownershipCharmEvocation', fields=[ - ('charmbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.charmBase')), - ('key', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.itemBase', verbose_name='Artifact')), + ('ownershipbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app.ownershipBase')), + ('owner', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmEvocation_set', to='app.characterExaltBase', verbose_name='Exalted Owner')), + ('target', app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ownershipCharmEvocationTarget_set', to='app.charmEvocation', verbose_name='Evocation')), ], options={ 'abstract': False, 'base_manager_name': 'objects', }, - bases=('app.charmbase',), + bases=('app.ownershipbase',), ), ] diff --git a/app/migrations/0002_auto_20200415_2109.py b/app/migrations/0002_auto_20200415_2109.py new file mode 100644 index 0000000..957fdb9 --- /dev/null +++ b/app/migrations/0002_auto_20200415_2109.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.5 on 2020-04-15 21:09 + +import app.models +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='charmlunarshape', + name='shapeType', + field=app.models.SingleChoiceField(blank=True, choices=[('Human', 'Human'), ('Animal', 'Animal')], max_length=100, verbose_name='Shape Type'), + ), + migrations.AddField( + model_name='charmlunarshape', + name='size', + field=app.models.SingleChoiceField(blank=True, choices=[('Normal', 'Normal')], max_length=100, verbose_name='Size'), + ), + ] diff --git a/app/migrations/0002_characterexaltbase_motescommitted.py b/app/migrations/0002_characterexaltbase_motescommitted.py deleted file mode 100644 index 08cad14..0000000 --- a/app/migrations/0002_characterexaltbase_motescommitted.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.0.5 on 2020-04-13 13:15 - -import app.models -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='characterexaltbase', - name='motesCommitted', - field=app.models.NamedIntegerField(default=0, help_text=None, verbose_name='Committed Motes'), - ), - ] diff --git a/app/migrations/0003_auto_20200415_1929.py b/app/migrations/0003_auto_20200415_1929.py deleted file mode 100644 index dc40ef0..0000000 --- a/app/migrations/0003_auto_20200415_1929.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 3.0.5 on 2020-04-15 19:29 - -import app.models -from django.db import migrations -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0002_characterexaltbase_motescommitted'), - ] - - operations = [ - migrations.RemoveField( - model_name='ownershipintimacytie', - name='owner', - ), - migrations.RemoveField( - model_name='ownershipintimacytie', - name='ownershipbase_ptr', - ), - migrations.RemoveField( - model_name='ownershipintimacytie', - name='target', - ), - migrations.AddField( - model_name='intimacybase', - name='character', - field=app.models.NamedForeignKeyField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.characterBase', verbose_name='Character'), - ), - migrations.DeleteModel( - name='ownershipIntimacyPrincipal', - ), - migrations.DeleteModel( - name='ownershipIntimacyTie', - ), - ] diff --git a/app/models.py b/app/models.py index d88169d..3b23673 100644 --- a/app/models.py +++ b/app/models.py @@ -124,6 +124,7 @@ TAGS_WEAPONS = [ ), ( "Thrown", ( + ("Thrown", "Thrown"), ("Occult", "Occult"), ("Cutting", "Cutting"), ("Poisonable", "Poisonable"), @@ -218,6 +219,15 @@ CASTES_LUNAR = [ ("Castless", "Castless") ] +SHAPE_SIZES = [ + ("Normal", "Normal"), +] + +SHAPE_TYPES = [ + ("Human", "Human"), + ("Animal", "Animal"), +] + #==============================================================================# #------------------------------- CUSTOM MODELS --------------------------------# #==============================================================================# @@ -923,6 +933,11 @@ class characterBase(PolymorphicModel): return ["Healthy"] + ["-0" for i in range(self.health0)] + ["-1" for i in range(self.health1)] + ["-1" for i in range(self.health1)] + ["-4", "i"] def healthLevel(self): return self.healthTrack()[self.healthIndex] + def healthDots(self): + output = [] + for i in range(len(self.healthTrack()) - 1): + output.append((self.healthTrack()[i+1], i < self.healthIndex)) + return output #============ STATICS =============# def resolve(self, speciality=None, mod=0): @@ -1035,7 +1050,7 @@ class characterExaltLunar(characterExaltBase): #========= SHAPESHIFTING ==========# spiritShape = models.CharField(verbose_name="Spirit Shape", max_length=100) # Reverse relation - def shapeSet(self): + def lunarShapeSet(self): output = [] try: ownerships = self.ownershipCharmLunarShape_set.all() @@ -1161,30 +1176,49 @@ class charmBase(effectBase): keywords = MultiChoiceField("Charm Keywords", CHARM_KEYWORDS) class charmMartialArt(charmBase): + def type(self): + return "Martial Art" levelKey = NamedIntegerField("Martial Arts Level") key = None class charmEvocation(charmBase): + def type(self): + return "Evocation" levelKey = 0 key = NamedForeignKeyField("Artifact", itemBase) class charmSolar(charmBase): + def type(self): + return "Solar" levelKey = NamedIntegerField("Ability Level") key = SingleChoiceField("Key Ability", ABILITIES) class charmLunar(charmBase): + def type(self): + return "Lunar" levelKey = NamedIntegerField("Attribute Level") key = SingleChoiceField("Key Attribute", ATTRIBUTES) class charmLunarShape(charmBase): levelKey = 0 + def type(self): + return "Lunar Shape" key = None + size = SingleChoiceField("Size", SHAPE_SIZES) + shapeType = SingleChoiceField("Shape Type", SHAPE_TYPES) #==============================================================================# #----------------------------------- MERITS -----------------------------------# #==============================================================================# class merit(effectBase): dots = DotField("Dots") + def dotsDisplay(self): + output = [] + for i in range(self.dots): + output.append(True) + for i in range(5 - self.dots): + output.append(False) + return output #==============================================================================# #-------------------------------- SPECIALITIES --------------------------------# @@ -1200,7 +1234,7 @@ class intimacyBase(PolymorphicModel): description = DescriptionField() intensity = SingleChoiceField("Intensity", INTENSITIES) - character = NamedForeignKeyField("Character", characterBase) + character = NamedForeignKeyField("Character", characterBase, related_name="intimacy_set") class intimacyTie(intimacyBase): target = NamedCharField("Target") @@ -1226,19 +1260,19 @@ class ownershipItemArmor(ownershipBase): owner = NamedForeignKeyField("Owner", characterBase, related_name="ownershipItemArmor_set") class ownershipCharmMartialArt(ownershipBase): - target = NamedForeignKeyField("Martial Arts Charm", characterExaltBase, related_name="ownershipCharmMartialArtTarget_set") + target = NamedForeignKeyField("Martial Arts Charm", charmMartialArt, related_name="ownershipCharmMartialArtTarget_set") owner = NamedForeignKeyField("Exalted Owner", characterExaltBase, related_name="ownershipCharmMartialArt_set") class ownershipCharmEvocation(ownershipBase): - target = NamedForeignKeyField("Evocation", characterExaltBase, related_name="ownershipCharmEvocationTarget_set") + target = NamedForeignKeyField("Evocation", charmEvocation, related_name="ownershipCharmEvocationTarget_set") owner = NamedForeignKeyField("Exalted Owner", characterExaltBase, related_name="ownershipCharmEvocation_set") class ownershipCharmSolar(ownershipBase): - target = NamedForeignKeyField("Solar Charm", characterExaltSolar, related_name="ownershipCharmSolarTarget_set") + target = NamedForeignKeyField("Solar Charm", charmSolar, related_name="ownershipCharmSolarTarget_set") owner = NamedForeignKeyField("Solar Exalted Owner", characterExaltSolar, related_name="ownershipCharmSolar_set") class ownershipCharmLunar(ownershipBase): - target = NamedForeignKeyField("Lunar Charm", characterExaltLunar, related_name="ownershipCharmLunarTarget_set") + target = NamedForeignKeyField("Lunar Charm", charmLunar, related_name="ownershipCharmLunarTarget_set") owner = NamedForeignKeyField("Lunar Exalted Owner", characterExaltLunar, related_name="ownershipCharmLunar_set") class ownershipCharmLunarShape(ownershipBase): - target = NamedForeignKeyField("Lunar Shape", characterExaltLunar, related_name="ownershipCharmLunarShapeTarget_set") + target = NamedForeignKeyField("Lunar Shape", charmLunarShape, related_name="ownershipCharmLunarShapeTarget_set") owner = NamedForeignKeyField("Lunar Exalted Owner", characterExaltLunar, related_name="ownershipCharmLunarShape_set") class ownershipMerit(ownershipBase): diff --git a/exalted/settings.py b/exalted/settings.py index 51a82f3..cf05ab4 100644 --- a/exalted/settings.py +++ b/exalted/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = '1ry9e5wz$6(c-)btw70c41woraos)5nzqfbw2^kvpzpi)gy#6v' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ["192.168.1.205", "localhost", "127.0.0.1"] +ALLOWED_HOSTS = ["192.168.1.205", "localhost", "127.0.0.1", "tcaxle.ddns.net", "xle.sh"] # Application definition diff --git a/templates/characterDetail.html b/templates/characterDetail.html index 23395fe..1c45fdb 100644 --- a/templates/characterDetail.html +++ b/templates/characterDetail.html @@ -546,13 +546,12 @@

{% if object.specialitySet %} {% for speciality in object.specialitySet %} -

+

{{ speciality }} - -

+

{% endfor %} {% else %} -

No specialities found.

+

No specialities found.

{% endif %} {% endblock %} @@ -622,10 +621,22 @@

{% if object.meritSet %} {% for merit in object.meritSet %} -

{{ merit }}

+

+ {{ merit }} + + {% for dot in merit.dotsDisplay %} + {% if dot %} + + {% else %} + + {% endif %} + {% endfor %} +   + +

{% endfor %} {% else %} -

No merits found.

+

No merits found.

{% endif %} {% endblock %} @@ -646,7 +657,9 @@ {% endfor %}

- {{ object.limitTrigger }} +

+ {{ object.limitTrigger }} +

{% endblock %} @@ -700,7 +713,7 @@

Weapons & Armor

- +
@@ -708,29 +721,28 @@ - {% if object.itemWeaponSet %} {% for weapon in object.itemWeaponSet %} + {% if weapon.rangeClose %} + + {% else %} + {% endif %} - {% if weapon.rangeClose %} - - {% else %} - - {% endif %} {% endfor %} {% else %} {% endif %}
Weapon ACCDEF OVW ATTRange/Parry
{{ weapon.name }}{{ weapon.rangeClose }}/{{ weapon.rangeShort }}/{{ weapon.rangeMedium }}/{{ weapon.rangeLong }}/{{ weapon.rangeExtreme }}{{ weapon.accuracy }}{{ weapon.damage }} {{ weapon.defense }} {{ weapon.overwhelming }} {{ weapon.attunement }}{{ weapon.rangeClose }}/{{ weapon.rangeShort }}/{{ weapon.rangeMedium }}/{{ weapon.rangeLong }}/{{ weapon.rangeExtreme }}
No weapons found.
- +
+
@@ -808,6 +820,34 @@ {{ object.joinBattle }} +
+
+
+ {% for level,dot in object.healthDots %} +
+

+ {% if dot %} +   + +   + {% else %} +   + +   + {% endif %} +

+

+   + {{ level }} +   +

+
+ {% endfor %} +
+
+
+
+
{% endblock %} @@ -816,30 +856,14 @@

Intimacies

-
Armor SOAK
+
- - - - {% if object.intimacyPrincipal_set.all %} - {% for tie in object.intimacyPrincipal_set.all %} - - - - - {% endfor %} - {% else %} - - {% endif %} -
PrincipalIntensity
{{ tie.description }}{{ tie.intensity }}
No principals found.
- - - + - {% if object.intimacyTie_set.all %} - {% for tie in object.intimacyTie_set.all %} + {% if object.intimacy_set.all %} + {% for tie in object.intimacy_set.all %} @@ -847,7 +871,7 @@ {% endfor %} {% else %} - + {% endif %}
TieIntimacy Target Intensity
{{ tie.description }} {{ tie.target }}
No ties found.
No intimacies found.
@@ -858,13 +882,112 @@

Charms

+ + + + + + + + + {% if object.charmSet %} + {% for charm in object.charmSet %} + + + + + + + + {% endfor %} + {% else %} + + {% endif %} +
CharmTypeDurationKeywordsDescription
{{ charm.name }}{{ charm.charmType }}{{ charm.duration }}{{ charm.keywords }}{{ charm.description }}
No charms found.
+ {% if object.lunarShapeSet %} +
+ + + + + + + + {% for charm in object.lunarShapeSet %} + + + + + + + {% endfor %} +
ShapeTypeSizeDescription
{{ charm.name }}{{ charm.shapeType }}{{ charm.size }}{{ charm.description }}
+ {% endif %} + {% if object.evocationSet %} +
+ + + + + + + + + {% for charm in object.evocationSet %} + + + + + + + + {% endfor %} +
EvocationTypeDurationKeywordsDescription
{{ charm.name }}{{ charm.charmType }}{{ charm.duration }}{{ charm.keywords }}{{ charm.description }}
+ {% endif %} + {% if object.martialArtSet %} +
+ + + + + + + + + {% for charm in object.martialArtSet %} + + + + + + + + {% endfor %} +
CharmTypeDurationKeywordsDescription
{{ charm.name }}{{ charm.charmType }}{{ charm.duration }}{{ charm.keywords }}{{ charm.description }}
+ {% endif %} {% endblock %} {% block items %}

- Items + Inventory

+ + + + + + {% if object.itemSet %} + {% for item in object.itemSet %} + + + + + {% endfor %} + {% else %} + + {% endif %} +
ItemDescription
{{ item.name }}{{ item.description }}
No items found.
{% endblock %}