diff --git a/foundry_templates/npc_template.json b/foundry_templates/npc_template.json new file mode 100644 index 0000000..8bdc929 --- /dev/null +++ b/foundry_templates/npc_template.json @@ -0,0 +1,224 @@ +{ + "name": "NPC", + "type": "npc", + "prototypeToken": { + "flags": { + "pf2e": { + "linkToActorSize": true, + "autoscale": true + } + }, + "height": 1, + "width": 1, + "name": "NPC", + "displayName": 20, + "actorLink": false, + "texture": { + "src": "systems/pf2e/icons/default-icons/npc.svg", + "anchorX": 0.5, + "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, + "fit": "contain", + "scaleX": 1, + "scaleY": 1, + "rotation": 0, + "tint": "#ffffff", + "alphaThreshold": 0.75 + }, + "lockRotation": true, + "rotation": 0, + "alpha": 1, + "disposition": -1, + "displayBars": 20, + "bar1": { + "attribute": "attributes.hp" + }, + "bar2": { + "attribute": null + }, + "light": { + "negative": false, + "priority": 0, + "alpha": 0.5, + "angle": 360, + "bright": 0, + "color": null, + "coloration": 1, + "dim": 0, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": null, + "speed": 5, + "intensity": 5, + "reverse": false + }, + "darkness": { + "min": 0, + "max": 1 + } + }, + "sight": { + "enabled": false, + "range": 0, + "angle": 360, + "visionMode": "basic", + "color": null, + "attenuation": 0.1, + "brightness": 0, + "saturation": 0, + "contrast": 0 + }, + "detectionModes": [], + "occludable": { + "radius": 0 + }, + "ring": { + "enabled": false, + "colors": { + "ring": null, + "background": null + }, + "effects": 1, + "subject": { + "scale": 1, + "texture": null + } + }, + "turnMarker": { + "mode": 1, + "animation": null, + "src": null, + "disposition": false + }, + "movementAction": null, + "randomImg": false, + "appendNumber": false, + "prependAdjective": false + }, + "effects": [], + "system": { + "attributes": { + "hp": { + "value": 10, + "temp": 0, + "max": 10, + "details": "" + }, + "ac": { + "value": 10, + "details": "" + }, + "allSaves": { + "value": "" + }, + "speed": { + "value": 25, + "otherSpeeds": [], + "details": "" + } + }, + "initiative": { + "statistic": "perception" + }, + "details": { + "languages": { + "value": [], + "details": "" + }, + "level": { + "value": 1 + }, + "blurb": "", + "publicNotes": "", + "privateNotes": "", + "publication": { + "title": "", + "authors": "", + "license": "OGL", + "remaster": false + } + }, + "resources": {}, + "_migration": { + "version": 0.953, + "previous": null + }, + "abilities": { + "str": { + "mod": 0 + }, + "dex": { + "mod": 0 + }, + "con": { + "mod": 0 + }, + "int": { + "mod": 0 + }, + "wis": { + "mod": 0 + }, + "cha": { + "mod": 0 + } + }, + "perception": { + "details": "", + "mod": 0, + "senses": [], + "vision": true + }, + "saves": { + "fortitude": { + "value": 0, + "saveDetail": "" + }, + "reflex": { + "value": 0, + "saveDetail": "" + }, + "will": { + "value": 0, + "saveDetail": "" + } + }, + "skills": {}, + "traits": { + "value": [], + "rarity": "common", + "size": { + "value": "med" + } + } + }, + "img": "systems/pf2e/icons/default-icons/npc.svg", + "items": [], + "folder": null, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": { + "worldId": "ren-city", + "uuid": "Actor.C3z1yVH1bb8JOGJ5", + "coreVersion": "13.351", + "systemId": "pf2e", + "systemVersion": "7.8.0" + }, + "coreVersion": "13.351", + "systemId": "pf2e", + "systemVersion": "7.8.0", + "createdTime": 1782755451922, + "modifiedTime": 1782755451922, + "lastModifiedBy": "lrcp8tpvQicPvXd6" + }, + "ownership": { + "default": 0 + } +} \ No newline at end of file diff --git a/llmflow/npc.toml b/llmflow/npc.toml new file mode 100644 index 0000000..665f583 --- /dev/null +++ b/llmflow/npc.toml @@ -0,0 +1,64 @@ +# Prompt Appendage for Retries +retry_prefix = "Previous attempts failed. Please try again and ensure you follow the strict formatting requirements." + +# NPC Generation Prompts + +[name] +question = "Based on the description, what is a fitting name for this character?" +constraints = "Respond with only the name." + +[ability_score_modifier] +question = "Based on the description, how would you rate the {modifierTier} ability score modifier for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, or Low." + +[perception_modifier] +question = "Based on the description, how would you rate the {modifierTier} perception modifier for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, Low, or Terrible." + +[skill_modifier] +question = "Based on the description, how would you rate the {modifierTier} skill modifier for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, or Low." + +[ac] +question = "Based on the description, how would you rate the {modifierTier} armor class (AC) for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, or Low." + +[saving_throw] +question = "Based on the description, how would you rate the {modifierTier} saving throw for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, Low, or Terrible." + +[hp] +question = "Based on the description, how would you rate the {modifierTier} hit points (HP) for a level {level} character in {system}?" +constraints = "Respond with only a single word: High, Moderate, or Low." + +[resistance_or_weakness] +question = "Based on the description, does this character have any notable resistances or weaknesses in {system}?" +constraints = "Respond with only a single word: Yes or No." + +[strike_attack_bonus] +question = "Based on the description, how would you rate the {modifierTier} strike attack bonus for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, Moderate, or Low." + +[strike_damage_roll] +question = "Based on the description, what is the strike damage dice roll for a level {level} character in {system}?" +constraints = "Respond with only the dice notation (e.g., 1d8+3, 2d6)." + +[strike_damage_average] +question = "Based on the description, what is the average strike damage for a level {level} character in {system}?" +constraints = "Respond with only the numerical value of the average damage." + +[area_damage_roll] +question = "Based on the description, what is the area damage dice roll for a level {level} character in {system} (unlimited: {unlimited})?" +constraints = "Respond with only the dice notation (e.g., 2d6, 1d10)." + +[area_damage_average] +question = "Based on the description, what is the average area damage for a level {level} character in {system} (unlimited: {unlimited})?" +constraints = "Respond with only the numerical value of the average damage." + +[spell_dc] +question = "Based on the description, how would you rate the {modifierTier} spell DC for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, or Moderate." + +[spell_attack_bonus] +question = "Based on the description, how would you rate the {modifierTier} spell attack bonus for a level {level} character in {system}?" +constraints = "Respond with only a single word: Extreme, High, or Moderate." diff --git a/viewmodels/mainwindowviewmodel.cs b/viewmodels/mainwindowviewmodel.cs index 6fb022b..0b0eddd 100644 --- a/viewmodels/mainwindowviewmodel.cs +++ b/viewmodels/mainwindowviewmodel.cs @@ -52,6 +52,14 @@ namespace finder2e_foundry_converter.ViewModels public ObservableCollection Models { get; } = new(); + [ObservableProperty] + private string? _selectedCategory; + + public ObservableCollection Categories { get; } = new() { "NPCs" }; + + [ObservableProperty] + private string _name = string.Empty; + [ObservableProperty] private string _description = string.Empty; diff --git a/views/mainwindow.axaml b/views/mainwindow.axaml index e43b243..a0c5547 100644 --- a/views/mainwindow.axaml +++ b/views/mainwindow.axaml @@ -43,6 +43,14 @@