Merge branch 'rwan'
This commit is contained in:
@@ -1 +1,2 @@
|
||||
packs/** binary
|
||||
node_modules/
|
||||
|
||||
@@ -1 +1,14 @@
|
||||
# Vermine 2047 System
|
||||
|
||||
|
||||
##TODO
|
||||
|
||||
- [ ] envoyer les spécialités utilisables au rollDialog
|
||||
- [X] refacto des template chat de roll
|
||||
- [X] gérer les dés de totems humains et adapté : couleur différente/double succès +update actor
|
||||
- [X] gérer les rerolls depuis chat(cf noc)
|
||||
- [X] gérer les rerolls après le jet en fonction du score d'effort et de la carac
|
||||
- [ ] repasser sur les différents itemTypes et sheets
|
||||
- [ ] update des reserves de sang-froids lors de jets
|
||||
- [ ] gérer les rolls d'items
|
||||
- [ ] ajout des domaines de prédilections
|
||||
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-458
File diff suppressed because one or more lines are too long
+1
-388
File diff suppressed because one or more lines are too long
+40
@@ -0,0 +1,40 @@
|
||||
'use strict';
|
||||
|
||||
const gulp = require('gulp');
|
||||
const sass = require('gulp-sass')(require('sass'));
|
||||
var browserSync = require('browser-sync').create();
|
||||
|
||||
function buildStyles() {
|
||||
return gulp.src('./scss/vermine2047.scss')
|
||||
.pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
|
||||
.pipe(gulp.dest('./css'))
|
||||
.pipe(browserSync.stream());
|
||||
|
||||
|
||||
};
|
||||
function reloadTemplatesHTML() {
|
||||
|
||||
return browserSync.reload("templates/**/*.html")
|
||||
}
|
||||
|
||||
function reloadTemplatesHBS() {
|
||||
|
||||
return browserSync.reload("templates/**/*.hbs")
|
||||
}
|
||||
exports.buildStyles = buildStyles;
|
||||
exports.watch = function () {
|
||||
browserSync.init(
|
||||
{
|
||||
server: false,
|
||||
proxy: {
|
||||
target: "https://localhost:443/",
|
||||
ws: true,
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
gulp.watch("./templates/**/*.html").on('change', reloadTemplatesHTML);
|
||||
gulp.watch("./templates/**/*.hbs").on('change', reloadTemplatesHBS);
|
||||
gulp.watch(['./scss/**/*.scss', './scss/*.scss'], buildStyles);
|
||||
|
||||
};
|
||||
+394
-284
@@ -2,396 +2,506 @@
|
||||
"SETTINGS": {
|
||||
"world": {
|
||||
"game_mode": {
|
||||
"name":"Choix du mode de jeu",
|
||||
"hint":"À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers."
|
||||
"name": "Game Mode Selection",
|
||||
"hint": "Just like some video games offer different modes, Vermine 2047 lets players choose their Game Mode and set the degree of realism, supernatural and dangerosity of the universe themselves."
|
||||
},
|
||||
"first_run": {
|
||||
"name":"Affichage du tour d'accueil",
|
||||
"hint":"Pour aider les débutantEs à bien commencer avec le système Vermine 2047."
|
||||
"name": "First Run Display",
|
||||
"hint": "To help beginners get started with the Vermine 2047 system."
|
||||
}
|
||||
}
|
||||
},
|
||||
"VERMINE.WorldSettings.GameMode.Name":"Choix du mode de jeu",
|
||||
"VERMINE.WorldSettings.GameMode.Hint":"À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers.",
|
||||
"VERMINE.WorldSettings.GameMode.Name": "Game Mode Selection",
|
||||
"VERMINE.WorldSettings.GameMode.Hint": "Just like some video games offer different modes, Vermine 2047 lets players choose their Game Mode and set the degree of realism, supernatural and dangerosity of the universe themselves.",
|
||||
"GAME_MODES": {
|
||||
"heroic": { "name": "Héroique"},
|
||||
"epic": { "name": "Epique"},
|
||||
"legendary": { "name": "Légendaire"}
|
||||
"heroic": {
|
||||
"name": "Heroic"
|
||||
},
|
||||
"epic": {
|
||||
"name": "Epic"
|
||||
},
|
||||
"legendary": {
|
||||
"name": "Legendary"
|
||||
}
|
||||
},
|
||||
"ROLLS": {
|
||||
"tool": "Lanceur de dés",
|
||||
"roll_dice": "Jeter les dés"
|
||||
"tool": "Dice Roller",
|
||||
"roll_dice": "Roll the dice"
|
||||
},
|
||||
"TOURS": {
|
||||
"ChatMessage": "<h3>Bienvenue dans Vermine!</h3><p>Si vous utilisez ce système pour la première fois, notre shaman va vous guider vers votre rite d'initiation</p> <button id=\"vermine-tour-chat-button\"> <i class=\"fas fa-person-hiking\"></i> J'y vais mais j'ai peur </button>",
|
||||
"ChatMessage": "<h3>Welcome to Vermine!</h3><p>If you're using this system for the first time, our shaman will guide you to your initiation rite</p> <button id=\"vermine-tour-chat-button\"> <i class=\"fas fa-person-hiking\"></i> I'm going but I'm scared </button>",
|
||||
"Welcome": {
|
||||
"Title": "Bienvenue dans Vermine",
|
||||
"Description": "Aperçu du système Vermine",
|
||||
"WelcomeTitle": "Bienvenue",
|
||||
"WelcomeContent": "<p>Bienvenue dans Vermine, survivantE ! Faire le tour de notre zone d'action te permettre de retrouver tes marques, même si c'est ton premier jour parmi nous.</p><p>En haut de la colonne de droite, tu as tout ce que tu as le droit de faire chez nous : parler, voir les autres tronches de ta commu, gérer ton matos et celui de tes potes, étudier les cartes, lire les journaux des clamsés, aller nous chercher de la bouffe à coups de surin. Entrons dans le vif du sujet.</p>",
|
||||
"ActorTabTitle": "Peupler son univers",
|
||||
"ActorTabContent": "<p>Bien installéE, survivantE ? Tournons pas au tour du pot, si tu veux rester avec nous, va falloir nous dire qui tu es, d'où tu viens, et à qui tu fais confiance. Une fois que t'es prêtE pour ca, clique donc sur le bouton \"Créer un acteur\"</p>",
|
||||
"CharacterCreateTitle": "Créer un groupe",
|
||||
"CharacterCreateContent": "<p>Ce bouton crée une fiche de groupe, parce que c'est par là qu'on commence, dans ce trou ! Ta tronche viendra ensuite, quand tu créeras ta fiche de personnage. Au fur et à mesure que tu progresses, tu voudras peut-être rajouter des infos sur ce que tu vois trainer autour du camp.</p>",
|
||||
"CompendiumTitle": "Cartes",
|
||||
"CompendiumContent": "<p>Vous aurez probablement besoin d'une carte des Terres de Fer ou d'un secteur de la Forge. Vous pouvez créer votre propre scène pour cela, ou vous pouvez utiliser l'une des nôtres. Ouvrez l'un de ces compendiums et faites glisser une carte dans votre zone de scènes (l'onglet qui ressemble à une carte pliée).</p>",
|
||||
"Title": "Welcome to Vermine",
|
||||
"Description": "Overview of the Vermine system",
|
||||
"WelcomeTitle": "Welcome",
|
||||
"WelcomeContent": "<p>Welcome to Vermine, survivor! Take a tour of our action zone to find your bearings, even if it's your first day among us.</p><p>At the top of the right column, you have everything you're allowed to do here: talk, see other tronches of your commu, manage your matos and that of your potes, study the maps, read the journals of the clamsés, go get us some food with your surin. Let's get into the thick of it.</p>",
|
||||
"ActorTabTitle": "Populate your universe",
|
||||
"ActorTabContent": "<p>Well installed, survivor? Let's not turn around the pot, if you want to stay with us, you'll have to tell us who you are, where you come from, and who you trust. Once you're ready for that, click on the \"Create an actor\" button</p>",
|
||||
"CharacterCreateTitle": "Create a group",
|
||||
"CharacterCreateContent": "<p>This button creates a group file, because that's where we start, in this trou! Your tronche will come later, when you create your character file. As you progress, you might want to add some info on what you see around the camp.</p>",
|
||||
"CompendiumTitle": "Maps",
|
||||
"CompendiumContent": "<p>You will probably need a map of the Iron Lands or a sector of the Forge. You can create your own scene for that, or you can use one of ours. Open one of these compendiums and drag a map into your scene tab (the tab that looks like a folded map).</p>",
|
||||
"OracleToolTitle": "Totem",
|
||||
"OracleToolContent": "<p>Aucune partie d'Vermine ou Starforged ne serait complète sans oracles. Ce bouton fera apparaître une fenêtre avec tous les oracles du jeu choisi. Les oracles sont également disponibles depuis la fiche de personnage.</p>",
|
||||
"ToursTitle": "Prochaines étapes",
|
||||
"ToursContent": "<p>Tu t'en sors pas si mal ! Moi je vais te laisser là, mais si tu as d'autres questions, tu peux venir me trouver. Si ca concerne la mécanique, inscris-toi dans notre groupe de parole, par là <a href=\"https://discord.gg/FqGHYvXg\">Totem Foundry Discord</a>. Sinon, tu peux rejoindre la place centrale par ici <a href=\"https://discord.gg/qejqmSxr\">Vermine Discord</a></p><p>Enjoy!</p>"
|
||||
"OracleToolContent": "<p>No game of Vermine or Starforged would be complete without oracles. This button will open a window with all the oracles of the chosen game. The oracles are also available from the character sheet.</p>",
|
||||
"ToursTitle": "Next steps",
|
||||
"ToursContent": "<p>You're not doing too badly! I'll leave you there, but if you have any questions, you can come find me. If it's about the mechanics, sign up for our group of speech, over there <a href=\"https://discord.gg/FqGHYvXg\">Totem Foundry Discord</a>. Otherwise, you can join the central place over here <a href=\"https://discord.gg/qejqmSxr\">Vermine Discord</a></p><p>Enjoy!</p>"
|
||||
}
|
||||
},
|
||||
"DIFFICULTY_LEVELS": {
|
||||
"obvious": "Evidente",
|
||||
"easy": "Facile",
|
||||
"hard": "Difficile",
|
||||
"very_hard": "Très difficile",
|
||||
"obvious": "Obvious",
|
||||
"easy": "Easy",
|
||||
"hard": "Hard",
|
||||
"very_hard": "Very hard",
|
||||
"impossible": "Impossible"
|
||||
},
|
||||
"ATTITUDES": {
|
||||
"offensive": { "name": "Offensif"},
|
||||
"active": { "name": "Actif"},
|
||||
"passive": { "name": "Passif"}
|
||||
"offensive": {
|
||||
"name": "Offensive"
|
||||
},
|
||||
"active": {
|
||||
"name": "Active"
|
||||
},
|
||||
"passive": {
|
||||
"name": "Passive"
|
||||
}
|
||||
},
|
||||
"AGE_TYPES": {
|
||||
"young": "Jeune",
|
||||
"adult": "Adulte",
|
||||
"old": "Vieux"
|
||||
"young": "Young",
|
||||
"adult": "Adult",
|
||||
"old": "Old"
|
||||
},
|
||||
"IDENTITY": {
|
||||
"name": "Nom",
|
||||
"height": "Taille",
|
||||
"weight": "Poids",
|
||||
"name": "Name",
|
||||
"height": "Height",
|
||||
"weight": "Weight",
|
||||
"totem": "Totem",
|
||||
"age": "Age",
|
||||
"gender": "Sexe",
|
||||
"profile": "Profil",
|
||||
"origin": "Origine",
|
||||
"gender": "Gender",
|
||||
"profile": "Profile",
|
||||
"origin": "Origin",
|
||||
"theme": "Concept",
|
||||
"instincts": "Instincts",
|
||||
"prohibits": "Interdits",
|
||||
"objectives": "Objectifs",
|
||||
"prohibits": "Prohibits",
|
||||
"objectives": "Objectives",
|
||||
"relations": "Relations",
|
||||
"morale":"Moral",
|
||||
"morale_level": "Niveau de moral",
|
||||
"morale": "Morale",
|
||||
"morale_level": "Morale level",
|
||||
"notes": "Notes"
|
||||
},
|
||||
"ADVERSITY": {
|
||||
"threat": "Menace",
|
||||
"experience": "Expérience",
|
||||
"role": "Rôle",
|
||||
"attack": "Attaque",
|
||||
"damage": "Dommages",
|
||||
"weapon": "Arme",
|
||||
"vigor": "Vigueur",
|
||||
"wounds": "Blessures",
|
||||
"threat": "Threat",
|
||||
"experience": "Experience",
|
||||
"role": "Role",
|
||||
"attack": "Attack",
|
||||
"damage": "Damage",
|
||||
"weapon": "Weapon",
|
||||
"vigor": "Vigor",
|
||||
"wounds": "Wounds",
|
||||
"action": "Action",
|
||||
"specialties": "Spécialité",
|
||||
"rerolls": "Relances",
|
||||
"specialties": "Specialty",
|
||||
"rerolls": "Rerolls",
|
||||
"contact": "Contact",
|
||||
"reaction": "Réaction",
|
||||
"pools":"Réserves",
|
||||
"gear": "Matériel",
|
||||
"reaction": "Reaction",
|
||||
"pools": "Reserves",
|
||||
"gear": "Gear",
|
||||
"protection": "Protection",
|
||||
"skills": "Compétences",
|
||||
"pattern": "Gabarit",
|
||||
"size": "Taille",
|
||||
"pack": "Groupe"
|
||||
"skills": "Skills",
|
||||
"pattern": "Pattern",
|
||||
"size": "Size",
|
||||
"pack": "Group"
|
||||
},
|
||||
|
||||
"VERMINE": {
|
||||
"name": "Vermine",
|
||||
"stats": "Statistiques",
|
||||
"level": "Niveau",
|
||||
"experience": "Expérience",
|
||||
"reputation": "Réputation",
|
||||
"pool": "Réserve",
|
||||
"pools": "Réserves",
|
||||
"self_control": "Sang-Froid",
|
||||
"stats": "Statistics",
|
||||
"level": "Level",
|
||||
"experience": "Experience",
|
||||
"reputation": "Reputation",
|
||||
"pool": "Reserve",
|
||||
"pools": "Reserves",
|
||||
"self_control": "Self-control",
|
||||
"effort": "Effort",
|
||||
"group": "Groupe",
|
||||
"abilities":"Caractéristiques",
|
||||
"ability":"Caractéristique",
|
||||
"skills_title":"Compétences",
|
||||
"skill_title":"Compétence",
|
||||
"skill_mastery":"Maîtrise",
|
||||
"bonus":"Bonus",
|
||||
"penalty":"Malus",
|
||||
"reroll":"Relance",
|
||||
"equipment":"Equipement",
|
||||
"specialty":"Spécialité",
|
||||
"technique":"Technique",
|
||||
"techniques":"Techniques",
|
||||
"difficulty":"Difficulté",
|
||||
"help":"Entraide",
|
||||
"tooling":"Equipement",
|
||||
"quantity": "Quantité",
|
||||
"qty": "Qté",
|
||||
"weight": "Poids",
|
||||
"group": "Group",
|
||||
"abilities": "Characteristics",
|
||||
"ability": "Characteristic",
|
||||
"skills_title": "Skills",
|
||||
"skill_title": "Skill",
|
||||
"skill_mastery": "Mastery",
|
||||
"bonus": "Bonus",
|
||||
"penalty": "Penalty",
|
||||
"reroll": "Reroll",
|
||||
"equipment": "Equipment",
|
||||
"specialty": "Specialty",
|
||||
"technique": "Technique",
|
||||
"techniques": "Techniques",
|
||||
"difficulty": "Difficulty",
|
||||
"help": "Help",
|
||||
"tooling": "Equipment",
|
||||
"quantity": "Quantity",
|
||||
"qty": "Qty",
|
||||
"weight": "Weight",
|
||||
"dmg": "Dmg",
|
||||
"damage": "Dommage",
|
||||
"damages": "Dommages",
|
||||
"range": "Portée",
|
||||
"ranges": "Portées",
|
||||
"mobility": "Mobilité",
|
||||
"rarity": "Rareté",
|
||||
"damage": "Damage",
|
||||
"damages": "Damages",
|
||||
"range": "Range",
|
||||
"ranges": "Ranges",
|
||||
"mobility": "Mobility",
|
||||
"rarity": "Rarity",
|
||||
"rarity_sm": "Rar.",
|
||||
"reliability": "Fiabilité",
|
||||
"reliability": "Reliability",
|
||||
"reliability_sm": "Fiab.",
|
||||
"wounds":{
|
||||
"name":"Blessures",
|
||||
"threshold": "Seuil",
|
||||
"light":"Légère",
|
||||
"heavy": "Grave",
|
||||
"deadly": "Mortelle",
|
||||
"light_wounds":"Blessure légère",
|
||||
"heavy_wounds":"Blessure grave",
|
||||
"deadly_wounds":"Blessure mortelle"
|
||||
"wounds": {
|
||||
"name": "Wounds",
|
||||
"threshold": "Threshold",
|
||||
"light": "Light",
|
||||
"heavy": "Heavy",
|
||||
"deadly": "Deadly",
|
||||
"light_wounds": "Light wounds",
|
||||
"heavy_wounds": "Heavy wounds",
|
||||
"deadly_wounds": "Deadly wounds"
|
||||
},
|
||||
"ammo": "Munitions",
|
||||
"ammo": "Ammo",
|
||||
"ammo_sm": "Mun",
|
||||
"trait": "Trait",
|
||||
"traits": "Traits",
|
||||
"clew": "Indice",
|
||||
"clew": "Clue",
|
||||
"combat": "Combat",
|
||||
"stories": "Histoires",
|
||||
"gear": "Matériel",
|
||||
"information": "Informations",
|
||||
"boost": "boost",
|
||||
"group_abilities": "Capacités de groupe",
|
||||
"totem_abilities": "Capacités de totem",
|
||||
"type_group": "Groupe",
|
||||
"type_character": "Personnage",
|
||||
"type_npc": "PNJ",
|
||||
"type_creature": "Créature",
|
||||
"stories": "Stories",
|
||||
"gear": "Gear",
|
||||
"information": "Information",
|
||||
"boost": "Boost",
|
||||
"group_abilities": "Group abilities",
|
||||
"totem_abilities": "Totem abilities",
|
||||
"type_group": "Group",
|
||||
"type_character": "Character",
|
||||
"type_npc": "NPC",
|
||||
"type_creature": "Creature",
|
||||
"type": "Type",
|
||||
"group_members": "Membres",
|
||||
"encounters": "Rencontres",
|
||||
"road": "La Route",
|
||||
"totem_picker": "Sélecteur de totem",
|
||||
"actor_picker": "Sélecteur de personnage"
|
||||
"group_members": "Members",
|
||||
"encounters": "Encounters",
|
||||
"road": "The Road",
|
||||
"totem_picker": "Totem picker",
|
||||
"actor_picker": "Actor picker"
|
||||
},
|
||||
"UI": {
|
||||
"add": "Ajouter",
|
||||
"source":"Source",
|
||||
"duration":"Durée",
|
||||
"effect_toggle":"Basculer un effet",
|
||||
"effect_edit":"Modifier un effet",
|
||||
"effect_delete":"Détruire un effet",
|
||||
"effect_create":"Créer un effet",
|
||||
"add": "Add",
|
||||
"source": "Source",
|
||||
"duration": "Duration",
|
||||
"effect_toggle": "Toggle effect",
|
||||
"effect_edit": "Edit effect",
|
||||
"effect_delete": "Delete effect",
|
||||
"effect_create": "Create effect",
|
||||
"effects": {
|
||||
"name": "Effets",
|
||||
"temporary": "Effets temporaires",
|
||||
"passive": "Effets passifs",
|
||||
"inactive": "Effets inactifs"
|
||||
"name": "Effects",
|
||||
"temporary": "Temporary effects",
|
||||
"passive": "Passive effects",
|
||||
"inactive": "Inactive effects"
|
||||
}
|
||||
},
|
||||
"ITEMS": {
|
||||
"defense": "Protection",
|
||||
"defenses": "Protections",
|
||||
"new_defense": "Nouvelle protection",
|
||||
"weapon": "Arme",
|
||||
"new_weapon": "Nouvelle arme",
|
||||
"weapons": "Armes",
|
||||
"new_background": "Nouvel historique",
|
||||
"backgrounds": "Historiques",
|
||||
"new_trauma": "Nouveau traumatisme",
|
||||
"traumas": "Traumatismes",
|
||||
"rumor": "Rumeur",
|
||||
"new_rumor": "Nouvelle rumeur",
|
||||
"rumors": "Rumeurs",
|
||||
"ability": "Capacité",
|
||||
"new_ability": "Nouvelle capacité",
|
||||
"abilities": "Capacités",
|
||||
"specialties": "Spécialités",
|
||||
"new_specialty": "Nouvelle spécialité",
|
||||
"new_defense": "New protection",
|
||||
"weapon": "Weapon",
|
||||
"new_weapon": "New weapon",
|
||||
"weapons": "Weapons",
|
||||
"new_background": "New background",
|
||||
"backgrounds": "Backgrounds",
|
||||
"new_trauma": "New trauma",
|
||||
"traumas": "Traumas",
|
||||
"rumor": "Rumor",
|
||||
"new_rumor": "New rumor",
|
||||
"rumors": "Rumors",
|
||||
"ability": "Ability",
|
||||
"new_ability": "New ability",
|
||||
"abilities": "Abilities",
|
||||
"specialties": "Specialties",
|
||||
"new_specialty": "New specialty",
|
||||
"evolution": "Adaptation",
|
||||
"new_evolution": "Nouvelle adaptation",
|
||||
"new_evolution": "New adaptation",
|
||||
"evolutions": "Adaptations",
|
||||
"new_vehicle": "Nouveau véhicule",
|
||||
"vehicles": "Véhicules",
|
||||
"new_objective": "Nouvel objectif",
|
||||
"learning": "Apprentissage",
|
||||
"cost": "Coût",
|
||||
"rituel": "Rituel",
|
||||
"transe": "Transe",
|
||||
"effects": "Effets",
|
||||
"details": "Détails"
|
||||
"new_vehicle": "New vehicle",
|
||||
"vehicles": "Vehicles",
|
||||
"new_objective": "New objective",
|
||||
"learning": "Learning",
|
||||
"cost": "Cost",
|
||||
"rituel": "Ritual",
|
||||
"transe": "Trance",
|
||||
"effects": "Effects",
|
||||
"details": "Details"
|
||||
},
|
||||
"ABILITIES": {
|
||||
"vigor": { "name": "Vigueur"},
|
||||
"health": { "name": "Santé"},
|
||||
"precision":{ "name": "Précision"},
|
||||
"reflexes":{ "name": "Réflexes"},
|
||||
"knowledge":{ "name": "Savoir"},
|
||||
"perception":{ "name": "Perception"},
|
||||
"will":{ "name": "Volonté"},
|
||||
"empathy":{ "name": "Empathie"}
|
||||
"vigor": {
|
||||
"name": "Vigor"
|
||||
},
|
||||
"health": {
|
||||
"name": "Health"
|
||||
},
|
||||
"precision": {
|
||||
"name": "Precision"
|
||||
},
|
||||
"reflexes": {
|
||||
"name": "Reflexes"
|
||||
},
|
||||
"knowledge": {
|
||||
"name": "Knowledge"
|
||||
},
|
||||
"perception": {
|
||||
"name": "Perception"
|
||||
},
|
||||
"will": {
|
||||
"name": "Will"
|
||||
},
|
||||
"empathy": {
|
||||
"name": "Empathy"
|
||||
}
|
||||
},
|
||||
"SKILL_LEVELS": {
|
||||
"beginner": "Débutant",
|
||||
"proficient": "Confirmé",
|
||||
"expert":"Expert",
|
||||
"master":"Maître",
|
||||
"legend":"Légende"
|
||||
"incompetent": "Incompetent",
|
||||
"beginner": "Beginner",
|
||||
"proficient": "Proficient",
|
||||
"expert": "Expert",
|
||||
"master": "Master",
|
||||
"legend": "Legend"
|
||||
},
|
||||
"THREAT_LEVELS": {
|
||||
"minor": "Mineure",
|
||||
"serious": "Sérieuse",
|
||||
"major":"Majeure",
|
||||
"deadly":"Mortelle"
|
||||
"minor": "Minor",
|
||||
"serious": "Serious",
|
||||
"major": "Major",
|
||||
"deadly": "Deadly"
|
||||
},
|
||||
"ROLE_LEVELS": {
|
||||
"minor": "Mineur",
|
||||
"secondary": "Secondaire",
|
||||
"important":"Important",
|
||||
"major":"Majeur"
|
||||
"minor": "Minor",
|
||||
"secondary": "Secondary",
|
||||
"important": "Important",
|
||||
"major": "Major"
|
||||
},
|
||||
"PATTERN_LEVELS": {
|
||||
"insect": "Insecte",
|
||||
"insect": "Insect",
|
||||
"rat": "Rat",
|
||||
"dog":"Chien",
|
||||
"bear":"Ours"
|
||||
"dog": "Dog",
|
||||
"bear": "Bear"
|
||||
},
|
||||
"TOTEMS": {
|
||||
"human": {
|
||||
"name": "L'Humain",
|
||||
"number":1,
|
||||
"description":"",
|
||||
"instincts" : "",
|
||||
"bans" : "",
|
||||
"name": "Human",
|
||||
"number": 1,
|
||||
"description": "",
|
||||
"instincts": "",
|
||||
"bans": "",
|
||||
"opposite": "adapted"
|
||||
},
|
||||
"predator": {
|
||||
"name": "Le prédateur",
|
||||
"number":2,
|
||||
"description":"Totem emblématique, le Prédateur a toujours été l’un des plus répandus dans le règne animal, et il reste de loin celui qui influence le plus grand nombre d’espèces aujourd’hui. On l’observe aussi bien chez les mammifères que chez de minuscules insectes, en meute comme en solitaire. Il inspire les comportements de traque, de chasse et d’affrontement essentiels à l’alimentation, mais il ne prône qu’une violence justifiée, nécessaire et vitale. Selon les peuples et les cultures, il a longtemps été symbolisé par le lion, l’aigle ou le chasseur, et ses valeurs guerrières ont toujours revêtu une certaine forme de noblesse. Un prédateur ne tue pas : il triomphe. Un prédateur ne fuit pas : il perd, ou il meurt",
|
||||
"instincts" : "Triompher, relever un défi, prendre l’initiative, atteindre un objectif.",
|
||||
"bans" : "Fuir, abandonner, renoncer,faire preuve de lâcheté.",
|
||||
"behaviour" : "Déterminé, implacable,courageux, dominant.",
|
||||
"name": "Predator",
|
||||
"number": 2,
|
||||
"description": "Totem emblematic, the Predator has always been one of the most widespread in the animal kingdom, and it remains by far the one that influences the greatest number of species today. It is observed as well in mammals as in tiny insects, in packs as in solitaries. It inspires hunting, chasing and fighting behaviors essential to feeding, but it only preaches a justified, necessary and vital violence. Depending on peoples and cultures, it has long been symbolized by the lion, the eagle or the hunter, and its warrior values have always taken a certain form of nobility. A predator does not kill: it triumphs. A predator does not flee: it loses, or it dies",
|
||||
"instincts": "Triumph, overcome a challenge, take the initiative, achieve a goal.",
|
||||
"bans": "Flee, abandon, renounce, show cowardice.",
|
||||
"behaviour": "Determined, implacable,courageous, dominant.",
|
||||
"opposite": "scavenger"
|
||||
},
|
||||
"scavenger": {
|
||||
"name": "Le Charognard",
|
||||
"number":3,
|
||||
"description":"Dans un écosystème dominé par la loi du plus fort, certains ont pris le parti d’attendre que la mort fasse son œuvre, quitte à se contenter des restes. Poissons de fond, plantes carnivores, pillards, insectes nécrophages, vautours ou meutes de loups trop faibles pour s’attaquer seuls aux proies de grande taille : le Charognard inspire toutes les espèces qui ont fait de la patience une de leurs rares vertus, et misent sur la faiblesse, la blessure, la fatigue ou l’opportunité pour se nourrir. Il règne sur les régions hostiles où le soleil, la chaleur ou le froid font son jeu, et se développe souvent dans l’ombre du Prédateur, avec qui il entretient une relation quasi symbiotique",
|
||||
"instincts" : "Achever, saboter, affaiblir, s’en prendre au plus faible.",
|
||||
"bans" : "Affronter, s’exposer, agir de façon compulsive, s’apitoyer.",
|
||||
"behaviour" : "Sournois, calculateur, impitoyable",
|
||||
"name": "Scavenger",
|
||||
"number": 3,
|
||||
"description": "In an ecosystem dominated by the law of the strongest, some have taken the party to wait for death to do its work, even if it means settling for the remains. Fish from the bottom, carnivorous plants, scavengers, necrophagous insects, vultures or packs of wolves too weak to attack the prey alone: the Scavenger inspires all the species that have made patience one of their rare virtues, and bet on weakness, injury, fatigue or opportunity to feed. It reigns over hostile regions where the sun, the heat or the cold make its game, and often develops in the shadow of the Predator, with which it maintains a quasi symbiotic relationship",
|
||||
"instincts": "Finish, sabotage, weaken, attack the weakest.",
|
||||
"bans": "Face, expose, act compulsively, pity.",
|
||||
"behaviour": "Sly, calculating, pitiless",
|
||||
"opposite": "predator"
|
||||
},
|
||||
"symbiote": {
|
||||
"name": "Le Symbiote",
|
||||
"number":4,
|
||||
"description":"Symbole d’entraide, d’équilibre et d’harmonie, le Symbiote se définit par la relation d’échange et de réciprocité où chaque partie profite de ce que l’autre apporte, quels que soient ses besoins ou ses motivations. Très courante dans le règne végétal, où de nombreuses fleurs et plantes l’ont instaurée avec les pollinisateurs, cette relation de symbiose s’observe également chez les insectes, les mammifères et les êtres humains. Elle peut être ponctuelle, issue des liens du sang, liée à un territoire ou un projet commun, et rien ne l’empêche d’être motivée par le profit ou l’intérêt, tant qu’elle est réciproque – ce qui distingue le Symbiote du Parasite.",
|
||||
"instincts" : "Partager, transmettre, équilibrer, trouver un compromis",
|
||||
"bans" : "Exploiter, abuser, profiter de la faiblesse, mettre en danger",
|
||||
"behaviour" : "Bienveillant, responsable, diplomate, modéré.",
|
||||
"name": "Symbiote",
|
||||
"number": 4,
|
||||
"description": "Symbol of mutual aid, balance and harmony, the Symbiote is defined by the relationship of exchange and reciprocity where each party benefits from what the other brings, whatever its needs or motivations. Very common in the plant kingdom, where many flowers and plants have established it with pollinators, this symbiotic relationship is also observed in insects, mammals and human beings. It can be punctual, stemming from blood ties, linked to a territory or a common project, and nothing prevents it from being motivated by profit or interest, as long as it is reciprocal – which distinguishes the Symbiote from the Parasite.",
|
||||
"instincts": "Share, transmit, balance, find a compromise",
|
||||
"bans": "Exploit, abuse, profit from weakness, put in danger",
|
||||
"behaviour": "Well-intentioned, responsible, diplomatic, moderate.",
|
||||
"opposite": "parasite"
|
||||
},
|
||||
"parasite": {
|
||||
"name": "Le Parasite",
|
||||
"number":5,
|
||||
"description":"Totem des infections, des basses œuvres et des épidémies, le Parasite a toujours joué un rôle funeste dans le destin de l’humanité, jusqu’à en devenir le fléau. Symbolisé par les moustiques, il s’observe également chez de nombreux champignons, végétaux et insectes incapables de survivre, de se nourrir ou de se reproduire sans un hôte, et toujours à ses dépens. Le Parasite exploite, profite, abuse sans états d’âme, mu par la seule démarche de prendre ce qu’un autre possède et dont il a besoin. Avec le Prédateur, c’est l’un des Totems les plus présents et les plus redoutés, tant les comportements qu’il inspire peuvent ruiner tout espoir de survie.",
|
||||
"instincts" : "Profiter, manipuler, voler, exploiter.",
|
||||
"bans" : "Partager, contribuer, tenir une promesse, prendre par la force",
|
||||
"behaviour" : "Manipulateur, menteur, égoïste, profiteur",
|
||||
"name": "The Parasite",
|
||||
"number": 5,
|
||||
"description": "Totem of infections, low works and epidemics, the Parasite has always played a sinister role in the destiny of humanity, until becoming its scourge. Symbolized by mosquitoes, it is also observed in many fungi, plants and insects unable to survive, feed or reproduce without a host, and always at its expense. The Parasite exploits, profits, abuses without remorse, driven by the sole approach of taking what another possesses and needs. Along with the Predator, it is one of the most present and most feared Totems, as the behaviors it inspires can ruin all hope of survival.",
|
||||
"instincts": "Profit, manipulate, steal, exploit.",
|
||||
"bans": "Share, contribute, keep a promise, take by force",
|
||||
"behaviour": "Manipulator, liar, selfish, profiteer",
|
||||
"opposite": "symbiote"
|
||||
},
|
||||
"builder": {
|
||||
"name": "Le Bâtisseur",
|
||||
"number":6,
|
||||
"description":"Souvent confondu avec la Ruche en raison des constructions géantes typiques de certaines espèces sociales, le Bâtisseur n’est pas le Totem de la communauté, mais celui de la fondation. À l’image des termites, des castors, de la plupart des oiseaux ou de certaines espèces d’araignées, il se caractérise par l’acte de construction, de création ou de modification, et s’observe aussi bien chez des groupes que chez des individus. Avec la Ruche, le Symbiote et la Horde, c’est l’un des Totems les plus courants chez les communautés humaines, dont il inspire les édifices, les inventions et les réparations.",
|
||||
"instincts" : "Fonder, créer, s’installer durablement, nouer des liens.",
|
||||
"bans" : "Détruire, saboter, quitter une communauté, provoquer le chaos",
|
||||
"behaviour" : "Réfléchi, organisé, pragmatique, constant.",
|
||||
"name": "The Builder",
|
||||
"number": 6,
|
||||
"description": "Often confused with the Hive due to the giant constructions typical of certain social species, the Builder is not the Totem of the community, but that of the foundation. In the image of termites, beavers, most birds or certain species of spiders, it is characterized by the act of construction, creation or modification, and is observed as well in groups as in individuals. Along with the Hive, the Symbiote and the Horde, it is one of the most common Totems among human communities, which it inspires with buildings, inventions and repairs.",
|
||||
"instincts": "Found, create, settle permanently, forge links.",
|
||||
"bans": "Destroy, sabotage, leave a community, provoke chaos",
|
||||
"behaviour": "Reflective, organized, pragmatic, constant.",
|
||||
"opposite": "horde"
|
||||
},
|
||||
"horde": {
|
||||
"name": "La Horde",
|
||||
"number":7,
|
||||
"description":"Fléau des cultures depuis la nuit des temps, la Horde est à l’image des nuées de criquets, des meutes de carnivores ou des tribus de nomades qui la représentent : imprévisible, impitoyable et sans visage. Au-delà de ses aspects collectifs, ce Totem redoutable se caractérise surtout par sa violence et sa méthode d’action. Là où le Prédateur tue, la Horde brûle, pille, dévaste pour parvenir à ses fins sans le moindre état d’âme. Elle inspire ceux qui prennent par la force, qui détruisent, qui ravagent et qui refusent toute forme de compromis, quelles que soient leur démarche ou leurs motivations.",
|
||||
"instincts" : "Piller, détruire, prendre par la force, miser sur le nombre",
|
||||
"bans" : "Négocier, épargner, faire des réserves, planifier à long terme.",
|
||||
"behaviour" : "Violent, imprévisible, destructeur, radical.",
|
||||
"name": "The Horde",
|
||||
"number": 7,
|
||||
"description": "Scourge of cultures since time immemorial, the Horde is in the image of swarms of locusts, packs of carnivores or nomadic tribes that represent it: unpredictable, pitiless and faceless. Beyond its collective aspects, this formidable Totem is characterized above all by its violence and method of action. Where the Predator kills, the Horde burns, plunders, devastates to achieve its ends without the slightest remorse. It inspires those who take by force, who destroy, who ravage and who refuse any form of compromise, whatever their approach or motivations.",
|
||||
"instincts": "Pillage, destroy, take by force, rely on numbers",
|
||||
"bans": "Negotiate, spare, make reserves, plan in the long term.",
|
||||
"behaviour": "Violent, unpredictable, destructive, radical.",
|
||||
"opposite": "builder"
|
||||
},
|
||||
"hive": {
|
||||
"name": "La Ruche",
|
||||
"number":8,
|
||||
"description":"Fourmis, abeilles, termites, factions aux règles strictes : la Ruche est le Totem des créatures sociales et des communautés humaines par excellence. Des cellules familiales aux multinationales, des meutes organisées aux super-colonies de plusieurs milliards d’individus, la Ruche est caractérisée par l’organisation, la hiérarchie, le dévouement et la conscience aigüe du rôle que chacun doit jouer dans l’intérêt commun, plus que par la notion de communauté elle-même. Elle s’appuie bien souvent sur un ensemble de règles, des tâches attribuées, des rôles identifiés – une philosophie qui proscrit tout individualisme et condamne toute désobéissance.",
|
||||
"instincts" : "Organiser, œuvrer pour la communauté, respecter la hiérarchie, privilégier l’intérêt collectif",
|
||||
"bans" : "trahir, désobéir, mettre sa communauté en danger, faire preuve d’individualisme.",
|
||||
"behaviour" : "Méthodique, autoritaire, consciencieux, rigide",
|
||||
"name": "The Hive",
|
||||
"number": 8,
|
||||
"description": "Ants, bees, termites, factions with strict rules: the Hive is the Totem of social creatures and human communities par excellence. From family cells to multinationals, from organized packs to super-colonies of several billion individuals, the Hive is characterized by organization, hierarchy, dedication and a keen awareness of the role that each must play in the common interest, more than by the notion of community itself. It often relies on a set of rules, assigned tasks, identified roles - a philosophy that proscribes individualism and condemns disobedience.",
|
||||
"instincts": "Organize, work for the community, respect the hierarchy, prioritize the collective interest",
|
||||
"bans": "Betray, disobey, put one's community in danger, show individualism.",
|
||||
"behaviour": "Methodical, authoritarian, conscientious, rigid",
|
||||
"opposite": "loner"
|
||||
},
|
||||
"loner": {
|
||||
"name": "Le solitaire",
|
||||
"number":9,
|
||||
"description":"Survivre, quoi qu’il en coûte. Sans cruauté, sans états d’âme, mais à tout prix. À l’inverse de la Ruche qui loue le sacrifice s’il est accompli dans l’intérêt du groupe, le Solitaire incarne le plus fondamental des réflexes : celui de la survie. Ni individualiste, ni franchement égoïste, il fait seulement passer ses propres intérêts, ses urgences et ses nécessités avant tout, quitte à trahir, à décevoir, à quitter ou à tuer. Rien n’empêche un Solitaire de trouver une place durable dans un groupe, d’y jouer un rôle précis ou même de suivre des règles établies, tant qu’elles ne heurtent pas ses propres convictions et qu’elles ne mettent pas en péril son bien le plus précieux : sa vie.",
|
||||
"instincts" : "Survivre, anticiper, s’adapter, faire passer sa vie avant tout",
|
||||
"bans" : "Se sacrifier, risquer sa vie, dépendre de quelqu’un, se résigner.",
|
||||
"behaviour" : "Indépendant, lucide, autonome, réactif.",
|
||||
"name": "The Loner",
|
||||
"number": 9,
|
||||
"description": "Survive, whatever the cost. Without cruelty, without remorse, but at all costs. Unlike the Hive, which praises sacrifice if it is accomplished in the interest of the group, the Loner embodies the most fundamental of reflexes: that of survival. Neither individualistic nor frankly selfish, it simply puts its own interests, urgencies and necessities first, even if it means betraying, disappointing, leaving or killing. Nothing prevents a Loner from finding a lasting place in a group, playing a precise role or even following established rules, as long as they do not conflict with its own convictions and do not put its most precious asset in danger: its life.",
|
||||
"instincts": "Survive, anticipate, adapt, put one's life first",
|
||||
"bans": "Sacrifice oneself, risk one's life, depend on someone, resign.",
|
||||
"behaviour": "Independent, lucid, autonomous, reactive.",
|
||||
"opposite": "hive"
|
||||
},
|
||||
"adapted": {
|
||||
"name": "L'adapté",
|
||||
"number":10,
|
||||
"description":"Évoluer ou mourir. Changer ou disparaître. L’Adapté est le Totem de la nécessité, de la survie et de l’évolution. Ni positif, ni négatif, il est présent partout. Il est cette dynamique, ce principe fondamental qui rythme les mutations des espèces et qui rappelle que l’Homme est la seule forme de vie à tenter de contrôler sa propre évolution. L’Adapté ne possède ni Interdit, ni Instinct spécifique. Aucun comportement n’est inapproprié, s’il permet de faire face et de survivre, et les Instincts de tous les autres Totems le renforcent. Seul l’Humain lutte contre son influence…",
|
||||
"instincts" : "Tous ceux des huit Totems majeurs",
|
||||
"bans" : "Aucun…",
|
||||
"name": "The Adapted",
|
||||
"number": 10,
|
||||
"description": "Evolve or die. Change or disappear. The Adapted is the Totem of necessity, survival and evolution. Neither positive nor negative, it is present everywhere. It is this dynamic, this fundamental principle that rhythm the mutations of species and reminds us that Man is the only form of life trying to control its own evolution. The Adapted has no Forbidden, no Specific Instinct. No behavior is inappropriate, if it allows to cope and survive, and the Instincts of all other Totems reinforce it. Only Man fights against its influence...",
|
||||
"instincts": "All those of the eight major Totems",
|
||||
"bans": "None...",
|
||||
"opposite": "human"
|
||||
}
|
||||
},
|
||||
"ABILITY_CATEGORIES": {
|
||||
"physical": { "name": "Physique"},
|
||||
"manual": { "name": "Manuel"},
|
||||
"mental": { "name": "Mental"},
|
||||
"social": { "name": "Social"}
|
||||
"physical": {
|
||||
"name": "Physical"
|
||||
},
|
||||
"manual": {
|
||||
"name": "Manual"
|
||||
},
|
||||
"mental": {
|
||||
"name": "Mental"
|
||||
},
|
||||
"social": {
|
||||
"name": "Social"
|
||||
}
|
||||
},
|
||||
"SKILLS_CATEGORIES": {
|
||||
"man": { "name": "L'Homme" },
|
||||
"animal": { "name": "L'Animal" },
|
||||
"tool": { "name": "L'Outil" },
|
||||
"weapon": { "name": "L'Arme" },
|
||||
"survival": { "name": "La Survie" },
|
||||
"world": { "name": "La Terre" }
|
||||
"man": {
|
||||
"name": "Man"
|
||||
},
|
||||
"animal": {
|
||||
"name": "Animal"
|
||||
},
|
||||
"tool": {
|
||||
"name": "Tool"
|
||||
},
|
||||
"weapon": {
|
||||
"name": "Weapon"
|
||||
},
|
||||
"survival": {
|
||||
"name": "Survival"
|
||||
},
|
||||
"world": {
|
||||
"name": "World"
|
||||
}
|
||||
},
|
||||
"SKILLS": {
|
||||
"arts": { "name": "Arts"},
|
||||
"civilization": { "name": "Civilisations"},
|
||||
"psychology": { "name": "Psychologie"},
|
||||
"rumors": { "name": "Rumeurs"},
|
||||
"healing": { "name": "Soins"},
|
||||
"animalism": { "name": "Animalisme"},
|
||||
"dissection": { "name": "Dissection"},
|
||||
"wildlife": { "name": "Faune"},
|
||||
"repulsion": { "name": "Répulsion"},
|
||||
"tracks": { "name": "Traces"},
|
||||
"crafting": { "name": "Artisanat"},
|
||||
"diy": { "name": "Bricolage"},
|
||||
"mecanical": { "name": "Mécanique"},
|
||||
"piloting": { "name": "Pilotage"},
|
||||
"technology": { "name": "Technologie"},
|
||||
"firearms": { "name": "Armes à feu"},
|
||||
"armory": { "name": "Armurerie"},
|
||||
"shield": { "name": "Bouclier"},
|
||||
"close": { "name": "Corps-à-corps"},
|
||||
"archery": { "name": "Armes de tir"},
|
||||
"throwing": { "name": "Lancer"},
|
||||
"melee": { "name": "Mêlée"},
|
||||
"atletics": { "name": "Atlétisme"},
|
||||
"stealth": { "name": "Discrétion"},
|
||||
"alertness": { "name": "Vigilance"},
|
||||
"flora": { "name": "Flore"},
|
||||
"food": { "name": "Alimentation"},
|
||||
"environment": { "name": "Environnement"},
|
||||
"road": { "name": "Route"},
|
||||
"toxics": { "name": "Toxiques"},
|
||||
"ruins": { "name": "Vestiges"}
|
||||
"arts": {
|
||||
"name": "Arts"
|
||||
},
|
||||
"civilization": {
|
||||
"name": "Civilizations"
|
||||
},
|
||||
"psychology": {
|
||||
"name": "Psychology"
|
||||
},
|
||||
"rumors": {
|
||||
"name": "Rumors"
|
||||
},
|
||||
"healing": {
|
||||
"name": "Healing"
|
||||
},
|
||||
"animalism": {
|
||||
"name": "Animalism"
|
||||
},
|
||||
"dissection": {
|
||||
"name": "Dissection"
|
||||
},
|
||||
"wildlife": {
|
||||
"name": "Wildlife"
|
||||
},
|
||||
"repulsion": {
|
||||
"name": "Repulsion"
|
||||
},
|
||||
"tracks": {
|
||||
"name": "Tracks"
|
||||
},
|
||||
"crafting": {
|
||||
"name": "Crafting"
|
||||
},
|
||||
"diy": {
|
||||
"name": "DIY"
|
||||
},
|
||||
"mecanical": {
|
||||
"name": "Mechanical"
|
||||
},
|
||||
"piloting": {
|
||||
"name": "Piloting"
|
||||
},
|
||||
"technology": {
|
||||
"name": "Technology"
|
||||
},
|
||||
"firearms": {
|
||||
"name": "Firearms"
|
||||
},
|
||||
"armory": {
|
||||
"name": "Armory"
|
||||
},
|
||||
"shield": {
|
||||
"name": "Shield"
|
||||
},
|
||||
"close": {
|
||||
"name": "Melee"
|
||||
},
|
||||
"archery": {
|
||||
"name": "Ranged"
|
||||
},
|
||||
"throwing": {
|
||||
"name": "Throwing"
|
||||
},
|
||||
"melee": {
|
||||
"name": "Melee"
|
||||
},
|
||||
"atletics": {
|
||||
"name": "Athletics"
|
||||
},
|
||||
"stealth": {
|
||||
"name": "Stealth"
|
||||
},
|
||||
"alertness": {
|
||||
"name": "Alertness"
|
||||
},
|
||||
"flora": {
|
||||
"name": "Flora"
|
||||
},
|
||||
"food": {
|
||||
"name": "Food"
|
||||
},
|
||||
"environment": {
|
||||
"name": "Environment"
|
||||
},
|
||||
"road": {
|
||||
"name": "Road"
|
||||
},
|
||||
"toxics": {
|
||||
"name": "Toxics"
|
||||
},
|
||||
"ruins": {
|
||||
"name": "Ruins"
|
||||
}
|
||||
},
|
||||
"SEXES": {
|
||||
"male": "Masculin",
|
||||
"female":"Féminin"
|
||||
"male": "Masculine",
|
||||
"female": "Feminine"
|
||||
}
|
||||
}
|
||||
+514
@@ -0,0 +1,514 @@
|
||||
{
|
||||
"SETTINGS": {
|
||||
"world": {
|
||||
"game_mode": {
|
||||
"name": "Choix du mode de jeu",
|
||||
"hint": "À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers."
|
||||
},
|
||||
"first_run": {
|
||||
"name": "Affichage du tour d'accueil",
|
||||
"hint": "Pour aider les débutantEs à bien commencer avec le système Vermine 2047."
|
||||
}
|
||||
}
|
||||
},
|
||||
"VERMINE.WorldSettings.GameMode.Name": "Choix du mode de jeu",
|
||||
"VERMINE.WorldSettings.GameMode.Hint": "À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers.",
|
||||
"GAME_MODES": {
|
||||
"heroic": {
|
||||
"name": "Héroique"
|
||||
},
|
||||
"epic": {
|
||||
"name": "Epique"
|
||||
},
|
||||
"legendary": {
|
||||
"name": "Légendaire"
|
||||
}
|
||||
},
|
||||
"ROLLS": {
|
||||
"tool": "Lanceur de dés",
|
||||
"roll_dice": "Jeter les dés"
|
||||
},
|
||||
"TOURS": {
|
||||
"ChatMessage": "<h3>Bienvenue dans Vermine!</h3><p>Si vous utilisez ce système pour la première fois, notre shaman va vous guider vers votre rite d'initiation</p> <button id=\"vermine-tour-chat-button\"> <i class=\"fas fa-person-hiking\"></i> J'y vais mais j'ai peur </button>",
|
||||
"Welcome": {
|
||||
"Title": "Bienvenue dans Vermine",
|
||||
"Description": "Aperçu du système Vermine",
|
||||
"WelcomeTitle": "Bienvenue",
|
||||
"WelcomeContent": "<p>Bienvenue dans Vermine, survivantE ! Faire le tour de notre zone d'action te permettre de retrouver tes marques, même si c'est ton premier jour parmi nous.</p><p>En haut de la colonne de droite, tu as tout ce que tu as le droit de faire chez nous : parler, voir les autres tronches de ta commu, gérer ton matos et celui de tes potes, étudier les cartes, lire les journaux des clamsés, aller nous chercher de la bouffe à coups de surin. Entrons dans le vif du sujet.</p>",
|
||||
"ActorTabTitle": "Peupler son univers",
|
||||
"ActorTabContent": "<p>Bien installéE, survivantE ? Tournons pas au tour du pot, si tu veux rester avec nous, va falloir nous dire qui tu es, d'où tu viens, et à qui tu fais confiance. Une fois que t'es prêtE pour ca, clique donc sur le bouton \"Créer un acteur\"</p>",
|
||||
"CharacterCreateTitle": "Créer un groupe",
|
||||
"CharacterCreateContent": "<p>Ce bouton crée une fiche de groupe, parce que c'est par là qu'on commence, dans ce trou ! Ta tronche viendra ensuite, quand tu créeras ta fiche de personnage. Au fur et à mesure que tu progresses, tu voudras peut-être rajouter des infos sur ce que tu vois trainer autour du camp.</p>",
|
||||
"CompendiumTitle": "Cartes",
|
||||
"CompendiumContent": "<p>Vous aurez probablement besoin d'une carte des Terres de Fer ou d'un secteur de la Forge. Vous pouvez créer votre propre scène pour cela, ou vous pouvez utiliser l'une des nôtres. Ouvrez l'un de ces compendiums et faites glisser une carte dans votre zone de scènes (l'onglet qui ressemble à une carte pliée).</p>",
|
||||
"OracleToolTitle": "Totem",
|
||||
"OracleToolContent": "<p>Aucune partie d'Vermine ou Starforged ne serait complète sans oracles. Ce bouton fera apparaître une fenêtre avec tous les oracles du jeu choisi. Les oracles sont également disponibles depuis la fiche de personnage.</p>",
|
||||
"ToursTitle": "Prochaines étapes",
|
||||
"ToursContent": "<p>Tu t'en sors pas si mal ! Moi je vais te laisser là, mais si tu as d'autres questions, tu peux venir me trouver. Si ca concerne la mécanique, inscris-toi dans notre groupe de parole, par là <a href=\"https://discord.gg/FqGHYvXg\">Totem Foundry Discord</a>. Sinon, tu peux rejoindre la place centrale par ici <a href=\"https://discord.gg/qejqmSxr\">Vermine Discord</a></p><p>Enjoy!</p>"
|
||||
}
|
||||
},
|
||||
"DIFFICULTY_LEVELS": {
|
||||
"obvious": "Evidente",
|
||||
"easy": "Facile",
|
||||
"hard": "Difficile",
|
||||
"very_hard": "Très difficile",
|
||||
"impossible": "Impossible"
|
||||
},
|
||||
"ATTITUDES": {
|
||||
"offensive": {
|
||||
"name": "Offensif"
|
||||
},
|
||||
"active": {
|
||||
"name": "Actif"
|
||||
},
|
||||
"passive": {
|
||||
"name": "Passif"
|
||||
}
|
||||
},
|
||||
"AGE_TYPES": {
|
||||
"young": "Jeune",
|
||||
"adult": "Adulte",
|
||||
"old": "Vieux"
|
||||
},
|
||||
"IDENTITY": {
|
||||
"name": "Nom",
|
||||
"height": "Taille",
|
||||
"weight": "Poids",
|
||||
"totem": "Totem",
|
||||
"age": "Age",
|
||||
"gender": "Sexe",
|
||||
"profile": "Profil",
|
||||
"origin": "Origine",
|
||||
"theme": "Concept",
|
||||
"instincts": "Instincts",
|
||||
"prohibits": "Interdits",
|
||||
"objectives": "Objectifs",
|
||||
"relations": "Relations",
|
||||
"morale": "Moral",
|
||||
"morale_level": "Niveau de moral",
|
||||
"notes": "Notes"
|
||||
},
|
||||
"ADVERSITY": {
|
||||
"threat": "Menace",
|
||||
"experience": "Expérience",
|
||||
"role": "Rôle",
|
||||
"attack": "Attaque",
|
||||
"damage": "Dommages",
|
||||
"weapon": "Arme",
|
||||
"vigor": "Vigueur",
|
||||
"wounds": "Blessures",
|
||||
"action": "Action",
|
||||
"specialties": "Spécialité",
|
||||
"rerolls": "Relances",
|
||||
"contact": "Contact",
|
||||
"reaction": "Réaction",
|
||||
"pools": "Réserves",
|
||||
"gear": "Matériel",
|
||||
"protection": "Protection",
|
||||
"skills": "Compétences",
|
||||
"pattern": "Gabarit",
|
||||
"size": "Taille",
|
||||
"pack": "Groupe"
|
||||
},
|
||||
"VERMINE": {
|
||||
"name": "Vermine",
|
||||
"stats": "Statistiques",
|
||||
"level": "Niveau",
|
||||
"experience": "Expérience",
|
||||
"reputation": "Réputation",
|
||||
"pool": "Réserve",
|
||||
"pools": "Réserves",
|
||||
"self_control": "Sang-Froid",
|
||||
"effort": "Effort",
|
||||
"group": "Groupe",
|
||||
"abilities": "Caractéristiques",
|
||||
"ability": "Caractéristique",
|
||||
"skills_title": "Compétences",
|
||||
"skill_title": "Compétence",
|
||||
"skill_mastery": "Maîtrise",
|
||||
"bonus": "Bonus",
|
||||
"penalty": "Malus",
|
||||
"reroll": "Relance",
|
||||
"equipment": "Equipement",
|
||||
"specialty": "Spécialité",
|
||||
"technique": "Technique",
|
||||
"techniques": "Techniques",
|
||||
"difficulty": "Difficulté",
|
||||
"help": "Entraide",
|
||||
"tooling": "Equipement",
|
||||
"quantity": "Quantité",
|
||||
"qty": "Qté",
|
||||
"weight": "Poids",
|
||||
"dmg": "Dmg",
|
||||
"damage": "Dommage",
|
||||
"damages": "Dommages",
|
||||
"range": "Portée",
|
||||
"ranges": "Portées",
|
||||
"mobility": "Mobilité",
|
||||
"rarity": "Rareté",
|
||||
"rarity_sm": "Rar.",
|
||||
"reliability": "Fiabilité",
|
||||
"reliability_sm": "Fiab.",
|
||||
"wounds": {
|
||||
"name": "Blessures",
|
||||
"threshold": "Seuil",
|
||||
"light": "Légère",
|
||||
"heavy": "Grave",
|
||||
"deadly": "Mortelle",
|
||||
"light_wounds": "Blessure légère",
|
||||
"heavy_wounds": "Blessure grave",
|
||||
"deadly_wounds": "Blessure mortelle"
|
||||
},
|
||||
"tabs": {
|
||||
"abilities": "Caractéristiques et compétences",
|
||||
"totem": "Totem et ajustements",
|
||||
"combat": "Combat et reserves",
|
||||
"equipment": "Matériel",
|
||||
"stories": "Histoire"
|
||||
},
|
||||
"ammo": "Munitions",
|
||||
"ammo_sm": "Mun",
|
||||
"trait": "Trait",
|
||||
"traits": "Traits",
|
||||
"clew": "Indice",
|
||||
"combat": "Combat",
|
||||
"stories": "Histoires",
|
||||
"gear": "Matériel",
|
||||
"information": "Informations",
|
||||
"boost": "boost",
|
||||
"group_abilities": "Capacités de groupe",
|
||||
"totem_abilities": "Capacités de totem",
|
||||
"type_group": "Groupe",
|
||||
"type_character": "Personnage",
|
||||
"type_npc": "PNJ",
|
||||
"type_creature": "Créature",
|
||||
"type": "Type",
|
||||
"group_members": "Membres",
|
||||
"encounters": "Rencontres",
|
||||
"road": "La Route",
|
||||
"totem_picker": "Sélecteur de totem",
|
||||
"actor_picker": "Sélecteur de personnage"
|
||||
},
|
||||
"UI": {
|
||||
"add": "Ajouter",
|
||||
"source": "Source",
|
||||
"duration": "Durée",
|
||||
"effect_toggle": "Basculer un effet",
|
||||
"effect_edit": "Modifier un effet",
|
||||
"effect_delete": "Détruire un effet",
|
||||
"effect_create": "Créer un effet",
|
||||
"effects": {
|
||||
"name": "Effets",
|
||||
"temporary": "Effets temporaires",
|
||||
"passive": "Effets passifs",
|
||||
"inactive": "Effets inactifs"
|
||||
}
|
||||
},
|
||||
"ITEMS": {
|
||||
"defense": "Protection",
|
||||
"defenses": "Protections",
|
||||
"new_defense": "Nouvelle protection",
|
||||
"weapon": "Arme",
|
||||
"new_weapon": "Nouvelle arme",
|
||||
"weapons": "Armes",
|
||||
"new_background": "Nouvel historique",
|
||||
"backgrounds": "Historiques",
|
||||
"new_trauma": "Nouveau traumatisme",
|
||||
"traumas": "Traumatismes",
|
||||
"rumor": "Rumeur",
|
||||
"new_rumor": "Nouvelle rumeur",
|
||||
"rumors": "Rumeurs",
|
||||
"ability": "Capacité",
|
||||
"new_ability": "Nouvelle capacité",
|
||||
"abilities": "Capacités",
|
||||
"specialties": "Spécialités",
|
||||
"new_specialty": "Nouvelle spécialité",
|
||||
"evolution": "Adaptation",
|
||||
"new_evolution": "Nouvelle adaptation",
|
||||
"evolutions": "Adaptations",
|
||||
"new_vehicle": "Nouveau véhicule",
|
||||
"vehicles": "Véhicules",
|
||||
"new_objective": "Nouvel objectif",
|
||||
"learning": "Apprentissage",
|
||||
"cost": "Coût",
|
||||
"rituel": "Rituel",
|
||||
"transe": "Transe",
|
||||
"effects": "Effets",
|
||||
"details": "Détails"
|
||||
},
|
||||
"ABILITIES": {
|
||||
"vigor": {
|
||||
"name": "Vigueur"
|
||||
},
|
||||
"health": {
|
||||
"name": "Santé"
|
||||
},
|
||||
"precision": {
|
||||
"name": "Précision"
|
||||
},
|
||||
"reflexes": {
|
||||
"name": "Réflexes"
|
||||
},
|
||||
"knowledge": {
|
||||
"name": "Savoir"
|
||||
},
|
||||
"perception": {
|
||||
"name": "Perception"
|
||||
},
|
||||
"will": {
|
||||
"name": "Volonté"
|
||||
},
|
||||
"empathy": {
|
||||
"name": "Empathie"
|
||||
}
|
||||
},
|
||||
"SKILL_LEVELS": {
|
||||
"incompetent": "Incompétent",
|
||||
"beginner": "Débutant",
|
||||
"proficient": "Confirmé",
|
||||
"expert": "Expert",
|
||||
"master": "Maître",
|
||||
"legend": "Légende"
|
||||
},
|
||||
"THREAT_LEVELS": {
|
||||
"minor": "Mineure",
|
||||
"serious": "Sérieuse",
|
||||
"major": "Majeure",
|
||||
"deadly": "Mortelle"
|
||||
},
|
||||
"ROLE_LEVELS": {
|
||||
"minor": "Mineur",
|
||||
"secondary": "Secondaire",
|
||||
"important": "Important",
|
||||
"major": "Majeur"
|
||||
},
|
||||
"PATTERN_LEVELS": {
|
||||
"insect": "Insecte",
|
||||
"rat": "Rat",
|
||||
"dog": "Chien",
|
||||
"bear": "Ours"
|
||||
},
|
||||
"TOTEMS": {
|
||||
"human": {
|
||||
"name": "L'Humain",
|
||||
"number": 1,
|
||||
"description": "",
|
||||
"instincts": "",
|
||||
"bans": "",
|
||||
"opposite": "adapted"
|
||||
},
|
||||
"predator": {
|
||||
"name": "Le prédateur",
|
||||
"number": 2,
|
||||
"description": "Totem emblématique, le Prédateur a toujours été l’un des plus répandus dans le règne animal, et il reste de loin celui qui influence le plus grand nombre d’espèces aujourd’hui. On l’observe aussi bien chez les mammifères que chez de minuscules insectes, en meute comme en solitaire. Il inspire les comportements de traque, de chasse et d’affrontement essentiels à l’alimentation, mais il ne prône qu’une violence justifiée, nécessaire et vitale. Selon les peuples et les cultures, il a longtemps été symbolisé par le lion, l’aigle ou le chasseur, et ses valeurs guerrières ont toujours revêtu une certaine forme de noblesse. Un prédateur ne tue pas : il triomphe. Un prédateur ne fuit pas : il perd, ou il meurt",
|
||||
"instincts": "Triompher, relever un défi, prendre l’initiative, atteindre un objectif.",
|
||||
"bans": "Fuir, abandonner, renoncer,faire preuve de lâcheté.",
|
||||
"behaviour": "Déterminé, implacable,courageux, dominant.",
|
||||
"opposite": "scavenger"
|
||||
},
|
||||
"scavenger": {
|
||||
"name": "Le Charognard",
|
||||
"number": 3,
|
||||
"description": "Dans un écosystème dominé par la loi du plus fort, certains ont pris le parti d’attendre que la mort fasse son œuvre, quitte à se contenter des restes. Poissons de fond, plantes carnivores, pillards, insectes nécrophages, vautours ou meutes de loups trop faibles pour s’attaquer seuls aux proies de grande taille : le Charognard inspire toutes les espèces qui ont fait de la patience une de leurs rares vertus, et misent sur la faiblesse, la blessure, la fatigue ou l’opportunité pour se nourrir. Il règne sur les régions hostiles où le soleil, la chaleur ou le froid font son jeu, et se développe souvent dans l’ombre du Prédateur, avec qui il entretient une relation quasi symbiotique",
|
||||
"instincts": "Achever, saboter, affaiblir, s’en prendre au plus faible.",
|
||||
"bans": "Affronter, s’exposer, agir de façon compulsive, s’apitoyer.",
|
||||
"behaviour": "Sournois, calculateur, impitoyable",
|
||||
"opposite": "predator"
|
||||
},
|
||||
"symbiote": {
|
||||
"name": "Le Symbiote",
|
||||
"number": 4,
|
||||
"description": "Symbole d’entraide, d’équilibre et d’harmonie, le Symbiote se définit par la relation d’échange et de réciprocité où chaque partie profite de ce que l’autre apporte, quels que soient ses besoins ou ses motivations. Très courante dans le règne végétal, où de nombreuses fleurs et plantes l’ont instaurée avec les pollinisateurs, cette relation de symbiose s’observe également chez les insectes, les mammifères et les êtres humains. Elle peut être ponctuelle, issue des liens du sang, liée à un territoire ou un projet commun, et rien ne l’empêche d’être motivée par le profit ou l’intérêt, tant qu’elle est réciproque – ce qui distingue le Symbiote du Parasite.",
|
||||
"instincts": "Partager, transmettre, équilibrer, trouver un compromis",
|
||||
"bans": "Exploiter, abuser, profiter de la faiblesse, mettre en danger",
|
||||
"behaviour": "Bienveillant, responsable, diplomate, modéré.",
|
||||
"opposite": "parasite"
|
||||
},
|
||||
"parasite": {
|
||||
"name": "Le Parasite",
|
||||
"number": 5,
|
||||
"description": "Totem des infections, des basses œuvres et des épidémies, le Parasite a toujours joué un rôle funeste dans le destin de l’humanité, jusqu’à en devenir le fléau. Symbolisé par les moustiques, il s’observe également chez de nombreux champignons, végétaux et insectes incapables de survivre, de se nourrir ou de se reproduire sans un hôte, et toujours à ses dépens. Le Parasite exploite, profite, abuse sans états d’âme, mu par la seule démarche de prendre ce qu’un autre possède et dont il a besoin. Avec le Prédateur, c’est l’un des Totems les plus présents et les plus redoutés, tant les comportements qu’il inspire peuvent ruiner tout espoir de survie.",
|
||||
"instincts": "Profiter, manipuler, voler, exploiter.",
|
||||
"bans": "Partager, contribuer, tenir une promesse, prendre par la force",
|
||||
"behaviour": "Manipulateur, menteur, égoïste, profiteur",
|
||||
"opposite": "symbiote"
|
||||
},
|
||||
"builder": {
|
||||
"name": "Le Bâtisseur",
|
||||
"number": 6,
|
||||
"description": "Souvent confondu avec la Ruche en raison des constructions géantes typiques de certaines espèces sociales, le Bâtisseur n’est pas le Totem de la communauté, mais celui de la fondation. À l’image des termites, des castors, de la plupart des oiseaux ou de certaines espèces d’araignées, il se caractérise par l’acte de construction, de création ou de modification, et s’observe aussi bien chez des groupes que chez des individus. Avec la Ruche, le Symbiote et la Horde, c’est l’un des Totems les plus courants chez les communautés humaines, dont il inspire les édifices, les inventions et les réparations.",
|
||||
"instincts": "Fonder, créer, s’installer durablement, nouer des liens.",
|
||||
"bans": "Détruire, saboter, quitter une communauté, provoquer le chaos",
|
||||
"behaviour": "Réfléchi, organisé, pragmatique, constant.",
|
||||
"opposite": "horde"
|
||||
},
|
||||
"horde": {
|
||||
"name": "La Horde",
|
||||
"number": 7,
|
||||
"description": "Fléau des cultures depuis la nuit des temps, la Horde est à l’image des nuées de criquets, des meutes de carnivores ou des tribus de nomades qui la représentent : imprévisible, impitoyable et sans visage. Au-delà de ses aspects collectifs, ce Totem redoutable se caractérise surtout par sa violence et sa méthode d’action. Là où le Prédateur tue, la Horde brûle, pille, dévaste pour parvenir à ses fins sans le moindre état d’âme. Elle inspire ceux qui prennent par la force, qui détruisent, qui ravagent et qui refusent toute forme de compromis, quelles que soient leur démarche ou leurs motivations.",
|
||||
"instincts": "Piller, détruire, prendre par la force, miser sur le nombre",
|
||||
"bans": "Négocier, épargner, faire des réserves, planifier à long terme.",
|
||||
"behaviour": "Violent, imprévisible, destructeur, radical.",
|
||||
"opposite": "builder"
|
||||
},
|
||||
"hive": {
|
||||
"name": "La Ruche",
|
||||
"number": 8,
|
||||
"description": "Fourmis, abeilles, termites, factions aux règles strictes : la Ruche est le Totem des créatures sociales et des communautés humaines par excellence. Des cellules familiales aux multinationales, des meutes organisées aux super-colonies de plusieurs milliards d’individus, la Ruche est caractérisée par l’organisation, la hiérarchie, le dévouement et la conscience aigüe du rôle que chacun doit jouer dans l’intérêt commun, plus que par la notion de communauté elle-même. Elle s’appuie bien souvent sur un ensemble de règles, des tâches attribuées, des rôles identifiés – une philosophie qui proscrit tout individualisme et condamne toute désobéissance.",
|
||||
"instincts": "Organiser, œuvrer pour la communauté, respecter la hiérarchie, privilégier l’intérêt collectif",
|
||||
"bans": "trahir, désobéir, mettre sa communauté en danger, faire preuve d’individualisme.",
|
||||
"behaviour": "Méthodique, autoritaire, consciencieux, rigide",
|
||||
"opposite": "loner"
|
||||
},
|
||||
"loner": {
|
||||
"name": "Le solitaire",
|
||||
"number": 9,
|
||||
"description": "Survivre, quoi qu’il en coûte. Sans cruauté, sans états d’âme, mais à tout prix. À l’inverse de la Ruche qui loue le sacrifice s’il est accompli dans l’intérêt du groupe, le Solitaire incarne le plus fondamental des réflexes : celui de la survie. Ni individualiste, ni franchement égoïste, il fait seulement passer ses propres intérêts, ses urgences et ses nécessités avant tout, quitte à trahir, à décevoir, à quitter ou à tuer. Rien n’empêche un Solitaire de trouver une place durable dans un groupe, d’y jouer un rôle précis ou même de suivre des règles établies, tant qu’elles ne heurtent pas ses propres convictions et qu’elles ne mettent pas en péril son bien le plus précieux : sa vie.",
|
||||
"instincts": "Survivre, anticiper, s’adapter, faire passer sa vie avant tout",
|
||||
"bans": "Se sacrifier, risquer sa vie, dépendre de quelqu’un, se résigner.",
|
||||
"behaviour": "Indépendant, lucide, autonome, réactif.",
|
||||
"opposite": "hive"
|
||||
},
|
||||
"adapted": {
|
||||
"name": "L'adapté",
|
||||
"number": 10,
|
||||
"description": "Évoluer ou mourir. Changer ou disparaître. L’Adapté est le Totem de la nécessité, de la survie et de l’évolution. Ni positif, ni négatif, il est présent partout. Il est cette dynamique, ce principe fondamental qui rythme les mutations des espèces et qui rappelle que l’Homme est la seule forme de vie à tenter de contrôler sa propre évolution. L’Adapté ne possède ni Interdit, ni Instinct spécifique. Aucun comportement n’est inapproprié, s’il permet de faire face et de survivre, et les Instincts de tous les autres Totems le renforcent. Seul l’Humain lutte contre son influence…",
|
||||
"instincts": "Tous ceux des huit Totems majeurs",
|
||||
"bans": "Aucun…",
|
||||
"opposite": "human"
|
||||
}
|
||||
},
|
||||
"ABILITY_CATEGORIES": {
|
||||
"physical": {
|
||||
"name": "Physique"
|
||||
},
|
||||
"manual": {
|
||||
"name": "Manuel"
|
||||
},
|
||||
"mental": {
|
||||
"name": "Mental"
|
||||
},
|
||||
"social": {
|
||||
"name": "Social"
|
||||
}
|
||||
},
|
||||
"SKILLS_CATEGORIES": {
|
||||
"man": {
|
||||
"name": "L'Homme"
|
||||
},
|
||||
"animal": {
|
||||
"name": "L'Animal"
|
||||
},
|
||||
"tool": {
|
||||
"name": "L'Outil"
|
||||
},
|
||||
"weapon": {
|
||||
"name": "L'Arme"
|
||||
},
|
||||
"survival": {
|
||||
"name": "La Survie"
|
||||
},
|
||||
"world": {
|
||||
"name": "La Terre"
|
||||
}
|
||||
},
|
||||
"SKILLS": {
|
||||
"arts": {
|
||||
"name": "Arts"
|
||||
},
|
||||
"civilization": {
|
||||
"name": "Civilisations"
|
||||
},
|
||||
"psychology": {
|
||||
"name": "Psychologie"
|
||||
},
|
||||
"rumors": {
|
||||
"name": "Rumeurs"
|
||||
},
|
||||
"healing": {
|
||||
"name": "Soins"
|
||||
},
|
||||
"animalism": {
|
||||
"name": "Animalisme"
|
||||
},
|
||||
"dissection": {
|
||||
"name": "Dissection"
|
||||
},
|
||||
"wildlife": {
|
||||
"name": "Faune"
|
||||
},
|
||||
"repulsion": {
|
||||
"name": "Répulsion"
|
||||
},
|
||||
"tracks": {
|
||||
"name": "Traces"
|
||||
},
|
||||
"crafting": {
|
||||
"name": "Artisanat"
|
||||
},
|
||||
"diy": {
|
||||
"name": "Bricolage"
|
||||
},
|
||||
"mecanical": {
|
||||
"name": "Mécanique"
|
||||
},
|
||||
"piloting": {
|
||||
"name": "Pilotage"
|
||||
},
|
||||
"technology": {
|
||||
"name": "Technologie"
|
||||
},
|
||||
"firearms": {
|
||||
"name": "Armes à feu"
|
||||
},
|
||||
"armory": {
|
||||
"name": "Armurerie"
|
||||
},
|
||||
"shield": {
|
||||
"name": "Bouclier"
|
||||
},
|
||||
"close": {
|
||||
"name": "Corps-à-corps"
|
||||
},
|
||||
"archery": {
|
||||
"name": "Armes de tir"
|
||||
},
|
||||
"throwing": {
|
||||
"name": "Lancer"
|
||||
},
|
||||
"melee": {
|
||||
"name": "Mêlée"
|
||||
},
|
||||
"atletics": {
|
||||
"name": "Atlétisme"
|
||||
},
|
||||
"stealth": {
|
||||
"name": "Discrétion"
|
||||
},
|
||||
"alertness": {
|
||||
"name": "Vigilance"
|
||||
},
|
||||
"flora": {
|
||||
"name": "Flore"
|
||||
},
|
||||
"food": {
|
||||
"name": "Alimentation"
|
||||
},
|
||||
"environment": {
|
||||
"name": "Environnement"
|
||||
},
|
||||
"road": {
|
||||
"name": "Route"
|
||||
},
|
||||
"toxics": {
|
||||
"name": "Toxiques"
|
||||
},
|
||||
"ruins": {
|
||||
"name": "Vestiges"
|
||||
}
|
||||
},
|
||||
"SEXES": {
|
||||
"male": "Masculin",
|
||||
"female": "Féminin"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import {onManageActiveEffect, prepareActiveEffectCategories} from "../system/effects.mjs";
|
||||
import { onManageActiveEffect, prepareActiveEffectCategories } from "../system/effects.mjs";
|
||||
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
@@ -90,8 +90,21 @@ export class VermineActorSheet extends ActorSheet {
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
//click on wound radio
|
||||
html.find('.hexa [type="radio"]').click(ev => {
|
||||
this._onClickRadioHexa(ev)
|
||||
})
|
||||
|
||||
}
|
||||
_onClickRadioHexa(ev) {
|
||||
if (!ev.currentTarget.checked) { return }
|
||||
let prop = ev.currentTarget.name;
|
||||
let update = {};
|
||||
update[prop] = ev.currentTarget.value - 1
|
||||
|
||||
this.actor.update(update)
|
||||
|
||||
}
|
||||
async _onItemCreate(event) {
|
||||
event.preventDefault();
|
||||
const header = event.currentTarget;
|
||||
@@ -113,6 +126,6 @@ export class VermineActorSheet extends ActorSheet {
|
||||
delete itemData.system["type"];
|
||||
|
||||
// Finally, create the item!
|
||||
return await Item.create(itemData, {parent: this.actor});
|
||||
return await Item.create(itemData, { parent: this.actor });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {onManageActiveEffect, prepareActiveEffectCategories} from "../system/effects.mjs";
|
||||
import { onManageActiveEffect, prepareActiveEffectCategories } from "../system/effects.mjs";
|
||||
import { VermineActorSheet } from "./actor-sheet.mjs";
|
||||
import { getRollBox } from "../system/dialogs.mjs";
|
||||
import { RollDialog } from "../system/dialogs.mjs";
|
||||
import { TotemPicker } from "../system/applications.mjs";
|
||||
|
||||
/**
|
||||
@@ -14,8 +14,7 @@ export class VermineCharacterSheet extends VermineActorSheet {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
classes: ["vermine2047", "sheet", "character", "actor"],
|
||||
template: "systems/vermine2047/templates/actor/actor-sheet.hbs",
|
||||
width: 600,
|
||||
height: 600,
|
||||
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "features" }]
|
||||
});
|
||||
}
|
||||
@@ -53,7 +52,6 @@ export class VermineCharacterSheet extends VermineActorSheet {
|
||||
if (actorData.type == 'npc') {
|
||||
this._prepareItems(context);
|
||||
}
|
||||
|
||||
// Add roll data for TinyMCE editors.
|
||||
context.rollData = context.actor.getRollData();
|
||||
|
||||
@@ -104,16 +102,36 @@ export class VermineCharacterSheet extends VermineActorSheet {
|
||||
super.activateListeners(html);
|
||||
// Choose Totem
|
||||
html.find('.chooseTotem').click(this._onTotemButton.bind(this));
|
||||
html.find('.ability .rollable').click(this._onRoll.bind(this));
|
||||
html.find('[data-totem-name]').click(this._onClickTotemDice.bind(this))
|
||||
|
||||
}
|
||||
|
||||
async _onClickTotemDice(ev) {
|
||||
let el = ev.currentTarget;
|
||||
let totem = el.dataset.totemName;
|
||||
let value = parseInt(el.dataset.totemValue);
|
||||
|
||||
let oldValue = this.actor.system.adaptation.totems[totem].value;
|
||||
if (value === oldValue) { value-- };
|
||||
let updates = {};
|
||||
updates[`system.adaptation.totems.${totem}.value`] = value;
|
||||
let totems = this.actor.system.adaptation.totems;
|
||||
let sumTotems = Object.keys(totems).reduce(function (previous, key) {
|
||||
return previous + totems[key].value;
|
||||
}, 0);
|
||||
if (sumTotems >5) {
|
||||
ui.notifications.warn('vous ne pouvez pas avoir plus de 5 dés totems')
|
||||
}
|
||||
console.log(sumTotems, updates)
|
||||
await this.actor.update(updates);
|
||||
}
|
||||
/**
|
||||
* Handle clickable rolls.
|
||||
* @param {Event} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onRoll(event) {
|
||||
async _onRoll(event) {
|
||||
event.preventDefault();
|
||||
const element = event.currentTarget;
|
||||
const dataset = element.dataset;
|
||||
@@ -130,26 +148,17 @@ export class VermineCharacterSheet extends VermineActorSheet {
|
||||
// Handle rolls that supply the formula directly.
|
||||
if (dataset.label) {
|
||||
dataset.rollType = dataset.type;
|
||||
/*const label = game.i18n.localize(dataset.label) ? `[ability] ${game.i18n.localize(dataset.label)}` : '';
|
||||
console.log($(element).attr('for'));
|
||||
const NoD = this.actor.system.skills[$(element).attr('for').split('.')[2]]?.value || 0
|
||||
return game.vermine2047.VermineRoll.roll(this.actor.id, label, NoD, 0, {});*/
|
||||
|
||||
let data = {
|
||||
actorId: this.actor.id,
|
||||
abilities: this.actor.system.abilities,
|
||||
skills: this.actor.system.skills,
|
||||
rollType: dataset.rollType,
|
||||
labelKey: dataset.label,
|
||||
abilityScore: 0,
|
||||
skillScore: 0,
|
||||
|
||||
label: game.i18n.localize(dataset.label)
|
||||
};
|
||||
if (dataset.type == 'ability'){
|
||||
data.abilityScore = this.actor.system.abilities[dataset.label].value;
|
||||
} else if (dataset.type == 'skill'){
|
||||
data.skillScore = this.actor.system.skills[dataset.label].value;
|
||||
}
|
||||
getRollBox(data);
|
||||
|
||||
let dial = await RollDialog.create(data);
|
||||
dial.render(true)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {onManageActiveEffect, prepareActiveEffectCategories} from "../system/effects.mjs";
|
||||
import { onManageActiveEffect, prepareActiveEffectCategories } from "../system/effects.mjs";
|
||||
import { VermineActorSheet } from "./actor-sheet.mjs";
|
||||
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
export class VermineCreatureSheet extends ActorSheet {
|
||||
export class VermineCreatureSheet extends VermineActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
@@ -118,7 +118,7 @@ export class VermineCreatureSheet extends ActorSheet {
|
||||
delete itemData.system["type"];
|
||||
|
||||
// Finally, create the item!
|
||||
return await Item.create(itemData, {parent: this.actor});
|
||||
return await Item.create(itemData, { parent: this.actor });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+81
-78
@@ -6,79 +6,80 @@ export const VERMINE = {};
|
||||
*/
|
||||
|
||||
VERMINE.AgeTypes = {
|
||||
1:{ "name":"AGE_TYPES.young", "beginning": 0 },
|
||||
2:{ "name":"AGE_TYPES.adult", "beginning": 18 },
|
||||
3:{ "name":"AGE_TYPES.old", "beginning": 47 }
|
||||
1: { "name": "AGE_TYPES.young", "beginning": 0 },
|
||||
2: { "name": "AGE_TYPES.adult", "beginning": 18 },
|
||||
3: { "name": "AGE_TYPES.old", "beginning": 47 }
|
||||
}
|
||||
|
||||
VERMINE.SkillLevels = {
|
||||
1:{ "label":"SKILL_LEVELS.beginner", "dicePool":1, "reroll":0},
|
||||
2:{ "label":"SKILL_LEVELS.proficient", "dicePool":1, "reroll":1},
|
||||
3:{ "label":"SKILL_LEVELS.expert", "dicePool":2, "reroll":1},
|
||||
4:{ "label":"SKILL_LEVELS.master", "dicePool":2, "reroll":2},
|
||||
5:{ "label":"SKILL_LEVELS.legend", "dicePool":3, "reroll":2}
|
||||
0: { "label": "SKILL_LEVELS.incompetent", "dicePool": 0, "reroll": 0 },
|
||||
1: { "label": "SKILL_LEVELS.beginner", "dicePool": 1, "reroll": 0 },
|
||||
2: { "label": "SKILL_LEVELS.proficient", "dicePool": 1, "reroll": 1 },
|
||||
3: { "label": "SKILL_LEVELS.expert", "dicePool": 2, "reroll": 1 },
|
||||
4: { "label": "SKILL_LEVELS.master", "dicePool": 2, "reroll": 2 },
|
||||
5: { "label": "SKILL_LEVELS.legend", "dicePool": 3, "reroll": 2 }
|
||||
}
|
||||
|
||||
VERMINE.DifficultyLevels = {
|
||||
1:{ "label":"DIFFICULTY_LEVELS.obvious", "difficulty":3},
|
||||
2:{ "label":"DIFFICULTY_LEVELS.easy", "difficulty":5},
|
||||
3:{ "label":"DIFFICULTY_LEVELS.hard", "difficulty":7},
|
||||
4:{ "label":"DIFFICULTY_LEVELS.very_hard", "difficulty":9},
|
||||
5:{ "label":"DIFFICULTY_LEVELS.impossible", "difficulty":10}
|
||||
1: { "label": "DIFFICULTY_LEVELS.obvious", "difficulty": 3 },
|
||||
2: { "label": "DIFFICULTY_LEVELS.easy", "difficulty": 5 },
|
||||
3: { "label": "DIFFICULTY_LEVELS.hard", "difficulty": 7 },
|
||||
4: { "label": "DIFFICULTY_LEVELS.very_hard", "difficulty": 9 },
|
||||
5: { "label": "DIFFICULTY_LEVELS.impossible", "difficulty": 10 }
|
||||
},
|
||||
|
||||
VERMINE.ThreatLevels = {
|
||||
1:{ "label":"THREAT_LEVELS.minor", "attack":3, "vigor":1, "minorWound":1, "majorWound":1, "deadlyWound":1},
|
||||
2:{ "label":"THREAT_LEVELS.serious", "attack":4, "vigor":2, "minorWound":2, "majorWound":1, "deadlyWound":1},
|
||||
3:{ "label":"THREAT_LEVELS.major", "attack":5, "vigor":3, "minorWound":2, "majorWound":1, "deadlyWound":1},
|
||||
4:{ "label":"THREAT_LEVELS.deadly", "attack":6, "vigor":4, "minorWound":2, "majorWound":2, "deadlyWound":2},
|
||||
}
|
||||
VERMINE.ThreatLevels = {
|
||||
1: { "label": "THREAT_LEVELS.minor", "attack": 3, "vigor": 1, "minorWound": 1, "majorWound": 1, "deadlyWound": 1 },
|
||||
2: { "label": "THREAT_LEVELS.serious", "attack": 4, "vigor": 2, "minorWound": 2, "majorWound": 1, "deadlyWound": 1 },
|
||||
3: { "label": "THREAT_LEVELS.major", "attack": 5, "vigor": 3, "minorWound": 2, "majorWound": 1, "deadlyWound": 1 },
|
||||
4: { "label": "THREAT_LEVELS.deadly", "attack": 6, "vigor": 4, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
|
||||
}
|
||||
|
||||
VERMINE.ExperienceLevels = {
|
||||
1:{ "label":"SKILL_LEVELS.beginner", "action":3, "specialties":4, "rerolls":0, "contact":"7"},
|
||||
2:{ "label":"SKILL_LEVELS.proficient", "action":3, "specialties":5, "rerolls":0, "contact":"5 ou 7"},
|
||||
3:{ "label":"SKILL_LEVELS.expert", "action":4, "specialties":6, "rerolls":1, "contact":"5,7 ou 9"},
|
||||
4:{ "label":"SKILL_LEVELS.master", "action":4, "specialties":6, "rerolls":2, "contact":"3,5,7 ou 9"},
|
||||
1: { "label": "SKILL_LEVELS.beginner", "action": 3, "specialties": 4, "rerolls": 0, "contact": "7" },
|
||||
2: { "label": "SKILL_LEVELS.proficient", "action": 3, "specialties": 5, "rerolls": 0, "contact": "5 ou 7" },
|
||||
3: { "label": "SKILL_LEVELS.expert", "action": 4, "specialties": 6, "rerolls": 1, "contact": "5,7 ou 9" },
|
||||
4: { "label": "SKILL_LEVELS.master", "action": 4, "specialties": 6, "rerolls": 2, "contact": "3,5,7 ou 9" },
|
||||
}
|
||||
|
||||
VERMINE.RoleLevels = {
|
||||
1:{ "label":"ROLE_LEVELS.minor", "reaction":3, "reaction_bonus":0, "pools":0, "gear":9, "gear_hindrance":0, "protection":1},
|
||||
2:{ "label":"ROLE_LEVELS.secondary", "reaction":3,"reaction_bonus":1, "pools":1, "gear":9,"gear_hindrance":1, "protection":2},
|
||||
3:{ "label":"ROLE_LEVELS.important", "reaction":3, "reaction_bonus":2, "pools":2, "gear":9,"gear_hindrance":2, "protection":3},
|
||||
4:{ "label":"ROLE_LEVELS.major", "reaction":4, "reaction_bonus":2, "pools":4, "gear":10, "gear_hindrance":2, "protection":3},
|
||||
1: { "label": "ROLE_LEVELS.minor", "reaction": 3, "reaction_bonus": 0, "pools": 0, "gear": 9, "gear_hindrance": 0, "protection": 1 },
|
||||
2: { "label": "ROLE_LEVELS.secondary", "reaction": 3, "reaction_bonus": 1, "pools": 1, "gear": 9, "gear_hindrance": 1, "protection": 2 },
|
||||
3: { "label": "ROLE_LEVELS.important", "reaction": 3, "reaction_bonus": 2, "pools": 2, "gear": 9, "gear_hindrance": 2, "protection": 3 },
|
||||
4: { "label": "ROLE_LEVELS.major", "reaction": 4, "reaction_bonus": 2, "pools": 4, "gear": 10, "gear_hindrance": 2, "protection": 3 },
|
||||
}
|
||||
|
||||
VERMINE.PatternLevels = {
|
||||
1:{ "label":"PATTERN_LEVELS.insect", "attack":2, "damage":0, "minorWound":0, "majorWound":0, "deadlyWound":1},
|
||||
2:{ "label":"PATTERN_LEVELS.rat", "attack":3, "damage":1, "minorWound":0, "majorWound":1, "deadlyWound":1},
|
||||
3:{ "label":"PATTERN_LEVELS.dog", "attack":4, "damage":3, "minorWound":1, "majorWound":1, "deadlyWound":1},
|
||||
4:{ "label":"PATTERN_LEVELS.bear", "attack":6, "damage":6, "minorWound":2, "majorWound":2, "deadlyWound":2},
|
||||
1: { "label": "PATTERN_LEVELS.insect", "attack": 2, "damage": 0, "minorWound": 0, "majorWound": 0, "deadlyWound": 1 },
|
||||
2: { "label": "PATTERN_LEVELS.rat", "attack": 3, "damage": 1, "minorWound": 0, "majorWound": 1, "deadlyWound": 1 },
|
||||
3: { "label": "PATTERN_LEVELS.dog", "attack": 4, "damage": 3, "minorWound": 1, "majorWound": 1, "deadlyWound": 1 },
|
||||
4: { "label": "PATTERN_LEVELS.bear", "attack": 6, "damage": 6, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
|
||||
}
|
||||
|
||||
VERMINE.SizeLevels = {
|
||||
1:{ "attack":2, "vigor":1, "minorWound":0, "majorWound":0, "deadlyWound":1},
|
||||
2:{ "attack":3, "vigor":2, "minorWound":0, "majorWound":1, "deadlyWound":1},
|
||||
3:{ "attack":4, "vigor":3, "minorWound":1, "majorWound":1, "deadlyWound":1}
|
||||
1: { "attack": 2, "vigor": 1, "minorWound": 0, "majorWound": 0, "deadlyWound": 1 },
|
||||
2: { "attack": 3, "vigor": 2, "minorWound": 0, "majorWound": 1, "deadlyWound": 1 },
|
||||
3: { "attack": 4, "vigor": 3, "minorWound": 1, "majorWound": 1, "deadlyWound": 1 }
|
||||
}
|
||||
|
||||
VERMINE.PackLevels = {
|
||||
1:{ "attack":1, "damage":1, "minorWound":0, "majorWound":0, "deadlyWound":1},
|
||||
2:{ "attack":2, "damage":2, "minorWound":2, "majorWound":2, "deadlyWound":2},
|
||||
3:{ "attack":5, "damage":5, "minorWound":3, "majorWound":3, "deadlyWound":3}
|
||||
1: { "attack": 1, "damage": 1, "minorWound": 0, "majorWound": 0, "deadlyWound": 1 },
|
||||
2: { "attack": 2, "damage": 2, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
|
||||
3: { "attack": 5, "damage": 5, "minorWound": 3, "majorWound": 3, "deadlyWound": 3 }
|
||||
}
|
||||
|
||||
VERMINE.abilityCategories = {
|
||||
"physical": {
|
||||
"label":"VERMINE.ability_category.physical"
|
||||
"label": "VERMINE.ability_category.physical"
|
||||
},
|
||||
"manual": {
|
||||
"label":"VERMINE.ability_category.manual"
|
||||
"label": "VERMINE.ability_category.manual"
|
||||
},
|
||||
"mental": {
|
||||
"label":"VERMINE.ability_category.mental"
|
||||
"label": "VERMINE.ability_category.mental"
|
||||
},
|
||||
"social": {
|
||||
"label":"VERMINE.ability_category.social"
|
||||
"label": "VERMINE.ability_category.social"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,64 +96,66 @@ VERMINE.abilities = {
|
||||
|
||||
VERMINE.skillCategories = {
|
||||
"man": {
|
||||
"label":"VERMINE.skill_category.man"
|
||||
"label": "VERMINE.skill_category.man"
|
||||
},
|
||||
"animal": {
|
||||
"label":"VERMINE.skill_category.animal"
|
||||
"label": "VERMINE.skill_category.animal"
|
||||
},
|
||||
"tool": {
|
||||
"label":"VERMINE.skill_category.tool"
|
||||
"label": "VERMINE.skill_category.tool"
|
||||
},
|
||||
"weapon": {
|
||||
"label":"VERMINE.skill_category.weapon"
|
||||
"label": "VERMINE.skill_category.weapon"
|
||||
},
|
||||
"survival": {
|
||||
"label":"VERMINE.skill_category.survival"
|
||||
"label": "VERMINE.skill_category.survival"
|
||||
},
|
||||
"world": {
|
||||
"label":"VERMINE.skill_category.world"
|
||||
"label": "VERMINE.skill_category.world"
|
||||
}
|
||||
}
|
||||
|
||||
VERMINE.sexes = {"male": "VERMINE.sexes.male", "female": "VERMINE.sexes.female"};
|
||||
VERMINE.sexes = { "male": "VERMINE.sexes.male", "female": "VERMINE.sexes.female" };
|
||||
|
||||
VERMINE.totems = {
|
||||
"human":"TOTEMS.human.name",
|
||||
"predator": "TOTEMS.predator.name" ,
|
||||
"scavenger": "TOTEMS.scavenger.name" ,
|
||||
"symbiote": "TOTEMS.symbiote.name" ,
|
||||
"parasite": "TOTEMS.parasite.name" ,
|
||||
"builder": "TOTEMS.builder.name" ,
|
||||
"horde": "TOTEMS.horde.name" ,
|
||||
"hive": "TOTEMS.hive.name" ,
|
||||
"human": "TOTEMS.human.name",
|
||||
"predator": "TOTEMS.predator.name",
|
||||
"scavenger": "TOTEMS.scavenger.name",
|
||||
"symbiote": "TOTEMS.symbiote.name",
|
||||
"parasite": "TOTEMS.parasite.name",
|
||||
"builder": "TOTEMS.builder.name",
|
||||
"horde": "TOTEMS.horde.name",
|
||||
"hive": "TOTEMS.hive.name",
|
||||
"loner": "TOTEMS.loner.name",
|
||||
"adapted": "TOTEMS.adapted.name"
|
||||
}
|
||||
VERMINE.totem_opposites = {
|
||||
"human":"TOTEMS.adapted.name",
|
||||
"predator": "TOTEMS.scavenger.name" ,
|
||||
"scavenger": "TOTEMS.predator.name" ,
|
||||
"symbiote": "TOTEMS.parasite.name" ,
|
||||
"parasite": "TOTEMS.symbiote.name" ,
|
||||
"builder": "TOTEMS.horde.name" ,
|
||||
"horde": "TOTEMS.builder.name" ,
|
||||
"hive": "TOTEMS.loner.name" ,
|
||||
"human": "TOTEMS.adapted.name",
|
||||
"predator": "TOTEMS.scavenger.name",
|
||||
"scavenger": "TOTEMS.predator.name",
|
||||
"symbiote": "TOTEMS.parasite.name",
|
||||
"parasite": "TOTEMS.symbiote.name",
|
||||
"builder": "TOTEMS.horde.name",
|
||||
"horde": "TOTEMS.builder.name",
|
||||
"hive": "TOTEMS.loner.name",
|
||||
"loner": "TOTEMS.hive.name",
|
||||
"adapted": "TOTEMS.human.name"
|
||||
}
|
||||
|
||||
VERMINE.origins = {"aon":"Aon",
|
||||
"avhorae": "Avhorae" ,
|
||||
"babel": "Babel",
|
||||
"soleil_noir": "Empire du Soleil Noir",
|
||||
"fakhar": "Fakhar",
|
||||
"horde": "Horde",
|
||||
"khashan": "Khashan",
|
||||
"ool": "Ool",
|
||||
"shattered_kingdoms": "Royaumes divisés",
|
||||
"saeth": "Saeth",
|
||||
"tegee": "Tégée (Thalos)",
|
||||
"tuuhle": "Tuuhle",
|
||||
"vaelor": "Vaelor",
|
||||
"valdheim": "Valdheim"
|
||||
VERMINE.origins = {
|
||||
"aon": "Aon",
|
||||
"avhorae": "Avhorae",
|
||||
"babel": "Babel",
|
||||
"soleil_noir": "Empire du Soleil Noir",
|
||||
"fakhar": "Fakhar",
|
||||
"horde": "Horde",
|
||||
"khashan": "Khashan",
|
||||
"ool": "Ool",
|
||||
"shattered_kingdoms": "Royaumes divisés",
|
||||
"saeth": "Saeth",
|
||||
"tegee": "Tégée (Thalos)",
|
||||
"tuuhle": "Tuuhle",
|
||||
"vaelor": "Vaelor",
|
||||
"valdheim": "Valdheim"
|
||||
}
|
||||
|
||||
|
||||
+145
-82
@@ -1,5 +1,5 @@
|
||||
|
||||
export class CombatResultDialog extends Dialog {
|
||||
import { VermineUtils } from "./roll.mjs";
|
||||
export class CombatResultDialog extends Dialog {
|
||||
|
||||
constructor(dialogData, options) {
|
||||
/*let options = { classes: ["combat", "result"], ...options };
|
||||
@@ -33,97 +33,160 @@
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
export class RollDialog extends Dialog {
|
||||
|
||||
export const getRollBox = async function(data) {
|
||||
let html = await renderTemplate('systems/vermine2047/templates/roll.hbs', data);
|
||||
let ui = new Dialog({
|
||||
title: game.i18n.localize("ROLLS.tool"),
|
||||
static async create(data = {
|
||||
label: null,
|
||||
rolltype: null,
|
||||
NoD: 1,
|
||||
Reroll: false,
|
||||
actorId: game.user.character.id
|
||||
}) {
|
||||
data.actor = await game.actors.get(data.actorId);
|
||||
data.config = CONFIG.VERMINE;
|
||||
let options = { classes: ["nocDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
|
||||
let html = await renderTemplate('systems/vermine2047/templates/roll-dialog.hbs', data);
|
||||
|
||||
return new RollDialog(data, html, options);
|
||||
}
|
||||
static get defaultOptions() {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
focus: true,
|
||||
classes: ["dialog vermine-roll"],
|
||||
|
||||
});
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
constructor(data, html, options, close = undefined) {
|
||||
let conf = {
|
||||
title: "jet de dés",
|
||||
content: html,
|
||||
buttons: {
|
||||
roll: {
|
||||
label: game.i18n.localize('ROLLS.roll_dice'),
|
||||
callback: (html) => {
|
||||
let form = html.find('#dice-pool-form');
|
||||
if (!form[0].checkValidity()) {
|
||||
throw "Invalid Data";
|
||||
}
|
||||
let formData = {};
|
||||
form.serializeArray().map(item => {
|
||||
formData[item.name] = item.value;
|
||||
});
|
||||
// console.log("roll form data", formData);
|
||||
let NoD = parseInt(formData.abilityScore,10);
|
||||
let Reroll = 0;
|
||||
// difficulty
|
||||
data.difficulty = (formData.difficulty != undefined) ? formData.difficulty : 7;
|
||||
// maîtrise bonus
|
||||
if (formData.rollType == 'skill'){
|
||||
NoD += CONFIG.VERMINE.SkillLevels[formData.skillScore].dicePool || 0;
|
||||
Reroll += CONFIG.VERMINE.SkillLevels[formData.skillScore].reroll || 0;
|
||||
}
|
||||
console.log('reroll', Reroll);
|
||||
|
||||
// réserves
|
||||
if (formData.self_control > 0){
|
||||
NoD += parseInt(formData.self_control,10);
|
||||
}
|
||||
if (formData.group > 0){
|
||||
NoD += parseInt(formData.group,10);
|
||||
}
|
||||
// checks
|
||||
if (formData.usingSpecialization !== undefined && formData.usingSpecialization == 1){
|
||||
NoD += 1;
|
||||
}
|
||||
if (formData.usingTools !== undefined && formData.usingTools == 1){
|
||||
NoD += 1;
|
||||
}
|
||||
if (formData.helped !== undefined && formData.helped == 1){
|
||||
NoD += 1;
|
||||
}
|
||||
if (formData.abilityScore == 0){
|
||||
ui.notifications.notify(`veuillez saisir une caractéristique`);
|
||||
} else return game.vermine2047.VermineRoll.roll(data.actorId, data.label, NoD, Reroll, data);
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer !",
|
||||
callback: () => {
|
||||
this.roll()
|
||||
}
|
||||
},
|
||||
close: {
|
||||
label: game.i18n.localize('Close'),
|
||||
callback: () => { }
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Annuler",
|
||||
callback: () => { this.close() }
|
||||
}
|
||||
},
|
||||
render: function (h) {
|
||||
if( h.find('input[name="abilityScore"]').val()== 0 && data.rollType == 'ability'){
|
||||
h.find('input[name="abilityScore"]').val(data.abilities[data.label].value);
|
||||
close: close,
|
||||
}
|
||||
|
||||
h.find('select[name="ability"]').change((event) => {
|
||||
if (event.target.value != undefined){
|
||||
const abilityScore = data.abilities[event.target.value].value;
|
||||
console.log('ability', abilityScore);
|
||||
// on enregistre la valeur de la caractéristique
|
||||
h.find('input[name="abilityScore"]').val(abilityScore);
|
||||
}
|
||||
});
|
||||
return super({ ...conf, ...data }, options);
|
||||
|
||||
h.find('select[name="skill"]').change((event) => {
|
||||
if (data.rollType == 'skill' && event.target.value != undefined){
|
||||
const skillScore = data.skills[event.target.value].value;
|
||||
// on enregistre la valeur de la compétence
|
||||
h.find('input[name="skillScore"]').val(skillScore);
|
||||
// on met à jour les infos de niveaux de compétence
|
||||
const skillLevel = CONFIG.VERMINE.SkillLevels[skillScore];
|
||||
if (skillLevel != undefined){
|
||||
h.find('#skillLevel').text(game.i18n.localize(skillLevel.label));
|
||||
h.find('#skillDicePool').text(skillLevel.dicePool);
|
||||
h.find('#skillReroll').text(skillLevel.reroll);
|
||||
} else {
|
||||
h.find('#skillLevel').text('Inconnu');
|
||||
h.find('#skillDicePool').text(0);
|
||||
h.find('#skillReroll').text(0);
|
||||
|
||||
|
||||
};
|
||||
getData() {
|
||||
let context = super.getData();
|
||||
context.data = this.data;
|
||||
context.config = CONFIG.VERMINE;
|
||||
return context;
|
||||
}
|
||||
async activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
this.getRollData();
|
||||
let rollInputs = html.find('[data-roll');
|
||||
for (let inp of rollInputs) {
|
||||
inp.addEventListener('change', await this.getRollData.bind(this))
|
||||
};
|
||||
let selectAbil = html.find('#ability')[0];
|
||||
html.find("#self_control")[0].max = selectAbil.value;
|
||||
selectAbil.addEventListener('change', this._onChangeAbility.bind(this));
|
||||
let selfControl = html.find('#self_control')[0]
|
||||
selfControl.addEventListener('change', this._onChangeSelfControl.bind(this));
|
||||
};
|
||||
async getRollData(ev) {
|
||||
console.log(this)
|
||||
this.rollData = {
|
||||
actor: this.data.actor,
|
||||
NoD: this.getDicePool(),
|
||||
Reroll: this.getReroll(),
|
||||
difficulty: this.getDifficulty(),
|
||||
rollLabel: this.data.labelKey,
|
||||
totems: this.getTotems(),
|
||||
self_control: this.getSelfControl(),
|
||||
max_effort: this.getMaxEffort()
|
||||
}
|
||||
console.log('____________________________________calculating roll', this.rollData);
|
||||
|
||||
};
|
||||
_onChangeSelfControl(ev) {
|
||||
let html = this.element[0];
|
||||
html.querySelector('#self_control_value').innerText = ev.currentTarget.value;
|
||||
|
||||
|
||||
};
|
||||
getSelfControl() {
|
||||
let html = this.element[0];
|
||||
let selfControl = parseInt(html.querySelector('#self_control').value)
|
||||
return selfControl
|
||||
}
|
||||
getMaxEffort() {
|
||||
let html = this.element[0];
|
||||
return parseInt(html.querySelector('#ability').value);
|
||||
}
|
||||
getTotems() {
|
||||
let html = this.element[0];
|
||||
let totems = {
|
||||
human: html.querySelector('#human-totem').checked,
|
||||
adapted: html.querySelector('#adapted-totem').checked,
|
||||
}
|
||||
return totems
|
||||
}
|
||||
_onChangeAbility(ev) {
|
||||
let html = this.element[0];
|
||||
let score = html.querySelector('#ability').options[html.querySelector('#ability').selectedIndex].value;
|
||||
|
||||
if (!typeof score == "number") {
|
||||
score = 0
|
||||
}
|
||||
html.querySelector('#abilityScore').value = score;
|
||||
html.querySelector('#self_control').max = score;
|
||||
|
||||
|
||||
}
|
||||
getDicePool() {
|
||||
let html = this.element[0];
|
||||
let abilValue = html.querySelector('#ability').options[html.querySelector('#ability').selectedIndex].value || 0;
|
||||
let skillValue = html.querySelector('#skill').options[html.querySelector('#skill').selectedIndex].dataset.pool || 0;
|
||||
let selfControl = html.querySelector('#self_control').value;
|
||||
let bonuses =
|
||||
(html.querySelector('#usingSpecialization').checked ? 1 : 0) +
|
||||
(html.querySelector('#helped').checked ? 1 : 0) +
|
||||
(html.querySelector('#usingTools').checked ? 1 : 0);
|
||||
let total = parseInt(abilValue) + parseInt(selfControl) + parseInt(skillValue) + bonuses;
|
||||
|
||||
return total || 0;
|
||||
|
||||
}
|
||||
getReroll() {
|
||||
let html = this.element[0];
|
||||
let selected = html.querySelector('#skill').selectedIndex;
|
||||
let reroll = html.querySelector('#skill').options[selected].dataset.reroll || 0;
|
||||
return parseInt(reroll) || 0;
|
||||
|
||||
}
|
||||
getDifficulty() {
|
||||
let html = this.element[0];
|
||||
let selected = html.querySelector('#difficulty').selectedIndex;
|
||||
let diff = html.querySelector('#difficulty').options[selected].value || 0;
|
||||
return parseInt(diff) || 0;
|
||||
}
|
||||
roll() {
|
||||
if (this.rollData.self_control > 0) {
|
||||
if (this.rollData.actor.system.attributes.self_control.value < this.rollData.self_control) {
|
||||
return ui.notifications.warn('vous navez pas assez de sang-froid')
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
ui.render(true);
|
||||
return VermineUtils.roll({ ...this.rollData })
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
export async function initUserDice(dice3d) {
|
||||
let baseColor = game.user.color;
|
||||
dice3d.addColorset({
|
||||
name: 'regular_' + game.user.name,
|
||||
description: "regular dice for " + game.user.name,
|
||||
category: "vermine 2047",
|
||||
foreground: '#9F8003',
|
||||
background: baseColor,
|
||||
outline: 'black',
|
||||
texture: 'none',
|
||||
material: 'plastic',
|
||||
visibility: 'visible'
|
||||
});
|
||||
dice3d.addColorset({
|
||||
name: 'human_' + game.user.name,
|
||||
description: "human totem dice for " + game.user.name,
|
||||
category: "vermine 2047",
|
||||
foreground: '#9F8003',
|
||||
background: lightenColor(baseColor, 40),
|
||||
outline: 'black',
|
||||
material: 'plastic',
|
||||
visibility: 'visible'
|
||||
});
|
||||
dice3d.addColorset({
|
||||
name: 'adapted_' + game.user.name,
|
||||
description: "adapted totem dice for " + game.user.name,
|
||||
category: "vermine 2047",
|
||||
foreground: '#9F8003',
|
||||
background: darkenColor(baseColor, 40),
|
||||
outline: 'black',
|
||||
material: 'plastic',
|
||||
visibility: 'visible'
|
||||
});
|
||||
|
||||
await game.user.setFlag("world", "diceInit", true);
|
||||
}
|
||||
|
||||
export function darkenColor(color, percent) {
|
||||
const num = parseInt(color.replace('#', ''), 16);
|
||||
const amt = Math.round(2.55 * percent);
|
||||
const R = (num >> 16) + amt;
|
||||
const G = ((num >> 8) & 0x00FF) + amt;
|
||||
const B = (num & 0x0000FF) + amt;
|
||||
return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
|
||||
}
|
||||
|
||||
export function lightenColor(color, percent) {
|
||||
const num = parseInt(color.replace('#', ''), 16);
|
||||
const amt = Math.round(2.55 * percent);
|
||||
const R = (num >> 16) - amt;
|
||||
const G = ((num >> 8) & 0x00FF) - amt;
|
||||
const B = (num & 0x0000FF) - amt;
|
||||
return '#' + (0x1000000 + (R < 0 ? 0 : R > 255 ? 255 : R) * 0x10000 + (G < 0 ? 0 : G > 255 ? 255 : G) * 0x100 + (B < 0 ? 0 : B > 255 ? 255 : B)).toString(16).slice(1);
|
||||
}
|
||||
+46
-47
@@ -1,11 +1,11 @@
|
||||
import { VERMINE } from "./config.mjs";
|
||||
import { getActorSkillScore,updateActorSkillScore } from "./functions.mjs";
|
||||
import { getActorSkillScore, updateActorSkillScore } from "./functions.mjs";
|
||||
|
||||
export class VermineFight {
|
||||
|
||||
async performTest(enemyAchievement, enemyConservation, skillKey, skill, params, actor) {
|
||||
const dicePool = (params.spleen != undefined || params.purpose != undefined) ? '5' : '4';
|
||||
const r = new Roll(dicePool +`d6`);
|
||||
const r = new Roll(dicePool + `d6`);
|
||||
let diceString = '';
|
||||
let dicePoolHint = '';
|
||||
let discardedRoll = false;
|
||||
@@ -15,16 +15,16 @@ export class VermineFight {
|
||||
|
||||
|
||||
r.roll(); // dice are rolled
|
||||
if (params.usure != undefined){
|
||||
if (params.usure != undefined) {
|
||||
currentSkillScore += params.usure;
|
||||
bonus += params.usure;
|
||||
}
|
||||
|
||||
if (params.specialization != undefined){
|
||||
if (params.specialization != undefined) {
|
||||
currentSkillScore += 2;
|
||||
}
|
||||
|
||||
if (params.trait != undefined){
|
||||
if (params.trait != undefined) {
|
||||
currentSkillScore += params.trait;
|
||||
bonus += params.trait;
|
||||
}
|
||||
@@ -32,16 +32,16 @@ export class VermineFight {
|
||||
bonusText += bonus;
|
||||
|
||||
let targetText = game.i18n.format('VERMINE.Selected') + ' : ' + game.i18n.format(skillKey) + " " + skill + bonusText;
|
||||
if (params.specialization != undefined){
|
||||
if (params.specialization != undefined) {
|
||||
targetText += " (S)";
|
||||
}
|
||||
// tri par ordre croissant
|
||||
r.terms[0].results.sort((a,b) => a.result - b.result );
|
||||
r.terms[0].results.sort((a, b) => a.result - b.result);
|
||||
|
||||
if (params.purpose != undefined){
|
||||
if (params.purpose != undefined) {
|
||||
discardedRoll = r.terms[0].results.shift();
|
||||
dicePoolHint = ' - ' + game.i18n.format('VERMINE.PurposeTrait');
|
||||
} else if (params.spleen != undefined){
|
||||
} else if (params.spleen != undefined) {
|
||||
discardedRoll = r.terms[0].results.pop();
|
||||
dicePoolHint = ' - ' + game.i18n.format('VERMINE.SpleenTrait');
|
||||
}
|
||||
@@ -49,7 +49,7 @@ export class VermineFight {
|
||||
|
||||
for (let i = 0; i < r.terms[0].results.length; i++) {
|
||||
let result = r.terms[0].results[i].result;
|
||||
diceString += '<li class="roll die d6 die-'+ i +'">' + result + '</li>';
|
||||
diceString += '<li class="roll die d6 die-' + i + '">' + result + '</li>';
|
||||
}
|
||||
|
||||
let hintText = game.i18n.format('VERMINE.ConfrontationHint');
|
||||
@@ -142,20 +142,20 @@ export class VermineFight {
|
||||
|
||||
// sélection du dé actif
|
||||
html.on("click", '.confrontation .die.d6', event => {
|
||||
const diceResult = parseInt($(event.target).html(),10);
|
||||
const diceResult = parseInt($(event.target).html(), 10);
|
||||
html.find('.confrontation .die.d6').removeClass('active');
|
||||
$(event.target).addClass('active');
|
||||
});
|
||||
|
||||
// sélection des dés d'accomplissement
|
||||
html.on("click", '.confrontation .add-to-achievement', event => {
|
||||
const diceResult = parseInt(html.find('.confrontation .die.d6.active').html(),10);
|
||||
const diceResult = parseInt(html.find('.confrontation .die.d6.active').html(), 10);
|
||||
html.find('.confrontation .die.d6.active').removeClass('min').addClass('max');
|
||||
});
|
||||
|
||||
// sélection des dés de conservation
|
||||
html.on("click", '.confrontation .add-to-conservation', event => {
|
||||
const diceResult = parseInt(html.find('.confrontation .die.d6.active').html(),10);
|
||||
const diceResult = parseInt(html.find('.confrontation .die.d6.active').html(), 10);
|
||||
html.find('.confrontation .die.d6.active').removeClass('max').addClass('min');
|
||||
});
|
||||
|
||||
@@ -172,10 +172,10 @@ export class VermineFight {
|
||||
let conservationDice = 0;
|
||||
let achievementBasis = 0;
|
||||
let conservationBasis = 0;
|
||||
html.find('.confrontation .die.d6.max').each(function(index){
|
||||
html.find('.confrontation .die.d6.max').each(function (index) {
|
||||
achievementDice += parseInt($(this).html(), 10);
|
||||
});
|
||||
html.find('.confrontation .die.d6.min').each(function(index){
|
||||
html.find('.confrontation .die.d6.min').each(function (index) {
|
||||
conservationDice += parseInt($(this).html(), 10);
|
||||
});
|
||||
|
||||
@@ -189,8 +189,8 @@ export class VermineFight {
|
||||
html.find('td.conservation-result').html(conservationBasis + conservationDice);
|
||||
|
||||
// calcul des marges
|
||||
const achievementMargin = achievementBasis + achievementDice - parseInt(html.find('td.adv-achievement-result').html(),10);
|
||||
const conservationMargin = conservationBasis + conservationDice - parseInt(html.find('td.adv-conservation-result').html(),10);
|
||||
const achievementMargin = achievementBasis + achievementDice - parseInt(html.find('td.adv-achievement-result').html(), 10);
|
||||
const conservationMargin = conservationBasis + conservationDice - parseInt(html.find('td.adv-conservation-result').html(), 10);
|
||||
html.find('td.achievement-margin').html(achievementMargin);
|
||||
html.find('td.conservation-margin').html(conservationMargin);
|
||||
|
||||
@@ -217,11 +217,11 @@ export class VermineFight {
|
||||
// get the actor
|
||||
try {
|
||||
actor = game.user.character;
|
||||
} catch(e){
|
||||
throw("Aucun personnage défini !");
|
||||
} catch (e) {
|
||||
throw ("Aucun personnage défini !");
|
||||
}
|
||||
|
||||
if (actor == null && externalData.speakerId != undefined && externalData.speakerId != null){
|
||||
if (actor == null && externalData.speakerId != undefined && externalData.speakerId != null) {
|
||||
// on récupère le speakerId, et de là l'objet actor
|
||||
actor = game.actors.get(externalData.speakerId);
|
||||
VermineFight.previousValues['speakerName'] = actor.name;
|
||||
@@ -232,7 +232,7 @@ export class VermineFight {
|
||||
|
||||
// get the data
|
||||
let charData = (externalData) => {
|
||||
let o = Object.assign({ _template: VermineFight.rollerTemplate }, {...VermineFight.previousValues, ...externalData});
|
||||
let o = Object.assign({ _template: VermineFight.rollerTemplate }, { ...VermineFight.previousValues, ...externalData });
|
||||
return o;
|
||||
};
|
||||
let data = charData(externalData);
|
||||
@@ -257,7 +257,7 @@ export class VermineFight {
|
||||
switch (e.name) {
|
||||
case "skill":
|
||||
case "cephalic":
|
||||
if (e.value !== ''){
|
||||
if (e.value !== '') {
|
||||
skillKey = e.value;
|
||||
}
|
||||
break;
|
||||
@@ -291,7 +291,7 @@ export class VermineFight {
|
||||
}
|
||||
});
|
||||
// prise en compte de l'usure sur la feuille de perso
|
||||
if (params.usure != undefined){
|
||||
if (params.usure != undefined) {
|
||||
const newSpentScore = getActorSkillScore(actor, skillKey, 'spent') + params.usure;
|
||||
console.log(newSpentScore);
|
||||
updateActorSkillScore(actor, skillKey, 'spent', newSpentScore);
|
||||
@@ -309,7 +309,7 @@ export class VermineFight {
|
||||
h.on("change", 'select[name="skill"]', event => {
|
||||
const skillLabel = $(event.target).val();
|
||||
const currentSkillScore = getActorSkillScore(actor, skillLabel) - getActorSkillScore(actor, skillLabel, 'spent');
|
||||
if (parseInt(currentSkillScore,10) >= 0){
|
||||
if (parseInt(currentSkillScore, 10) >= 0) {
|
||||
h.find('input#skillScore').val(currentSkillScore);
|
||||
}
|
||||
});
|
||||
@@ -321,7 +321,7 @@ export class VermineFight {
|
||||
}
|
||||
|
||||
export class VermineCombat extends Combat {
|
||||
_encounterCheck(){
|
||||
_encounterCheck() {
|
||||
console.log('encounter combat object', this);
|
||||
}
|
||||
|
||||
@@ -338,7 +338,7 @@ export class VermineCombat extends Combat {
|
||||
}*/
|
||||
const combatant = this.combatants.get(ids[0]);
|
||||
let token = canvas.scene.tokens.get(combatant.tokenId);
|
||||
combatant.type = game.actors.get( combatant.actorId)?.type;
|
||||
combatant.type = game.actors.get(combatant.actorId)?.type;
|
||||
combatant.disposition = token.disposition;
|
||||
let enemies = [];
|
||||
|
||||
@@ -346,7 +346,7 @@ export class VermineCombat extends Combat {
|
||||
let token = canvas.scene.tokens.get(cbt.tokenId);
|
||||
let enemy = token.actor;
|
||||
const isEnemy = (token.disposition == -1) ? true : false;
|
||||
if (isEnemy){
|
||||
if (isEnemy) {
|
||||
enemies.push({
|
||||
id: enemy.id,
|
||||
name: enemy.name,
|
||||
@@ -363,7 +363,7 @@ export class VermineCombat extends Combat {
|
||||
return (token.disposition == 1 && cbt.id != combatant.id) ? true : false;
|
||||
});
|
||||
|
||||
if (combatant.type != 'character'){
|
||||
if (combatant.type != 'character') {
|
||||
let warningDialogHTML = await renderTemplate('systems/vermine2047/templates/dialogs/warning.html', {
|
||||
warningText: "Seuls les PJs peuvent initier des confrontations. Relancer l'opération au tour du PJ actif."
|
||||
});
|
||||
@@ -381,7 +381,7 @@ export class VermineCombat extends Combat {
|
||||
VermineFight.ui({
|
||||
speakerId: combatant.actorId,
|
||||
speakerWeapons: fightingActor.items.filter(item => item.type == 'weapon'),
|
||||
speakerExperience:fightingActor.system.attributes.experience.value,
|
||||
speakerExperience: fightingActor.system.attributes.experience.value,
|
||||
speakerEffects: token.actor.effects,
|
||||
adversaries: enemies,
|
||||
allies: allies
|
||||
@@ -445,10 +445,10 @@ export class VermineCombatTracker extends CombatTracker {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
get template() {
|
||||
return "systems/gods-system/templates/combat/tracker.hbs";
|
||||
}
|
||||
return "systems/vermine2047/templates/combat-tracker.hbs";
|
||||
}
|
||||
|
||||
async getData(options) {
|
||||
async getData(options) {
|
||||
const context = await super.getData(options);
|
||||
|
||||
if (!context.hasCombat) {
|
||||
@@ -462,33 +462,32 @@ async getData(options) {
|
||||
context.turns[i].isCreature = combatant.actor.type == "creature";
|
||||
}
|
||||
return context;
|
||||
}
|
||||
}
|
||||
|
||||
activateListeners(html) {
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
html.find(".status").click(this._setStatut.bind(this));
|
||||
}
|
||||
html.find("[data-attitude]").click(this._setStatut.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @description Use to put an attitude to an actor
|
||||
* @param {*} event
|
||||
*/
|
||||
async _setStatut(event) {
|
||||
async _setStatut(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const btn = event.currentTarget;
|
||||
const attitude = btn.dataset.attitude;
|
||||
const li = btn.closest(".combatant");
|
||||
const combat = this.viewed;
|
||||
const combatant = combat.combatants.get(li.dataset.combatantId);
|
||||
let flag = combatant.getFlag("world", "attitude");
|
||||
if (flag == attitude) {
|
||||
return await combatant.setFlag("world", "attitude", null);
|
||||
} else {
|
||||
return await combatant.setFlag("world", "attitude", attitude);
|
||||
}
|
||||
|
||||
if ($(btn).hasClass('offensive'))
|
||||
await combatant.setFlag("world", "attitude", "offensive");
|
||||
else if ($(btn).hasClass('active'))
|
||||
await combatant.setFlag("world", "attitude", "active");
|
||||
else if ($(btn).hasClass('passive'))
|
||||
await combatant.setFlag("world", "attitude", "passive");
|
||||
else
|
||||
await combatant.setFlag("world", "attitude", null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* Pre-loaded templates are compiled and cached for fast access when rendering
|
||||
* @return {Promise}
|
||||
*/
|
||||
export const preloadHandlebarsTemplates = async function() {
|
||||
export const preloadHandlebarsTemplates = async function () {
|
||||
return loadTemplates([
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"systems/vermine2047/templates/actor/creature/creature-combat.hbs",
|
||||
|
||||
// additional templates
|
||||
"systems/vermine2047/templates/roll.hbs",
|
||||
"systems/vermine2047/templates/roll-dialog.hbs",
|
||||
]);
|
||||
};
|
||||
|
||||
@@ -76,23 +76,23 @@ export const registerHandlebarsHelpers = function () {
|
||||
Handlebars.registerHelper('concat', (...args) => args.slice(0, -1).join(''));
|
||||
Handlebars.registerHelper('lower', e => e.toLocaleLowerCase());
|
||||
|
||||
Handlebars.registerHelper('toLowerCase', function(str) {
|
||||
Handlebars.registerHelper('toLowerCase', function (str) {
|
||||
return str.toLowerCase();
|
||||
});
|
||||
|
||||
// search translation with variables
|
||||
Handlebars.registerHelper('smarttl', function (arrayLabel,objectLabel, options) {
|
||||
return game.i18n.localize(arrayLabel +"."+objectLabel+".name");
|
||||
Handlebars.registerHelper('smarttl', function (arrayLabel, objectLabel, options) {
|
||||
return game.i18n.localize(arrayLabel + "." + objectLabel + ".name");
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('smarttlk', function (arrayLabel,objectLabel, key) {
|
||||
return game.i18n.localize(arrayLabel +"."+objectLabel+"."+key);
|
||||
Handlebars.registerHelper('smarttlk', function (arrayLabel, objectLabel, key) {
|
||||
return game.i18n.localize(arrayLabel + "." + objectLabel + "." + key);
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('smartcfg', function (configLabel, objectLabel) {
|
||||
let text = "";
|
||||
text = game.i18n.localize(CONFIG.VERMINE[configLabel][objectLabel]);
|
||||
if (text == null){
|
||||
if (text == null) {
|
||||
text = CONFIG.VERMINE[configLabel][objectLabel];
|
||||
}
|
||||
return text;
|
||||
@@ -104,7 +104,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 4)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.ThreatLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -116,7 +116,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 4)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.ExperienceLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -128,7 +128,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 4)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.RoleLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -140,7 +140,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 4)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.PatternLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -152,7 +152,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 4)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.SizeLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -164,7 +164,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 0 || level > 3)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.PackLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -176,8 +176,9 @@ export const registerHandlebarsHelpers = function () {
|
||||
Handlebars.registerHelper('skillLevel', function (property, level, options) {
|
||||
if (level < 1 || level > 5)
|
||||
return "";
|
||||
level = parseInt(level);
|
||||
let levelData = CONFIG.VERMINE.SkillLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -189,7 +190,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 5)
|
||||
return "";
|
||||
let levelData = CONFIG.VERMINE.DifficultyLevels[level];
|
||||
if (property == 'label'){
|
||||
if (property == 'label') {
|
||||
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
|
||||
} else {
|
||||
return (levelData !== undefined) ? levelData[property] : "";
|
||||
@@ -202,7 +203,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
if (level < 1 || level > 3)
|
||||
return "";
|
||||
let ageData = CONFIG.VERMINE.AgeTypes[level];
|
||||
if (property == 'name'){
|
||||
if (property == 'name') {
|
||||
return (ageData !== undefined) ? game.i18n.localize(ageData[property]) : "";
|
||||
} else {
|
||||
return (ageData !== undefined) ? ageData[property] : "";
|
||||
@@ -217,21 +218,50 @@ export const registerHandlebarsHelpers = function () {
|
||||
});
|
||||
|
||||
|
||||
Handlebars.registerHelper('range', function() {
|
||||
Handlebars.registerHelper('range', function () {
|
||||
var args = Array.prototype.slice.call(arguments),
|
||||
rangeArgs = args.slice(0, -1),
|
||||
options = args[args.length - 1];
|
||||
|
||||
return range.apply(null, rangeArgs)
|
||||
.map(function(num) { return options.fn(num); })
|
||||
.map(function (num) { return options.fn(num); })
|
||||
.join('');
|
||||
});
|
||||
|
||||
// return age type information
|
||||
Handlebars.registerHelper('ife', function(arg1, arg2, options) {
|
||||
Handlebars.registerHelper('ife', function (arg1, arg2, options) {
|
||||
return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('ifgt', function (a, b, options) {
|
||||
if (a > b) { return options.fn(this); }
|
||||
return options.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('iflt', function (a, b, options) {
|
||||
if (a < b) { return options.fn(this); }
|
||||
return options.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('ifgteq', function (a, b, options) {
|
||||
if (a >= b) { return options.fn(this); }
|
||||
return options.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('iflteq', function (a, b, options) {
|
||||
if (a <= b) { return options.fn(this); }
|
||||
return options.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('ifincludes', function (arg1, arg2, options) {
|
||||
return (arg1.includes(arg2)) ? options.fn(this) : options.inverse(this);
|
||||
});
|
||||
|
||||
|
||||
Handlebars.registerHelper('repeat', function (times, start, block) {
|
||||
var accum = '';
|
||||
if (!start) { start = 0; }
|
||||
for (var i = start; i < times + start; ++i) {
|
||||
block.data.index = i;
|
||||
block.data.first = i === start;
|
||||
block.data.last = i === (times + start - 1);
|
||||
accum += block.fn(this);
|
||||
}
|
||||
return accum;
|
||||
});
|
||||
|
||||
}
|
||||
+51
-8
@@ -1,20 +1,62 @@
|
||||
import { RollDialog } from "./dialogs.mjs";
|
||||
import { initUserDice } from "./dice3d.mjs";
|
||||
import { VermineUtils } from "./roll.mjs";
|
||||
import { registerTours } from "./tour.mjs";
|
||||
|
||||
export const registerHooks = function () {
|
||||
/**
|
||||
* Ready hook loads tables, and override's foundry's entity link functions to provide extension to pseudo entities
|
||||
*/
|
||||
CONFIG.debug.hooks = true;
|
||||
Hooks.once('diceSoNiceReady', async (dice3d) => {
|
||||
dice3d.addSystem({ id: "Vermine2047", name: "Vermine 2047" }, "preferred");
|
||||
|
||||
dice3d.addDicePreset({
|
||||
type: "d10",
|
||||
labels: [
|
||||
"systems/vermine2047/assets/images/die/d10-1.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-2.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-3.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-4.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-5.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-6.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-7.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-8.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-9.webp",
|
||||
"systems/vermine2047/assets/images/die/d10-0.webp",
|
||||
],
|
||||
|
||||
system: "Vermine2047"
|
||||
});
|
||||
|
||||
|
||||
await initUserDice(dice3d);
|
||||
|
||||
});
|
||||
|
||||
Hooks.on('renderChatMessage', async (message, html, data) => {
|
||||
if (message.user._id != game.user._id) { return }
|
||||
await VermineUtils.chatListenners(html)
|
||||
})
|
||||
|
||||
|
||||
Hooks.on('updateUser', async () => {
|
||||
if (game.dice3d) {
|
||||
initUserDice(game.dice3d)
|
||||
|
||||
}
|
||||
})
|
||||
Hooks.once("ready", async () => {
|
||||
console.info("Vermine 2047 | System Initialized.");
|
||||
await registerTours();
|
||||
|
||||
});
|
||||
|
||||
// changement de la pause
|
||||
Hooks.on("renderPause", async function () {
|
||||
if ($("#pause").attr("class") !== "paused") return;
|
||||
$(".paused img").attr("src", 'systems/vermine2047/assets/images/ui/vermine_pause.webp');
|
||||
$(".paused img").css({ "opacity": 1});
|
||||
$(".paused img").css({ "opacity": 1 });
|
||||
$("#pause.paused figcaption").text("Communauté endormie...");
|
||||
});
|
||||
|
||||
@@ -34,16 +76,17 @@ export const registerHooks = function () {
|
||||
return false;
|
||||
});
|
||||
|
||||
Hooks.on('getSceneControlButtons', (controls) => {
|
||||
/*controls.find((c) => c.name === 'token').tools.push({
|
||||
Hooks.on('getSceneControlButtons', async (controls) => {
|
||||
console.log;
|
||||
controls.find((c) => c.name === 'token').tools.push({
|
||||
name: 'Dice Roller',
|
||||
title: game.i18n.localize("VERMINE.RollTool"),
|
||||
icon: 'fas fa-dice-d6',
|
||||
icon: 'fas fa-dice-d10',
|
||||
button: true,
|
||||
onClick() {
|
||||
VermineRoll.ui();
|
||||
RollDialog.create().then(d => d.render(true));
|
||||
}
|
||||
});*/
|
||||
});
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -53,13 +96,13 @@ export const registerHooks = function () {
|
||||
Hooks.on("preCreateActor", function (actor) {
|
||||
console.log('pre create actor', actor.img);
|
||||
if (actor.img == "icons/svg/mystery-man.svg") {
|
||||
actor.updateSource({"img": `systems/vermine2047/assets/icons/actors/${actor.type}.webp`});
|
||||
actor.updateSource({ "img": `systems/vermine2047/assets/icons/actors/${actor.type}.webp` });
|
||||
}
|
||||
});
|
||||
|
||||
Hooks.on("preCreateItem", function (item) {
|
||||
if (item.img == "icons/svg/item-bag.svg") {
|
||||
item.updateSource({"img": `systems/vermine2047/assets/icons/items/${item.type}.webp`});
|
||||
item.updateSource({ "img": `systems/vermine2047/assets/icons/items/${item.type}.webp` });
|
||||
// item.updateSource({"img": `systems/vermine2047/icons/competence.webp`});
|
||||
}
|
||||
});
|
||||
|
||||
+225
-12
@@ -1,21 +1,234 @@
|
||||
export class VermineRoll {
|
||||
export class VermineUtils {
|
||||
/**
|
||||
* Méthode pour effectuer un jet de dés avec différentes options
|
||||
* @param {Object} options - Les options du jet de dés
|
||||
* @returns {Roll} - Le résultat du jet de dés
|
||||
*/
|
||||
static async roll({ actor, NoD, Reroll = 0, difficulty = 7, self_control = 0, rollLabel = "jet custom", totems = { human: false, adapted: false }, max_effort = 0 }) {
|
||||
// Déclaration des variables
|
||||
let formula = "";
|
||||
let modFormula = null;
|
||||
|
||||
static roll(actorId, label, NoD, Reroll = 0, params = {}){
|
||||
const actor = game.actors.get(actorId);
|
||||
let formula = '' + (parseInt(NoD,10) + parseInt(Reroll,10)) + "d10";
|
||||
if (Reroll > 0 && params.difficulty != undefined){
|
||||
formula += 'kh' + NoD;
|
||||
// Vérification des totems humains
|
||||
if (totems.human) {
|
||||
NoD--;
|
||||
modFormula = "(1D10cs>=" + difficulty + `[human_${game.user.name}]*2)`;
|
||||
await actor.update({
|
||||
"system.adaptation.totems.human.value": actor.system.adaptation.totems.human.value - 1
|
||||
})
|
||||
}
|
||||
formula += (params.difficulty != undefined) ? "cs>" + params.difficulty : "cs>7";
|
||||
// Vérification des totems adaptés
|
||||
if (totems.adapted) {
|
||||
NoD--;
|
||||
// Construction de la formule modifiée
|
||||
if (modFormula != null) {
|
||||
modFormula = modFormula + "+(1D10cs>=" + difficulty + `[adapted_${game.user.name}]*2)`;
|
||||
} else {
|
||||
modFormula = "(1D10cs>=" + difficulty + `[adapted_${game.user.name}]*2)`;
|
||||
}
|
||||
await actor.update({
|
||||
"system.adaptation.totems.adapted.value": actor.system.adaptation.totems.adapted.value - 1
|
||||
})
|
||||
};
|
||||
|
||||
// Construction de la formule de base
|
||||
let baseFormula = '' + NoD + "d10";
|
||||
baseFormula += (difficulty != undefined) ? "cs>=" + difficulty : "cs>=7";
|
||||
baseFormula += `[regular_${game.user.name}]`
|
||||
|
||||
// Construction de la formule finale
|
||||
if (modFormula != null) {
|
||||
formula = baseFormula + "+" + modFormula;
|
||||
} else { formula = baseFormula }
|
||||
|
||||
// Création du jet de dés
|
||||
let roll = new Roll(formula, actor.getRollData());
|
||||
roll.toMessage({
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
flavor: label,
|
||||
rollMode: game.settings.get('core', 'rollMode'),
|
||||
});
|
||||
await roll.evaluate();
|
||||
await VermineUtils.showDiceSoNice(roll);
|
||||
VermineUtils.diplayChatRoll(roll, ...arguments);
|
||||
return roll;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode pour gérer les événements de relance de dés
|
||||
* @param {Object} message - Le message contenant l'événement de relance
|
||||
* @param {Object} ev - L'événement de relance
|
||||
*/
|
||||
static async _onRerollSelect(message, ev) {
|
||||
// Vérification de l'utilisateur
|
||||
if (game.user._id != message.user._id) {
|
||||
ui.notifications.warn('vous ne pouvez pas relancer un dés sur ce jet')
|
||||
return false
|
||||
}
|
||||
|
||||
// Récupération du nombre de relances autorisé
|
||||
let rerollCount = ev.currentTarget.closest('div.vermine-roll-message').querySelector('#allowed_reroll')?.innerText;
|
||||
// Vérification du nombre de relances restantes
|
||||
if (!rerollCount || parseInt(rerollCount) < 1) {
|
||||
console.log('no reroll')
|
||||
ui.notifications.warn("plus de relance possible");
|
||||
let rerollables = ev.currentTarget.closest('ul').querySelectorAll('.rerollable');
|
||||
rerollables.forEach(el => el.classList.remove('rerollable'));
|
||||
|
||||
// Mise à jour du nombre de relances restantes
|
||||
ev.currentTarget.closest('div.vermine-roll-message').querySelector('#allowed_reroll').innerText = rerollCount - 1;
|
||||
|
||||
let content = ev.currentTarget.closest('div.message-content').outerHTML;
|
||||
|
||||
await message.update({
|
||||
content: content
|
||||
})
|
||||
return false
|
||||
}
|
||||
ev.currentTarget.classList.add('rerolled');
|
||||
|
||||
// Mise en place de la relance
|
||||
await message.setFlag("world", "reroll", true);
|
||||
|
||||
// Récupération de la difficulté et du type de dé
|
||||
let difficulty = ev.currentTarget.closest('ul').dataset.difficulty;
|
||||
let diceType = ev.currentTarget.dataset.diceType;
|
||||
|
||||
// Mise à jour du nombre de relances restantes
|
||||
ev.currentTarget.closest('div.vermine-roll-message').querySelector('#allowed_reroll').innerText = rerollCount - 1;
|
||||
|
||||
// Construction de la formule de relance
|
||||
let formula = `1d10cs>=${difficulty}`;
|
||||
console.log(diceType)
|
||||
switch (diceType.trim()) {
|
||||
case 'human':
|
||||
formula = `(1d10cs>=${difficulty}[human_${game.user.name}])*2`
|
||||
break;
|
||||
case 'adapted':
|
||||
formula = `(1d10cs>=${difficulty}[adapted_${game.user.name}])*2`
|
||||
break;
|
||||
default:
|
||||
formula += `[regular_${game.user.name}]`
|
||||
break;
|
||||
};
|
||||
|
||||
// Création et évaluation du jet de dés de relance
|
||||
let reroll = await new Roll(formula);
|
||||
await reroll.evaluate();
|
||||
await VermineUtils.showDiceSoNice(reroll);
|
||||
// mise à jour de l'affichage du dés
|
||||
console.log(reroll)
|
||||
let result = reroll.dice[0].results[0].result;
|
||||
ev.currentTarget.querySelector('span').innerText = result;
|
||||
//mise à jour du total
|
||||
let success = reroll.dice[0].results[0].success;
|
||||
if (success) {
|
||||
ev.currentTarget.classList.add('success')
|
||||
let total = parseInt(ev.currentTarget.closest('.vermine-roll-message').querySelector('#total').innerText) + reroll.total
|
||||
ev.currentTarget.closest('.vermine-roll-message').querySelector('#total').innerText = total
|
||||
}
|
||||
// Mise à jour de l'affichagedu message
|
||||
ev.currentTarget.classList.remove("rerollable")
|
||||
let content = ev.currentTarget.closest('div.message-content').outerHTML;
|
||||
console.log(reroll, message);
|
||||
|
||||
await message.update({
|
||||
content: content
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode pour gérer les événements de chat
|
||||
* @param {HTMLElement} html - L'élément HTML contenant les événements de chat
|
||||
*/
|
||||
static async chatListenners(html) {
|
||||
let reroll = html.find('#allowed_reroll')[0]?.innerText;
|
||||
if (!reroll || parseInt(reroll) < 1) {
|
||||
for (let die of html.find('.die')) {
|
||||
die.classList.remove("rerollable")
|
||||
};
|
||||
} else {
|
||||
for (let die of html.find('.die')) {
|
||||
die.classList.add("rerollable")
|
||||
};
|
||||
}
|
||||
html.find('.rerollable').click(async (ev) => {
|
||||
ev.preventDefault();
|
||||
let msgId = ev.currentTarget.closest("li.message").dataset.messageId;
|
||||
let message = await game.messages.get(msgId);
|
||||
await VermineUtils._onRerollSelect(message, ev);
|
||||
});
|
||||
|
||||
html.find("#effort-reroll").change(ev => {
|
||||
let label = html.find("#granted-reroll")[0]
|
||||
label.innerText = ev.currentTarget.value
|
||||
});
|
||||
html.find("button.grant-reroll").click(async (ev) => {
|
||||
html.find("#allowed_reroll")[0].innerText = html.find('#granted-reroll')[0].innerText
|
||||
let mesEl = ev.currentTarget.closest('[data-message-id]')
|
||||
let messageId = mesEl.dataset.messageId;
|
||||
ev.currentTarget.closest('.reroll-from-effort').style.display="none"
|
||||
let content = ev.currentTarget.closest(".vermine-roll-message").outerHTML;
|
||||
let message = await game.messages.get(messageId);
|
||||
await message.update({ content: content });
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode pour afficher les résultats des dés de manière graphique
|
||||
* @param {Roll} roll - Le jet de dés à afficher
|
||||
* @param {string} rollMode - Le mode d'affichage du jet de dés
|
||||
*/
|
||||
static async showDiceSoNice(roll, rollMode) {
|
||||
if (game.modules.get("dice-so-nice")?.active) {
|
||||
if (game.dice3d) {
|
||||
let whisper = null;
|
||||
let blind = false;
|
||||
rollMode = rollMode ?? game.settings.get("core", "rollMode");
|
||||
switch (rollMode) {
|
||||
case "blindroll": //GM only
|
||||
blind = true;
|
||||
case "gmroll": //GM + rolling player
|
||||
whisper = this.getUsers(user => user.isGM);
|
||||
break;
|
||||
case "roll": //everybody
|
||||
whisper = this.getUsers(user => user.active);
|
||||
break;
|
||||
case "selfroll":
|
||||
whisper = [game.user.id];
|
||||
break;
|
||||
}
|
||||
await game.dice3d.showForRoll(roll, game.user, true, whisper, blind);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode pour récupérer un jet de dés à partir d'un message
|
||||
* @param {string} messageId - L'identifiant du message contenant le jet de dés
|
||||
*/
|
||||
static async getRollFromMessage(messageId) {
|
||||
let message = await game.messages.get(messageId);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Méthode pour afficher un jet de dés dans le chat
|
||||
* @param {Roll} roll - Le jet de dés à afficher
|
||||
* @param {Object} param - Les paramètres du jet de dés
|
||||
* @returns {ChatMessage} - Le message affichant le jet de dés
|
||||
*/
|
||||
static async diplayChatRoll(roll, param) {
|
||||
let content = await renderTemplate("systems/vermine2047/templates/roll-message.hbs", { roll, param })
|
||||
let chatData = {
|
||||
user: game.user._id,
|
||||
speaker: ChatMessage.getSpeaker(),
|
||||
content: content,
|
||||
roll: roll
|
||||
};
|
||||
let msg = await ChatMessage.create(chatData);
|
||||
await msg.setFlag('world', 'roll', roll);
|
||||
return msg
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -12,7 +12,20 @@ export const registerSettings = function () {
|
||||
},
|
||||
default: 'e',
|
||||
onChange: value => {
|
||||
// console.log(value);
|
||||
let el = document.querySelector('.game-mode');
|
||||
el.id = 'game-mode-' + game.settings.get('vermine2047', 'game-mode')
|
||||
switch (game.settings.get('vermine2047', 'game-mode')) {
|
||||
case '1':
|
||||
el.innerText = 'mode survie';
|
||||
|
||||
break;
|
||||
case '2':
|
||||
el.innerText = 'mode cauchemard'
|
||||
break;
|
||||
case '3':
|
||||
el.innerText = 'mode apocalypse'
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+26
-4
@@ -12,31 +12,32 @@ import { VermineCreatureSheet } from "./sheets/creature-sheet.mjs";
|
||||
import { VermineItem } from "./documents/item.mjs";
|
||||
import { VermineItemSheet } from "./sheets/item-sheet.mjs";
|
||||
|
||||
import { VermineRoll } from "./system/roll.mjs";
|
||||
import { VermineUtils } from "./system/roll.mjs";
|
||||
import { VermineCombat, VermineCombatTracker } from "./system/fight.mjs";
|
||||
|
||||
// Import helper/utility classes and constants.
|
||||
import { preloadHandlebarsTemplates, registerHandlebarsHelpers } from "./system/handlebars-manager.mjs";
|
||||
import { VERMINE } from "./system/config.mjs";
|
||||
import { initUserDice } from "./system/dice3d.mjs";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Init Hook */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Hooks.once('init', async function() {
|
||||
Hooks.once('init', async function () {
|
||||
|
||||
// Add utility classes to the global game object so that they're more easily
|
||||
// accessible in global contexts.
|
||||
game.vermine2047 = {
|
||||
VermineActor,
|
||||
VermineItem,
|
||||
VermineRoll,
|
||||
VermineUtils,
|
||||
VermineCombat
|
||||
};
|
||||
|
||||
// Add custom constants for configuration.
|
||||
CONFIG.VERMINE = VERMINE;
|
||||
|
||||
CONFIG.VERMINE.model = game.system.model
|
||||
/**
|
||||
* Set an initiative formula for the system
|
||||
* @type {String}
|
||||
@@ -79,6 +80,27 @@ Hooks.once('init', async function() {
|
||||
registerHooks(); // register Hooks
|
||||
registerSettings(); // register Vermine Settings
|
||||
|
||||
//afficher le mode de jeu
|
||||
let mode = game.settings.get('vermine2047', 'game-mode');
|
||||
let el = document.createElement('SPAN');
|
||||
switch (mode) {
|
||||
case '1':
|
||||
el.innerText = 'mode survie';
|
||||
break;
|
||||
case '2':
|
||||
el.innerText = 'mode cauchemard';
|
||||
break;
|
||||
case '3':
|
||||
el.innerText = 'mode apocalypse';
|
||||
break;
|
||||
}
|
||||
el.classList.add('game-mode');
|
||||
el.id = 'game-mode-' + mode;
|
||||
document.querySelector('#ui-left').prepend(el);
|
||||
|
||||
|
||||
|
||||
// Preload Handlebars templates.
|
||||
return preloadHandlebarsTemplates();
|
||||
|
||||
});
|
||||
|
||||
Generated
+5887
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "vermine2047",
|
||||
"version": "1.0.0",
|
||||
"description": "vermine 2047 for foundry",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"launch window Foundry11": "cd C:/Program Files/Foundry Virtual Tabletop_V11/resources/app && node main.js",
|
||||
"watch": "gulp watch",
|
||||
"buildStyle": "gulp buildStyles"
|
||||
},
|
||||
"author": "",
|
||||
"devDependencies": {
|
||||
"@typhonjs-fvtt/eslint-config-foundry.js": "^0.8.0",
|
||||
"browser-sync": "^2.27.11",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-sass": "^5.1.0",
|
||||
"sass": "^1.55.0"
|
||||
}
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000127
|
||||
MANIFEST-000177
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
2023/09/07-17:42:45.351570 7f3e00bf0640 Recovering log #121
|
||||
2023/09/07-17:42:45.359683 7f3e00bf0640 Delete type=0 #121
|
||||
2023/09/07-17:42:45.359723 7f3e00bf0640 Delete type=3 #119
|
||||
2023/09/07-17:43:21.919681 7f3df7cfb640 Level-0 table #126: started
|
||||
2023/09/07-17:43:21.919705 7f3df7cfb640 Level-0 table #126: 0 bytes OK
|
||||
2023/09/07-17:43:21.925140 7f3df7cfb640 Delete type=0 #124
|
||||
2023/09/07-17:43:21.932544 7f3df7cfb640 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.076 b5c Recovering log #174
|
||||
2024/04/26-22:48:34.079 b5c Delete type=0 #174
|
||||
2024/04/26-22:48:34.081 b5c Delete type=3 #173
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000127
|
||||
MANIFEST-000177
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
2023/09/07-17:42:45.379151 7f3e01bf2640 Recovering log #121
|
||||
2023/09/07-17:42:45.393418 7f3e01bf2640 Delete type=0 #121
|
||||
2023/09/07-17:42:45.393457 7f3e01bf2640 Delete type=3 #119
|
||||
2023/09/07-17:43:21.937228 7f3df7cfb640 Level-0 table #126: started
|
||||
2023/09/07-17:43:21.937306 7f3df7cfb640 Level-0 table #126: 0 bytes OK
|
||||
2023/09/07-17:43:21.941263 7f3df7cfb640 Delete type=0 #124
|
||||
2023/09/07-17:43:21.945982 7f3df7cfb640 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.179 b5c Recovering log #174
|
||||
2024/04/26-22:48:34.188 b5c Delete type=0 #174
|
||||
2024/04/26-22:48:34.188 b5c Delete type=3 #173
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000111
|
||||
MANIFEST-000161
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
2023/09/07-17:42:45.361812 7f3e023f3640 Recovering log #105
|
||||
2023/09/07-17:42:45.375049 7f3e023f3640 Delete type=3 #103
|
||||
2023/09/07-17:42:45.375081 7f3e023f3640 Delete type=0 #105
|
||||
2023/09/07-17:43:21.928733 7f3df7cfb640 Level-0 table #110: started
|
||||
2023/09/07-17:43:21.928798 7f3df7cfb640 Level-0 table #110: 0 bytes OK
|
||||
2023/09/07-17:43:21.932413 7f3df7cfb640 Delete type=0 #108
|
||||
2023/09/07-17:43:21.932652 7f3df7cfb640 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.099 b5c Recovering log #158
|
||||
2024/04/26-22:48:34.107 b5c Delete type=0 #158
|
||||
2024/04/26-22:48:34.107 b5c Delete type=3 #157
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000125
|
||||
MANIFEST-000175
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
2023/09/07-17:42:45.376908 7f3e013f1640 Recovering log #119
|
||||
2023/09/07-17:42:45.390868 7f3e013f1640 Delete type=0 #119
|
||||
2023/09/07-17:42:45.390911 7f3e013f1640 Delete type=3 #117
|
||||
2023/09/07-17:43:21.941413 7f3df7cfb640 Level-0 table #124: started
|
||||
2023/09/07-17:43:21.941481 7f3df7cfb640 Level-0 table #124: 0 bytes OK
|
||||
2023/09/07-17:43:21.945682 7f3df7cfb640 Delete type=0 #122
|
||||
2023/09/07-17:43:21.946023 7f3df7cfb640 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.159 1544 Recovering log #172
|
||||
2024/04/26-22:48:34.165 1544 Delete type=0 #172
|
||||
2024/04/26-22:48:34.166 1544 Delete type=3 #171
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000018
|
||||
MANIFEST-000071
|
||||
|
||||
+3
-8
@@ -1,8 +1,3 @@
|
||||
2023/09/07-17:42:45.340397 7f3e013f1640 Recovering log #12
|
||||
2023/09/07-17:42:45.348853 7f3e013f1640 Delete type=0 #12
|
||||
2023/09/07-17:42:45.348874 7f3e013f1640 Delete type=3 #10
|
||||
2023/09/07-17:43:21.915992 7f3df7cfb640 Level-0 table #17: started
|
||||
2023/09/07-17:43:21.916004 7f3df7cfb640 Level-0 table #17: 0 bytes OK
|
||||
2023/09/07-17:43:21.919638 7f3df7cfb640 Delete type=0 #15
|
||||
2023/09/07-17:43:21.925330 7f3df7cfb640 Manual compaction at level-0 from '!items!10vhNURxl8FOwfy0' @ 72057594037927935 : 1 .. '!items!vX832Z4LpasxLIIx' @ 0 : 0; will stop at (end)
|
||||
2023/09/07-17:43:21.932584 7f3df7cfb640 Manual compaction at level-1 from '!items!10vhNURxl8FOwfy0' @ 72057594037927935 : 1 .. '!items!vX832Z4LpasxLIIx' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.121 1544 Recovering log #68
|
||||
2024/04/26-22:48:34.127 1544 Delete type=0 #68
|
||||
2024/04/26-22:48:34.127 1544 Delete type=3 #67
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000018
|
||||
MANIFEST-000068
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
2023/09/07-17:42:45.340398 7f3e01bf2640 Recovering log #12
|
||||
2023/09/07-17:42:45.348853 7f3e01bf2640 Delete type=0 #12
|
||||
2023/09/07-17:42:45.348878 7f3e01bf2640 Delete type=3 #10
|
||||
2023/09/07-17:43:21.901412 7f3df7cfb640 Level-0 table #17: started
|
||||
2023/09/07-17:43:21.901429 7f3df7cfb640 Level-0 table #17: 0 bytes OK
|
||||
2023/09/07-17:43:21.905137 7f3df7cfb640 Delete type=0 #15
|
||||
2023/09/07-17:43:21.915980 7f3df7cfb640 Manual compaction at level-0 from '!tables!UxgGMRs0kTplpTbe' @ 72057594037927935 : 1 .. '!tables.results!dXo0EN9ieo1tSnRY.ymnitiW2yAuk75M3' @ 0 : 0; will stop at (end)
|
||||
2023/09/07-17:43:21.919676 7f3df7cfb640 Manual compaction at level-1 from '!tables!UxgGMRs0kTplpTbe' @ 72057594037927935 : 1 .. '!tables.results!dXo0EN9ieo1tSnRY.ymnitiW2yAuk75M3' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.142 b5c Recovering log #65
|
||||
2024/04/26-22:48:34.148 b5c Delete type=0 #65
|
||||
2024/04/26-22:48:34.148 b5c Delete type=3 #64
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000125
|
||||
MANIFEST-000175
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
2023/09/07-17:42:45.351565 7f3e023f3640 Recovering log #119
|
||||
2023/09/07-17:42:45.359682 7f3e023f3640 Delete type=0 #119
|
||||
2023/09/07-17:42:45.359722 7f3e023f3640 Delete type=3 #117
|
||||
2023/09/07-17:43:21.925366 7f3df7cfb640 Level-0 table #124: started
|
||||
2023/09/07-17:43:21.925434 7f3df7cfb640 Level-0 table #124: 0 bytes OK
|
||||
2023/09/07-17:43:21.928599 7f3df7cfb640 Delete type=0 #122
|
||||
2023/09/07-17:43:21.932611 7f3df7cfb640 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-22:48:34.087 1544 Recovering log #172
|
||||
2024/04/26-22:48:34.091 1544 Delete type=0 #172
|
||||
2024/04/26-22:48:34.092 1544 Delete type=3 #171
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,668 @@
|
||||
@font-face {
|
||||
font-family: "DistressBlack";
|
||||
src: url("../assets/fonts/dcc_sharp_distress_black_by_dccanim.otf");
|
||||
}
|
||||
|
||||
.sans-font {
|
||||
font-family: "DistressBlack", sans-serif;
|
||||
}
|
||||
|
||||
/* Change shadow colors and Foundry general font color!! */
|
||||
.app {
|
||||
box-shadow: 0 0 20px #7e4444;
|
||||
/* Change the color code here for a nice shadow color! */
|
||||
color: #dfdfdf;
|
||||
/* Text color for window titles and menu all across Foundry */
|
||||
}
|
||||
|
||||
/* Character and Item Name Titles Text style! */
|
||||
.sheet .charname input {
|
||||
color: #191813;
|
||||
font-family: "DistressBlack", sans-serif;
|
||||
font-size: 30px;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* custom styles */
|
||||
body.system-vermine2047 img#logo {
|
||||
content: url("/systems/vermine2047/assets/images/ui/logo_vermine_foundry.webp");
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Customize the chat roll area! */
|
||||
#chat-form textarea {
|
||||
background: url(/systems/vermine2047/assets/images/ui/box_background.webp) repeat;
|
||||
/*font-family: monospace;
|
||||
font-size: 14px;
|
||||
color: black; */
|
||||
}
|
||||
|
||||
/* Customize the chat history area! */
|
||||
#chat-log .message {
|
||||
background: url(/systems/vermine2047/assets/images/ui/box_background.webp) repeat;
|
||||
/*color: #191813; */
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
ul.unstyled {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
ul.unstyled li {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.padding-with-frieze {
|
||||
margin-left: 18% !important;
|
||||
margin-right: 10% !important;
|
||||
}
|
||||
|
||||
.padding-with-frieze li {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.mx-auto {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* ----------------------------------------- */
|
||||
/* Sheet Structure */
|
||||
/* ----------------------------------------- */
|
||||
.system-vermine2047 .sheet .window-content {
|
||||
background: url(/systems/vermine2047/assets/images/ui/box_background.webp);
|
||||
padding: 0;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.system-vermine2047 .dialog .window-content {
|
||||
background: url(/systems/vermine2047/assets/images/ui/fond_chat_box.webp);
|
||||
padding: 0.5rem;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.window-content .row.smb {
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
.window-content .row.mdb {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.window-content .row.lgb {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.actor.sheet form .form {
|
||||
display: grid;
|
||||
|
||||
grid-template-columns: minmax(230px, 1fr) 3fr;
|
||||
grid-template-rows: 1fr;
|
||||
align-items: flex-start;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.actor.sheet .form aside {
|
||||
grid-row: span 1 / span 1;
|
||||
background-image: url(/systems/vermine2047/assets/images/ui/barre_laterale.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
height: 100%;
|
||||
width: 240px;
|
||||
padding: 0 0.3rem;
|
||||
box-shadow: -20px 0px 100px #000000b5 inset;
|
||||
|
||||
|
||||
.major-totem {
|
||||
position: relative;
|
||||
|
||||
h4 {
|
||||
position: absolute;
|
||||
transform: rotate(-8deg);
|
||||
opacity: 0.7;
|
||||
transition: 0.2s;
|
||||
|
||||
}
|
||||
|
||||
&:hover h4 {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.actor.sheet .form main {
|
||||
box-shadow: 10px 0px 100px #000000b5 inset;
|
||||
padding-left: 1rem;
|
||||
grid-row: span 1 / span 1;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.actor.sheet .form aside .image-wrapper {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.actor.sheet .form aside .image-wrapper img {
|
||||
width: 170px;
|
||||
height: 145px;
|
||||
}
|
||||
|
||||
.actor.sheet .form aside .paper {
|
||||
margin-top: 1rem;
|
||||
height: 350px;
|
||||
}
|
||||
|
||||
.actor.sheet .form aside .second-paper {
|
||||
margin-top: 4rem;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
.actor.sheet .form h3 {
|
||||
font-family: "DistressBlack", sans-serif;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
color: #4e564c;
|
||||
font-size: 1.7rem;
|
||||
border-bottom: none;
|
||||
margin: 0;
|
||||
|
||||
}
|
||||
|
||||
.actor.sheet .form h4,
|
||||
.item.sheet .form h4 {
|
||||
font-family: "DistressBlack", sans-serif;
|
||||
font-size: 1.4em;
|
||||
text-transform: uppercase;
|
||||
margin: 0 0 0.2rem;
|
||||
}
|
||||
|
||||
.actor.sheet .form .characteristics h4 {
|
||||
font-size: 1.25rem;
|
||||
margin-top: 0 0.1rem;
|
||||
}
|
||||
|
||||
.actor.sheet .form .tab.totem h4,
|
||||
.actor.sheet .form .tab.equipment h4,
|
||||
.actor.sheet .form .tab.stories h4 {
|
||||
margin-top: 0.875rem;
|
||||
}
|
||||
|
||||
.system-vermine2047 .char-header {
|
||||
font-family: "DistressBlack", sans-serif;
|
||||
}
|
||||
|
||||
.system-vermine2047 .char-header section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
|
||||
}
|
||||
|
||||
.system-vermine2047 .char-header h1.char-name,
|
||||
.system-vermine2047 .char-vermine2047 {
|
||||
border-bottom: none;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
.system-vermine2047 .char-vermine2047 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form div.hexa {
|
||||
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
|
||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.425) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
height: unset;
|
||||
max-width: 1.5rem;
|
||||
aspect-ratio: 1/1;
|
||||
color: black;
|
||||
transform: rotate(90deg);
|
||||
transition: 0.2s;
|
||||
margin: 0.2rem;
|
||||
|
||||
&:hover {
|
||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.425) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
|
||||
}
|
||||
|
||||
input {
|
||||
opacity: 1;
|
||||
min-width: 100%;
|
||||
min-height: 100%;
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
&.checked {
|
||||
&:hover {
|
||||
background: radial-gradient(circle, rgb(43, 43, 43) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
|
||||
}
|
||||
|
||||
background: radial-gradient(circle, rgb(0, 0, 0) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
}
|
||||
|
||||
&.unavailable {
|
||||
background: radial-gradient(circle, rgba(66, 15, 15, 0.664) 0%, rgba(131, 70, 70, 0.432) 100%);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor div.minor-totems {
|
||||
position: relative;
|
||||
background-color: #929c6f85;
|
||||
|
||||
h5 {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
||||
img {
|
||||
max-width: 2rem;
|
||||
position: absolute;
|
||||
bottom: -2rem;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.totem-dice {
|
||||
|
||||
.human-dice,
|
||||
.adapted-dice {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-left: 2rem;
|
||||
|
||||
|
||||
i {
|
||||
padding-top: 0.5rem;
|
||||
color: #064930;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.adapted-dice {
|
||||
justify-content: flex-end;
|
||||
margin-left: 0;
|
||||
margin-right: 2rem;
|
||||
transform: rotate(180deg);
|
||||
|
||||
i {
|
||||
transform: rotate(180deg);
|
||||
padding-top: 0.5rem;
|
||||
color: rgb(85, 52, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.human {
|
||||
left: 0;
|
||||
|
||||
img {
|
||||
left: 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.adapted {
|
||||
right: 0;
|
||||
|
||||
img {
|
||||
right: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form input[type=text],
|
||||
.system-vermine2047 .sheet.actor form input[type=number] {
|
||||
width: calc(100% - 2px);
|
||||
height: calc(100% - 2px);
|
||||
background: none;
|
||||
padding: 0;
|
||||
margin: 1px 0;
|
||||
color: #333;
|
||||
border: 1px solid transparent;
|
||||
|
||||
&.hexa {
|
||||
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
|
||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.425) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
height: unset;
|
||||
max-width: 1.5rem;
|
||||
aspect-ratio: 1/1;
|
||||
color: black
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form input[type=text]:hover:not(:disabled),
|
||||
.system-vermine2047 .sheet.actor form input[type=text]:focus,
|
||||
.system-vermine2047 .sheet.actor form select:hover:not(:disabled),
|
||||
.system-vermine2047 .sheet.actor form select:focus,
|
||||
.system-vermine2047 .sheet.actor form input[type=number]:hover:not(:disabled),
|
||||
.system-vermine2047 .sheet.actor form input[type=number]:focus,
|
||||
.system-vermine2047 .sheet.actor form textarea:hover:not(:disabled),
|
||||
.system-vermine2047 .sheet.actor form textarea:focus {
|
||||
box-shadow: 0 0 10px #005a3c inset;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form select {
|
||||
font-size: 0.6rem;
|
||||
border: none;
|
||||
appearance: none;
|
||||
min-width: fit-content;
|
||||
max-width: fit-content;
|
||||
padding: 0 0.2rem;
|
||||
margin: 0 0.2rem;
|
||||
cursor: help;
|
||||
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form label {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .mce-panel span {
|
||||
display: inherit;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form.editable .rollable:hover,
|
||||
.system-vermine2047 .sheet.actor form.editable a:hover {
|
||||
color: #000;
|
||||
text-shadow: 0 5px 5px #1fa832;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .sheet-tabs {
|
||||
font-weight: 500;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .sheet-tabs>.list-row {
|
||||
line-height: 24px;
|
||||
padding-top: 3px;
|
||||
font-size: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .sheet-tabs>.list-row:last-of-type {
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .sheet-tabs>.list-row.active {
|
||||
color: #000;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .tab {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor form .tag-legacy {
|
||||
float: left;
|
||||
margin: 0 2px 2px 0;
|
||||
padding: 0 3px;
|
||||
font-size: var(--font-size-10);
|
||||
line-height: 16px;
|
||||
border: 1px solid #999;
|
||||
border-radius: 3px;
|
||||
white-space: normal;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* ---------------------------------------- */
|
||||
/* Actor Sheet */
|
||||
/* ---------------------------------------- */
|
||||
|
||||
|
||||
.system-vermine2047 .sheet.actor,
|
||||
.system-vermine2047 .sheet.actor .window-content {
|
||||
min-width: 690px;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sidebar {
|
||||
width: 230px;
|
||||
min-height: 518px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .floatright {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-upper {
|
||||
height: 268px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-upper .sheet-header {
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-upper .sheet-profile,
|
||||
.system-vermine2047 .sheet.actor .sheet-upper .sheet-showcase {
|
||||
height: 220px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-content {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-sidebar {
|
||||
height: calc(100% - 48px);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-sidebar>* {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-sidebar .sidebar-summary {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor.npc-sheet .sheet-upper {
|
||||
height: 220px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor.npc-sheet .sheet-upper .sheet-showcase {
|
||||
height: 172px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor.npc-sheet .sheet-lower {
|
||||
height: calc(100% - 220px - 32px);
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-navigation {
|
||||
border-top: 1px solid var(--secondary-background);
|
||||
border-bottom: 1px solid var(--primary-background);
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-navigation .sheet-tabs>.list-row {
|
||||
border-radius: 5px 5px 0 0;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .sheet-navigation .sheet-tabs>.list-row.active {
|
||||
border: 1px solid #666;
|
||||
border-bottom: none;
|
||||
/* box-shadow: 0 0 10px inset #ff6400;
|
||||
*/
|
||||
background: var(--primary-background);
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
|
||||
color: #000;
|
||||
text-shadow: 0 0 10px #00005a;
|
||||
cursor: pointer;
|
||||
|
||||
}
|
||||
|
||||
|
||||
.actor.sheet nav.sheet-navigation {
|
||||
display: inline-flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
height: 54px;
|
||||
background: url(../assets/images/ui/barre_haut.webp) no-repeat right top;
|
||||
background-size: 100% 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
padding-right: 4rem;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.actor.sheet nav.sheet-navigation.tabs .item {
|
||||
height: 2.4rem;
|
||||
display: inline-block;
|
||||
z-index: 1;
|
||||
transition: all 0.1s ease-out;
|
||||
color: #606060;
|
||||
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.404);
|
||||
}
|
||||
|
||||
.actor.sheet nav.sheet-navigation.tabs .item:hover,
|
||||
.actor.sheet nav.sheet-navigation.tabs .item.active {
|
||||
color: #000;
|
||||
text-shadow: 0 5px 5px #1fa832;
|
||||
cursor: pointer;
|
||||
|
||||
}
|
||||
|
||||
.actor.sheet nav.sheet-navigation.tabs .item:hover {
|
||||
text-shadow: 0 5px 5px #1e52259a;
|
||||
|
||||
}
|
||||
|
||||
|
||||
.system-vermine2047 .sheet.actor form nav.sheet-navigation.sheet-tabs {
|
||||
height: 54px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet.actor .ability {
|
||||
padding-right: 0.6rem;
|
||||
font-size: 0.8rem;
|
||||
border-bottom: 1px solid rgba(170, 170, 152, 0.664);
|
||||
box-shadow: 0px 0px 15px rgba(128, 128, 128, 0) inset;
|
||||
transition: 0.2s;
|
||||
position: relative;
|
||||
|
||||
&:hover {
|
||||
box-shadow: 0px 0px 15px gray inset;
|
||||
}
|
||||
|
||||
label {
|
||||
min-width: fit-content;
|
||||
|
||||
}
|
||||
|
||||
span {
|
||||
max-width: fit-content;
|
||||
margin: 0 1rem;
|
||||
|
||||
flex: 0.5;
|
||||
}
|
||||
|
||||
.hexa {
|
||||
text-align: center;
|
||||
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
|
||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.425) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
max-height: 1.2rem;
|
||||
max-width: 1.2rem;
|
||||
aspect-ratio: 1/1;
|
||||
color: black;
|
||||
vertical-align: center;
|
||||
|
||||
&.checked {
|
||||
background: radial-gradient(circle, rgb(0, 0, 0) 0%, rgba(0, 0, 0, 0.288) 100%);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
div.specialties {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.skill-dots {
|
||||
height: 100%;
|
||||
align-self: center;
|
||||
flex: 1.5;
|
||||
|
||||
&>div {
|
||||
|
||||
max-width: 0.7rem;
|
||||
height: 0.7rem;
|
||||
aspect-ratio: 1/1;
|
||||
border-radius: 50%;
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
padding-bottom: 0.2rem;
|
||||
font-style: oblique;
|
||||
align-self: flex-start;
|
||||
|
||||
|
||||
&.dice-pool-dot {
|
||||
background: radial-gradient(circle, rgba(94, 90, 77, 1) 25%, rgba(0, 0, 0, 1) 100%);
|
||||
max-width: 0.7rem;
|
||||
aspect-ratio: 1/1;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
&.dice-reroll-dot {
|
||||
background: radial-gradient(circle, rgb(187, 182, 165) 25%, rgba(0, 0, 0, 1) 100%);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.vermine2047.sheet.actor input[type="radio"] {
|
||||
&::after {
|
||||
content: " ";
|
||||
display: block;
|
||||
width: 0.8rem;
|
||||
height: 0.8rem;
|
||||
background: radial-gradient(circle, rgba(217, 214, 204, 1) 0%, rgba(217, 214, 204, 1) 40%, rgb(85, 85, 85) 60%);
|
||||
border-radius: 50%;
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
&.checked {
|
||||
&::after {
|
||||
content: " ";
|
||||
display: block;
|
||||
width: 0.8rem;
|
||||
height: 0.8rem;
|
||||
background: radial-gradient(circle, rgb(75, 74, 74) 0%, rgb(27, 39, 28) 60%);
|
||||
border-radius: 50%;
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+178
@@ -0,0 +1,178 @@
|
||||
ol#chat-log {
|
||||
header.message-header {
|
||||
background-color: black;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.vermine-roll-message {
|
||||
overflow: hidden;
|
||||
box-shadow: 0px 0px 30px white inset;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
|
||||
|
||||
.flexrow {
|
||||
align-items: center;
|
||||
box-shadow: 0px 5px 10px 0px black;
|
||||
}
|
||||
|
||||
h3,
|
||||
h4 {
|
||||
text-transform: uppercase;
|
||||
font-family: "DistressBlack";
|
||||
margin-top: 1rem;
|
||||
border-bottom: none;
|
||||
font-weight: 900;
|
||||
font-weight: 900;
|
||||
background: 50% 0%/cover no-repeat url(/systems/vermine2047/assets/images/ui/scotch.webp);
|
||||
|
||||
&+span {
|
||||
font-family: "DistressBlack";
|
||||
font-size: large;
|
||||
text-transform: unset;
|
||||
|
||||
padding-left: 2rem;
|
||||
background: -100% 0%/cover no-repeat url(/systems/vermine2047/assets/images/ui/scotch.webp);
|
||||
|
||||
&#allowed_reroll {
|
||||
font-size: large;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
background: url(/systems/vermine2047/assets/images/ui/scotch.webp);
|
||||
background-position: center;
|
||||
background-size: 200%;
|
||||
}
|
||||
|
||||
h4 {
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
div.roll-total {
|
||||
transform: rotate(-3deg) scale(1.3) translateX(2rem) translateY(0.5rem);
|
||||
background: url(/systems/vermine2047/assets/images/ui/scotch.webp);
|
||||
background-position: center;
|
||||
background-size: 200%;
|
||||
margin-bottom: 2rem;
|
||||
padding: 0;
|
||||
z-index: +1;
|
||||
}
|
||||
|
||||
div.reroll {
|
||||
button {
|
||||
text-transform: uppercase;
|
||||
font-family: "DistressBlack";
|
||||
margin-top: 1rem;
|
||||
box-shadow: 0px 0px 3px black;
|
||||
background: 50% 0%/cover no-repeat url(/systems/vermine2047/assets/images/ui/scotch.webp);
|
||||
|
||||
}
|
||||
|
||||
padding: 0 2rem;
|
||||
padding-bottom: 2rem;
|
||||
justify-content: end;
|
||||
text-align: center;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
ul.roll-results {
|
||||
list-style: none;
|
||||
|
||||
li.die {
|
||||
position: relative;
|
||||
max-width: 3rem;
|
||||
line-height: 3rem;
|
||||
float: left;
|
||||
margin: 0.2rem;
|
||||
background-image: url(/icons/dice/d10black.svg);
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
font-weight: 800;
|
||||
font-size: 1rem;
|
||||
color: #ffffff;
|
||||
text-align: center;
|
||||
transition: 0.3s;
|
||||
border-bottom: 5px solid rgb(255, 0, 0);
|
||||
border-radius: 2rem;
|
||||
|
||||
|
||||
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -1rem;
|
||||
text-wrap: nowrap;
|
||||
color: black;
|
||||
font-weight: 100;
|
||||
font-size: smaller;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
&:hover::after {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
|
||||
&.human,
|
||||
&.adapted {
|
||||
border-top: 5px solid rgb(255, 217, 0);
|
||||
}
|
||||
|
||||
&.rerollable {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(0.5rem)
|
||||
}
|
||||
}
|
||||
|
||||
&.success {
|
||||
border-bottom: 5px solid rgb(0, 143, 7);
|
||||
}
|
||||
|
||||
&.adapted {
|
||||
|
||||
&::after {
|
||||
content: "adapté"
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
&.human {
|
||||
&::after {
|
||||
|
||||
content: "humain"
|
||||
}
|
||||
}
|
||||
|
||||
&.rerolled {
|
||||
transform: translateY(-0rem);
|
||||
}
|
||||
|
||||
span {
|
||||
text-align: center;
|
||||
font-size: larger;
|
||||
text-shadow: 0px 0px 8px black;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+539
@@ -0,0 +1,539 @@
|
||||
@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap");
|
||||
|
||||
/* Global styles */
|
||||
.window-app {
|
||||
font-family: "Roboto", sans-serif;
|
||||
box-shadow: 0px 0px 30px rgb(69, 78, 44);
|
||||
}
|
||||
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
color: #000;
|
||||
text-shadow: 0 0 10px red;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.grid,
|
||||
.grid-2col {
|
||||
display: grid;
|
||||
grid-column: span 2/span 2;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 10px;
|
||||
margin: 5px 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.grid-3col {
|
||||
grid-column: span 3/span 3;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-4col {
|
||||
grid-column: span 4/span 4;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-5col {
|
||||
grid-column: span 5/span 5;
|
||||
grid-template-columns: repeat(5, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-6col {
|
||||
grid-column: span 6/span 6;
|
||||
grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-7col {
|
||||
grid-column: span 7/span 7;
|
||||
grid-template-columns: repeat(7, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-8col {
|
||||
grid-column: span 8/span 8;
|
||||
grid-template-columns: repeat(8, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-9col {
|
||||
grid-column: span 9/span 9;
|
||||
grid-template-columns: repeat(9, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-10col {
|
||||
grid-column: span 10/span 10;
|
||||
grid-template-columns: repeat(10, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-11col {
|
||||
grid-column: span 11/span 11;
|
||||
grid-template-columns: repeat(11, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-12col {
|
||||
grid-column: span 12/span 12;
|
||||
grid-template-columns: repeat(12, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-start-2 {
|
||||
grid-column-start: 2;
|
||||
}
|
||||
|
||||
.grid-start-3 {
|
||||
grid-column-start: 3;
|
||||
}
|
||||
|
||||
.grid-start-4 {
|
||||
grid-column-start: 4;
|
||||
}
|
||||
|
||||
.grid-start-5 {
|
||||
grid-column-start: 5;
|
||||
}
|
||||
|
||||
.grid-start-6 {
|
||||
grid-column-start: 6;
|
||||
}
|
||||
|
||||
.grid-start-7 {
|
||||
grid-column-start: 7;
|
||||
}
|
||||
|
||||
.grid-start-8 {
|
||||
grid-column-start: 8;
|
||||
}
|
||||
|
||||
.grid-start-9 {
|
||||
grid-column-start: 9;
|
||||
}
|
||||
|
||||
.grid-start-10 {
|
||||
grid-column-start: 10;
|
||||
}
|
||||
|
||||
.grid-start-11 {
|
||||
grid-column-start: 11;
|
||||
}
|
||||
|
||||
.grid-start-12 {
|
||||
grid-column-start: 12;
|
||||
}
|
||||
|
||||
.grid-span-2 {
|
||||
grid-column-end: span 2;
|
||||
}
|
||||
|
||||
.grid-span-3 {
|
||||
grid-column-end: span 3;
|
||||
}
|
||||
|
||||
.grid-span-4 {
|
||||
grid-column-end: span 4;
|
||||
}
|
||||
|
||||
.grid-span-5 {
|
||||
grid-column-end: span 5;
|
||||
}
|
||||
|
||||
.grid-span-6 {
|
||||
grid-column-end: span 6;
|
||||
}
|
||||
|
||||
.grid-span-7 {
|
||||
grid-column-end: span 7;
|
||||
}
|
||||
|
||||
.grid-span-8 {
|
||||
grid-column-end: span 8;
|
||||
}
|
||||
|
||||
.grid-span-9 {
|
||||
grid-column-end: span 9;
|
||||
}
|
||||
|
||||
.grid-span-10 {
|
||||
grid-column-end: span 10;
|
||||
}
|
||||
|
||||
.grid-span-11 {
|
||||
grid-column-end: span 11;
|
||||
}
|
||||
|
||||
.grid-span-12 {
|
||||
grid-column-end: span 12;
|
||||
}
|
||||
|
||||
.flex-group-center,
|
||||
.flex-group-left,
|
||||
.flex-group-right {
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.flex-group-left {
|
||||
-webkit-box-pack: start;
|
||||
-ms-flex-pack: start;
|
||||
justify-content: flex-start;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.flex-group-right {
|
||||
-webkit-box-pack: end;
|
||||
-ms-flex-pack: end;
|
||||
justify-content: flex-end;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.flex-align-left {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.flex-align-right {
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
.gap-xs {
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.gap-sm {
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.gap-md {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.gap-lg {
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.flexshrink {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0;
|
||||
flex: 0;
|
||||
}
|
||||
|
||||
.flex-between {
|
||||
-webkit-box-pack: justify;
|
||||
-ms-flex-pack: justify;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.flexlarge {
|
||||
-webkit-box-flex: 2;
|
||||
-ms-flex: 2;
|
||||
flex: 2;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
-webkit-box-pack: start;
|
||||
-ms-flex-pack: start;
|
||||
justify-content: flex-start;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.align-right {
|
||||
-webkit-box-pack: end;
|
||||
-ms-flex-pack: end;
|
||||
justify-content: flex-end;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.system-vermine2047 .item-form {
|
||||
font-family: "Roboto", sans-serif;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-header {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0 auto;
|
||||
flex: 0 auto;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: horizontal;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: row;
|
||||
flex-direction: row;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
-webkit-box-pack: start;
|
||||
-ms-flex-pack: start;
|
||||
justify-content: flex-start;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-header .profile-img {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0 0 100px;
|
||||
flex: 0 0 100px;
|
||||
height: 100px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-header .header-fields {
|
||||
-webkit-box-flex: 1;
|
||||
-ms-flex: 1;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-header h1.charname {
|
||||
height: 50px;
|
||||
padding: 0px;
|
||||
margin: 5px 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-header h1.charname input {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-tabs {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0;
|
||||
flex: 0;
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-body .tab,
|
||||
.system-vermine2047 .sheet-body .tab .editor {
|
||||
height: 100%;
|
||||
min-width: 100%;
|
||||
|
||||
}
|
||||
|
||||
.system-vermine2047 .sheet-body .tab .editor {
|
||||
min-height: 75px;
|
||||
margin-bottom: 1rem;
|
||||
|
||||
min-width: 100%;
|
||||
|
||||
|
||||
.editor-content {
|
||||
min-width: 100%;
|
||||
min-height: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.system-vermine2047 editor:hover .editor-edit {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.system-vermine2047 .tox {
|
||||
min-height: 25vh;
|
||||
}
|
||||
|
||||
.system-vermine2047 .tox .tox-editor-container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.system-vermine2047 .tox .tox-edit-area {
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .resource-label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-header {
|
||||
height: 28px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
border: 2px groove #eeede0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-header>* {
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-header .item-name {
|
||||
font-weight: bold;
|
||||
padding-left: 5px;
|
||||
text-align: left;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow-y: auto;
|
||||
scrollbar-width: thin;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-name {
|
||||
-webkit-box-flex: 2;
|
||||
-ms-flex: 2;
|
||||
flex: 2;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
font-size: 13px;
|
||||
text-align: left;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-name h3,
|
||||
.system-vermine2047 .items-list .item-name h4 {
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-controls {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-flex: 0;
|
||||
-webkit-box-pack: end;
|
||||
-ms-flex-pack: end;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-controls a {
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
margin: 0 6px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item {
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
padding: 0 2px;
|
||||
border-bottom: 1px solid #c9c7b8;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item .item-name {
|
||||
color: #191813;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item .item-name .item-image {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0 0 30px;
|
||||
flex: 0 0 30px;
|
||||
height: 30px;
|
||||
background-size: 30px;
|
||||
border: none;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .item-prop {
|
||||
text-align: center;
|
||||
border-left: 1px solid #c9c7b8;
|
||||
border-right: 1px solid #c9c7b8;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .items-header {
|
||||
height: 28px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
border: 2px groove #eeede0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .items-header>* {
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.system-vermine2047 .items-list .items-header .item-name {
|
||||
padding-left: 5px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.system-vermine2047 .item-formula {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex: 0 0 200px;
|
||||
flex: 0 0 200px;
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .effects .item .effect-source,
|
||||
.system-vermine2047 .effects .item .effect-duration,
|
||||
.system-vermine2047 .effects .item .effect-controls {
|
||||
text-align: center;
|
||||
border-left: 1px solid #c9c7b8;
|
||||
border-right: 1px solid #c9c7b8;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.system-vermine2047 .effects .item .effect-controls {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.chat-message .message-header {
|
||||
line-height: 20px;
|
||||
color: white;
|
||||
text-shadow: 0px 0px 5px black;
|
||||
background: #1918135e
|
||||
}
|
||||
|
||||
span.game-mode {
|
||||
font-family: "DistressBlack",
|
||||
sans-serif;
|
||||
|
||||
position: absolute;
|
||||
margin-left: auto;
|
||||
color: transparent;
|
||||
top: 1rem;
|
||||
z-index: 900;
|
||||
width: 55%;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
font-weight: 900;
|
||||
background: linear-gradient(180deg, rgba(255, 255, 255, 0.767) 0%, rgba(0, 0, 0, 0.61) 17%, rgba(0, 0, 0, 0.548) 19%, rgba(222, 255, 221, 0.575) 24%, rgba(255, 255, 255, 0.637) 43%, rgba(0, 0, 0, 0.486) 47%, rgba(254, 255, 254, 0.466) 50%, rgba(0, 0, 0, 0.699) 63%, rgba(134, 160, 137, 0.479) 64%, rgba(213, 248, 210, 0.493) 100%);
|
||||
background-clip: text;
|
||||
|
||||
&#game-mode-1 {
|
||||
color: rgba(235, 218, 143, 0.8);
|
||||
}
|
||||
|
||||
&#game-mode-2 {
|
||||
color: rgb(131, 248, 131);
|
||||
}
|
||||
|
||||
&#game-mode-3 {
|
||||
color: rgba(245, 124, 124, 0.8);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
@import "./base_work.scss";
|
||||
@import "./style.scss";
|
||||
@import "./roll.scss"
|
||||
+6
-1
@@ -18,7 +18,6 @@
|
||||
"module/vermine2047.mjs"
|
||||
],
|
||||
"styles": [
|
||||
"css/style.css",
|
||||
"css/vermine2047.css"
|
||||
],
|
||||
"languages": [
|
||||
@@ -27,6 +26,12 @@
|
||||
"name": "English",
|
||||
"path": "lang/en.json",
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"lang": "fr",
|
||||
"name": "Français",
|
||||
"path": "lang/fr.json",
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"packs": [
|
||||
|
||||
+146
-80
@@ -1,30 +1,54 @@
|
||||
{
|
||||
"Actor": {
|
||||
"types": ["character", "npc", "group", "creature"],
|
||||
"types": [
|
||||
"character",
|
||||
"npc",
|
||||
"group",
|
||||
"creature"
|
||||
],
|
||||
"templates": {
|
||||
"base": {
|
||||
"minorWound": {
|
||||
"threshold":1,
|
||||
"value": 4,
|
||||
"min": 1,
|
||||
"threshold": 1,
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5
|
||||
},
|
||||
"majorWound": {
|
||||
"threshold":4,
|
||||
"value": 3,
|
||||
"min": 1,
|
||||
"threshold": 4,
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 4
|
||||
},
|
||||
"deadlyWound": {
|
||||
"threshold":8,
|
||||
"value": 2,
|
||||
"min": 1,
|
||||
"threshold": 8,
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"character": {
|
||||
"templates": ["base"],
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"adaptation": {
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"totems": {
|
||||
"human": {
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 3
|
||||
},
|
||||
"adapted": {
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"identity": {
|
||||
"height": 0,
|
||||
"weight": 0,
|
||||
@@ -45,11 +69,11 @@
|
||||
"attributes": {
|
||||
"xp": {
|
||||
"value": 0,
|
||||
"max":10
|
||||
"max": 10
|
||||
},
|
||||
"reputation": {
|
||||
"value": 0,
|
||||
"max":10
|
||||
"max": 10
|
||||
},
|
||||
"self_control": {
|
||||
"value": 0,
|
||||
@@ -64,49 +88,49 @@
|
||||
},
|
||||
"abilities": {
|
||||
"vigor": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "physical"
|
||||
},
|
||||
"health": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "physical"
|
||||
},
|
||||
"precision": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "manual"
|
||||
},
|
||||
"reflexes": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "manual"
|
||||
},
|
||||
"knowledge": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "mental"
|
||||
},
|
||||
"perception": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "mental"
|
||||
},
|
||||
"will": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "social"
|
||||
},
|
||||
"empathy": {
|
||||
"value": 0,
|
||||
"value": 1,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "social"
|
||||
@@ -118,215 +142,217 @@
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "man",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"civilization": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "man",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"psychology": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "man",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"rumors": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "man",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"healing": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "man",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"animalism": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "animal",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"dissection": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "animal",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"wildlife": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "animal",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"repulsion": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "animal",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"tracks": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "animal",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"crafting": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "tool",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"diy": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "tool",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"mecanical": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "tool",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"piloting": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "tool",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"technology": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "tool",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"firearms": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "weapon",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"archery": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "weapon",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"armory": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "weapon",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"throwing": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "weapon",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"melee": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "weapon",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"alertness": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "survival",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"atletics": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "survival",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"food": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "survival",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"stealth": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "survival",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"close": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "survival",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"environment": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "world",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"flora": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "world",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
},
|
||||
"road": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "world",
|
||||
"rarity":0
|
||||
"rarity": 0
|
||||
},
|
||||
"toxics": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "world",
|
||||
"rarity":2
|
||||
"rarity": 2
|
||||
},
|
||||
"ruins": {
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 5,
|
||||
"category": "world",
|
||||
"rarity":1
|
||||
"rarity": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"npc": {
|
||||
"templates": ["base"],
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"age": 15,
|
||||
"skills": "",
|
||||
"threat": {
|
||||
@@ -346,7 +372,9 @@
|
||||
}
|
||||
},
|
||||
"group": {
|
||||
"templates": ["base"],
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"identity": {
|
||||
"totem": "",
|
||||
"profile": "",
|
||||
@@ -381,7 +409,9 @@
|
||||
"encounters": []
|
||||
},
|
||||
"creature": {
|
||||
"templates": ["base"],
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"skills": "",
|
||||
"modes": {
|
||||
"survival": true,
|
||||
@@ -411,12 +441,25 @@
|
||||
}
|
||||
},
|
||||
"Item": {
|
||||
"types": ["item", "weapon", "defense", "vehicle", "ability", "specialty", "background", "trauma", "evolution", "rumor", "target", "rite"],
|
||||
"types": [
|
||||
"item",
|
||||
"weapon",
|
||||
"defense",
|
||||
"vehicle",
|
||||
"ability",
|
||||
"specialty",
|
||||
"background",
|
||||
"trauma",
|
||||
"evolution",
|
||||
"rumor",
|
||||
"target",
|
||||
"rite"
|
||||
],
|
||||
"templates": {
|
||||
"base": {
|
||||
"description": "",
|
||||
"rarity":3,
|
||||
"reliability":3,
|
||||
"rarity": 3,
|
||||
"reliability": 3,
|
||||
"quantity": 1,
|
||||
"weight": 0,
|
||||
"traits": []
|
||||
@@ -426,27 +469,35 @@
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"templates": ["base"]
|
||||
"templates": [
|
||||
"base"
|
||||
]
|
||||
},
|
||||
"weapon": {
|
||||
"templates": ["base"],
|
||||
"min_range":0,
|
||||
"max_range":0,
|
||||
"damage":0,
|
||||
"ammo":0
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"min_range": 0,
|
||||
"max_range": 0,
|
||||
"damage": 0,
|
||||
"ammo": 0
|
||||
},
|
||||
"defense": {
|
||||
"templates": ["base"],
|
||||
"level":0,
|
||||
"mobility":3
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"level": 0,
|
||||
"mobility": 3
|
||||
},
|
||||
"ability": {
|
||||
"templates": ["list"],
|
||||
"templates": [
|
||||
"list"
|
||||
],
|
||||
"type": "",
|
||||
"totem": "",
|
||||
"learn": {
|
||||
"threshold":5,
|
||||
"hindrance":0
|
||||
"threshold": 5,
|
||||
"hindrance": 0
|
||||
},
|
||||
"level": {
|
||||
"value": 1,
|
||||
@@ -456,29 +507,40 @@
|
||||
"effects": []
|
||||
},
|
||||
"specialty": {
|
||||
"templates": ["list"]
|
||||
"name": "",
|
||||
"skill": ""
|
||||
},
|
||||
"vehicle": {
|
||||
"templates": ["base"],
|
||||
"mobility":3
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"mobility": 3
|
||||
},
|
||||
"rite": {
|
||||
"templates": ["base"],
|
||||
"templates": [
|
||||
"base"
|
||||
],
|
||||
"rituel": "",
|
||||
"transe": "",
|
||||
"ability": "",
|
||||
"effect": ""
|
||||
},
|
||||
"background": {
|
||||
"templates": ["list"],
|
||||
"cost":1
|
||||
"templates": [
|
||||
"list"
|
||||
],
|
||||
"cost": 1
|
||||
},
|
||||
"trauma": {
|
||||
"templates": ["list"],
|
||||
"templates": [
|
||||
"list"
|
||||
],
|
||||
"type": ""
|
||||
},
|
||||
"evolution": {
|
||||
"templates": ["list"],
|
||||
"templates": [
|
||||
"list"
|
||||
],
|
||||
"level": {
|
||||
"value": 1,
|
||||
"min": 1,
|
||||
@@ -486,11 +548,15 @@
|
||||
}
|
||||
},
|
||||
"rumor": {
|
||||
"templates": ["list"]
|
||||
"templates": [
|
||||
"list"
|
||||
]
|
||||
},
|
||||
"target": {
|
||||
"templates": ["list"],
|
||||
"level":"minor"
|
||||
"templates": [
|
||||
"list"
|
||||
],
|
||||
"level": "minor"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
<form class="{{cssClass}} {{actor.type}} flexcol form" autocomplete="off">
|
||||
|
||||
<div class="form">
|
||||
<aside>
|
||||
<img class="logo mx-auto" src="systems/vermine2047/assets/images/ui/logo.webp" width="200" alt="logo Vermine" />
|
||||
<img class="logo mx-auto"
|
||||
src="systems/vermine2047/assets/images/ui/logo.webp" width="200"
|
||||
alt="logo Vermine" />
|
||||
<div class="sidebar" data-group="dashboard" data-tab="sidebar">
|
||||
<!--ID -->
|
||||
{{> "systems/vermine2047/templates/actor/character/character-id.hbs"}}
|
||||
@@ -12,27 +15,33 @@
|
||||
{{> "systems/vermine2047/templates/actor/character/character-header.hbs"}}
|
||||
|
||||
<!-- SHEET NAVIGATION -->
|
||||
<nav class="sheet-navigation sheet-tabs tabs flex-group-end" data-group="primary">
|
||||
<a class="item" data-tab="character" title="{{localize "VERMINE.tab_character_label"}}">
|
||||
<nav class="sheet-navigation sheet-tabs tabs flex-group-center"
|
||||
data-group="primary">
|
||||
<a class="item" data-tab="character"
|
||||
data-tooltip="{{localize "VERMINE.tabs.abilities"}}">
|
||||
<i class="fas fa-address-card"></i>
|
||||
</a>
|
||||
|
||||
<a class="item" data-tab="totem" title="{{localize "VERMINE.tab_totem_label"}}">
|
||||
<a class="item" data-tab="totem"
|
||||
data-tooltip="{{localize "VERMINE.tabs.totem"}}">
|
||||
<i class="fas fa-star"></i>
|
||||
</a>
|
||||
<a class="item" data-tab="equipment" title="{{localize "VERMINE.tab_equipment_label"}}">
|
||||
<a class="item" data-tab="equipment"
|
||||
data-tooltip="{{localize "VERMINE.tabs.equipment"}}">
|
||||
<i class="fas fa-hammer"></i>
|
||||
</a>
|
||||
|
||||
<a class="item" data-tab="stories" title="{{localize "VERMINE.tab_stories_label"}}">
|
||||
<i class="fas fa-hand-paper"></i>
|
||||
<a class="item" data-tab="stories"
|
||||
data-tooltip="{{localize "VERMINE.tabs.stories"}}">
|
||||
<i class="fas fa-book-open-reader"></i>
|
||||
</a>
|
||||
|
||||
<a class="item" data-tab="combat" title="{{localize "VERMINE.tab_combat_label"}}">
|
||||
<a class="item" data-tab="combat"
|
||||
data-tooltip="{{localize "VERMINE.tabs.combat"}}">
|
||||
<i class="fas fa-medal"></i>
|
||||
</a>
|
||||
|
||||
<!--a class="manage-tabs" data-action="manage-tabs" title="{{localize "VERMINE.tab_options"}}">
|
||||
<!--a class="manage-tabs" data-action="manage-tabs" data-tooltip="{{localize "VERMINE.tab_options"}}">
|
||||
<i class="fas fa-fw fa-ellipsis-v"></i>
|
||||
</a-->
|
||||
</nav>
|
||||
@@ -40,13 +49,16 @@
|
||||
<!-- BODY -->
|
||||
<section class="sheet-body">
|
||||
<section class="sheet-content">
|
||||
<div class="tab character character-pane active" data-group="primary" data-tab="character">
|
||||
<div class="tab character character-pane active" data-group="primary"
|
||||
data-tab="character">
|
||||
<!-- Character -->
|
||||
{{> "systems/vermine2047/templates/actor/character/character-features.hbs"}}
|
||||
{{>
|
||||
"systems/vermine2047/templates/actor/character/character-features.hbs"}}
|
||||
</div>
|
||||
<div class="tab totem" data-group="primary" data-tab="totem">
|
||||
<h3>{{ localize 'IDENTITY.totem'}}</h3>
|
||||
{{> "systems/vermine2047/templates/actor/character/character-totem.hbs"}}
|
||||
{{>
|
||||
"systems/vermine2047/templates/actor/character/character-totem.hbs"}}
|
||||
</div>
|
||||
<div class="tab equipment" data-group="primary" data-tab="equipment">
|
||||
<h3>{{ localize 'VERMINE.equipment'}}</h3>
|
||||
@@ -56,12 +68,14 @@
|
||||
<div class="tab combat" data-group="primary" data-tab="combat">
|
||||
<h3>{{ localize 'VERMINE.combat'}}</h3>
|
||||
<!-- effects -->
|
||||
{{> "systems/vermine2047/templates/actor/character/character-combat.hbs"}}
|
||||
{{>
|
||||
"systems/vermine2047/templates/actor/character/character-combat.hbs"}}
|
||||
</div>
|
||||
|
||||
<div class="tab stories" data-group="primary" data-tab="stories">
|
||||
<h3>{{ localize 'VERMINE.stories'}}</h3>
|
||||
{{> "systems/vermine2047/templates/actor/character/character-stories.hbs"}}
|
||||
{{>
|
||||
"systems/vermine2047/templates/actor/character/character-stories.hbs"}}
|
||||
</div>
|
||||
|
||||
</section>
|
||||
@@ -69,4 +83,3 @@
|
||||
</main>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
@@ -1,39 +1,148 @@
|
||||
<div class="grid grid-2col">
|
||||
<div>
|
||||
<h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4>
|
||||
<p class="align-center">
|
||||
<input type="number" name="system.attributes.self_control.value" value="{{ system.attributes.self_control.value }}" data-dtype="Number" min="{{ system.attributes.self_control.min }}" max="{{ system.attributes.self_control.max }}" /> / {{ system.attributes.self_control.max }}
|
||||
</p>
|
||||
<h4 class="align-center">{{ localize "VERMINE.self_control"}} :
|
||||
{{@root.system.attributes.self_control.value}}/
|
||||
{{@root.system.attributes.self_control.max}}
|
||||
</h4>
|
||||
|
||||
<div class="flexrow">
|
||||
{{#repeat 10 1}}
|
||||
<div class="hexa
|
||||
{{#iflteq @index @root.system.attributes.self_control.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
{{#ifgt @index @root.system.attributes.self_control.max }}
|
||||
unavailable
|
||||
{{/ifgt}}">
|
||||
{{#iflteq @index @root.system.attributes.self_control.max }}
|
||||
<input type="radio" data-dtype="Number"
|
||||
name="system.attributes.self_control.value"
|
||||
value="{{@index}}" {{#ife @root.system.attributes.self_control.value
|
||||
@index
|
||||
}}checked="checked"{{/ife}}
|
||||
class="
|
||||
{{#iflteq @index @root.system.attributes.self_control.max }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
{{/iflteq}}
|
||||
|
||||
</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="align-center">{{ localize "VERMINE.effort"}}</h4>
|
||||
<p class="align-center">
|
||||
<input type="number" name="system.attributes.effort.value" value="{{ system.attributes.effort.value }}" data-dtype="Number" min="{{ system.attributes.effort.min }}" max="{{ system.attributes.effort.max }}" /> / {{ system.attributes.effort.max }}
|
||||
</p>
|
||||
<h4 class="align-center">{{ localize "VERMINE.effort"}} :
|
||||
{{@root.system.attributes.effort.value}}/
|
||||
{{@root.system.attributes.effort.max}}
|
||||
</h4>
|
||||
|
||||
<div class="flexrow">
|
||||
{{#repeat 10 1}}
|
||||
<div
|
||||
class="hexa
|
||||
{{#iflteq @index @root.system.attributes.effort.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
{{#ifgt @index @root.system.attributes.effort.max }}
|
||||
unavailable
|
||||
{{/ifgt}}">
|
||||
{{#iflteq @index @root.system.attributes.effort.max }}
|
||||
<input type="radio" data-dtype="Number"
|
||||
name="system.attributes.effort.value"
|
||||
value="{{@index}}" {{#ife @root.system.attributes.effort.value
|
||||
@index
|
||||
}}checked="checked"{{/ife}}
|
||||
class="
|
||||
{{#iflteq @index @root.system.attributes.effort.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
{{/iflteq}}
|
||||
|
||||
</div>
|
||||
{{#ife @index 1}}
|
||||
<br />
|
||||
{{/ife}}
|
||||
{{/repeat}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="item-name effect-name flexrow">{{ localize "VERMINE.wounds.name"}}</h4>
|
||||
<h4 class="item-name effect-name flexrow">{{ localize
|
||||
"VERMINE.wounds.name"}}</h4>
|
||||
<ul class="unstyled">
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.light'}} ({{ system.minorWound.threshold }})
|
||||
{{#range system.minorWound.max }}
|
||||
<input type="radio" data-dtype="Number" name="system.minorWound.value" value="{{this}}" {{#ife @root.system.minorWound.value this }}checked="checked"{{/ife}} />
|
||||
{{/range}}</li>
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}} ({{ system.majorWound.threshold }})
|
||||
{{#range system.majorWound.max }}
|
||||
<input type="radio" name="system.majorWound.value" value="{{this}}" {{#ife @root.system.majorWound.value this }}checked="checked"{{/ife}} />
|
||||
{{/range}}
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.light'}} <span
|
||||
data-tooltip="seuil">({{
|
||||
system.minorWound.threshold }})</span>
|
||||
<div class="flexrow">
|
||||
{{#repeat system.minorWound.max 1}}
|
||||
<div class="hexa ability{{#iflteq @index @root.system.minorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}">
|
||||
<input type="radio" data-dtype="Number" name="system.minorWound.value"
|
||||
value="{{@index}}" {{#ife @root.system.minorWound.value @index
|
||||
}}checked="checked"{{/ife}} data-wound="minorWound"
|
||||
class="
|
||||
{{#iflteq @index @root.system.minorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}} ({{ system.deadlyWound.threshold }})
|
||||
{{#range system.deadlyWound.max }}
|
||||
<input type="radio" name="system.deadlyWound.value" value="{{this}}" {{#ife @root.system.deadlyWound.value this }}checked="checked"{{/ife}} />
|
||||
{{/range}}
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}}
|
||||
<span>({{
|
||||
system.majorWound.threshold }})</span>
|
||||
<div class="flexrow">
|
||||
{{#repeat system.majorWound.max 1}}
|
||||
<div class="hexa ability{{#iflteq @index @root.system.majorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}">
|
||||
<input type="radio" data-dtype="Number" name="system.majorWound.value"
|
||||
value="{{@index}}" {{#ife @root.system.majorWound.value @index
|
||||
}}checked="checked"{{/ife}} data-wound="majorWound"
|
||||
class="
|
||||
{{#iflteq @index @root.system.majorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
</div>
|
||||
{{/repeat}}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}}
|
||||
<span>({{system.deadlyWound.threshold }})</span>
|
||||
<div class="flexrow">
|
||||
{{#repeat system.deadlyWound.max 1}}
|
||||
<div class="hexa ability{{#iflteq @index @root.system.deadlyWound.value }}
|
||||
checked
|
||||
{{/iflteq}}">
|
||||
<input type="radio" data-dtype="Number" name="system.deadlyWound.value"
|
||||
value="{{@index}}" {{#ife @root.system.deadlyWound.value @index
|
||||
}}checked="checked"{{/ife}} data-wound="deadlyWound"
|
||||
class="
|
||||
{{#iflteq @index @root.system.deadlyWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4>
|
||||
<ol class="items-list effects-list">
|
||||
{{#each effects as |section sid|}}
|
||||
<li class="items-header flexrow" data-effect-type="{{section.type}}">
|
||||
<p class="item-name effect-name flexrow">{{#if (eq section.type 'temporary')}}
|
||||
<p class="item-name effect-name flexrow">{{#if (eq section.type
|
||||
'temporary')}}
|
||||
{{localize "UI.effects.temporary" }}
|
||||
{{else if (eq section.type 'passive')}}
|
||||
{{localize "UI.effects.passive" }}
|
||||
@@ -44,7 +153,8 @@
|
||||
<div class="effect-source">{{localize 'UI.source'}}</div>
|
||||
<div class="effect-source">{{localize 'UI.duration'}}</div>
|
||||
<div class="item-controls effect-controls flexrow">
|
||||
<a class="effect-control" data-action="create" title="{{localize 'UI.effect_create'}}">
|
||||
<a class="effect-control" data-action="create"
|
||||
title="{{localize 'UI.effect_create'}}">
|
||||
<i class="fas fa-plus"></i> {{localize "UI.add"}}
|
||||
</a>
|
||||
</div>
|
||||
@@ -54,18 +164,22 @@
|
||||
{{#each section.effects as |effect|}}
|
||||
<li class="item effect flexrow" data-effect-id="{{effect.id}}">
|
||||
<div class="item-name effect-name">
|
||||
<a class="effect-control flexrow flex-group-center items-center" data-action="edit" title="{{localize 'UI.effect_edit'}}">
|
||||
<img class="item-image" src="{{effect.icon}}"/>
|
||||
<a class="effect-control flexrow flex-group-center items-center"
|
||||
data-action="edit" title="{{localize 'UI.effect_edit'}}">
|
||||
<img class="item-image" src="{{effect.icon}}" />
|
||||
<span>{{effect.label}}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="effect-source">{{effect.sourceName}}</div>
|
||||
<div class="effect-duration">{{effect.duration.label}}</div>
|
||||
<div class="item-controls effect-controls flexrow">
|
||||
<a class="effect-control" data-action="toggle" title="{{localize 'UI.effect_toggle'}}">
|
||||
<i class="fas {{#if effect.disabled}}fa-check{{else}}fa-times{{/if}}"></i>
|
||||
<a class="effect-control" data-action="toggle"
|
||||
title="{{localize 'UI.effect_toggle'}}">
|
||||
<i
|
||||
class="fas {{#if effect.disabled}}fa-check{{else}}fa-times{{/if}}"></i>
|
||||
</a>
|
||||
<a class="effect-control" data-action="delete" title="{{localize 'UI.effect_delete'}}">
|
||||
<a class="effect-control" data-action="delete"
|
||||
title="{{localize 'UI.effect_delete'}}">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -6,32 +6,67 @@
|
||||
<h4 class="align-center">{{ smarttl "ABILITY_CATEGORIES" ackey }}</h4>
|
||||
{{#each @root.system.abilities as |ability key|}}
|
||||
{{#if (eq ability.category ackey) }}
|
||||
<div class="ability flexcol flex-group-center items-center">
|
||||
<label for="system.abilities.{{key}}.value" class="resource-label rollable flexlarge align-left" data-type="ability" data-label="{{ key }}">{{ smarttl "ABILITIES" key }}</label>
|
||||
<input type="number" name="system.abilities.{{key}}.value" value="{{ability.value}}" data-dtype="Number" min="1" max="5" />
|
||||
<div class="ability flexrow flex-group-center items-center">
|
||||
<label for="system.abilities.{{key}}.value"
|
||||
class="resource-label rollable flexlarge align-left" data-type="ability"
|
||||
data-label="{{ key }}">{{ smarttl "ABILITIES" key }}</label>
|
||||
<input type="number" class="hexa" name="system.abilities.{{key}}.value"
|
||||
value="{{ability.value}}" data-dtype="Number" min="1" max="5" />
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
<h3>Compétences</h3>
|
||||
<div class="grid grid-2col">
|
||||
{{#each config.skillCategories as |skillCategory sckey|}}
|
||||
{{#each config.skillCategories as |skillCategory sckey|}}
|
||||
<div class="col">
|
||||
<h4>{{ smarttl "SKILLS_CATEGORIES" sckey }}</h4>
|
||||
{{#each @root.system.skills as |skill skey|}}
|
||||
|
||||
{{#if (eq skill.category sckey) }}
|
||||
<div class="ability flexrow flex-group-center">
|
||||
<label style="flex:60%;" for="system.skills.{{skey}}.value" class="resource-label rollable flexlarge align-left" data-type="skill" data-label="{{ skey }}">{{ smarttl "SKILLS" skey }}
|
||||
{{#if (eq skill.rarity 1)}}<sup>(I)</sup>{{/if}}{{#if (eq skill.rarity 2)}}<sup>(II)</sup>{{/if}}</label>
|
||||
<span class="die d10 pool" title="pool">{{ skillLevel "dicePool" skill.value }}</span>
|
||||
<span class="die d10 reroll" title="reroll">{{ skillLevel "reroll" skill.value }}</span>
|
||||
<input type="number" name="system.skills.{{skey}}.value" value="{{skill.value}}" class="skill" data-dtype="Number" min="0" max="5" />
|
||||
<div class="ability flexrow ">
|
||||
<label for="system.skills.{{skey}}.value"
|
||||
class="resource-label rollable flexlarge align-left" data-type="skill"
|
||||
data-label="{{ skey }}">
|
||||
{{ smarttl "SKILLS" skey }}
|
||||
{{#if (eq skill.rarity 1)}}<sup>(I)</sup>{{/if}}
|
||||
{{#if (eq skill.rarity 2)}}<sup>(II)</sup>{{/if}}
|
||||
|
||||
</label>
|
||||
<div class="specialties">
|
||||
{{#each @root.specialties as |spe ind|}}
|
||||
{{#ife spe.system.skill skey}}
|
||||
<i class="specialty"
|
||||
data-tooltip="spécialité utilisable">{{spe.name}}</i>
|
||||
{{/ife}}
|
||||
{{/each}}
|
||||
</div>
|
||||
<select name="system.skills.{{skey}}.value" class="skill-select">
|
||||
{{#select skill.value}}
|
||||
{{#each @root.config.SkillLevels as |level ind|}}
|
||||
<option value="{{ind}}" title="{{localize level.label}}">
|
||||
{{localize level.label}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
</select>
|
||||
<span class="hexa">{{skill.value}}</span>
|
||||
<div class="skill-dots flexrow">
|
||||
{{#repeat (skillLevel "dicePool" skill.value) 0}}
|
||||
<div class="dice-pool-dot"
|
||||
data-tooltip="{{localize "VERMINE.pool"}}"></div>
|
||||
{{/repeat}}
|
||||
{{#repeat (skillLevel "reroll" skill.value) 0}}
|
||||
<div class="dice-reroll-dot"
|
||||
data-tooltip="{{localize "VERMINE.reroll"}}">X</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
</div>
|
||||
@@ -3,36 +3,45 @@
|
||||
<section class="char-details">
|
||||
<h1 class="char-name flexrow flex-group-left w-full">
|
||||
<label>{{ localize 'IDENTITY.name' }}</label>
|
||||
<input name="name" type="text" value="{{actor.name}}" placeholder="{{localize "VERMINE.CharacterNamePlaceholder"}}" />
|
||||
<input name="name" type="text" value="{{actor.name}}"
|
||||
placeholder="{{localize "VERMINE.CharacterNamePlaceholder"}}" />
|
||||
</h1>
|
||||
<div class="profile flexrow flex-group-center">
|
||||
<label>{{ localize 'IDENTITY.profile' }}</label>
|
||||
<input name="system.identity.profile" type="text" value="{{system.identity.profile }}" data-dtype="String" />
|
||||
<input name="system.identity.profile" type="text"
|
||||
value="{{system.identity.profile }}" data-dtype="String" />
|
||||
</div>
|
||||
<div class="flexrow flex-group-center">
|
||||
<label for="system.identity.age">{{ localize 'IDENTITY.age' }}</label>
|
||||
<label for="system.identity.age">{{ localize 'IDENTITY.age'
|
||||
}}</label>
|
||||
<div class="flexrow row">
|
||||
<input type="number" name="system.identity.age" value="{{ system.identity.age }}" data-dtype="Number"/>
|
||||
<span id="ageType">({{ ageType "name" system.identity.ageType }})</span>
|
||||
<input type="number" name="system.identity.age"
|
||||
value="{{ system.identity.age }}" data-dtype="Number" />
|
||||
<span id="ageType">({{ ageType "name" system.identity.ageType
|
||||
}})</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="char-level">
|
||||
<h1 class="char-vermine2047 flexrow flex-group-left w-full">
|
||||
<label for="system.identity.totem">{{ localize 'IDENTITY.totem' }}</label>
|
||||
<label for="system.identity.totem">{{ localize 'IDENTITY.totem'
|
||||
}}</label>
|
||||
{{#if (eq system.identity.totem "")}}
|
||||
<a name="chooseTotem" class="chooseTotem">Choisissez votre totem</a>
|
||||
{{ else }}
|
||||
<a name="chooseTotem" class="chooseTotem">{{ smarttl "TOTEMS" system.identity.totem }}</a>
|
||||
<a name="chooseTotem" class="chooseTotem">{{ smarttl "TOTEMS"
|
||||
system.identity.totem }}</a>
|
||||
{{/if}}
|
||||
</h1>
|
||||
<div class="reputation flexrow flex-group-center">
|
||||
<label>{{ localize 'VERMINE.reputation' }}</label>
|
||||
<input name="system.attributes.reputation.value" type="text" value="{{system.attributes.reputation.value }}" data-dtype="Number" />
|
||||
</div>
|
||||
<div class="experience flexrow flex-group-center">
|
||||
<input name="system.attributes.reputation.value" type="text"
|
||||
value="{{system.attributes.reputation.value }}"
|
||||
data-dtype="Number" />
|
||||
|
||||
<label>{{ localize 'VERMINE.experience' }}</label>
|
||||
<input name="system.details.xp.value" type="text" value="{{system.attributes.xp.value}}" data-dtype="Number" />
|
||||
<input name="system.details.xp.value" type="text"
|
||||
value="{{system.attributes.xp.value}}" data-dtype="Number" />
|
||||
</div>
|
||||
</section>
|
||||
</header>
|
||||
@@ -1,18 +1,65 @@
|
||||
<div class="image-wrapper">
|
||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100"/>
|
||||
<img class="profile-img" src="{{actor.img}}" data-edit="img"
|
||||
title="{{actor.name}}" height="100" width="100" />
|
||||
</div>
|
||||
<div class="minor-totems ">
|
||||
|
||||
<h3>{{localize "ITEMS.evolution"}}</h3>
|
||||
<h5 class="human
|
||||
{{#ifgt system.adaptation.totems.human.value system.adaptation.totems.adapted.value}}
|
||||
major
|
||||
{{/ifgt}}
|
||||
">{{localize "TOTEMS.human.name"}}
|
||||
<img src="/systems/vermine2047/assets/images/ui/totems/human.webp" />
|
||||
</h5>
|
||||
|
||||
<h5 class="adapted
|
||||
{{#ifgt system.adaptation.totems.human.value system.adaptation.totems.adapted.value}}
|
||||
major
|
||||
{{/ifgt}}">{{localize "TOTEMS.adapted.name"}}
|
||||
<img src="/systems/vermine2047/assets/images/ui/totems/adapted.webp" />
|
||||
</h5>
|
||||
|
||||
<div class="totem-dice flexrow flex-group-center">
|
||||
<div class="human-dice flexrow">
|
||||
{{#repeat system.adaptation.totems.human.max 1}}
|
||||
<div class="hexa" data-totem-name="human" data-totem-value="{{@index}}">
|
||||
{{#ifgteq system.adaptation.totems.human.value @index}}
|
||||
<div class="human-die"><i class="fas fa-dice-d10"></i></div>
|
||||
{{/ifgteq}}
|
||||
</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
|
||||
<div class="adapted-dice flexrow">
|
||||
{{#repeat system.adaptation.totems.adapted.max 1}}
|
||||
<div class="hexa" data-totem-name="adapted" data-totem-value="{{@index}}">
|
||||
{{#ifgteq system.adaptation.totems.adapted.value @index}}
|
||||
<div class="adapted-die"><i class="fas fa-dice-d10"></i></div>
|
||||
{{/ifgteq}}</div>
|
||||
{{/repeat}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<ul class="padding-with-frieze unstyled paper">
|
||||
{{#if system.identity.totem }}
|
||||
<li class="row lgb">
|
||||
<li class="row lgb major-totem">
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<img src="/systems/vermine2047/assets/images/ui/totems/{{ system.identity.totem }}.webp" alt="{{ smarttl 'TOTEMS' system.identity.totem 'name' }}" width="80" height="80" />
|
||||
<h4>{{ smarttl 'TOTEMS' system.identity.totem 'name' }}</h4>
|
||||
<img
|
||||
src="/systems/vermine2047/assets/images/ui/totems/{{ system.identity.totem }}.webp"
|
||||
alt="{{ smarttl 'TOTEMS' system.identity.totem 'name' }}" width="80"
|
||||
height="80" />
|
||||
</div>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#if system.identity.theme}}
|
||||
<li>
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<label for="system.identity.theme" class="resource-label flexlarge align-left">{{ localize "IDENTITY.theme"}}</label>
|
||||
<label for="system.identity.theme"
|
||||
class="resource-label flexlarge align-left"><h4>{{ localize
|
||||
"IDENTITY.theme"}}</h4></label>
|
||||
<p>{{{ system.identity.theme }}}</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -20,7 +67,9 @@
|
||||
{{#if system.identity.instincts}}
|
||||
<li>
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<label for="system.identity.instincts" class="resource-label flexlarge align-left">{{ localize "IDENTITY.instincts"}}</label>
|
||||
<label for="system.identity.instincts"
|
||||
class="resource-label flexlarge align-left"><h4>{{ localize
|
||||
"IDENTITY.instincts"}}</h4></label>
|
||||
<p>{{{ system.identity.instincts }}}</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -28,7 +77,9 @@
|
||||
{{#if system.identity.prohibits}}
|
||||
<li>
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<label for="system.identity.prohibits" class="resource-label flexlarge align-left">{{ localize "IDENTITY.prohibits"}}</label>
|
||||
<label for="system.identity.prohibits"
|
||||
class="resource-label flexlarge align-left"><h4>{{ localize
|
||||
"IDENTITY.prohibits"}}</h4></label>
|
||||
<p>{{{ system.identity.prohibits }}}</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -36,19 +87,21 @@
|
||||
{{#if system.identity.objectives}}
|
||||
<li>
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<label for="system.identity.objectives" class="resource-label flexlarge align-left">{{ localize "IDENTITY.objectives"}}</label>
|
||||
<label for="system.identity.objectives"
|
||||
class="resource-label flexlarge align-left"><h4>{{ localize
|
||||
"IDENTITY.objectives"}}</h4></label>
|
||||
<p>{{{ system.identity.objectives }}}</p>
|
||||
</div>
|
||||
</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
{{#if system.identity.relations}}
|
||||
<ul class="padding-with-frieze unstyled second-paper">
|
||||
<li>
|
||||
<div class="flexcol flex-group-center items-center w-full">
|
||||
<label for="system.identity.relations" class="resource-label flexlarge align-left">{{ localize "IDENTITY.relations"}}</label>
|
||||
<label for="system.identity.relations"
|
||||
class="resource-label flexlarge align-left"><h4>{{ localize
|
||||
"IDENTITY.relations"}}</h4></label>
|
||||
{{{ system.identity.relations }}}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{{/if}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
<section class="flexrow flex-group-left flex-align-left gap-md">
|
||||
<div>
|
||||
<h4>{{ localize 'IDENTITY.theme'}}</h4>
|
||||
<textarea name="system.identity.theme">{{ system.identity.theme }}</textarea>
|
||||
<textarea
|
||||
name="system.identity.theme">{{ system.identity.theme }}</textarea>
|
||||
<h4>{{ localize 'IDENTITY.objectives'}}</h4>
|
||||
<textarea name="system.identity.objectives">{{ system.identity.objectives }}</textarea>
|
||||
<textarea
|
||||
name="system.identity.objectives">{{ system.identity.objectives }}</textarea>
|
||||
</div>
|
||||
<div>
|
||||
<h4>{{ localize 'IDENTITY.instincts'}}</h4>
|
||||
<textarea name="system.identity.instincts">{{ system.identity.instincts }}</textarea>
|
||||
<textarea
|
||||
name="system.identity.instincts">{{ system.identity.instincts }}</textarea>
|
||||
<h4>{{ localize 'IDENTITY.prohibits'}}</h4>
|
||||
<textarea name="system.identity.prohibits">{{ system.identity.prohibits }}</textarea>
|
||||
<textarea
|
||||
name="system.identity.prohibits">{{ system.identity.prohibits }}</textarea>
|
||||
</div>
|
||||
</section>
|
||||
<section class="flexcol flex-group-left flex-align-left">
|
||||
<section class="flexcol ">
|
||||
<div>
|
||||
<h4>{{ localize 'IDENTITY.notes'}}</h4>
|
||||
{{editor system.identity.biography target="system.identity.biography" button=true owner=owner editable=editable}}
|
||||
{{editor system.identity.biography target="system.identity.biography"
|
||||
button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
<div>
|
||||
<h4>{{ localize 'IDENTITY.relations'}}</h4>
|
||||
{{editor system.identity.relations target="system.identity.relations" button=true owner=owner editable=editable}}
|
||||
{{editor system.identity.relations target="system.identity.relations"
|
||||
button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1,30 +1,40 @@
|
||||
{{#if system.identity.totem}}
|
||||
|
||||
<h4 class="align-center">
|
||||
{{ smarttl 'TOTEMS' system.identity.totem 'name' }}
|
||||
</h4>
|
||||
<p style="font-size:80%;">{{ smarttlk "TOTEMS" system.identity.totem "description"}}</p>
|
||||
<div class="grid grid-2col">
|
||||
<div class="">
|
||||
<div class="item-name"><strong>Principes</strong><br />{{ smarttlk "TOTEMS" system.identity.totem "instincts"}}</div>
|
||||
<p style="font-size:80%;">{{ smarttlk "TOTEMS" system.identity.totem
|
||||
"description"}}</p>
|
||||
<div class="grid grid-2col">
|
||||
<div class>
|
||||
<div class="item-name"><strong>Principes</strong><br />{{ smarttlk "TOTEMS"
|
||||
system.identity.totem "instincts"}}</div>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="item-name"><strong>Interdits</strong><br />{{ smarttlk "TOTEMS" system.identity.totem "bans"}}</div>
|
||||
<div class>
|
||||
<div class="item-name"><strong>Interdits</strong><br />{{ smarttlk "TOTEMS"
|
||||
system.identity.totem "bans"}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="grid grid-2col">
|
||||
</div>
|
||||
<hr>
|
||||
<div class="grid grid-2col">
|
||||
<div>
|
||||
<h4>
|
||||
<span>{{ localize 'ITEMS.abilities'}}</span>
|
||||
<a class="item-control item-create" title="Create item" data-type="ability"><i class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-create" title="Create item"
|
||||
data-type="ability"><i class="fas fa-plus"></i></a>
|
||||
</h4>
|
||||
<ol class="list-item">
|
||||
{{#each abilities as |item id|}}
|
||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||
<div class="item-name" style="flex:4;">
|
||||
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a>
|
||||
|
||||
</div>
|
||||
<div class="item-controls flexrow">
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
<i class="fas fa-circle-question"
|
||||
data-tooltip="{{item.system.description}}"></i>
|
||||
<a class="item-control item-delete" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
@@ -33,7 +43,8 @@
|
||||
<div>
|
||||
<h4>
|
||||
<span>{{ localize 'ITEMS.specialties'}}</span>
|
||||
<a class="item-control item-create" title="Create item" data-type="specialty"><i class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-create" title="Create item"
|
||||
data-type="specialty"><i class="fas fa-plus"></i></a>
|
||||
</h4>
|
||||
<ol class="list-item">
|
||||
{{#each specialties as |item id|}}
|
||||
@@ -42,7 +53,10 @@
|
||||
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a>
|
||||
</div>
|
||||
<div class="item-controls flexrow">
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
<i class="fas fa-circle-question"
|
||||
data-tooltip="{{item.system.description}}"></i>
|
||||
<a class="item-control item-delete" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
@@ -51,7 +65,8 @@
|
||||
<div>
|
||||
<h4>
|
||||
<span>{{ localize 'ITEMS.backgrounds'}}</span>
|
||||
<a class="item-control item-create" title="Create item" data-type="background"><i class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-create" title="Create item"
|
||||
data-type="background"><i class="fas fa-plus"></i></a>
|
||||
</h4>
|
||||
<ol class="list-item">
|
||||
{{#each backgrounds as |item id|}}
|
||||
@@ -60,7 +75,10 @@
|
||||
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a>
|
||||
</div>
|
||||
<div class="item-controls flexrow">
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
<i class="fas fa-circle-question"
|
||||
data-tooltip="{{item.system.description}}"></i>
|
||||
<a class="item-control item-delete" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
@@ -69,7 +87,8 @@
|
||||
<div>
|
||||
<h4>
|
||||
<span>{{ localize 'ITEMS.traumas'}}</span>
|
||||
<a class="item-control item-create" title="Create item" data-type="trauma"><i class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-create" title="Create item"
|
||||
data-type="trauma"><i class="fas fa-plus"></i></a>
|
||||
</h4>
|
||||
<ol class="list-item">
|
||||
{{#each traumas as |item id|}}
|
||||
@@ -78,7 +97,10 @@
|
||||
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a>
|
||||
</div>
|
||||
<div class="item-controls flexrow">
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
<i class="fas fa-circle-question"
|
||||
data-tooltip="{{item.system.description}}"></i>
|
||||
<a class="item-control item-delete" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
@@ -87,7 +109,8 @@
|
||||
<div>
|
||||
<h4>
|
||||
<span>{{ localize 'ITEMS.evolutions'}}</span>
|
||||
<a class="item-control item-create" title="Create item" data-type="evolution"><i class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-create" title="Create item"
|
||||
data-type="evolution"><i class="fas fa-plus"></i></a>
|
||||
</h4>
|
||||
<ol class="list-item">
|
||||
{{#each evolutions as |item id|}}
|
||||
@@ -96,11 +119,18 @@
|
||||
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a>
|
||||
</div>
|
||||
<div class="item-controls flexrow">
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
<i class="fas fa-circle-question"
|
||||
data-tooltip="{{item.system.description}}"></i>
|
||||
<a class="item-control item-delete" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
|
||||
<h3>choisissez un totem</h3>
|
||||
|
||||
{{/if}}
|
||||
|
||||
@@ -2,30 +2,67 @@
|
||||
<div>
|
||||
<h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4>
|
||||
<p class="align-center">
|
||||
<input type="number" name="system.attributes.self_control.value" value="{{ system.attributes.self_control.value }}" data-dtype="Number" min="{{ system.attributes.self_control.min }}" max="{{ system.attributes.self_control.max }}" /> / {{ system.attributes.self_control.max }}
|
||||
<input type="number" name="system.attributes.self_control.value"
|
||||
value="{{ system.attributes.self_control.value }}" data-dtype="Number"
|
||||
min="{{ system.attributes.self_control.min }}"
|
||||
max="{{ system.attributes.self_control.max }}" /> / {{
|
||||
system.attributes.self_control.max }}
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="align-center">{{ localize "VERMINE.effort"}}</h4>
|
||||
<p class="align-center">
|
||||
<input type="number" name="system.attributes.effort.value" value="{{ system.attributes.effort.value }}" data-dtype="Number" min="{{ system.attributes.effort.min }}" max="{{ system.attributes.effort.max }}" /> / {{ system.attributes.effort.max }}
|
||||
<input type="number" name="system.attributes.effort.value"
|
||||
value="{{ system.attributes.effort.value }}" data-dtype="Number"
|
||||
min="{{ system.attributes.effort.min }}"
|
||||
max="{{ system.attributes.effort.max }}" /> / {{
|
||||
system.attributes.effort.max }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="item-name effect-name flexrow">{{ localize "VERMINE.wounds.name"}}</h4>
|
||||
<h4 class="item-name effect-name flexrow">{{ localize
|
||||
"VERMINE.wounds.name"}}</h4>
|
||||
<ul class="unstyled">
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.light'}} ({{ system.minorWound.threshold }})
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.light'}} <span
|
||||
data-tooltip="seuil">({{
|
||||
system.minorWound.threshold }})</span>
|
||||
{{#range system.minorWound.max }}
|
||||
<input type="radio" data-dtype="Number" name="system.minorWound.value" value="{{this}}" {{#ife @root.system.minorWound.value this }}checked="checked"{{/ife}} />
|
||||
<input type="radio" data-dtype="Number" name="system.minorWound.value"
|
||||
value="{{this}}" {{#ife @root.system.minorWound.value this
|
||||
}}checked="checked"{{/ife}} data-wound="minorWound"
|
||||
class="
|
||||
{{#iflteq this @root.system.minorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
{{/range}}</li>
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}} ({{ system.majorWound.threshold }})
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}} ({{
|
||||
system.majorWound.threshold }})
|
||||
{{#range system.majorWound.max }}
|
||||
<input type="radio" name="system.majorWound.value" value="{{this}}" {{#ife @root.system.majorWound.value this }}checked="checked"{{/ife}} />
|
||||
<input type="radio" name="system.majorWound.value" value="{{this}}" {{#ife
|
||||
@root.system.majorWound.value this }}checked="checked"{{/ife}}
|
||||
data-wound="majorWound"
|
||||
class="
|
||||
{{#iflteq this @root.system.majorWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
{{/range}}
|
||||
</li>
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}} ({{ system.deadlyWound.threshold }})
|
||||
<li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}} ({{
|
||||
system.deadlyWound.threshold }})
|
||||
{{#range system.deadlyWound.max }}
|
||||
<input type="radio" name="system.deadlyWound.value" value="{{this}}" {{#ife @root.system.deadlyWound.value this }}checked="checked"{{/ife}} />
|
||||
<input type="radio" name="system.deadlyWound.value" value="{{this}}" {{#ife
|
||||
@root.system.deadlyWound.value this }}checked="checked"{{/ife}}
|
||||
data-wound="deadlyWound"
|
||||
class="
|
||||
{{#iflteq this @root.system.deadlyWound.value }}
|
||||
checked
|
||||
{{/iflteq}}
|
||||
|
||||
" />
|
||||
{{/range}}
|
||||
</li>
|
||||
</ul>
|
||||
@@ -33,7 +70,8 @@
|
||||
<ol class="items-list effects-list">
|
||||
{{#each effects as |section sid|}}
|
||||
<li class="items-header flexrow" data-effect-type="{{section.type}}">
|
||||
<p class="item-name effect-name flexrow">{{#if (eq section.type 'temporary')}}
|
||||
<p class="item-name effect-name flexrow">{{#if (eq section.type
|
||||
'temporary')}}
|
||||
{{localize "UI.effects.temporary" }}
|
||||
{{else if (eq section.type 'passive')}}
|
||||
{{localize "UI.effects.passive" }}
|
||||
@@ -44,7 +82,8 @@
|
||||
<div class="effect-source">{{localize 'UI.source'}}</div>
|
||||
<div class="effect-source">{{localize 'UI.duration'}}</div>
|
||||
<div class="item-controls effect-controls flexrow">
|
||||
<a class="effect-control" data-action="create" title="{{localize 'UI.effect_create'}}">
|
||||
<a class="effect-control" data-action="create"
|
||||
title="{{localize 'UI.effect_create'}}">
|
||||
<i class="fas fa-plus"></i> {{localize "UI.add"}}
|
||||
</a>
|
||||
</div>
|
||||
@@ -54,18 +93,22 @@
|
||||
{{#each section.effects as |effect|}}
|
||||
<li class="item effect flexrow" data-effect-id="{{effect.id}}">
|
||||
<div class="item-name effect-name">
|
||||
<a class="effect-control flexrow flex-group-center items-center" data-action="edit" title="{{localize 'UI.effect_edit'}}">
|
||||
<img class="item-image" src="{{effect.icon}}"/>
|
||||
<a class="effect-control flexrow flex-group-center items-center"
|
||||
data-action="edit" title="{{localize 'UI.effect_edit'}}">
|
||||
<img class="item-image" src="{{effect.icon}}" />
|
||||
<span>{{effect.label}}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="effect-source">{{effect.sourceName}}</div>
|
||||
<div class="effect-duration">{{effect.duration.label}}</div>
|
||||
<div class="item-controls effect-controls flexrow">
|
||||
<a class="effect-control" data-action="toggle" title="{{localize 'UI.effect_toggle'}}">
|
||||
<i class="fas {{#if effect.disabled}}fa-check{{else}}fa-times{{/if}}"></i>
|
||||
<a class="effect-control" data-action="toggle"
|
||||
title="{{localize 'UI.effect_toggle'}}">
|
||||
<i
|
||||
class="fas {{#if effect.disabled}}fa-check{{else}}fa-times{{/if}}"></i>
|
||||
</a>
|
||||
<a class="effect-control" data-action="delete" title="{{localize 'UI.effect_delete'}}">
|
||||
<a class="effect-control" data-action="delete"
|
||||
title="{{localize 'UI.effect_delete'}}">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -2,17 +2,28 @@
|
||||
{{#each config.totems as | totem tk|}}
|
||||
{{#if (ne tk "human")}}
|
||||
{{#if (ne tk "adapted")}}
|
||||
|
||||
<div class="flexrow row mdb flex-group-center">
|
||||
<h4 style="flex:33%;">
|
||||
<a class="totem" data-totem="{{ tk }}" title="{{ smarttlk "TOTEMS" tk "description"}}">
|
||||
<img src="/systems/vermine2047/assets/images/ui/totems/{{ tk }}.webp" alt="{{ localize totem }}" width="80" height="80" />
|
||||
<a class="totem" data-totem="{{ tk }}"
|
||||
title="{{ smarttlk "TOTEMS"
|
||||
tk "description"}}">
|
||||
<img
|
||||
src="/systems/vermine2047/assets/images/ui/totems/{{ tk }}.webp"
|
||||
alt="{{ localize totem }}" width="80" height="80" />
|
||||
<h2>{{ smarttlk "TOTEMS"
|
||||
tk "name"}}</h2>
|
||||
</a>
|
||||
</h4>
|
||||
<p style="flex:66%;text-align:left;">
|
||||
<strong>Instincts</strong> : {{ smarttlk "TOTEMS" tk "instincts"}}<br>
|
||||
<strong>Interdits</strong> : {{ smarttlk "TOTEMS" tk "bans"}}<br>
|
||||
<strong>Comportements</strong> : {{ smarttlk "TOTEMS" tk "behaviour"}}<br>
|
||||
<strong>Totem opposé</strong> : {{ smartcfg "totem_opposites" tk }}<br>
|
||||
<strong>Instincts</strong> : {{ smarttlk "TOTEMS" tk
|
||||
"instincts"}}<br>
|
||||
<strong>Interdits</strong> : {{ smarttlk "TOTEMS" tk
|
||||
"bans"}}<br>
|
||||
<strong>Comportements</strong> : {{ smarttlk "TOTEMS" tk
|
||||
"behaviour"}}<br>
|
||||
<strong>Totem opposé</strong> : {{ smartcfg "totem_opposites" tk
|
||||
}}<br>
|
||||
</p>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<section class="{{cssClass}} directory flexcol" id="{{cssId}}" data-tab="{{tabName}}">
|
||||
<section class="{{cssClass}} directory flexcol" id="{{cssId}}"
|
||||
data-tab="{{tabName}}">
|
||||
<header class="combat-tracker-header">
|
||||
{{#if user.isGM}}
|
||||
<nav class="encounters flexrow" aria-label="COMBAT.NavLabel">
|
||||
@@ -6,17 +7,24 @@
|
||||
<i class="fas fa-plus"></i>
|
||||
</a>
|
||||
{{#if combatCount}}
|
||||
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterPrevious"
|
||||
{{#if previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
|
||||
<a class="combat-button combat-cycle"
|
||||
data-tooltip="COMBAT.EncounterPrevious"
|
||||
{{#if
|
||||
previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
|
||||
<i class="fas fa-caret-left"></i>
|
||||
</a>
|
||||
<h4 class="encounter">{{localize "COMBAT.Encounter"}} {{currentIndex}} / {{combatCount}}</h4>
|
||||
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterNext"
|
||||
{{#if nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}>
|
||||
<h4 class="encounter">{{localize "COMBAT.Encounter"}}
|
||||
{{currentIndex}} / {{combatCount}}</h4>
|
||||
<a class="combat-button combat-cycle"
|
||||
data-tooltip="COMBAT.EncounterNext"
|
||||
{{#if
|
||||
nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}>
|
||||
<i class="fas fa-caret-right"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.Delete" data-control="endCombat" {{#unless combatCount}}disabled{{/unless}}>
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.Delete"
|
||||
data-control="endCombat" {{#unless
|
||||
combatCount}}disabled{{/unless}}>
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</nav>
|
||||
@@ -24,34 +32,44 @@
|
||||
|
||||
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
|
||||
{{#if user.isGM}}
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.RollAll" data-control="rollAll" {{#unless turns}}disabled{{/unless}}>
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.RollAll" data-control="rollAll" {{#unless
|
||||
turns}}disabled{{/unless}}>
|
||||
<i class="fas fa-users"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.RollNPC" data-control="rollNPC" {{#unless turns}}disabled{{/unless}}>
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.RollNPC" data-control="rollNPC" {{#unless
|
||||
turns}}disabled{{/unless}}>
|
||||
<i class="fas fa-users-cog"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
|
||||
{{#if combatCount}}
|
||||
{{#if combat.round}}
|
||||
<h3 class="encounter-title noborder">{{localize 'COMBAT.Round'}} {{combat.round}}</h3>
|
||||
<h3 class="encounter-title noborder">{{localize 'COMBAT.Round'}}
|
||||
{{combat.round}}</h3>
|
||||
{{else}}
|
||||
<h3 class="encounter-title noborder">{{localize 'COMBAT.NotStarted'}}</h3>
|
||||
<h3 class="encounter-title noborder">{{localize
|
||||
'COMBAT.NotStarted'}}</h3>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
|
||||
{{/if}}
|
||||
|
||||
{{#if user.isGM}}
|
||||
<a class="combat-button combat-control" data-tooltip="COMBAT.InitiativeReset" data-control="resetAll"
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="COMBAT.InitiativeReset" data-control="resetAll"
|
||||
{{#unless hasCombat}}disabled{{/unless}}>
|
||||
<i class="fas fa-undo"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-control" data-tooltip="{{labels.scope}}"
|
||||
data-control="toggleSceneLink" {{#unless hasCombat}}disabled{{/unless}}>
|
||||
<a class="combat-button combat-control"
|
||||
data-tooltip="{{labels.scope}}"
|
||||
data-control="toggleSceneLink" {{#unless
|
||||
hasCombat}}disabled{{/unless}}>
|
||||
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
|
||||
</a>
|
||||
<a class="combat-button combat-settings" data-tooltip="COMBAT.Settings" data-control="trackerSettings">
|
||||
<a class="combat-button combat-settings"
|
||||
data-tooltip="COMBAT.Settings" data-control="trackerSettings">
|
||||
<i class="fas fa-cog"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
@@ -60,34 +78,60 @@
|
||||
|
||||
<ol id="combat-tracker" class="directory-list">
|
||||
{{#each turns}}
|
||||
<li class="combatant actor directory-item flexrow {{this.css}}" data-combatant-id="{{this.id}}">
|
||||
<img class="token-image" data-src="{{this.img}}" alt="{{this.name}}"/>
|
||||
<li class="combatant actor directory-item flexrow {{this.css}}"
|
||||
data-combatant-id="{{this.id}}">
|
||||
<img class="token-image" data-src="{{this.img}}"
|
||||
alt="{{this.name}}" />
|
||||
<div class="token-name flexcol">
|
||||
<h4 class="{{getCombatTrackerColor this.isPlayer this.isNpc}}">{{this.name}}</h4>
|
||||
<h4
|
||||
class="{{getCombatTrackerColor this.isPlayer this.isNpc}}">{{this.name}}</h4>
|
||||
<div class="combatant-controls flexrow">
|
||||
<a class="combatant-control {{#if this.hidden}}active{{/if}}" data-tooltip="COMBAT.ToggleVis" data-control="toggleHidden">
|
||||
<a
|
||||
class="combatant-control {{#if this.hidden}}active{{/if}}"
|
||||
data-tooltip="COMBAT.ToggleVis"
|
||||
data-control="toggleHidden">
|
||||
<i class="fas fa-eye-slash"></i>
|
||||
</a>
|
||||
<a class="combatant-control {{#if this.defeated}}active{{/if}}" data-tooltip="COMBAT.ToggleDead" data-control="toggleDefeated">
|
||||
<a
|
||||
class="combatant-control {{#if this.defeated}}active{{/if}}"
|
||||
data-tooltip="COMBAT.ToggleDead"
|
||||
data-control="toggleDefeated">
|
||||
<i class="fas fa-skull"></i>
|
||||
</a>
|
||||
<a class="combatant-control offensive status" {{#if (eq this.attitude "offensive")}} data-tooltip="{{localize 'ATTITUDES.offensive.name'}}" {{else}} data-tooltip="{{localize 'ATTITUDES.offensive.name'}}" {{/if}}>
|
||||
<i {{#if (eq this.attitude "offensive")}} class="fas fa-fist-raised" style="color:white" {{else}} class="fas fa-fist-raised" style="color:gray" {{/if}}></i>
|
||||
<a class="combatant-control offensive status"
|
||||
data-tooltip="{{localize 'ATTITUDES.offensive.name'}}"
|
||||
data-attitude="offensive">
|
||||
<i
|
||||
class="fas fa-fist-raised"
|
||||
style="{{#if (eq this.attitude "offensive")}}color:white
|
||||
{{else}}color:gray {{/if}}"></i>
|
||||
</a>
|
||||
<a class="combatant-control active status" {{#if (eq this.attitude "active")}} data-tooltip="{{localize 'ATTITUDES.active.name'}}" {{else}} data-tooltip="{{localize 'ATTITUDES.active.name'}}" {{/if}}>
|
||||
<i {{#if (eq this.attitude "active")}} class="fas fa-bow-arrow" style="color:white" {{else}} class="fas fa-bow-arrow" style="color:gray" {{/if}}></i>
|
||||
<a class="combatant-control active status"
|
||||
data-tooltip="{{localize 'ATTITUDES.active.name'}}"
|
||||
data-attitude="active">
|
||||
<i
|
||||
class="fas fa-bow-arrow"
|
||||
style="{{#if (eq this.attitude "active")}}color:white
|
||||
{{else}} color:gray
|
||||
{{/if}}"></i>
|
||||
</a>
|
||||
<a class="combatant-control passive status" {{#if (eq this.attitude "passive")}} data-tooltip="{{localize 'ATTITUDES.passive.name'}}" {{else}} data-tooltip="{{localize 'ATTITUDES.passive.name'}}" {{/if}}>
|
||||
<i {{#if (eq this.attitude "passive")}} class="fas fa-shield-cross" style="color:white" {{else}} class="fas fa-shield-cross" style="color:gray" {{/if}}></i>
|
||||
<a class="combatant-control passive status"
|
||||
data-tooltip="{{localize 'ATTITUDES.passive.name'}}"
|
||||
data-attitude="passive">
|
||||
<i class="fas fa-shield-quartered"
|
||||
style="{{#if (eq this.attitude "passive")}}color:white
|
||||
{{else}} color:gray{{/if}}"></i>
|
||||
</a>
|
||||
{{#if this.canPing}}
|
||||
<a class="combatant-control" data-tooltip="COMBAT.PingCombatant" data-control="pingCombatant">
|
||||
<a class="combatant-control"
|
||||
data-tooltip="COMBAT.PingCombatant"
|
||||
data-control="alertPingCombatant">
|
||||
<i class="fa-solid fa-bullseye-arrow"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
<div class="token-effects">
|
||||
{{#each this.effects}}
|
||||
<img class="token-effect" src="{{this}}"/>
|
||||
<img class="token-effect" src="{{this}}" />
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -103,29 +147,42 @@
|
||||
{{#if this.hasRolled}}
|
||||
<span class="initiative">{{this.initiative}}</span>
|
||||
{{else if this.owner}}
|
||||
<a class="combatant-control roll" data-tooltip="COMBAT.InitiativeRoll" data-control="rollInitiative"></a>
|
||||
<a class="combatant-control roll"
|
||||
data-tooltip="COMBAT.InitiativeRoll"
|
||||
data-control="rollInitiative"></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
|
||||
<nav id="combat-controls" class="directory-footer flexrow" data-tooltip-direction="UP">
|
||||
<nav id="combat-controls" class="directory-footer flexrow"
|
||||
data-tooltip-direction="UP">
|
||||
{{#if hasCombat}}
|
||||
{{#if user.isGM}}
|
||||
{{#if round}}
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundPrev" data-control="previousRound"><i class="fas fa-step-backward"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-control="endCombat">{{localize 'COMBAT.End'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundNext" data-control="nextRound"><i class="fas fa-step-forward"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundPrev"
|
||||
data-control="previousRound"><i
|
||||
class="fas fa-step-backward"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev"
|
||||
data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-control="endCombat">{{localize
|
||||
'COMBAT.End'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext"
|
||||
data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.RoundNext"
|
||||
data-control="nextRound"><i class="fas fa-step-forward"></i></a>
|
||||
{{else}}
|
||||
<a class="combat-control center" data-control="startCombat">{{localize 'COMBAT.Begin'}}</a>
|
||||
<a class="combat-control center" data-control="startCombat">{{localize
|
||||
'COMBAT.Begin'}}</a>
|
||||
{{/if}}
|
||||
{{else if control}}
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-control="nextTurn">{{localize 'COMBAT.TurnEnd'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnPrev"
|
||||
data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
|
||||
<a class="combat-control center" data-control="nextTurn">{{localize
|
||||
'COMBAT.TurnEnd'}}</a>
|
||||
<a class="combat-control" data-tooltip="COMBAT.TurnNext"
|
||||
data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</nav>
|
||||
|
||||
@@ -1,34 +1,67 @@
|
||||
<form class="{{cssClass}}" autocomplete="off">
|
||||
<form
|
||||
class="{{cssClass}}"
|
||||
autocomplete="off"
|
||||
>
|
||||
<header class="sheet-header">
|
||||
<img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
|
||||
<img
|
||||
class="profile-img"
|
||||
src="{{item.img}}"
|
||||
data-edit="img"
|
||||
title="{{item.name}}"
|
||||
/>
|
||||
<div class="header-fields">
|
||||
<h1 class="charname"><input name="name" type="text" value="{{item.name}}" placeholder="Name"/></h1>
|
||||
<h1 class="charname"><input
|
||||
name="name"
|
||||
type="text"
|
||||
value="{{item.name}}"
|
||||
placeholder="Name"
|
||||
/></h1>
|
||||
</div>
|
||||
</header>
|
||||
<nav class="sheet-tabs tabs" data-group="primary">
|
||||
<a class="item active" data-tab="description">{{ localize "VERMINE.stats" }}</a>
|
||||
</nav>
|
||||
|
||||
<section class="sheet-body">
|
||||
<div class="tab flexrow" data-group="primary" data-tab="description">
|
||||
<aside style="flex:1">
|
||||
<div class="flexrow">
|
||||
<div class="resource">
|
||||
<label class="resource-label">{{ localize "VERMINE.clew"}}</label>
|
||||
<input type="number" name="system.level" value="{{system.level}}" data-dtype="Number"/>
|
||||
<input
|
||||
type="number"
|
||||
name="system.level"
|
||||
value="{{system.level}}"
|
||||
data-dtype="Number"
|
||||
/>
|
||||
</div>
|
||||
<div class="resource">
|
||||
<label class="resource-label">{{ localize "VERMINE.mobility"}}</label>
|
||||
<input type="number" name="system.mobility" value="{{system.mobility}}" data-dtype="Number"/>
|
||||
<input
|
||||
type="number"
|
||||
name="system.mobility"
|
||||
value="{{system.mobility}}"
|
||||
data-dtype="Number"
|
||||
/>
|
||||
</div>
|
||||
<div class="resource">
|
||||
<label class="resource-label">{{ localize "VERMINE.rarity"}}</label>
|
||||
<input type="number" name="system.rarity" value="{{system.rarity}}" data-dtype="Number"/>
|
||||
<input
|
||||
type="number"
|
||||
name="system.rarity"
|
||||
value="{{system.rarity}}"
|
||||
data-dtype="Number"
|
||||
/>
|
||||
</div>
|
||||
<div class="resource">
|
||||
<label class="resource-label">{{ localize "VERMINE.reliability"}}</label>
|
||||
<input type="number" name="system.reliability" value="{{system.reliability}}" data-dtype="Number"/>
|
||||
<input
|
||||
type="number"
|
||||
name="system.reliability"
|
||||
value="{{system.reliability}}"
|
||||
data-dtype="Number"
|
||||
/>
|
||||
</div>
|
||||
</aside>
|
||||
<main class="editor-wrapper" style="flex:10">
|
||||
</div>
|
||||
<main
|
||||
class="editor-wrapper"
|
||||
style="flex:10"
|
||||
>
|
||||
{{editor system.description target="system.description" rollData=rollData button=true owner=owner editable=editable}}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
@@ -1,29 +1,40 @@
|
||||
<form class="{{cssClass}}" autocomplete="off">
|
||||
<form
|
||||
class="{{cssClass}}"
|
||||
autocomplete="off"
|
||||
>
|
||||
<header class="sheet-header">
|
||||
<img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
|
||||
<img
|
||||
class="profile-img"
|
||||
src="{{item.img}}"
|
||||
data-edit="img"
|
||||
title="{{item.name}}"
|
||||
/>
|
||||
<div class="header-fields">
|
||||
<h1 class="charname"><input name="name" type="text" value="{{item.name}}" placeholder="Name"/></h1>
|
||||
<h1 class="charname"><input
|
||||
name="name"
|
||||
type="text"
|
||||
value="{{item.name}}"
|
||||
placeholder="Name"
|
||||
/></h1>
|
||||
<select
|
||||
name="system.skill"
|
||||
class="skill-select"
|
||||
>
|
||||
{{#select system.skill}}
|
||||
{{#each @root.config.skillCategories as |skillCategory sckey|}}
|
||||
|
||||
<optgroup label="{{ smarttlk 'SKILLS_CATEGORIES' sckey 'name' }}">
|
||||
{{#each @root.config.model.Actor.character.skills as |skill key|}}
|
||||
{{#ife skill.category sckey}}
|
||||
<option value="{{key}}">{{ smarttlk 'SKILLS' key 'name' }}</option>
|
||||
{{/ife}}
|
||||
</optgroup>
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
</select>
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{{!-- Sheet Tab Navigation --}}
|
||||
<nav class="sheet-tabs tabs" data-group="primary">
|
||||
<a class="item" data-tab="description">Description</a>
|
||||
<a class="item" data-tab="attributes">Attributes</a>
|
||||
</nav>
|
||||
|
||||
{{!-- Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
|
||||
{{!-- Description Tab --}}
|
||||
<div class="tab" data-group="primary" data-tab="description">
|
||||
{{editor system.description target="system.description" rollData=rollData button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
|
||||
{{!-- Attributes Tab --}}
|
||||
<div class="tab attributes" data-group="primary" data-tab="attributes">
|
||||
{{!-- As you add new fields, add them in here! --}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</form>
|
||||
@@ -0,0 +1,164 @@
|
||||
<form id="dice-pool-form" class="vermine form"
|
||||
data-actor-id="{{ speakerId }}">
|
||||
|
||||
<input type="hidden" name="label" id="label" value="{{ label }}" />
|
||||
<input type="hidden" name="rollType" id="rollType" value="{{ rollType }}" />
|
||||
<input type="hidden" name="abilityScore" id="abilityScore"
|
||||
value="{{ abilityScore }}" />
|
||||
<input type="hidden" name="skillScore" id="skillScore"
|
||||
value="{{ skillScore }}" />
|
||||
<div class="dice-pool flexcol">
|
||||
<div class="flexrow row lgb flex-group-center">
|
||||
<span>Type de jet <strong>{{#if (eq rollType 'skill')}}{{ localize
|
||||
'VERMINE.skill_title' }}{{else}}{{ localize 'VERMINE.ability'
|
||||
}}{{/if}}</strong></span>
|
||||
<span>{{#if (eq rollType 'skill')}}{{ localize 'VERMINE.skill_title'
|
||||
}}{{else}}{{ localize 'VERMINE.ability' }}{{/if}}
|
||||
<strong>{{#if (eq rollType 'skill')}}{{ smarttl "SKILLS" label
|
||||
}}{{else}}{{ smarttl "ABILITIES" label }}{{/if}}</strong> </span>
|
||||
</div>
|
||||
|
||||
<div class="flexrow form-group row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize
|
||||
'VERMINE.difficulty'}}</label>
|
||||
<select class="info-value" data-roll="tue" style="max-width: 40%;"
|
||||
data-dtype="String"
|
||||
type="number" name="difficulty" id="difficulty" min="3" max="10">
|
||||
{{#select difficulty }}
|
||||
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 1}} -
|
||||
{{ diffLevel 'difficulty' 1}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 2}}">{{ diffLevel 'label' 2}} -
|
||||
{{ diffLevel 'difficulty' 2}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 3}}" selected>{{ diffLevel
|
||||
'label' 3}} - {{ diffLevel 'difficulty' 3}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 4}}">{{ diffLevel 'label' 4}} -
|
||||
{{ diffLevel 'difficulty' 4}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 5}}">{{ diffLevel 'label' 5}} -
|
||||
{{ diffLevel 'difficulty' 5}}</option>
|
||||
{{/select}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize
|
||||
'VERMINE.ability'}}</label>
|
||||
<select class="info-value" data-roll="true" style="max-width: 40%;"
|
||||
data-dtype="String"
|
||||
type="number" name="ability" id="ability" min="1" max="5">
|
||||
<option>-- Choisissez une caractéristique
|
||||
--</option>
|
||||
{{#each config.abilityCategories as |abilCategory catkey|}}
|
||||
|
||||
<optgroup label="{{ smarttlk 'ABILITY_CATEGORIES' catkey 'name' }}">
|
||||
{{#each @root.actor.system.abilities as |abil key|}}
|
||||
{{#ife abil.category catkey}}
|
||||
<option value="{{abil.value}}"
|
||||
{{#ife @root.rollType "ability"}}
|
||||
{{#ife @root.labelKey key}}
|
||||
selected="true"
|
||||
{{/ife}}
|
||||
{{/ife}}>{{ smarttlk 'ABILITIES' key 'name'
|
||||
}} / {{abil.value}}</option>
|
||||
{{/ife}}
|
||||
{{/each}}
|
||||
|
||||
</optgroup>
|
||||
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize
|
||||
'VERMINE.skill_title'}}</label>
|
||||
<select class="info-value" data-roll="true" style="max-width: 40%;"
|
||||
data-dtype="String"
|
||||
type="number" name="skill" id="skill" min="1" max="5">
|
||||
<option>-- Choisissez une caractéristique
|
||||
--</option>
|
||||
{{#each config.skillCategories as |skillCategory catkey|}}
|
||||
|
||||
<optgroup label="{{ smarttlk 'SKILLS_CATEGORIES' catkey 'name' }}">
|
||||
{{#each @root.actor.system.skills as |skill key|}}
|
||||
{{#ife skill.category catkey}}
|
||||
<option value="{{skill.value}}" data-pool="{{skillLevel "dicePool"
|
||||
skill.value}}"
|
||||
data-reroll="{{skillLevel "reroll" skill.value}}"
|
||||
{{#ife @root.rollType "skill"}}
|
||||
{{#ife @root.labelKey key}}
|
||||
selected="true"
|
||||
{{/ife}}
|
||||
{{/ife}}>
|
||||
<b>{{ smarttlk 'SKILLS' key 'name' }},</b>
|
||||
<i>dés:{{skillLevel "dicePool" skill.value}},
|
||||
relances:{{skillLevel "reroll" skill.value}}</i>
|
||||
</option>
|
||||
{{/ife}}
|
||||
{{/each}}
|
||||
|
||||
</optgroup>
|
||||
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flexrow row lgb">
|
||||
<span id="skillLevel">{{#if (ne skillScore 0)}}{{ skillLevel 'label'
|
||||
skillScore }}{{/if}}</span>
|
||||
<span>{{localize 'VERMINE.bonus'}} : <em id="skillDicePool">{{#if (ne
|
||||
skillScore 0)}}{{ skillLevel 'dicePool' skillScore
|
||||
}}{{else}}0{{/if}}</em></span>
|
||||
<span>{{localize 'VERMINE.reroll'}} : <em id="skillReroll">{{#if (ne
|
||||
skillScore 0)}}{{ skillLevel 'reroll' skillScore
|
||||
}}{{else}}0{{/if}}</em></span>
|
||||
</div>
|
||||
<div class="flexrow row smb">
|
||||
<label class="label">{{localize 'VERMINE.specialty'}} (+1D)</label>
|
||||
<input type="checkbox" data-roll="true" name="usingSpecialization"
|
||||
id="usingSpecialization"
|
||||
value="1" {{#if specialty}}checked{{/if}}>
|
||||
</div>
|
||||
<div class="flexrow row smb">
|
||||
<label class="label">{{localize 'VERMINE.help'}} (+1D)</label>
|
||||
<input type="checkbox" data-roll="true" name="helped" id="helped"
|
||||
value="1" {{#if
|
||||
help}}checked{{/if}}>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label">{{localize 'VERMINE.tooling'}} (+1D)</label>
|
||||
<input type="checkbox" data-roll="true" name="usingTools" id="usingTools"
|
||||
value="1" {{#if
|
||||
help}}checked{{/if}}>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 80%;">{{localize
|
||||
'VERMINE.self_control'}} <span id="self_control_value"></span>
|
||||
</label>
|
||||
<input type="range" id="self_control" data-roll="true" name="self_control"
|
||||
min="0"
|
||||
max="0" value="0" />
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
<h4 class="label">utiliser des dés totems ?
|
||||
</h4>
|
||||
<div class="totem-human">
|
||||
<label for="human-totem">totem humain </label>
|
||||
<input type="checkbox" data-roll="true" name="human-totem"
|
||||
id="human-totem"
|
||||
value="1">
|
||||
</div>
|
||||
<div class="totem-adapted">
|
||||
<label for="human-totem">totem adapté </label>
|
||||
<input type="checkbox" data-roll="true" name="adapted-totem"
|
||||
id="adapted-totem"
|
||||
value="1">
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 80%;">{{localize
|
||||
'VERMINE.group'}}</label>
|
||||
<input type="number" data-roll="true" class="numeric-entry"
|
||||
style="text-align: center;"
|
||||
name="group" id="group" min="0" max="5" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<p><input type="hidden" name="speakerId" value="{{ speakerId }}" />
|
||||
<input type="hidden" name="skillLabel" value="{{ skill }}" /></p>
|
||||
</form>
|
||||
+68
-19
@@ -1,26 +1,75 @@
|
||||
<div class="ecryme-dv roll attribute">
|
||||
<div class="dice-roll">
|
||||
<div class="dice-result">
|
||||
<div class="dice-formula">
|
||||
{{ ` + dicePool + `d6 }}
|
||||
<div class="vermine-roll-message">
|
||||
{{log this}}
|
||||
<h3>{{param.actor.name}} : test de {{param.rollLabel}}</h3>
|
||||
<div class="flexrow">
|
||||
<h4>difficulté</h4>
|
||||
<span id="difficulty">{{param.difficulty}}</span>
|
||||
</div>
|
||||
<div class="dice-tooltip expanded">
|
||||
<section class="tooltip-part flexrow">
|
||||
<div class="" style="flex:60%;">
|
||||
<div class="parameters">
|
||||
{{ targetText }}
|
||||
<ul class="flexrow roll-results initial-roll"
|
||||
data-difficulty="{{param.difficulty}}">
|
||||
{{#each roll.dice as |dieType index|}}
|
||||
{{#each dieType.results as |die index|}}
|
||||
<li class="roll die flexcol
|
||||
{{#if die.success}}
|
||||
success
|
||||
{{/if}}
|
||||
{{#ifincludes dieType.options.flavor "adapted"}}
|
||||
adapted
|
||||
{{/ifincludes}}
|
||||
{{#ifincludes dieType.options.flavor "regular"}}
|
||||
regular
|
||||
{{/ifincludes}}
|
||||
{{#ifincludes dieType.options.flavor "human"}}
|
||||
human
|
||||
{{/ifincludes}}
|
||||
{{#ifgt @root.param.Reroll 0}}
|
||||
rerollable
|
||||
{{/ifgt}}
|
||||
"
|
||||
data-dice-type="
|
||||
{{#ifincludes dieType.options.flavor "adapted"}}
|
||||
adapted
|
||||
{{/ifincludes}}
|
||||
{{#ifincludes dieType.options.flavor "regular"}}
|
||||
regular
|
||||
{{/ifincludes}}
|
||||
{{#ifincludes dieType.options.flavor "human"}}
|
||||
human
|
||||
{{/ifincludes}}">
|
||||
|
||||
<span>{{die.result}}</span>
|
||||
|
||||
</li>
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
<div class="roll-total flexrow">
|
||||
<h4>nombre de succès :</h4>
|
||||
<span id="total">{{roll._total}}</span>
|
||||
</div>
|
||||
<div class="dice">
|
||||
<ol class="dice-rolls">{{ diceString }}</ol>
|
||||
<div class="reroll flexrow">
|
||||
<div class="reroll-from-effort ">
|
||||
<div class="flexcol">
|
||||
<h4 class="flexcol">
|
||||
<span>effort</span>
|
||||
</h4>
|
||||
<input type="range" min="0"
|
||||
{{#iflt param.max_effort param.actor.system.attributes.effort.value}}
|
||||
max="{{param.max_effort}}"
|
||||
{{/iflt}}
|
||||
{{#iflteq param.actor.system.attributes.effort.value param.max_effort }}
|
||||
max="{{param.actor.system.attributes.effort.value}}"
|
||||
{{/iflteq}}
|
||||
value="0"
|
||||
id="effort-reroll">
|
||||
</input>
|
||||
|
||||
</div>
|
||||
<button class="grant-reroll" data-tooltip="s'accorder des relances"> <span id="granted-reroll">0</span> </button>
|
||||
</div>
|
||||
<div class="align-center">
|
||||
Résultat
|
||||
<p style="font-weight:bold; font-size:2em;">{{ (total + skill + _trait + _usingSpecialization + _used).toString() }}</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>` +
|
||||
`<h4 class="dice-total">{{ successText }}</h4>
|
||||
<div class="reroll-fromroll">
|
||||
<h4>relances possibles : </h4>
|
||||
<span id="allowed_reroll">{{param.Reroll}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,74 +0,0 @@
|
||||
<form id="dice-pool-form" class="ecryme-dv-form" data-actor-id="{{ speakerId }}">
|
||||
<input type="hidden" name="label" id="label" value="{{ label }}" />
|
||||
<input type="hidden" name="rollType" id="rollType" value="{{ rollType }}" />
|
||||
<input type="hidden" name="abilityScore" id="abilityScore" value="{{ abilityScore }}" />
|
||||
<input type="hidden" name="skillScore" id="skillScore" value="{{ skillScore }}" />
|
||||
<div class="dice-pool flexcol">
|
||||
<div class="flexrow row lgb flex-group-center">
|
||||
<span>Type de jet <strong>{{#if (eq rollType 'skill')}}{{ localize 'VERMINE.skill_title' }}{{else}}{{ localize 'VERMINE.ability' }}{{/if}}</strong></span>
|
||||
<span>{{#if (eq rollType 'skill')}}{{ localize 'VERMINE.skill_title' }}{{else}}{{ localize 'VERMINE.ability' }}{{/if}}
|
||||
<strong>{{#if (eq rollType 'skill')}}{{ smarttl "SKILLS" label }}{{else}}{{ smarttl "ABILITIES" label }}{{/if}}</strong> </span>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize 'VERMINE.difficulty'}}</label>
|
||||
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="difficulty" id="difficulty" min="3" max="10">
|
||||
{{#select difficulty }}
|
||||
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 1}} - {{ diffLevel 'difficulty' 1}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 2}} - {{ diffLevel 'difficulty' 2}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 1}}" selected>{{ diffLevel 'label' 3}} - {{ diffLevel 'difficulty' 3}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 4}} - {{ diffLevel 'difficulty' 4}}</option>
|
||||
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 5}} - {{ diffLevel 'difficulty' 5}}</option>
|
||||
{{/select}}
|
||||
</select>
|
||||
</div>
|
||||
<!--div class="flexrow row">
|
||||
<input style="text-align: center;" class="numeric-entry" type="number" name="difficulty" value="7" id="difficulty" min="3" max="10">
|
||||
</div-->
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize 'VERMINE.ability'}}</label>
|
||||
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="ability" id="ability" min="1" max="5">
|
||||
{{#if (eq rollType 'skill')}}<option>-- Choisissez une caractéristique --</option>{{/if}}
|
||||
{{#each abilities as |ability key| }}
|
||||
<option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}> {{ smarttl "ABILITIES" key }} - {{ ability.value }}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
{{#if (eq rollType 'skill')}}
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 60%;">{{localize 'VERMINE.skill_title'}}</label>
|
||||
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="skill" id="skill" min="1" max="5">
|
||||
{{#each skills as |skill key| }}
|
||||
<option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}> {{ smarttl "SKILLS" key }} - {{ skill.value }}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flexrow row lgb">
|
||||
<span id="skillLevel">{{#if (ne skillScore 0)}}{{ skillLevel 'label' skillScore }}{{/if}}</span>
|
||||
<span>{{localize 'VERMINE.bonus'}} : <em id="skillDicePool">{{#if (ne skillScore 0)}}{{ skillLevel 'dicePool' skillScore }}{{else}}0{{/if}}</em></span>
|
||||
<span>{{localize 'VERMINE.reroll'}} : <em id="skillReroll">{{#if (ne skillScore 0)}}{{ skillLevel 'reroll' skillScore }}{{else}}0{{/if}}</em></span>
|
||||
</div>
|
||||
<div class="flexrow row smb">
|
||||
<label class="label">{{localize 'VERMINE.specialty'}} (+1D)</label>
|
||||
<input type="checkbox" name="usingSpecialization" id="usingSpecialization" value="1" {{#if specialty}}checked{{/if}}>
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="flexrow row smb">
|
||||
<label class="label">{{localize 'VERMINE.help'}} (+1D)</label>
|
||||
<input type="checkbox" name="helped" id="helped" value="1" {{#if help}}checked{{/if}}>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label">{{localize 'VERMINE.tooling'}} (+1D)</label>
|
||||
<input type="checkbox" name="usingTools" id="usingTools" value="1" {{#if help}}checked{{/if}}>
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 80%;">{{localize 'VERMINE.self_control'}}</label>
|
||||
<input type="number" class="numeric-entry" style="text-align: center;" name="self_control" id="self_control" min="0" max="5" value="0">
|
||||
</div>
|
||||
<div class="flexrow row mdb">
|
||||
<label class="label" style="flex: 80%;">{{localize 'VERMINE.group'}}</label>
|
||||
<input type="number" class="numeric-entry" style="text-align: center;" name="group" id="group" min="0" max="" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<p><input type="hidden" name="speakerId" value="{{ speakerId }}" />
|
||||
<input type="hidden" name="skillLabel" value="{{ skill }}" /></p>
|
||||
</form>
|
||||
Reference in New Issue
Block a user