plein de truc

This commit is contained in:
rwanoux
2024-04-21 16:51:13 +02:00
parent 0fe0d530b1
commit 74e11d439c
78 changed files with 9447 additions and 2112 deletions
+9
View File
@@ -1 +1,10 @@
# Vermine 2047 System # Vermine 2047 System
##TODO
- [ ] envoyer les spécialités utilisables au rollDialog
- [ ] refacto des template chat de roll
- [ ] gérer les dés de totems humains et adapté : couleur différente/double succès
- [ ] gérer les rerolls depuis chat(cf noc)
- [ ] repasser sur les différents itemTypes et sheets
-458
View File
File diff suppressed because one or more lines are too long
+1 -388
View File
File diff suppressed because one or more lines are too long
+40
View File
@@ -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
View File
@@ -2,396 +2,506 @@
"SETTINGS": { "SETTINGS": {
"world": { "world": {
"game_mode": { "game_mode": {
"name":"Choix du mode de jeu", "name": "Game Mode Selection",
"hint":"À limage 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 lunivers." "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": { "first_run": {
"name":"Affichage du tour d'accueil", "name": "First Run Display",
"hint":"Pour aider les débutantEs à bien commencer avec le système Vermine 2047." "hint": "To help beginners get started with the Vermine 2047 system."
} }
} }
}, },
"VERMINE.WorldSettings.GameMode.Name":"Choix du mode de jeu", "VERMINE.WorldSettings.GameMode.Name": "Game Mode Selection",
"VERMINE.WorldSettings.GameMode.Hint":"À limage 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 lunivers.", "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": { "GAME_MODES": {
"heroic": { "name": "Héroique"}, "heroic": {
"epic": { "name": "Epique"}, "name": "Heroic"
"legendary": { "name": "Légendaire"} },
"epic": {
"name": "Epic"
},
"legendary": {
"name": "Legendary"
}
}, },
"ROLLS": { "ROLLS": {
"tool": "Lanceur de dés", "tool": "Dice Roller",
"roll_dice": "Jeter les dés" "roll_dice": "Roll the dice"
}, },
"TOURS": { "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": { "Welcome": {
"Title": "Bienvenue dans Vermine", "Title": "Welcome to Vermine",
"Description": "Aperçu du système Vermine", "Description": "Overview of the Vermine system",
"WelcomeTitle": "Bienvenue", "WelcomeTitle": "Welcome",
"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>", "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": "Peupler son univers", "ActorTabTitle": "Populate your universe",
"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>", "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": "Créer un groupe", "CharacterCreateTitle": "Create a group",
"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>", "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": "Cartes", "CompendiumTitle": "Maps",
"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>", "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", "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>", "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": "Prochaines étapes", "ToursTitle": "Next steps",
"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>" "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": { "DIFFICULTY_LEVELS": {
"obvious": "Evidente", "obvious": "Obvious",
"easy": "Facile", "easy": "Easy",
"hard": "Difficile", "hard": "Hard",
"very_hard": "Très difficile", "very_hard": "Very hard",
"impossible": "Impossible" "impossible": "Impossible"
}, },
"ATTITUDES": { "ATTITUDES": {
"offensive": { "name": "Offensif"}, "offensive": {
"active": { "name": "Actif"}, "name": "Offensive"
"passive": { "name": "Passif"} },
"active": {
"name": "Active"
},
"passive": {
"name": "Passive"
}
}, },
"AGE_TYPES": { "AGE_TYPES": {
"young": "Jeune", "young": "Young",
"adult": "Adulte", "adult": "Adult",
"old": "Vieux" "old": "Old"
}, },
"IDENTITY": { "IDENTITY": {
"name": "Nom", "name": "Name",
"height": "Taille", "height": "Height",
"weight": "Poids", "weight": "Weight",
"totem": "Totem", "totem": "Totem",
"age": "Age", "age": "Age",
"gender": "Sexe", "gender": "Gender",
"profile": "Profil", "profile": "Profile",
"origin": "Origine", "origin": "Origin",
"theme": "Concept", "theme": "Concept",
"instincts": "Instincts", "instincts": "Instincts",
"prohibits": "Interdits", "prohibits": "Prohibits",
"objectives": "Objectifs", "objectives": "Objectives",
"relations": "Relations", "relations": "Relations",
"morale":"Moral", "morale": "Morale",
"morale_level": "Niveau de moral", "morale_level": "Morale level",
"notes": "Notes" "notes": "Notes"
}, },
"ADVERSITY": { "ADVERSITY": {
"threat": "Menace", "threat": "Threat",
"experience": "Expérience", "experience": "Experience",
"role": "Rôle", "role": "Role",
"attack": "Attaque", "attack": "Attack",
"damage": "Dommages", "damage": "Damage",
"weapon": "Arme", "weapon": "Weapon",
"vigor": "Vigueur", "vigor": "Vigor",
"wounds": "Blessures", "wounds": "Wounds",
"action": "Action", "action": "Action",
"specialties": "Spécialité", "specialties": "Specialty",
"rerolls": "Relances", "rerolls": "Rerolls",
"contact": "Contact", "contact": "Contact",
"reaction": "Réaction", "reaction": "Reaction",
"pools":"Réserves", "pools": "Reserves",
"gear": "Matériel", "gear": "Gear",
"protection": "Protection", "protection": "Protection",
"skills": "Compétences", "skills": "Skills",
"pattern": "Gabarit", "pattern": "Pattern",
"size": "Taille", "size": "Size",
"pack": "Groupe" "pack": "Group"
}, },
"VERMINE": { "VERMINE": {
"name": "Vermine", "name": "Vermine",
"stats": "Statistiques", "stats": "Statistics",
"level": "Niveau", "level": "Level",
"experience": "Expérience", "experience": "Experience",
"reputation": "Réputation", "reputation": "Reputation",
"pool": "Réserve", "pool": "Reserve",
"pools": "Réserves", "pools": "Reserves",
"self_control": "Sang-Froid", "self_control": "Self-control",
"effort": "Effort", "effort": "Effort",
"group": "Groupe", "group": "Group",
"abilities":"Caractéristiques", "abilities": "Characteristics",
"ability":"Caractéristique", "ability": "Characteristic",
"skills_title":"Compétences", "skills_title": "Skills",
"skill_title":"Compétence", "skill_title": "Skill",
"skill_mastery":"Maîtrise", "skill_mastery": "Mastery",
"bonus":"Bonus", "bonus": "Bonus",
"penalty":"Malus", "penalty": "Penalty",
"reroll":"Relance", "reroll": "Reroll",
"equipment":"Equipement", "equipment": "Equipment",
"specialty":"Spécialité", "specialty": "Specialty",
"technique":"Technique", "technique": "Technique",
"techniques":"Techniques", "techniques": "Techniques",
"difficulty":"Difficulté", "difficulty": "Difficulty",
"help":"Entraide", "help": "Help",
"tooling":"Equipement", "tooling": "Equipment",
"quantity": "Quantité", "quantity": "Quantity",
"qty": "Qté", "qty": "Qty",
"weight": "Poids", "weight": "Weight",
"dmg": "Dmg", "dmg": "Dmg",
"damage": "Dommage", "damage": "Damage",
"damages": "Dommages", "damages": "Damages",
"range": "Portée", "range": "Range",
"ranges": "Portées", "ranges": "Ranges",
"mobility": "Mobilité", "mobility": "Mobility",
"rarity": "Rareté", "rarity": "Rarity",
"rarity_sm": "Rar.", "rarity_sm": "Rar.",
"reliability": "Fiabilité", "reliability": "Reliability",
"reliability_sm": "Fiab.", "reliability_sm": "Fiab.",
"wounds":{ "wounds": {
"name":"Blessures", "name": "Wounds",
"threshold": "Seuil", "threshold": "Threshold",
"light":"Légère", "light": "Light",
"heavy": "Grave", "heavy": "Heavy",
"deadly": "Mortelle", "deadly": "Deadly",
"light_wounds":"Blessure légère", "light_wounds": "Light wounds",
"heavy_wounds":"Blessure grave", "heavy_wounds": "Heavy wounds",
"deadly_wounds":"Blessure mortelle" "deadly_wounds": "Deadly wounds"
}, },
"ammo": "Munitions", "ammo": "Ammo",
"ammo_sm": "Mun", "ammo_sm": "Mun",
"trait": "Trait", "trait": "Trait",
"traits": "Traits", "traits": "Traits",
"clew": "Indice", "clew": "Clue",
"combat": "Combat", "combat": "Combat",
"stories": "Histoires", "stories": "Stories",
"gear": "Matériel", "gear": "Gear",
"information": "Informations", "information": "Information",
"boost": "boost", "boost": "Boost",
"group_abilities": "Capacités de groupe", "group_abilities": "Group abilities",
"totem_abilities": "Capacités de totem", "totem_abilities": "Totem abilities",
"type_group": "Groupe", "type_group": "Group",
"type_character": "Personnage", "type_character": "Character",
"type_npc": "PNJ", "type_npc": "NPC",
"type_creature": "Créature", "type_creature": "Creature",
"type": "Type", "type": "Type",
"group_members": "Membres", "group_members": "Members",
"encounters": "Rencontres", "encounters": "Encounters",
"road": "La Route", "road": "The Road",
"totem_picker": "Sélecteur de totem", "totem_picker": "Totem picker",
"actor_picker": "Sélecteur de personnage" "actor_picker": "Actor picker"
}, },
"UI": { "UI": {
"add": "Ajouter", "add": "Add",
"source":"Source", "source": "Source",
"duration":"Durée", "duration": "Duration",
"effect_toggle":"Basculer un effet", "effect_toggle": "Toggle effect",
"effect_edit":"Modifier un effet", "effect_edit": "Edit effect",
"effect_delete":"Détruire un effet", "effect_delete": "Delete effect",
"effect_create":"Créer un effet", "effect_create": "Create effect",
"effects": { "effects": {
"name": "Effets", "name": "Effects",
"temporary": "Effets temporaires", "temporary": "Temporary effects",
"passive": "Effets passifs", "passive": "Passive effects",
"inactive": "Effets inactifs" "inactive": "Inactive effects"
} }
}, },
"ITEMS": { "ITEMS": {
"defense": "Protection", "defense": "Protection",
"defenses": "Protections", "defenses": "Protections",
"new_defense": "Nouvelle protection", "new_defense": "New protection",
"weapon": "Arme", "weapon": "Weapon",
"new_weapon": "Nouvelle arme", "new_weapon": "New weapon",
"weapons": "Armes", "weapons": "Weapons",
"new_background": "Nouvel historique", "new_background": "New background",
"backgrounds": "Historiques", "backgrounds": "Backgrounds",
"new_trauma": "Nouveau traumatisme", "new_trauma": "New trauma",
"traumas": "Traumatismes", "traumas": "Traumas",
"rumor": "Rumeur", "rumor": "Rumor",
"new_rumor": "Nouvelle rumeur", "new_rumor": "New rumor",
"rumors": "Rumeurs", "rumors": "Rumors",
"ability": "Capacité", "ability": "Ability",
"new_ability": "Nouvelle capacité", "new_ability": "New ability",
"abilities": "Capacités", "abilities": "Abilities",
"specialties": "Spécialités", "specialties": "Specialties",
"new_specialty": "Nouvelle spécialité", "new_specialty": "New specialty",
"evolution": "Adaptation", "evolution": "Adaptation",
"new_evolution": "Nouvelle adaptation", "new_evolution": "New adaptation",
"evolutions": "Adaptations", "evolutions": "Adaptations",
"new_vehicle": "Nouveau véhicule", "new_vehicle": "New vehicle",
"vehicles": "Véhicules", "vehicles": "Vehicles",
"new_objective": "Nouvel objectif", "new_objective": "New objective",
"learning": "Apprentissage", "learning": "Learning",
"cost": "Coût", "cost": "Cost",
"rituel": "Rituel", "rituel": "Ritual",
"transe": "Transe", "transe": "Trance",
"effects": "Effets", "effects": "Effects",
"details": "Détails" "details": "Details"
}, },
"ABILITIES": { "ABILITIES": {
"vigor": { "name": "Vigueur"}, "vigor": {
"health": { "name": "Santé"}, "name": "Vigor"
"precision":{ "name": "Précision"}, },
"reflexes":{ "name": "Réflexes"}, "health": {
"knowledge":{ "name": "Savoir"}, "name": "Health"
"perception":{ "name": "Perception"}, },
"will":{ "name": "Volonté"}, "precision": {
"empathy":{ "name": "Empathie"} "name": "Precision"
},
"reflexes": {
"name": "Reflexes"
},
"knowledge": {
"name": "Knowledge"
},
"perception": {
"name": "Perception"
},
"will": {
"name": "Will"
},
"empathy": {
"name": "Empathy"
}
}, },
"SKILL_LEVELS": { "SKILL_LEVELS": {
"beginner": "Débutant", "incompetent": "Incompetent",
"proficient": "Confirmé", "beginner": "Beginner",
"expert":"Expert", "proficient": "Proficient",
"master":"Maître", "expert": "Expert",
"legend":"Légende" "master": "Master",
"legend": "Legend"
}, },
"THREAT_LEVELS": { "THREAT_LEVELS": {
"minor": "Mineure", "minor": "Minor",
"serious": "Sérieuse", "serious": "Serious",
"major":"Majeure", "major": "Major",
"deadly":"Mortelle" "deadly": "Deadly"
}, },
"ROLE_LEVELS": { "ROLE_LEVELS": {
"minor": "Mineur", "minor": "Minor",
"secondary": "Secondaire", "secondary": "Secondary",
"important":"Important", "important": "Important",
"major":"Majeur" "major": "Major"
}, },
"PATTERN_LEVELS": { "PATTERN_LEVELS": {
"insect": "Insecte", "insect": "Insect",
"rat": "Rat", "rat": "Rat",
"dog":"Chien", "dog": "Dog",
"bear":"Ours" "bear": "Bear"
}, },
"TOTEMS": { "TOTEMS": {
"human": { "human": {
"name": "L'Humain", "name": "Human",
"number":1, "number": 1,
"description":"", "description": "",
"instincts" : "", "instincts": "",
"bans" : "", "bans": "",
"opposite": "adapted" "opposite": "adapted"
}, },
"predator": { "predator": {
"name": "Le prédateur", "name": "Predator",
"number":2, "number": 2,
"description":"Totem emblématique, le Prédateur a toujours été lun des plus répandus dans le règne animal, et il reste de loin celui qui influence le plus grand nombre despèces aujourdhui. On lobserve 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 daffrontement essentiels à lalimentation, mais il ne prône quune violence justifiée, nécessaire et vitale. Selon les peuples et les cultures, il a longtemps été symbolisé par le lion, laigle 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", "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" : "Triompher, relever un défi, prendre linitiative, atteindre un objectif.", "instincts": "Triumph, overcome a challenge, take the initiative, achieve a goal.",
"bans" : "Fuir, abandonner, renoncer,faire preuve de lâcheté.", "bans": "Flee, abandon, renounce, show cowardice.",
"behaviour" : "Déterminé, implacable,courageux, dominant.", "behaviour": "Determined, implacable,courageous, dominant.",
"opposite": "scavenger" "opposite": "scavenger"
}, },
"scavenger": { "scavenger": {
"name": "Le Charognard", "name": "Scavenger",
"number":3, "number": 3,
"description":"Dans un écosystème dominé par la loi du plus fort, certains ont pris le parti dattendre 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 sattaquer 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 lopportunité 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 lombre du Prédateur, avec qui il entretient une relation quasi symbiotique", "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" : "Achever, saboter, affaiblir, sen prendre au plus faible.", "instincts": "Finish, sabotage, weaken, attack the weakest.",
"bans" : "Affronter, sexposer, agir de façon compulsive, sapitoyer.", "bans": "Face, expose, act compulsively, pity.",
"behaviour" : "Sournois, calculateur, impitoyable", "behaviour": "Sly, calculating, pitiless",
"opposite": "predator" "opposite": "predator"
}, },
"symbiote": { "symbiote": {
"name": "Le Symbiote", "name": "Symbiote",
"number":4, "number": 4,
"description":"Symbole dentraide, d’équilibre et dharmonie, le Symbiote se définit par la relation d’échange et de réciprocité où chaque partie profite de ce que lautre 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 lont instaurée avec les pollinisateurs, cette relation de symbiose sobserve é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 lempêche d’être motivée par le profit ou lintérêt, tant quelle est réciproque ce qui distingue le Symbiote du Parasite.", "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" : "Partager, transmettre, équilibrer, trouver un compromis", "instincts": "Share, transmit, balance, find a compromise",
"bans" : "Exploiter, abuser, profiter de la faiblesse, mettre en danger", "bans": "Exploit, abuse, profit from weakness, put in danger",
"behaviour" : "Bienveillant, responsable, diplomate, modéré.", "behaviour": "Well-intentioned, responsible, diplomatic, moderate.",
"opposite": "parasite" "opposite": "parasite"
}, },
"parasite": { "parasite": {
"name": "Le Parasite", "name": "The Parasite",
"number":5, "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 lhumanité, jusqu’à en devenir le fléau. Symbolisé par les moustiques, il sobserve é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 quun autre possède et dont il a besoin. Avec le Prédateur, cest lun des Totems les plus présents et les plus redoutés, tant les comportements quil inspire peuvent ruiner tout espoir de survie.", "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" : "Profiter, manipuler, voler, exploiter.", "instincts": "Profit, manipulate, steal, exploit.",
"bans" : "Partager, contribuer, tenir une promesse, prendre par la force", "bans": "Share, contribute, keep a promise, take by force",
"behaviour" : "Manipulateur, menteur, égoïste, profiteur", "behaviour": "Manipulator, liar, selfish, profiteer",
"opposite": "symbiote" "opposite": "symbiote"
}, },
"builder": { "builder": {
"name": "Le Bâtisseur", "name": "The Builder",
"number":6, "number": 6,
"description":"Souvent confondu avec la Ruche en raison des constructions géantes typiques de certaines espèces sociales, le Bâtisseur nest pas le Totem de la communauté, mais celui de la fondation. À limage des termites, des castors, de la plupart des oiseaux ou de certaines espèces daraignées, il se caractérise par lacte de construction, de création ou de modification, et sobserve aussi bien chez des groupes que chez des individus. Avec la Ruche, le Symbiote et la Horde, cest lun des Totems les plus courants chez les communautés humaines, dont il inspire les édifices, les inventions et les réparations.", "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" : "Fonder, créer, sinstaller durablement, nouer des liens.", "instincts": "Found, create, settle permanently, forge links.",
"bans" : "Détruire, saboter, quitter une communauté, provoquer le chaos", "bans": "Destroy, sabotage, leave a community, provoke chaos",
"behaviour" : "Réfléchi, organi, pragmatique, constant.", "behaviour": "Reflective, organized, pragmatic, constant.",
"opposite": "horde" "opposite": "horde"
}, },
"horde": { "horde": {
"name": "La Horde", "name": "The Horde",
"number":7, "number": 7,
"description":"Fléau des cultures depuis la nuit des temps, la Horde est à limage 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 daction. 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.", "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" : "Piller, détruire, prendre par la force, miser sur le nombre", "instincts": "Pillage, destroy, take by force, rely on numbers",
"bans" : "Négocier, épargner, faire des réserves, planifier à long terme.", "bans": "Negotiate, spare, make reserves, plan in the long term.",
"behaviour" : "Violent, imprévisible, destructeur, radical.", "behaviour": "Violent, unpredictable, destructive, radical.",
"opposite": "builder" "opposite": "builder"
}, },
"hive": { "hive": {
"name": "La Ruche", "name": "The Hive",
"number":8, "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 dindividus, la Ruche est caractérisée par lorganisation, la hiérarchie, le dévouement et la conscience aigüe du rôle que chacun doit jouer dans lintérêt commun, plus que par la notion de communauté elle-même. Elle sappuie 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.", "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" : "Organiser, œuvrer pour la communauté, respecter la hiérarchie, privilégier lintérêt collectif", "instincts": "Organize, work for the community, respect the hierarchy, prioritize the collective interest",
"bans" : "trahir, désobéir, mettre sa communauté en danger, faire preuve dindividualisme.", "bans": "Betray, disobey, put one's community in danger, show individualism.",
"behaviour" : "Méthodique, autoritaire, consciencieux, rigide", "behaviour": "Methodical, authoritarian, conscientious, rigid",
"opposite": "loner" "opposite": "loner"
}, },
"loner": { "loner": {
"name": "Le solitaire", "name": "The Loner",
"number":9, "number": 9,
"description":"Survivre, quoi quil en coûte. Sans cruauté, sans états d’âme, mais à tout prix. À linverse de la Ruche qui loue le sacrifice sil est accompli dans linté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 nempêche un Solitaire de trouver une place durable dans un groupe, dy jouer un rôle précis ou même de suivre des règles établies, tant quelles ne heurtent pas ses propres convictions et quelles ne mettent pas en péril son bien le plus précieux : sa vie.", "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" : "Survivre, anticiper, sadapter, faire passer sa vie avant tout", "instincts": "Survive, anticipate, adapt, put one's life first",
"bans" : "Se sacrifier, risquer sa vie, dépendre de quelquun, se résigner.", "bans": "Sacrifice oneself, risk one's life, depend on someone, resign.",
"behaviour" : "Indépendant, lucide, autonome, réactif.", "behaviour": "Independent, lucid, autonomous, reactive.",
"opposite": "hive" "opposite": "hive"
}, },
"adapted": { "adapted": {
"name": "L'adapté", "name": "The Adapted",
"number":10, "number": 10,
"description":"Évoluer ou mourir. Changer ou disparaître. LAdapté 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 lHomme est la seule forme de vie à tenter de contrôler sa propre évolution. LAdapté ne possède ni Interdit, ni Instinct spécifique. Aucun comportement nest inapproprié, sil permet de faire face et de survivre, et les Instincts de tous les autres Totems le renforcent. Seul lHumain lutte contre son influence", "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" : "Tous ceux des huit Totems majeurs", "instincts": "All those of the eight major Totems",
"bans" : "Aucun…", "bans": "None...",
"opposite": "human" "opposite": "human"
} }
}, },
"ABILITY_CATEGORIES": { "ABILITY_CATEGORIES": {
"physical": { "name": "Physique"}, "physical": {
"manual": { "name": "Manuel"}, "name": "Physical"
"mental": { "name": "Mental"}, },
"social": { "name": "Social"} "manual": {
"name": "Manual"
},
"mental": {
"name": "Mental"
},
"social": {
"name": "Social"
}
}, },
"SKILLS_CATEGORIES": { "SKILLS_CATEGORIES": {
"man": { "name": "L'Homme" }, "man": {
"animal": { "name": "L'Animal" }, "name": "Man"
"tool": { "name": "L'Outil" }, },
"weapon": { "name": "L'Arme" }, "animal": {
"survival": { "name": "La Survie" }, "name": "Animal"
"world": { "name": "La Terre" } },
"tool": {
"name": "Tool"
},
"weapon": {
"name": "Weapon"
},
"survival": {
"name": "Survival"
},
"world": {
"name": "World"
}
}, },
"SKILLS": { "SKILLS": {
"arts": { "name": "Arts"}, "arts": {
"civilization": { "name": "Civilisations"}, "name": "Arts"
"psychology": { "name": "Psychologie"}, },
"rumors": { "name": "Rumeurs"}, "civilization": {
"healing": { "name": "Soins"}, "name": "Civilizations"
"animalism": { "name": "Animalisme"}, },
"dissection": { "name": "Dissection"}, "psychology": {
"wildlife": { "name": "Faune"}, "name": "Psychology"
"repulsion": { "name": "Répulsion"}, },
"tracks": { "name": "Traces"}, "rumors": {
"crafting": { "name": "Artisanat"}, "name": "Rumors"
"diy": { "name": "Bricolage"}, },
"mecanical": { "name": "Mécanique"}, "healing": {
"piloting": { "name": "Pilotage"}, "name": "Healing"
"technology": { "name": "Technologie"}, },
"firearms": { "name": "Armes à feu"}, "animalism": {
"armory": { "name": "Armurerie"}, "name": "Animalism"
"shield": { "name": "Bouclier"}, },
"close": { "name": "Corps-à-corps"}, "dissection": {
"archery": { "name": "Armes de tir"}, "name": "Dissection"
"throwing": { "name": "Lancer"}, },
"melee": { "name": "Mêlée"}, "wildlife": {
"atletics": { "name": "Atlétisme"}, "name": "Wildlife"
"stealth": { "name": "Discrétion"}, },
"alertness": { "name": "Vigilance"}, "repulsion": {
"flora": { "name": "Flore"}, "name": "Repulsion"
"food": { "name": "Alimentation"}, },
"environment": { "name": "Environnement"}, "tracks": {
"road": { "name": "Route"}, "name": "Tracks"
"toxics": { "name": "Toxiques"}, },
"ruins": { "name": "Vestiges"} "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": { "SEXES": {
"male": "Masculin", "male": "Masculine",
"female":"Féminin" "female": "Feminine"
} }
} }
+514
View File
@@ -0,0 +1,514 @@
{
"SETTINGS": {
"world": {
"game_mode": {
"name": "Choix du mode de jeu",
"hint": "À limage 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 lunivers."
},
"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": "À limage 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 lunivers.",
"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é lun des plus répandus dans le règne animal, et il reste de loin celui qui influence le plus grand nombre despèces aujourdhui. On lobserve 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 daffrontement essentiels à lalimentation, mais il ne prône quune violence justifiée, nécessaire et vitale. Selon les peuples et les cultures, il a longtemps été symbolisé par le lion, laigle 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 linitiative, 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 dattendre 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 sattaquer 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 lopportunité 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 lombre du Prédateur, avec qui il entretient une relation quasi symbiotique",
"instincts": "Achever, saboter, affaiblir, sen prendre au plus faible.",
"bans": "Affronter, sexposer, agir de façon compulsive, sapitoyer.",
"behaviour": "Sournois, calculateur, impitoyable",
"opposite": "predator"
},
"symbiote": {
"name": "Le Symbiote",
"number": 4,
"description": "Symbole dentraide, d’équilibre et dharmonie, le Symbiote se définit par la relation d’échange et de réciprocité où chaque partie profite de ce que lautre 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 lont instaurée avec les pollinisateurs, cette relation de symbiose sobserve é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 lempêche d’être motivée par le profit ou lintérêt, tant quelle 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 lhumanité, jusqu’à en devenir le fléau. Symbolisé par les moustiques, il sobserve é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 quun autre possède et dont il a besoin. Avec le Prédateur, cest lun des Totems les plus présents et les plus redoutés, tant les comportements quil 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 nest pas le Totem de la communauté, mais celui de la fondation. À limage des termites, des castors, de la plupart des oiseaux ou de certaines espèces daraignées, il se caractérise par lacte de construction, de création ou de modification, et sobserve aussi bien chez des groupes que chez des individus. Avec la Ruche, le Symbiote et la Horde, cest lun 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, sinstaller 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 à limage 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 daction. 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 dindividus, la Ruche est caractérisée par lorganisation, la hiérarchie, le dévouement et la conscience aigüe du rôle que chacun doit jouer dans lintérêt commun, plus que par la notion de communauté elle-même. Elle sappuie 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 lintérêt collectif",
"bans": "trahir, désobéir, mettre sa communauté en danger, faire preuve dindividualisme.",
"behaviour": "Méthodique, autoritaire, consciencieux, rigide",
"opposite": "loner"
},
"loner": {
"name": "Le solitaire",
"number": 9,
"description": "Survivre, quoi quil en coûte. Sans cruauté, sans états d’âme, mais à tout prix. À linverse de la Ruche qui loue le sacrifice sil est accompli dans linté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 nempêche un Solitaire de trouver une place durable dans un groupe, dy jouer un rôle précis ou même de suivre des règles établies, tant quelles ne heurtent pas ses propres convictions et quelles ne mettent pas en péril son bien le plus précieux : sa vie.",
"instincts": "Survivre, anticiper, sadapter, faire passer sa vie avant tout",
"bans": "Se sacrifier, risquer sa vie, dépendre de quelquun, 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. LAdapté 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 lHomme est la seule forme de vie à tenter de contrôler sa propre évolution. LAdapté ne possède ni Interdit, ni Instinct spécifique. Aucun comportement nest inapproprié, sil permet de faire face et de survivre, et les Instincts de tous les autres Totems le renforcent. Seul lHumain 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"
}
}
+17 -3
View File
@@ -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 * Extend the basic ActorSheet with some very simple modifications
@@ -90,8 +90,22 @@ export class VermineActorSheet extends ActorSheet {
}); });
} }
} //click on wound radio
html.find('[type="radio"][data-wound]').click(ev => {
this._onWoundClick(ev)
})
}
_onWoundClick(ev) {
if (!ev.currentTarget.checked) { return }
let woundType = ev.currentTarget.dataset.wound;
let targetProp = "system." + woundType + ".value";
let update = {};
update[targetProp] = ev.currentTarget.value - 1
this.actor.update(update)
}
async _onItemCreate(event) { async _onItemCreate(event) {
event.preventDefault(); event.preventDefault();
const header = event.currentTarget; const header = event.currentTarget;
@@ -113,6 +127,6 @@ export class VermineActorSheet extends ActorSheet {
delete itemData.system["type"]; delete itemData.system["type"];
// Finally, create the item! // Finally, create the item!
return await Item.create(itemData, {parent: this.actor}); return await Item.create(itemData, { parent: this.actor });
} }
} }
+1 -3
View File
@@ -14,8 +14,7 @@ export class VermineCharacterSheet extends VermineActorSheet {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["vermine2047", "sheet", "character", "actor"], classes: ["vermine2047", "sheet", "character", "actor"],
template: "systems/vermine2047/templates/actor/actor-sheet.hbs", template: "systems/vermine2047/templates/actor/actor-sheet.hbs",
width: 600,
height: 600,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "features" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "features" }]
}); });
} }
@@ -53,7 +52,6 @@ export class VermineCharacterSheet extends VermineActorSheet {
if (actorData.type == 'npc') { if (actorData.type == 'npc') {
this._prepareItems(context); this._prepareItems(context);
} }
// Add roll data for TinyMCE editors. // Add roll data for TinyMCE editors.
context.rollData = context.actor.getRollData(); context.rollData = context.actor.getRollData();
+3 -3
View File
@@ -1,11 +1,11 @@
import {onManageActiveEffect, prepareActiveEffectCategories} from "../system/effects.mjs"; import { onManageActiveEffect, prepareActiveEffectCategories } from "../system/effects.mjs";
import { VermineActorSheet } from "./actor-sheet.mjs"; import { VermineActorSheet } from "./actor-sheet.mjs";
/** /**
* Extend the basic ActorSheet with some very simple modifications * Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet} * @extends {ActorSheet}
*/ */
export class VermineCreatureSheet extends ActorSheet { export class VermineCreatureSheet extends VermineActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
@@ -118,7 +118,7 @@ export class VermineCreatureSheet extends ActorSheet {
delete itemData.system["type"]; delete itemData.system["type"];
// Finally, create the item! // Finally, create the item!
return await Item.create(itemData, {parent: this.actor}); return await Item.create(itemData, { parent: this.actor });
} }
} }
+81 -78
View File
@@ -6,79 +6,80 @@ export const VERMINE = {};
*/ */
VERMINE.AgeTypes = { VERMINE.AgeTypes = {
1:{ "name":"AGE_TYPES.young", "beginning": 0 }, 1: { "name": "AGE_TYPES.young", "beginning": 0 },
2:{ "name":"AGE_TYPES.adult", "beginning": 18 }, 2: { "name": "AGE_TYPES.adult", "beginning": 18 },
3:{ "name":"AGE_TYPES.old", "beginning": 47 } 3: { "name": "AGE_TYPES.old", "beginning": 47 }
} }
VERMINE.SkillLevels = { VERMINE.SkillLevels = {
1:{ "label":"SKILL_LEVELS.beginner", "dicePool":1, "reroll":0}, 0: { "label": "SKILL_LEVELS.incompetent", "dicePool": 0, "reroll": 0 },
2:{ "label":"SKILL_LEVELS.proficient", "dicePool":1, "reroll":1}, 1: { "label": "SKILL_LEVELS.beginner", "dicePool": 1, "reroll": 0 },
3:{ "label":"SKILL_LEVELS.expert", "dicePool":2, "reroll":1}, 2: { "label": "SKILL_LEVELS.proficient", "dicePool": 1, "reroll": 1 },
4:{ "label":"SKILL_LEVELS.master", "dicePool":2, "reroll":2}, 3: { "label": "SKILL_LEVELS.expert", "dicePool": 2, "reroll": 1 },
5:{ "label":"SKILL_LEVELS.legend", "dicePool":3, "reroll":2} 4: { "label": "SKILL_LEVELS.master", "dicePool": 2, "reroll": 2 },
5: { "label": "SKILL_LEVELS.legend", "dicePool": 3, "reroll": 2 }
} }
VERMINE.DifficultyLevels = { VERMINE.DifficultyLevels = {
1:{ "label":"DIFFICULTY_LEVELS.obvious", "difficulty":3}, 1: { "label": "DIFFICULTY_LEVELS.obvious", "difficulty": 3 },
2:{ "label":"DIFFICULTY_LEVELS.easy", "difficulty":5}, 2: { "label": "DIFFICULTY_LEVELS.easy", "difficulty": 5 },
3:{ "label":"DIFFICULTY_LEVELS.hard", "difficulty":7}, 3: { "label": "DIFFICULTY_LEVELS.hard", "difficulty": 7 },
4:{ "label":"DIFFICULTY_LEVELS.very_hard", "difficulty":9}, 4: { "label": "DIFFICULTY_LEVELS.very_hard", "difficulty": 9 },
5:{ "label":"DIFFICULTY_LEVELS.impossible", "difficulty":10} 5: { "label": "DIFFICULTY_LEVELS.impossible", "difficulty": 10 }
}, },
VERMINE.ThreatLevels = { VERMINE.ThreatLevels = {
1:{ "label":"THREAT_LEVELS.minor", "attack":3, "vigor":1, "minorWound":1, "majorWound":1, "deadlyWound":1}, 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}, 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}, 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}, 4: { "label": "THREAT_LEVELS.deadly", "attack": 6, "vigor": 4, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
} }
VERMINE.ExperienceLevels = { VERMINE.ExperienceLevels = {
1:{ "label":"SKILL_LEVELS.beginner", "action":3, "specialties":4, "rerolls":0, "contact":"7"}, 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"}, 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"}, 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"}, 4: { "label": "SKILL_LEVELS.master", "action": 4, "specialties": 6, "rerolls": 2, "contact": "3,5,7 ou 9" },
} }
VERMINE.RoleLevels = { VERMINE.RoleLevels = {
1:{ "label":"ROLE_LEVELS.minor", "reaction":3, "reaction_bonus":0, "pools":0, "gear":9, "gear_hindrance":0, "protection":1}, 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}, 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}, 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}, 4: { "label": "ROLE_LEVELS.major", "reaction": 4, "reaction_bonus": 2, "pools": 4, "gear": 10, "gear_hindrance": 2, "protection": 3 },
} }
VERMINE.PatternLevels = { VERMINE.PatternLevels = {
1:{ "label":"PATTERN_LEVELS.insect", "attack":2, "damage":0, "minorWound":0, "majorWound":0, "deadlyWound":1}, 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}, 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}, 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}, 4: { "label": "PATTERN_LEVELS.bear", "attack": 6, "damage": 6, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
} }
VERMINE.SizeLevels = { VERMINE.SizeLevels = {
1:{ "attack":2, "vigor":1, "minorWound":0, "majorWound":0, "deadlyWound":1}, 1: { "attack": 2, "vigor": 1, "minorWound": 0, "majorWound": 0, "deadlyWound": 1 },
2:{ "attack":3, "vigor":2, "minorWound":0, "majorWound":1, "deadlyWound":1}, 2: { "attack": 3, "vigor": 2, "minorWound": 0, "majorWound": 1, "deadlyWound": 1 },
3:{ "attack":4, "vigor":3, "minorWound":1, "majorWound":1, "deadlyWound":1} 3: { "attack": 4, "vigor": 3, "minorWound": 1, "majorWound": 1, "deadlyWound": 1 }
} }
VERMINE.PackLevels = { VERMINE.PackLevels = {
1:{ "attack":1, "damage":1, "minorWound":0, "majorWound":0, "deadlyWound":1}, 1: { "attack": 1, "damage": 1, "minorWound": 0, "majorWound": 0, "deadlyWound": 1 },
2:{ "attack":2, "damage":2, "minorWound":2, "majorWound":2, "deadlyWound":2}, 2: { "attack": 2, "damage": 2, "minorWound": 2, "majorWound": 2, "deadlyWound": 2 },
3:{ "attack":5, "damage":5, "minorWound":3, "majorWound":3, "deadlyWound":3} 3: { "attack": 5, "damage": 5, "minorWound": 3, "majorWound": 3, "deadlyWound": 3 }
} }
VERMINE.abilityCategories = { VERMINE.abilityCategories = {
"physical": { "physical": {
"label":"VERMINE.ability_category.physical" "label": "VERMINE.ability_category.physical"
}, },
"manual": { "manual": {
"label":"VERMINE.ability_category.manual" "label": "VERMINE.ability_category.manual"
}, },
"mental": { "mental": {
"label":"VERMINE.ability_category.mental" "label": "VERMINE.ability_category.mental"
}, },
"social": { "social": {
"label":"VERMINE.ability_category.social" "label": "VERMINE.ability_category.social"
} }
} }
@@ -95,64 +96,66 @@ VERMINE.abilities = {
VERMINE.skillCategories = { VERMINE.skillCategories = {
"man": { "man": {
"label":"VERMINE.skill_category.man" "label": "VERMINE.skill_category.man"
}, },
"animal": { "animal": {
"label":"VERMINE.skill_category.animal" "label": "VERMINE.skill_category.animal"
}, },
"tool": { "tool": {
"label":"VERMINE.skill_category.tool" "label": "VERMINE.skill_category.tool"
}, },
"weapon": { "weapon": {
"label":"VERMINE.skill_category.weapon" "label": "VERMINE.skill_category.weapon"
}, },
"survival": { "survival": {
"label":"VERMINE.skill_category.survival" "label": "VERMINE.skill_category.survival"
}, },
"world": { "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 = { VERMINE.totems = {
"human":"TOTEMS.human.name", "human": "TOTEMS.human.name",
"predator": "TOTEMS.predator.name" , "predator": "TOTEMS.predator.name",
"scavenger": "TOTEMS.scavenger.name" , "scavenger": "TOTEMS.scavenger.name",
"symbiote": "TOTEMS.symbiote.name" , "symbiote": "TOTEMS.symbiote.name",
"parasite": "TOTEMS.parasite.name" , "parasite": "TOTEMS.parasite.name",
"builder": "TOTEMS.builder.name" , "builder": "TOTEMS.builder.name",
"horde": "TOTEMS.horde.name" , "horde": "TOTEMS.horde.name",
"hive": "TOTEMS.hive.name" , "hive": "TOTEMS.hive.name",
"loner": "TOTEMS.loner.name", "loner": "TOTEMS.loner.name",
"adapted": "TOTEMS.adapted.name" "adapted": "TOTEMS.adapted.name"
} }
VERMINE.totem_opposites = { VERMINE.totem_opposites = {
"human":"TOTEMS.adapted.name", "human": "TOTEMS.adapted.name",
"predator": "TOTEMS.scavenger.name" , "predator": "TOTEMS.scavenger.name",
"scavenger": "TOTEMS.predator.name" , "scavenger": "TOTEMS.predator.name",
"symbiote": "TOTEMS.parasite.name" , "symbiote": "TOTEMS.parasite.name",
"parasite": "TOTEMS.symbiote.name" , "parasite": "TOTEMS.symbiote.name",
"builder": "TOTEMS.horde.name" , "builder": "TOTEMS.horde.name",
"horde": "TOTEMS.builder.name" , "horde": "TOTEMS.builder.name",
"hive": "TOTEMS.loner.name" , "hive": "TOTEMS.loner.name",
"loner": "TOTEMS.hive.name", "loner": "TOTEMS.hive.name",
"adapted": "TOTEMS.human.name" "adapted": "TOTEMS.human.name"
} }
VERMINE.origins = {"aon":"Aon", VERMINE.origins = {
"avhorae": "Avhorae" , "aon": "Aon",
"babel": "Babel", "avhorae": "Avhorae",
"soleil_noir": "Empire du Soleil Noir", "babel": "Babel",
"fakhar": "Fakhar", "soleil_noir": "Empire du Soleil Noir",
"horde": "Horde", "fakhar": "Fakhar",
"khashan": "Khashan", "horde": "Horde",
"ool": "Ool", "khashan": "Khashan",
"shattered_kingdoms": "Royaumes divisés", "ool": "Ool",
"saeth": "Saeth", "shattered_kingdoms": "Royaumes divisés",
"tegee": "Tégée (Thalos)", "saeth": "Saeth",
"tuuhle": "Tuuhle", "tegee": "Tégée (Thalos)",
"vaelor": "Vaelor", "tuuhle": "Tuuhle",
"valdheim": "Valdheim" "vaelor": "Vaelor",
"valdheim": "Valdheim"
} }
+57 -3
View File
@@ -1,4 +1,4 @@
import { VermineUtils } from "./roll.mjs";
export class CombatResultDialog extends Dialog { export class CombatResultDialog extends Dialog {
constructor(dialogData, options) { constructor(dialogData, options) {
@@ -34,8 +34,48 @@ export class CombatResultDialog extends Dialog {
} }
export class RollDialog extends Dialog {
static async create(rollData) {
let options = { classes: ["vermine-roll"], width: 420, height: 'fit-content', 'z-index': 99999 };
let html = await renderTemplate('systems/vermine2047/templates/roll.hbs', rollData);
return new RollDialog(actor, rollData, html, options);
}
/* -------------------------------------------- */
constructor(data, html, options, close = undefined) {
let conf = {
title: "",
content: html,
buttons: {
roll: {
icon: '<i class="fas fa-check"></i>',
label: "Lancer !",
callback: () => { this.roll(data.actorId, data.label, data.NoD, data.Reroll) }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: "Annuler",
callback: () => { this.close() }
}
},
close: close
}
super(conf, options);
this.data = data;
}
roll() {
VermineUtils.roll(actorId, label, NoD, Reroll = 0, params = {})
}
}
export const getRollBox = async function (data) { export const getRollBox = async function (data) {
console.log(data)
let actor = await game.actors.get(data.actorId)
let html = await renderTemplate('systems/vermine2047/templates/roll.hbs', data); let html = await renderTemplate('systems/vermine2047/templates/roll.hbs', data);
let dial = new Dialog({ let dial = new Dialog({
title: game.i18n.localize("ROLLS.tool"), title: game.i18n.localize("ROLLS.tool"),
@@ -43,7 +83,7 @@ export const getRollBox = async function (data) {
buttons: { buttons: {
roll: { roll: {
label: game.i18n.localize('ROLLS.roll_dice'), label: game.i18n.localize('ROLLS.roll_dice'),
callback: (html) => { callback: async (html) => {
let form = html.find('#dice-pool-form'); let form = html.find('#dice-pool-form');
if (!form[0].checkValidity()) { if (!form[0].checkValidity()) {
throw "Invalid Data"; throw "Invalid Data";
@@ -67,6 +107,18 @@ export const getRollBox = async function (data) {
// réserves // réserves
if (formData.self_control > 0) { if (formData.self_control > 0) {
NoD += parseInt(formData.self_control, 10); NoD += parseInt(formData.self_control, 10);
let newSelfControl = actor.system.attributes.self_control.value - parseInt(formData.self_control);
if (newSelfControl < 0) {
return async () => {
await ui.notifications.notify(`vous ne disposez pas d'assez de sang-froid`);
dial.render(true);
}
}
await actor.update({
"system.attributes.self_control.value": newSelfControl
})
} }
if (formData.group > 0) { if (formData.group > 0) {
NoD += parseInt(formData.group, 10); NoD += parseInt(formData.group, 10);
@@ -83,7 +135,9 @@ export const getRollBox = async function (data) {
} }
if (formData.abilityScore == 0 || !formData.abilityScore) { if (formData.abilityScore == 0 || !formData.abilityScore) {
ui.notifications.notify(`veuillez saisir une caractéristique`); ui.notifications.notify(`veuillez saisir une caractéristique`);
} else return game.vermine2047.VermineRoll.roll(data.actorId, data.label, NoD, Reroll, data); dial.render(true);
} else
return VermineUtils.roll(data.actorId, data.label, NoD, Reroll, data);
} }
}, },
close: { close: {
+89 -90
View File
@@ -1,11 +1,11 @@
import { VERMINE } from "./config.mjs"; import { VERMINE } from "./config.mjs";
import { getActorSkillScore,updateActorSkillScore } from "./functions.mjs"; import { getActorSkillScore, updateActorSkillScore } from "./functions.mjs";
export class VermineFight { export class VermineFight {
async performTest(enemyAchievement, enemyConservation, skillKey, skill, params, actor) { async performTest(enemyAchievement, enemyConservation, skillKey, skill, params, actor) {
const dicePool = (params.spleen != undefined || params.purpose != undefined) ? '5' : '4'; 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 diceString = '';
let dicePoolHint = ''; let dicePoolHint = '';
let discardedRoll = false; let discardedRoll = false;
@@ -15,16 +15,16 @@ export class VermineFight {
r.roll(); // dice are rolled r.roll(); // dice are rolled
if (params.usure != undefined){ if (params.usure != undefined) {
currentSkillScore += params.usure; currentSkillScore += params.usure;
bonus += params.usure; bonus += params.usure;
} }
if (params.specialization != undefined){ if (params.specialization != undefined) {
currentSkillScore += 2; currentSkillScore += 2;
} }
if (params.trait != undefined){ if (params.trait != undefined) {
currentSkillScore += params.trait; currentSkillScore += params.trait;
bonus += params.trait; bonus += params.trait;
} }
@@ -32,16 +32,16 @@ export class VermineFight {
bonusText += bonus; bonusText += bonus;
let targetText = game.i18n.format('VERMINE.Selected') + ' : ' + game.i18n.format(skillKey) + " " + skill + bonusText; let targetText = game.i18n.format('VERMINE.Selected') + ' : ' + game.i18n.format(skillKey) + " " + skill + bonusText;
if (params.specialization != undefined){ if (params.specialization != undefined) {
targetText += " (S)"; targetText += " (S)";
} }
// tri par ordre croissant // 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(); discardedRoll = r.terms[0].results.shift();
dicePoolHint = ' - ' + game.i18n.format('VERMINE.PurposeTrait'); dicePoolHint = ' - ' + game.i18n.format('VERMINE.PurposeTrait');
} else if (params.spleen != undefined){ } else if (params.spleen != undefined) {
discardedRoll = r.terms[0].results.pop(); discardedRoll = r.terms[0].results.pop();
dicePoolHint = ' - ' + game.i18n.format('VERMINE.SpleenTrait'); dicePoolHint = ' - ' + game.i18n.format('VERMINE.SpleenTrait');
} }
@@ -49,7 +49,7 @@ export class VermineFight {
for (let i = 0; i < r.terms[0].results.length; i++) { for (let i = 0; i < r.terms[0].results.length; i++) {
let result = r.terms[0].results[i].result; 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'); let hintText = game.i18n.format('VERMINE.ConfrontationHint');
@@ -73,7 +73,7 @@ export class VermineFight {
</div> </div>
</section> </section>
</div>` + </div>` +
`<p class="step1-text" id="step1">` + hintText + `</p> `<p class="step1-text" id="step1">` + hintText + `</p>
<div class="row"> <div class="row">
<a class="inline-block button add-to-achievement">` + game.i18n.format('VERMINE.Achievement') + `</a> <a class="inline-block button add-to-achievement">` + game.i18n.format('VERMINE.Achievement') + `</a>
<a class="inline-block button add-to-conservation">` + game.i18n.format('VERMINE.Conservation') + `</a> <a class="inline-block button add-to-conservation">` + game.i18n.format('VERMINE.Conservation') + `</a>
@@ -109,8 +109,8 @@ export class VermineFight {
if (actor) if (actor)
conf.speaker = ChatMessage.getSpeaker({ actor: actor }); conf.speaker = ChatMessage.getSpeaker({ actor: actor });
// Send's Chat Message to foundry, if items are missing they will appear as false or undefined and this not be rendered. // Send's Chat Message to foundry, if items are missing they will appear as false or undefined and this not be rendered.
ChatMessage.create(conf).then((msg) => { ChatMessage.create(conf).then((msg) => {
return msg; return msg;
}); });
} }
@@ -142,28 +142,28 @@ export class VermineFight {
// sélection du dé actif // sélection du dé actif
html.on("click", '.confrontation .die.d6', event => { 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'); html.find('.confrontation .die.d6').removeClass('active');
$(event.target).addClass('active'); $(event.target).addClass('active');
}); });
// sélection des dés d'accomplissement // sélection des dés d'accomplissement
html.on("click", '.confrontation .add-to-achievement', event => { 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'); html.find('.confrontation .die.d6.active').removeClass('min').addClass('max');
}); });
// sélection des dés de conservation // sélection des dés de conservation
html.on("click", '.confrontation .add-to-conservation', event => { 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'); html.find('.confrontation .die.d6.active').removeClass('max').addClass('min');
}); });
// reset de la sélection des pools // reset de la sélection des pools
html.on("click", '.confrontation .reset', event => { html.on("click", '.confrontation .reset', event => {
html.find('.confrontation .die.d6') html.find('.confrontation .die.d6')
.removeClass('max') .removeClass('max')
.removeClass('min'); .removeClass('min');
}); });
// résolution de la confrontation // résolution de la confrontation
@@ -172,10 +172,10 @@ export class VermineFight {
let conservationDice = 0; let conservationDice = 0;
let achievementBasis = 0; let achievementBasis = 0;
let conservationBasis = 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); 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); conservationDice += parseInt($(this).html(), 10);
}); });
@@ -189,8 +189,8 @@ export class VermineFight {
html.find('td.conservation-result').html(conservationBasis + conservationDice); html.find('td.conservation-result').html(conservationBasis + conservationDice);
// calcul des marges // calcul des marges
const achievementMargin = achievementBasis + achievementDice - parseInt(html.find('td.adv-achievement-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); const conservationMargin = conservationBasis + conservationDice - parseInt(html.find('td.adv-conservation-result').html(), 10);
html.find('td.achievement-margin').html(achievementMargin); html.find('td.achievement-margin').html(achievementMargin);
html.find('td.conservation-margin').html(conservationMargin); html.find('td.conservation-margin').html(conservationMargin);
@@ -217,11 +217,11 @@ export class VermineFight {
// get the actor // get the actor
try { try {
actor = game.user.character; actor = game.user.character;
} catch(e){ } catch (e) {
throw("Aucun personnage défini !"); 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 // on récupère le speakerId, et de là l'objet actor
actor = game.actors.get(externalData.speakerId); actor = game.actors.get(externalData.speakerId);
VermineFight.previousValues['speakerName'] = actor.name; VermineFight.previousValues['speakerName'] = actor.name;
@@ -232,7 +232,7 @@ export class VermineFight {
// get the data // get the data
let charData = (externalData) => { 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; return o;
}; };
let data = charData(externalData); let data = charData(externalData);
@@ -257,7 +257,7 @@ export class VermineFight {
switch (e.name) { switch (e.name) {
case "skill": case "skill":
case "cephalic": case "cephalic":
if (e.value !== ''){ if (e.value !== '') {
skillKey = e.value; skillKey = e.value;
} }
break; break;
@@ -270,31 +270,31 @@ export class VermineFight {
case "usure": case "usure":
params.usure = +e.value; params.usure = +e.value;
break; break;
case "trait": case "trait":
params.trait = +e.value; params.trait = +e.value;
break; break;
case "purpose": case "purpose":
params.purpose = true; params.purpose = true;
break; break;
case "spleen": case "spleen":
params.spleen = true; params.spleen = true;
break; break;
case "adv-skill": case "adv-skill":
enemySkill = +e.value; enemySkill = +e.value;
break; break;
case "achievement": case "achievement":
enemyAchievement = +e.value; enemyAchievement = +e.value;
break; break;
case "conservation": case "conservation":
enemyConservation = +e.value; enemyConservation = +e.value;
break; break;
} }
}); });
// prise en compte de l'usure sur la feuille de perso // 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; const newSpentScore = getActorSkillScore(actor, skillKey, 'spent') + params.usure;
console.log(newSpentScore); console.log(newSpentScore);
updateActorSkillScore(actor, skillKey, 'spent', newSpentScore); updateActorSkillScore(actor, skillKey, 'spent', newSpentScore);
} }
return VermineFight.get().performTest(enemyAchievement + enemySkill, enemyConservation + enemySkill, skillKey, skill, params, actor); return VermineFight.get().performTest(enemyAchievement + enemySkill, enemyConservation + enemySkill, skillKey, skill, params, actor);
@@ -309,7 +309,7 @@ export class VermineFight {
h.on("change", 'select[name="skill"]', event => { h.on("change", 'select[name="skill"]', event => {
const skillLabel = $(event.target).val(); const skillLabel = $(event.target).val();
const currentSkillScore = getActorSkillScore(actor, skillLabel) - getActorSkillScore(actor, skillLabel, 'spent'); 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); h.find('input#skillScore').val(currentSkillScore);
} }
}); });
@@ -321,7 +321,7 @@ export class VermineFight {
} }
export class VermineCombat extends Combat { export class VermineCombat extends Combat {
_encounterCheck(){ _encounterCheck() {
console.log('encounter combat object', this); console.log('encounter combat object', this);
} }
@@ -338,7 +338,7 @@ export class VermineCombat extends Combat {
}*/ }*/
const combatant = this.combatants.get(ids[0]); const combatant = this.combatants.get(ids[0]);
let token = canvas.scene.tokens.get(combatant.tokenId); 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; combatant.disposition = token.disposition;
let enemies = []; let enemies = [];
@@ -346,7 +346,7 @@ export class VermineCombat extends Combat {
let token = canvas.scene.tokens.get(cbt.tokenId); let token = canvas.scene.tokens.get(cbt.tokenId);
let enemy = token.actor; let enemy = token.actor;
const isEnemy = (token.disposition == -1) ? true : false; const isEnemy = (token.disposition == -1) ? true : false;
if (isEnemy){ if (isEnemy) {
enemies.push({ enemies.push({
id: enemy.id, id: enemy.id,
name: enemy.name, name: enemy.name,
@@ -363,7 +363,7 @@ export class VermineCombat extends Combat {
return (token.disposition == 1 && cbt.id != combatant.id) ? true : false; 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', { 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." 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({ VermineFight.ui({
speakerId: combatant.actorId, speakerId: combatant.actorId,
speakerWeapons: fightingActor.items.filter(item => item.type == 'weapon'), speakerWeapons: fightingActor.items.filter(item => item.type == 'weapon'),
speakerExperience:fightingActor.system.attributes.experience.value, speakerExperience: fightingActor.system.attributes.experience.value,
speakerEffects: token.actor.effects, speakerEffects: token.actor.effects,
adversaries: enemies, adversaries: enemies,
allies: allies allies: allies
@@ -425,30 +425,10 @@ export class VermineCombat extends Combat {
export class VermineCombatTracker extends CombatTracker { export class VermineCombatTracker extends CombatTracker {
get template() { get template() {
return "systems/vermine2047/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) {
return context;
}
for (let [i, combatant] of context.combat.turns.entries()) {
context.turns[i].hasActed = combatant.getFlag("world", "hasActed");
context.turns[i].isPlayer = combatant.actor.type == "player";
context.turns[i].isNpc = combatant.actor.type == "npc";
}
return context;
}
/* -------------------------------------------- */
get template() {
return "systems/gods-system/templates/combat/tracker.hbs";
}
async getData(options) {
const context = await super.getData(options); const context = await super.getData(options);
if (!context.hasCombat) { if (!context.hasCombat) {
@@ -456,39 +436,58 @@ async getData(options) {
} }
for (let [i, combatant] of context.combat.turns.entries()) { for (let [i, combatant] of context.combat.turns.entries()) {
context.turns[i].attitude = combatant.getFlag("world", "attitude"); context.turns[i].hasActed = combatant.getFlag("world", "hasActed");
context.turns[i].isPlayer = combatant.actor.type == "character"; context.turns[i].isPlayer = combatant.actor.type == "player";
context.turns[i].isNpc = combatant.actor.type == "npc"; context.turns[i].isNpc = combatant.actor.type == "npc";
context.turns[i].isCreature = combatant.actor.type == "creature";
} }
return context; return context;
} }
activateListeners(html) { /* -------------------------------------------- */
get template() {
return "systems/vermine2047/templates/combat-tracker.hbs";
}
async getData(options) {
const context = await super.getData(options);
if (!context.hasCombat) {
return context;
}
for (let [i, combatant] of context.combat.turns.entries()) {
context.turns[i].attitude = combatant.getFlag("world", "attitude");
context.turns[i].isPlayer = combatant.actor.type == "character";
context.turns[i].isNpc = combatant.actor.type == "npc";
context.turns[i].isCreature = combatant.actor.type == "creature";
}
return context;
}
activateListeners(html) {
super.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 * @description Use to put an attitude to an actor
* @param {*} event * @param {*} event
*/ */
async _setStatut(event) { async _setStatut(event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
const btn = event.currentTarget; const btn = event.currentTarget;
const attitude = btn.dataset.attitude;
const li = btn.closest(".combatant"); const li = btn.closest(".combatant");
const combat = this.viewed; const combat = this.viewed;
const combatant = combat.combatants.get(li.dataset.combatantId); 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);
}
} }
+136 -110
View File
@@ -3,7 +3,7 @@
* Pre-loaded templates are compiled and cached for fast access when rendering * Pre-loaded templates are compiled and cached for fast access when rendering
* @return {Promise} * @return {Promise}
*/ */
export const preloadHandlebarsTemplates = async function() { export const preloadHandlebarsTemplates = async function () {
return loadTemplates([ return loadTemplates([
@@ -57,16 +57,16 @@ function range(start, end, step) {
step = step == null ? 1 : Number(step); step = step == null ? 1 : Number(step);
if (end == null) { if (end == null) {
end = start; end = start;
start = 0; start = 0;
} }
var length = Math.max(Math.ceil((end - start) / (step || 1)), 0); var length = Math.max(Math.ceil((end - start) / (step || 1)), 0);
var result = new Array(length); var result = new Array(length);
for (var i = 0; i < length; i += 1) { for (var i = 0; i < length; i += 1) {
result[i] = start; result[i] = start;
start += step; start += step;
} }
return result; return result;
@@ -76,100 +76,100 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('concat', (...args) => args.slice(0, -1).join('')); Handlebars.registerHelper('concat', (...args) => args.slice(0, -1).join(''));
Handlebars.registerHelper('lower', e => e.toLocaleLowerCase()); Handlebars.registerHelper('lower', e => e.toLocaleLowerCase());
Handlebars.registerHelper('toLowerCase', function(str) { Handlebars.registerHelper('toLowerCase', function (str) {
return str.toLowerCase(); return str.toLowerCase();
}); });
// search translation with variables // search translation with variables
Handlebars.registerHelper('smarttl', function (arrayLabel,objectLabel, options) { Handlebars.registerHelper('smarttl', function (arrayLabel, objectLabel, options) {
return game.i18n.localize(arrayLabel +"."+objectLabel+".name"); return game.i18n.localize(arrayLabel + "." + objectLabel + ".name");
}); });
Handlebars.registerHelper('smarttlk', function (arrayLabel,objectLabel, key) { Handlebars.registerHelper('smarttlk', function (arrayLabel, objectLabel, key) {
return game.i18n.localize(arrayLabel +"."+objectLabel+"."+key); return game.i18n.localize(arrayLabel + "." + objectLabel + "." + key);
}); });
Handlebars.registerHelper('smartcfg', function (configLabel, objectLabel) { Handlebars.registerHelper('smartcfg', function (configLabel, objectLabel) {
let text = ""; let text = "";
text = game.i18n.localize(CONFIG.VERMINE[configLabel][objectLabel]); text = game.i18n.localize(CONFIG.VERMINE[configLabel][objectLabel]);
if (text == null){ if (text == null) {
text = CONFIG.VERMINE[configLabel][objectLabel]; text = CONFIG.VERMINE[configLabel][objectLabel];
} }
return text; return text;
}); });
// return threat level information // return threat level information
Handlebars.registerHelper('threatLevel', function (property, level, options) { Handlebars.registerHelper('threatLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.ThreatLevels[level];
if (property == 'label'){
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return experience level information
Handlebars.registerHelper('experienceLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.ExperienceLevels[level];
if (property == 'label'){
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return role level information
Handlebars.registerHelper('roleLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.RoleLevels[level];
if (property == 'label'){
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return pattern level information
Handlebars.registerHelper('patternLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.PatternLevels[level];
if (property == 'label'){
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return size level information
Handlebars.registerHelper('sizeLevel', function (property, level, options) {
if (level < 1 || level > 4) if (level < 1 || level > 4)
return ""; return "";
let levelData = CONFIG.VERMINE.SizeLevels[level]; let levelData = CONFIG.VERMINE.ThreatLevels[level];
if (property == 'label'){ if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : ""; return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else { } else {
return (levelData !== undefined) ? levelData[property] : ""; return (levelData !== undefined) ? levelData[property] : "";
} }
}); });
// return pack level information // return experience level information
Handlebars.registerHelper('packLevel', function (property, level, options) { Handlebars.registerHelper('experienceLevel', function (property, level, options) {
if (level < 0 || level > 3) if (level < 1 || level > 4)
return ""; return "";
let levelData = CONFIG.VERMINE.PackLevels[level]; let levelData = CONFIG.VERMINE.ExperienceLevels[level];
if (property == 'label'){ if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : ""; return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else { } else {
return (levelData !== undefined) ? levelData[property] : ""; return (levelData !== undefined) ? levelData[property] : "";
} }
}); });
// return role level information
Handlebars.registerHelper('roleLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.RoleLevels[level];
if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return pattern level information
Handlebars.registerHelper('patternLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.PatternLevels[level];
if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return size level information
Handlebars.registerHelper('sizeLevel', function (property, level, options) {
if (level < 1 || level > 4)
return "";
let levelData = CONFIG.VERMINE.SizeLevels[level];
if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return pack level information
Handlebars.registerHelper('packLevel', function (property, level, options) {
if (level < 0 || level > 3)
return "";
let levelData = CONFIG.VERMINE.PackLevels[level];
if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else {
return (levelData !== undefined) ? levelData[property] : "";
}
});
// return skill level information // return skill level information
@@ -177,61 +177,87 @@ export const registerHandlebarsHelpers = function () {
if (level < 1 || level > 5) if (level < 1 || level > 5)
return ""; return "";
let levelData = CONFIG.VERMINE.SkillLevels[level]; let levelData = CONFIG.VERMINE.SkillLevels[level];
if (property == 'label'){ if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : ""; return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else { } else {
return (levelData !== undefined) ? levelData[property] : ""; return (levelData !== undefined) ? levelData[property] : "";
} }
}); });
// return diff level information // return diff level information
Handlebars.registerHelper('diffLevel', function (property, level, options) { Handlebars.registerHelper('diffLevel', function (property, level, options) {
if (level < 1 || level > 5) if (level < 1 || level > 5)
return ""; return "";
let levelData = CONFIG.VERMINE.DifficultyLevels[level]; let levelData = CONFIG.VERMINE.DifficultyLevels[level];
if (property == 'label'){ if (property == 'label') {
return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : ""; return (levelData !== undefined) ? game.i18n.localize(levelData[property]) : "";
} else { } else {
return (levelData !== undefined) ? levelData[property] : ""; return (levelData !== undefined) ? levelData[property] : "";
} }
}); });
// return age type information // return age type information
Handlebars.registerHelper('ageType', function (property, level, options) { Handlebars.registerHelper('ageType', function (property, level, options) {
if (level < 1 || level > 3) if (level < 1 || level > 3)
return ""; return "";
let ageData = CONFIG.VERMINE.AgeTypes[level]; let ageData = CONFIG.VERMINE.AgeTypes[level];
if (property == 'name'){ if (property == 'name') {
return (ageData !== undefined) ? game.i18n.localize(ageData[property]) : ""; return (ageData !== undefined) ? game.i18n.localize(ageData[property]) : "";
} else { } else {
return (ageData !== undefined) ? ageData[property] : ""; return (ageData !== undefined) ? ageData[property] : "";
} }
}); });
Handlebars.registerHelper('getCombatTrackerColor', function (isPlayer, isNpc) { Handlebars.registerHelper('getCombatTrackerColor', function (isPlayer, isNpc) {
if (isPlayer) return "player"; if (isPlayer) return "player";
if (isNpc) return "npc"; if (isNpc) return "npc";
}); });
Handlebars.registerHelper('range', function() { Handlebars.registerHelper('range', function () {
var args = Array.prototype.slice.call(arguments), var args = Array.prototype.slice.call(arguments),
rangeArgs = args.slice(0, -1), rangeArgs = args.slice(0, -1),
options = args[args.length - 1]; options = args[args.length - 1];
return range.apply(null, rangeArgs) return range.apply(null, rangeArgs)
.map(function(num) { return options.fn(num); }) .map(function (num) { return options.fn(num); })
.join(''); .join('');
}); });
// return age type information // 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); 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('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;
});
} }
+53 -14
View File
@@ -1,20 +1,59 @@
export class VermineRoll { export class VermineUtils {
static roll(actorId, label, NoD, Reroll = 0, params = {}){ static roll(actorId, label, NoD, Reroll = 0, params = {}) {
const actor = game.actors.get(actorId); const actor = game.actors.get(actorId);
let formula = '' + (parseInt(NoD,10) + parseInt(Reroll,10)) + "d10"; let formula = '' + NoD + "d10";
if (Reroll > 0 && params.difficulty != undefined){
formula += 'kh' + NoD; formula += (params.difficulty != undefined) ? "cs>=" + params.difficulty : "cs>=7";
let roll = new Roll(formula, actor.getRollData());
roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: actor }),
flavor: label,
rollMode: game.settings.get('core', 'rollMode'),
});
return roll;
}
/* -------------------------------------------- */
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;
} }
formula += (params.difficulty != undefined) ? "cs>" + params.difficulty : "cs>7"; await game.dice3d.showForRoll(roll, game.user, true, whisper, blind);
let roll = new Roll(formula, actor.getRollData()); }
roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: actor }),
flavor: label,
rollMode: game.settings.get('core', 'rollMode'),
});
return roll;
} }
}
/* -------------------------------------------- */
static async chatListeners(html) {
html.on("click", '.roll-dice-bonus', event => {
let rollData = this.getRollDataFromMessage(event)
let msgId = VermineRoll.findChatMessageId(event.currentTarget)
nocUtility.removeChatMessageId(msgId)
let nbDice = $(event.target).data('nb-dice')
console.log(">>>>>", nbDice)
this.rollBonus(rollData, nbDice)
})
}
} }
+17 -4
View File
@@ -6,13 +6,26 @@ export const registerSettings = function () {
config: true, config: true,
type: String, type: String,
choices: { choices: {
"1": "Survie", "1": "Survie",
"2": "Cauchemar", "2": "Cauchemar",
"3": "Apocalypse" "3": "Apocalypse"
}, },
default: 'e', default: 'e',
onChange: value => { 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;
}
} }
}); });
+29 -10
View File
@@ -12,7 +12,7 @@ import { VermineCreatureSheet } from "./sheets/creature-sheet.mjs";
import { VermineItem } from "./documents/item.mjs"; import { VermineItem } from "./documents/item.mjs";
import { VermineItemSheet } from "./sheets/item-sheet.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 { VermineCombat, VermineCombatTracker } from "./system/fight.mjs";
// Import helper/utility classes and constants. // Import helper/utility classes and constants.
@@ -23,20 +23,21 @@ import { VERMINE } from "./system/config.mjs";
/* Init Hook */ /* 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 // Add utility classes to the global game object so that they're more easily
// accessible in global contexts. // accessible in global contexts.
game.vermine2047 = { game.vermine2047 = {
VermineActor, VermineActor,
VermineItem, VermineItem,
VermineRoll, VermineUtils,
VermineCombat VermineCombat
}; };
// Add custom constants for configuration. // Add custom constants for configuration.
CONFIG.VERMINE = VERMINE; CONFIG.VERMINE = VERMINE;
CONFIG.VERMINE.model = game.system.model
console.log('__________________', CONFIG.VERMINE)
/** /**
* Set an initiative formula for the system * Set an initiative formula for the system
* @type {String} * @type {String}
@@ -54,14 +55,14 @@ Hooks.once('init', async function() {
// Register sheet application classes // Register sheet application classes
Actors.unregisterSheet("core", ActorSheet); Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet('vermine2047', VermineCharacterSheet, { Actors.registerSheet('vermine2047', VermineCharacterSheet, {
types: ['character'], types: ['character'],
makeDefault: true, makeDefault: true,
}); });
Actors.registerSheet('vermine2047', VermineNpcSheet, { Actors.registerSheet('vermine2047', VermineNpcSheet, {
types: ['npc'], types: ['npc'],
makeDefault: true, makeDefault: true,
}); });
Actors.registerSheet('vermine2047', VermineCreatureSheet, { Actors.registerSheet('vermine2047', VermineCreatureSheet, {
types: ['creature'], types: ['creature'],
@@ -79,6 +80,24 @@ Hooks.once('init', async function() {
registerHooks(); // register Hooks registerHooks(); // register Hooks
registerSettings(); // register Vermine Settings 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. // Preload Handlebars templates.
return preloadHandlebarsTemplates(); return preloadHandlebarsTemplates();
}); });
+5887
View File
File diff suppressed because it is too large Load Diff
+20
View File
@@ -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 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
View File
@@ -1 +1 @@
MANIFEST-000127 MANIFEST-000149
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.272832 7f3e00bf0640 Recovering log #125 2024/04/21-11:00:14.926 40b8 Recovering log #147
2023/09/07-17:43:25.289734 7f3e00bf0640 Delete type=0 #125 2024/04/21-11:00:14.930 40b8 Delete type=0 #147
2023/09/07-17:43:25.289773 7f3e00bf0640 Delete type=3 #123 2024/04/21-11:00:14.930 40b8 Delete type=3 #145
+7 -7
View File
@@ -1,7 +1,7 @@
2023/09/07-17:42:45.351570 7f3e00bf0640 Recovering log #121 2024/04/21-08:39:21.586 3594 Recovering log #144
2023/09/07-17:42:45.359683 7f3e00bf0640 Delete type=0 #121 2024/04/21-08:39:21.591 3594 Delete type=0 #144
2023/09/07-17:42:45.359723 7f3e00bf0640 Delete type=3 #119 2024/04/21-08:39:21.591 3594 Delete type=3 #143
2023/09/07-17:43:21.919681 7f3df7cfb640 Level-0 table #126: started 2024/04/21-10:20:47.336 5c50 Level-0 table #148: started
2023/09/07-17:43:21.919705 7f3df7cfb640 Level-0 table #126: 0 bytes OK 2024/04/21-10:20:47.336 5c50 Level-0 table #148: 0 bytes OK
2023/09/07-17:43:21.925140 7f3df7cfb640 Delete type=0 #124 2024/04/21-10:20:47.337 5c50 Delete type=0 #146
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/21-10:20:47.355 5c50 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000127 MANIFEST-000149
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.309925 7f3e01bf2640 Recovering log #125 2024/04/21-11:00:14.993 40b8 Recovering log #147
2023/09/07-17:43:25.325289 7f3e01bf2640 Delete type=0 #125 2024/04/21-11:00:14.999 40b8 Delete type=0 #147
2023/09/07-17:43:25.325377 7f3e01bf2640 Delete type=3 #123 2024/04/21-11:00:14.999 40b8 Delete type=3 #145
+7 -7
View File
@@ -1,7 +1,7 @@
2023/09/07-17:42:45.379151 7f3e01bf2640 Recovering log #121 2024/04/21-08:39:21.654 3594 Recovering log #144
2023/09/07-17:42:45.393418 7f3e01bf2640 Delete type=0 #121 2024/04/21-08:39:21.658 3594 Delete type=0 #144
2023/09/07-17:42:45.393457 7f3e01bf2640 Delete type=3 #119 2024/04/21-08:39:21.658 3594 Delete type=3 #143
2023/09/07-17:43:21.937228 7f3df7cfb640 Level-0 table #126: started 2024/04/21-10:20:47.365 5c50 Level-0 table #148: started
2023/09/07-17:43:21.937306 7f3df7cfb640 Level-0 table #126: 0 bytes OK 2024/04/21-10:20:47.365 5c50 Level-0 table #148: 0 bytes OK
2023/09/07-17:43:21.941263 7f3df7cfb640 Delete type=0 #124 2024/04/21-10:20:47.367 5c50 Delete type=0 #146
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/21-10:20:47.367 5c50 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000111 MANIFEST-000133
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.291517 7f3e013f1640 Recovering log #109 2024/04/21-11:00:14.944 40b8 Recovering log #131
2023/09/07-17:43:25.305979 7f3e013f1640 Delete type=0 #109 2024/04/21-11:00:14.950 40b8 Delete type=0 #131
2023/09/07-17:43:25.306018 7f3e013f1640 Delete type=3 #107 2024/04/21-11:00:14.950 40b8 Delete type=3 #129
+7 -7
View File
@@ -1,7 +1,7 @@
2023/09/07-17:42:45.361812 7f3e023f3640 Recovering log #105 2024/04/21-08:39:21.607 3594 Recovering log #128
2023/09/07-17:42:45.375049 7f3e023f3640 Delete type=3 #103 2024/04/21-08:39:21.613 3594 Delete type=0 #128
2023/09/07-17:42:45.375081 7f3e023f3640 Delete type=0 #105 2024/04/21-08:39:21.613 3594 Delete type=3 #127
2023/09/07-17:43:21.928733 7f3df7cfb640 Level-0 table #110: started 2024/04/21-10:20:47.362 5c50 Level-0 table #132: started
2023/09/07-17:43:21.928798 7f3df7cfb640 Level-0 table #110: 0 bytes OK 2024/04/21-10:20:47.362 5c50 Level-0 table #132: 0 bytes OK
2023/09/07-17:43:21.932413 7f3df7cfb640 Delete type=0 #108 2024/04/21-10:20:47.363 5c50 Delete type=0 #130
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/21-10:20:47.364 5c50 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000125 MANIFEST-000147
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.308285 7f3e00bf0640 Recovering log #123 2024/04/21-11:00:14.982 56d0 Recovering log #145
2023/09/07-17:43:25.322724 7f3e00bf0640 Delete type=3 #121 2024/04/21-11:00:14.987 56d0 Delete type=0 #145
2023/09/07-17:43:25.322771 7f3e00bf0640 Delete type=0 #123 2024/04/21-11:00:14.987 56d0 Delete type=3 #143
+7 -7
View File
@@ -1,7 +1,7 @@
2023/09/07-17:42:45.376908 7f3e013f1640 Recovering log #119 2024/04/21-08:39:21.641 5300 Recovering log #142
2023/09/07-17:42:45.390868 7f3e013f1640 Delete type=0 #119 2024/04/21-08:39:21.646 5300 Delete type=0 #142
2023/09/07-17:42:45.390911 7f3e013f1640 Delete type=3 #117 2024/04/21-08:39:21.647 5300 Delete type=3 #141
2023/09/07-17:43:21.941413 7f3df7cfb640 Level-0 table #124: started 2024/04/21-10:20:47.358 5c50 Level-0 table #146: started
2023/09/07-17:43:21.941481 7f3df7cfb640 Level-0 table #124: 0 bytes OK 2024/04/21-10:20:47.358 5c50 Level-0 table #146: 0 bytes OK
2023/09/07-17:43:21.945682 7f3df7cfb640 Delete type=0 #122 2024/04/21-10:20:47.360 5c50 Delete type=0 #144
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/21-10:20:47.364 5c50 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000018 MANIFEST-000043
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.262013 7f3e013f1640 Recovering log #16 2024/04/21-11:00:14.957 56d0 Recovering log #41
2023/09/07-17:43:25.270615 7f3e013f1640 Delete type=3 #14 2024/04/21-11:00:14.962 56d0 Delete type=0 #41
2023/09/07-17:43:25.270709 7f3e013f1640 Delete type=0 #16 2024/04/21-11:00:14.962 56d0 Delete type=3 #39
+8 -8
View File
@@ -1,8 +1,8 @@
2023/09/07-17:42:45.340397 7f3e013f1640 Recovering log #12 2024/04/21-08:39:21.618 5300 Recovering log #38
2023/09/07-17:42:45.348853 7f3e013f1640 Delete type=0 #12 2024/04/21-08:39:21.623 5300 Delete type=0 #38
2023/09/07-17:42:45.348874 7f3e013f1640 Delete type=3 #10 2024/04/21-08:39:21.623 5300 Delete type=3 #37
2023/09/07-17:43:21.915992 7f3df7cfb640 Level-0 table #17: started 2024/04/21-10:20:47.360 5c50 Level-0 table #42: started
2023/09/07-17:43:21.916004 7f3df7cfb640 Level-0 table #17: 0 bytes OK 2024/04/21-10:20:47.360 5c50 Level-0 table #42: 0 bytes OK
2023/09/07-17:43:21.919638 7f3df7cfb640 Delete type=0 #15 2024/04/21-10:20:47.362 5c50 Delete type=0 #40
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) 2024/04/21-10:20:47.364 5c50 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/21-10:20:47.364 5c50 Manual compaction at level-1 from '!items!10vhNURxl8FOwfy0' @ 72057594037927935 : 1 .. '!items!vX832Z4LpasxLIIx' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000018 MANIFEST-000040
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.262019 7f3e023f3640 Recovering log #16 2024/04/21-11:00:14.969 40b8 Recovering log #38
2023/09/07-17:43:25.273130 7f3e023f3640 Delete type=3 #14 2024/04/21-11:00:14.975 40b8 Delete type=0 #38
2023/09/07-17:43:25.273157 7f3e023f3640 Delete type=0 #16 2024/04/21-11:00:14.975 40b8 Delete type=3 #36
+8 -8
View File
@@ -1,8 +1,8 @@
2023/09/07-17:42:45.340398 7f3e01bf2640 Recovering log #12 2024/04/21-08:39:21.629 3594 Recovering log #35
2023/09/07-17:42:45.348853 7f3e01bf2640 Delete type=0 #12 2024/04/21-08:39:21.634 3594 Delete type=0 #35
2023/09/07-17:42:45.348878 7f3e01bf2640 Delete type=3 #10 2024/04/21-08:39:21.634 3594 Delete type=3 #34
2023/09/07-17:43:21.901412 7f3df7cfb640 Level-0 table #17: started 2024/04/21-10:20:47.356 5c50 Level-0 table #39: started
2023/09/07-17:43:21.901429 7f3df7cfb640 Level-0 table #17: 0 bytes OK 2024/04/21-10:20:47.356 5c50 Level-0 table #39: 0 bytes OK
2023/09/07-17:43:21.905137 7f3df7cfb640 Delete type=0 #15 2024/04/21-10:20:47.358 5c50 Delete type=0 #37
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) 2024/04/21-10:20:47.364 5c50 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/21-10:20:47.364 5c50 Manual compaction at level-1 from '!tables!UxgGMRs0kTplpTbe' @ 72057594037927935 : 1 .. '!tables.results!dXo0EN9ieo1tSnRY.ymnitiW2yAuk75M3' @ 0 : 0; will stop at (end)
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000125 MANIFEST-000147
+3 -3
View File
@@ -1,3 +1,3 @@
2023/09/07-17:43:25.274840 7f3e01bf2640 Recovering log #123 2024/04/21-11:00:14.935 56d0 Recovering log #145
2023/09/07-17:43:25.292451 7f3e01bf2640 Delete type=3 #121 2024/04/21-11:00:14.939 56d0 Delete type=0 #145
2023/09/07-17:43:25.292504 7f3e01bf2640 Delete type=0 #123 2024/04/21-11:00:14.939 56d0 Delete type=3 #143
+7 -7
View File
@@ -1,7 +1,7 @@
2023/09/07-17:42:45.351565 7f3e023f3640 Recovering log #119 2024/04/21-08:39:21.598 5300 Recovering log #142
2023/09/07-17:42:45.359682 7f3e023f3640 Delete type=0 #119 2024/04/21-08:39:21.602 5300 Delete type=0 #142
2023/09/07-17:42:45.359722 7f3e023f3640 Delete type=3 #117 2024/04/21-08:39:21.602 5300 Delete type=3 #141
2023/09/07-17:43:21.925366 7f3df7cfb640 Level-0 table #124: started 2024/04/21-10:20:47.353 5c50 Level-0 table #146: started
2023/09/07-17:43:21.925434 7f3df7cfb640 Level-0 table #124: 0 bytes OK 2024/04/21-10:20:47.353 5c50 Level-0 table #146: 0 bytes OK
2023/09/07-17:43:21.928599 7f3df7cfb640 Delete type=0 #122 2024/04/21-10:20:47.354 5c50 Delete type=0 #144
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/21-10:20:47.355 5c50 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+544
View File
@@ -0,0 +1,544 @@
@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:
"sidebar header" 75px
"sidebar nav" minmax(min-content, max-content)
"sidebar content" 1fr/230px 1fr;*/
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-position: 12% 50%;
background-size: 400%;
height: 100%;
box-shadow: -20px 0px 100px #000000b5 inset
}
.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 {
margin: 1rem auto 3rem;
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 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: bottom;
}
}
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%;
;
}
}
}
+539
View File
@@ -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);
}
}
+2
View File
@@ -0,0 +1,2 @@
@import "./base_work.scss";
@import "./style.scss";
+6 -1
View File
@@ -18,7 +18,6 @@
"module/vermine2047.mjs" "module/vermine2047.mjs"
], ],
"styles": [ "styles": [
"css/style.css",
"css/vermine2047.css" "css/vermine2047.css"
], ],
"languages": [ "languages": [
@@ -27,6 +26,12 @@
"name": "English", "name": "English",
"path": "lang/en.json", "path": "lang/en.json",
"flags": {} "flags": {}
},
{
"lang": "fr",
"name": "Français",
"path": "lang/fr.json",
"flags": {}
} }
], ],
"packs": [ "packs": [
+130 -81
View File
@@ -1,30 +1,37 @@
{ {
"Actor": { "Actor": {
"types": ["character", "npc", "group", "creature"], "types": [
"character",
"npc",
"group",
"creature"
],
"templates": { "templates": {
"base": { "base": {
"minorWound": { "minorWound": {
"threshold":1, "threshold": 1,
"value": 4, "value": 0,
"min": 1, "min": 0,
"max": 5 "max": 5
}, },
"majorWound": { "majorWound": {
"threshold":4, "threshold": 4,
"value": 3, "value": 0,
"min": 1, "min": 0,
"max": 4 "max": 4
}, },
"deadlyWound": { "deadlyWound": {
"threshold":8, "threshold": 8,
"value": 2, "value": 0,
"min": 1, "min": 0,
"max": 2 "max": 2
} }
} }
}, },
"character": { "character": {
"templates": ["base"], "templates": [
"base"
],
"identity": { "identity": {
"height": 0, "height": 0,
"weight": 0, "weight": 0,
@@ -45,11 +52,11 @@
"attributes": { "attributes": {
"xp": { "xp": {
"value": 0, "value": 0,
"max":10 "max": 10
}, },
"reputation": { "reputation": {
"value": 0, "value": 0,
"max":10 "max": 10
}, },
"self_control": { "self_control": {
"value": 0, "value": 0,
@@ -64,49 +71,49 @@
}, },
"abilities": { "abilities": {
"vigor": { "vigor": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "physical" "category": "physical"
}, },
"health": { "health": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "physical" "category": "physical"
}, },
"precision": { "precision": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "manual" "category": "manual"
}, },
"reflexes": { "reflexes": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "manual" "category": "manual"
}, },
"knowledge": { "knowledge": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "mental" "category": "mental"
}, },
"perception": { "perception": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "mental" "category": "mental"
}, },
"will": { "will": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "social" "category": "social"
}, },
"empathy": { "empathy": {
"value": 0, "value": 1,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "social" "category": "social"
@@ -118,215 +125,217 @@
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "man", "category": "man",
"rarity":1 "rarity": 1
}, },
"civilization": { "civilization": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "man", "category": "man",
"rarity":2 "rarity": 2
}, },
"psychology": { "psychology": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "man", "category": "man",
"rarity":1 "rarity": 1
}, },
"rumors": { "rumors": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "man", "category": "man",
"rarity":0 "rarity": 0
}, },
"healing": { "healing": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "man", "category": "man",
"rarity":1 "rarity": 1
}, },
"animalism": { "animalism": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "animal", "category": "animal",
"rarity":1 "rarity": 1
}, },
"dissection": { "dissection": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "animal", "category": "animal",
"rarity":2 "rarity": 2
}, },
"wildlife": { "wildlife": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "animal", "category": "animal",
"rarity":1 "rarity": 1
}, },
"repulsion": { "repulsion": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "animal", "category": "animal",
"rarity":0 "rarity": 0
}, },
"tracks": { "tracks": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "animal", "category": "animal",
"rarity":0 "rarity": 0
}, },
"crafting": { "crafting": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "tool", "category": "tool",
"rarity":2 "rarity": 2
}, },
"diy": { "diy": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "tool", "category": "tool",
"rarity":0 "rarity": 0
}, },
"mecanical": { "mecanical": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "tool", "category": "tool",
"rarity":2 "rarity": 2
}, },
"piloting": { "piloting": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "tool", "category": "tool",
"rarity":1 "rarity": 1
}, },
"technology": { "technology": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "tool", "category": "tool",
"rarity":2 "rarity": 2
}, },
"firearms": { "firearms": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "weapon", "category": "weapon",
"rarity":2 "rarity": 2
}, },
"archery": { "archery": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "weapon", "category": "weapon",
"rarity":0 "rarity": 0
}, },
"armory": { "armory": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "weapon", "category": "weapon",
"rarity":2 "rarity": 2
}, },
"throwing": { "throwing": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "weapon", "category": "weapon",
"rarity":0 "rarity": 0
}, },
"melee": { "melee": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "weapon", "category": "weapon",
"rarity":0 "rarity": 0
}, },
"alertness": { "alertness": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "survival", "category": "survival",
"rarity":0 "rarity": 0
}, },
"atletics": { "atletics": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "survival", "category": "survival",
"rarity":0 "rarity": 0
}, },
"food": { "food": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "survival", "category": "survival",
"rarity":0 "rarity": 0
}, },
"stealth": { "stealth": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "survival", "category": "survival",
"rarity":0 "rarity": 0
}, },
"close": { "close": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "survival", "category": "survival",
"rarity":0 "rarity": 0
}, },
"environment": { "environment": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "world", "category": "world",
"rarity":1 "rarity": 1
}, },
"flora": { "flora": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "world", "category": "world",
"rarity":1 "rarity": 1
}, },
"road": { "road": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "world", "category": "world",
"rarity":0 "rarity": 0
}, },
"toxics": { "toxics": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "world", "category": "world",
"rarity":2 "rarity": 2
}, },
"ruins": { "ruins": {
"value": 0, "value": 0,
"min": 0, "min": 0,
"max": 5, "max": 5,
"category": "world", "category": "world",
"rarity":1 "rarity": 1
} }
} }
}, },
"npc": { "npc": {
"templates": ["base"], "templates": [
"base"
],
"age": 15, "age": 15,
"skills": "", "skills": "",
"threat": { "threat": {
@@ -346,7 +355,9 @@
} }
}, },
"group": { "group": {
"templates": ["base"], "templates": [
"base"
],
"identity": { "identity": {
"totem": "", "totem": "",
"profile": "", "profile": "",
@@ -381,7 +392,9 @@
"encounters": [] "encounters": []
}, },
"creature": { "creature": {
"templates": ["base"], "templates": [
"base"
],
"skills": "", "skills": "",
"modes": { "modes": {
"survival": true, "survival": true,
@@ -411,42 +424,63 @@
} }
}, },
"Item": { "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": { "templates": {
"base": { "base": {
"description": "", "description": "",
"rarity":3, "rarity": 3,
"reliability":3, "reliability": 3,
"quantity": 1, "quantity": 1,
"weight": 0, "weight": 0,
"traits": [] "traits": []
}, },
"list": { "list": {
"description": "" "description": ""
} }
}, },
"item": { "item": {
"templates": ["base"] "templates": [
"base"
]
}, },
"weapon": { "weapon": {
"templates": ["base"], "templates": [
"min_range":0, "base"
"max_range":0, ],
"damage":0, "min_range": 0,
"ammo":0 "max_range": 0,
"damage": 0,
"ammo": 0
}, },
"defense": { "defense": {
"templates": ["base"], "templates": [
"level":0, "base"
"mobility":3 ],
"level": 0,
"mobility": 3
}, },
"ability": { "ability": {
"templates": ["list"], "templates": [
"list"
],
"type": "", "type": "",
"totem": "", "totem": "",
"learn": { "learn": {
"threshold":5, "threshold": 5,
"hindrance":0 "hindrance": 0
}, },
"level": { "level": {
"value": 1, "value": 1,
@@ -456,29 +490,40 @@
"effects": [] "effects": []
}, },
"specialty": { "specialty": {
"templates": ["list"] "name": "",
"skill": ""
}, },
"vehicle": { "vehicle": {
"templates": ["base"], "templates": [
"mobility":3 "base"
],
"mobility": 3
}, },
"rite": { "rite": {
"templates": ["base"], "templates": [
"base"
],
"rituel": "", "rituel": "",
"transe": "", "transe": "",
"ability": "", "ability": "",
"effect": "" "effect": ""
}, },
"background": { "background": {
"templates": ["list"], "templates": [
"cost":1 "list"
],
"cost": 1
}, },
"trauma": { "trauma": {
"templates": ["list"], "templates": [
"list"
],
"type": "" "type": ""
}, },
"evolution": { "evolution": {
"templates": ["list"], "templates": [
"list"
],
"level": { "level": {
"value": 1, "value": 1,
"min": 1, "min": 1,
@@ -486,11 +531,15 @@
} }
}, },
"rumor": { "rumor": {
"templates": ["list"] "templates": [
"list"
]
}, },
"target": { "target": {
"templates": ["list"], "templates": [
"level":"minor" "list"
],
"level": "minor"
} }
} }
} }
+47 -34
View File
@@ -1,52 +1,64 @@
<form class="{{cssClass}} {{actor.type}} flexcol form" autocomplete="off"> <form class="{{cssClass}} {{actor.type}} flexcol form" autocomplete="off">
<div class="form"> <div class="form">
<aside> <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"> <div class="sidebar" data-group="dashboard" data-tab="sidebar">
<!--ID --> <!--ID -->
{{> "systems/vermine2047/templates/actor/character/character-id.hbs"}} {{> "systems/vermine2047/templates/actor/character/character-id.hbs"}}
</div> </div>
</aside> </aside>
<main> <main>
<!-- HEADER --> <!-- HEADER -->
{{> "systems/vermine2047/templates/actor/character/character-header.hbs"}} {{> "systems/vermine2047/templates/actor/character/character-header.hbs"}}
<!-- SHEET NAVIGATION --> <!-- SHEET NAVIGATION -->
<nav class="sheet-navigation sheet-tabs tabs flex-group-end" data-group="primary"> <nav class="sheet-navigation sheet-tabs tabs flex-group-center"
<a class="item" data-tab="character" title="{{localize "VERMINE.tab_character_label"}}"> data-group="primary">
<i class="fas fa-address-card"></i> <a class="item" data-tab="character"
data-tooltip="{{localize "VERMINE.tabs.abilities"}}">
<i class="fas fa-address-card"></i>
</a> </a>
<a class="item" data-tab="totem" title="{{localize "VERMINE.tab_totem_label"}}"> <a class="item" data-tab="totem"
<i class="fas fa-star"></i> data-tooltip="{{localize "VERMINE.tabs.totem"}}">
<i class="fas fa-star"></i>
</a> </a>
<a class="item" data-tab="equipment" title="{{localize "VERMINE.tab_equipment_label"}}"> <a class="item" data-tab="equipment"
<i class="fas fa-hammer"></i> data-tooltip="{{localize "VERMINE.tabs.equipment"}}">
<i class="fas fa-hammer"></i>
</a> </a>
<a class="item" data-tab="stories" title="{{localize "VERMINE.tab_stories_label"}}"> <a class="item" data-tab="stories"
<i class="fas fa-hand-paper"></i> data-tooltip="{{localize "VERMINE.tabs.stories"}}">
<i class="fas fa-book-open-reader"></i>
</a> </a>
<a class="item" data-tab="combat" title="{{localize "VERMINE.tab_combat_label"}}"> <a class="item" data-tab="combat"
<i class="fas fa-medal"></i> data-tooltip="{{localize "VERMINE.tabs.combat"}}">
<i class="fas fa-medal"></i>
</a> </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> <i class="fas fa-fw fa-ellipsis-v"></i>
</a--> </a-->
</nav> </nav>
<!-- BODY --> <!-- BODY -->
<section class="sheet-body"> <section class="sheet-body">
<section class="sheet-content"> <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"
<!-- Character --> data-tab="character">
{{> "systems/vermine2047/templates/actor/character/character-features.hbs"}} <!-- Character -->
{{>
"systems/vermine2047/templates/actor/character/character-features.hbs"}}
</div> </div>
<div class="tab totem" data-group="primary" data-tab="totem"> <div class="tab totem" data-group="primary" data-tab="totem">
<h3>{{ localize 'IDENTITY.totem'}}</h3> <h3>{{ localize 'IDENTITY.totem'}}</h3>
{{> "systems/vermine2047/templates/actor/character/character-totem.hbs"}} {{>
"systems/vermine2047/templates/actor/character/character-totem.hbs"}}
</div> </div>
<div class="tab equipment" data-group="primary" data-tab="equipment"> <div class="tab equipment" data-group="primary" data-tab="equipment">
<h3>{{ localize 'VERMINE.equipment'}}</h3> <h3>{{ localize 'VERMINE.equipment'}}</h3>
@@ -56,17 +68,18 @@
<div class="tab combat" data-group="primary" data-tab="combat"> <div class="tab combat" data-group="primary" data-tab="combat">
<h3>{{ localize 'VERMINE.combat'}}</h3> <h3>{{ localize 'VERMINE.combat'}}</h3>
<!-- effects --> <!-- effects -->
{{> "systems/vermine2047/templates/actor/character/character-combat.hbs"}} {{>
"systems/vermine2047/templates/actor/character/character-combat.hbs"}}
</div> </div>
<div class="tab stories" data-group="primary" data-tab="stories"> <div class="tab stories" data-group="primary" data-tab="stories">
<h3>{{ localize 'VERMINE.stories'}}</h3> <h3>{{ localize 'VERMINE.stories'}}</h3>
{{> "systems/vermine2047/templates/actor/character/character-stories.hbs"}} {{>
</div> "systems/vermine2047/templates/actor/character/character-stories.hbs"}}
</div>
</section> </section>
</section> </section>
</main> </main>
</div> </div>
</form> </form>
+95 -50
View File
@@ -2,75 +2,120 @@
<div> <div>
<h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4> <h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4>
<p class="align-center"> <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> </p>
</div> </div>
<div> <div>
<h4 class="align-center">{{ localize "VERMINE.effort"}}</h4> <h4 class="align-center">{{ localize "VERMINE.effort"}}</h4>
<p class="align-center"> <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> </p>
</div> </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"> <ul class="unstyled">
<li class="row mdb">{{ localize 'VERMINE.wounds.light'}} ({{ system.minorWound.threshold }}) <li class="row mdb">{{ localize 'VERMINE.wounds.light'}} <span
{{#range system.minorWound.max }} data-tooltip="seuil">({{
<input type="radio" data-dtype="Number" name="system.minorWound.value" value="{{this}}" {{#ife @root.system.minorWound.value this }}checked="checked"{{/ife}} /> system.minorWound.threshold }})</span>
{{/range}}</li> {{#repeat system.minorWound.max 1}}
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}} ({{ system.majorWound.threshold }}) <input type="radio" data-dtype="Number" name="system.minorWound.value"
{{#range system.majorWound.max }} value="{{@index}}" {{#ife @root.system.minorWound.value @index
<input type="radio" name="system.majorWound.value" value="{{this}}" {{#ife @root.system.majorWound.value this }}checked="checked"{{/ife}} /> }}checked="checked"{{/ife}} data-wound="minorWound"
{{/range}} class="
{{#iflteq @index @root.system.minorWound.value }}
checked
{{/iflteq}}
" />
{{/repeat}}</li>
<li class="row mdb">{{ localize 'VERMINE.wounds.heavy'}} ({{
system.majorWound.threshold }})
{{#repeat system.majorWound.max 1}}
<input type="radio" 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}}
" />
{{/repeat}}
</li> </li>
<li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}} ({{ system.deadlyWound.threshold }}) <li class="row mdb">{{ localize 'VERMINE.wounds.deadly'}} ({{
{{#range system.deadlyWound.max }} system.deadlyWound.threshold }})
<input type="radio" name="system.deadlyWound.value" value="{{this}}" {{#ife @root.system.deadlyWound.value this }}checked="checked"{{/ife}} /> {{#repeat system.deadlyWound.max 1}}
{{/range}}
<input type="radio" 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}}
" />
{{/repeat}}
</li> </li>
</ul> </ul>
<h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4> <h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4>
<ol class="items-list effects-list"> <ol class="items-list effects-list">
{{#each effects as |section sid|}} {{#each effects as |section sid|}}
<li class="items-header flexrow" data-effect-type="{{section.type}}"> <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
{{localize "UI.effects.temporary" }} 'temporary')}}
{{else if (eq section.type 'passive')}} {{localize "UI.effects.temporary" }}
{{localize "UI.effects.passive" }} {{else if (eq section.type 'passive')}}
{{else if (eq section.type 'inactive')}} {{localize "UI.effects.passive" }}
{{localize "UI.effects.inactive" }} {{else if (eq section.type 'inactive')}}
{{/if}} {{localize "UI.effects.inactive" }}
</p> {{/if}}
<div class="effect-source">{{localize 'UI.source'}}</div> </p>
<div class="effect-source">{{localize 'UI.duration'}}</div> <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'}}">
<i class="fas fa-plus"></i> {{localize "UI.add"}}
</a>
</div>
</li>
<ol class="item-list">
{{#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}}" />
<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"> <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="toggle"
<i class="fas fa-plus"></i> {{localize "UI.add"}} 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'}}">
<i class="fas fa-trash"></i>
</a> </a>
</div> </div>
</li> </li>
<ol class="item-list">
{{#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}}"/>
<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>
<a class="effect-control" data-action="delete" title="{{localize 'UI.effect_delete'}}">
<i class="fas fa-trash"></i>
</a>
</div>
</li>
{{/each}} {{/each}}
</ol> </ol>
{{/each}} {{/each}}
</ol> </ol>
@@ -2,36 +2,71 @@
<h3>Caractéristiques</h3> <h3>Caractéristiques</h3>
<div class="grid grid-4col"> <div class="grid grid-4col">
{{#each config.abilityCategories as |abilityCategory ackey|}} {{#each config.abilityCategories as |abilityCategory ackey|}}
<div class="characteristics"> <div class="characteristics">
<h4 class="align-center">{{ smarttl "ABILITY_CATEGORIES" ackey }}</h4> <h4 class="align-center">{{ smarttl "ABILITY_CATEGORIES" ackey }}</h4>
{{#each @root.system.abilities as |ability key|}} {{#each @root.system.abilities as |ability key|}}
{{#if (eq ability.category ackey) }} {{#if (eq ability.category ackey) }}
<div class="ability flexcol flex-group-center items-center"> <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> <label for="system.abilities.{{key}}.value"
<input type="number" name="system.abilities.{{key}}.value" value="{{ability.value}}" data-dtype="Number" min="1" max="5" /> class="resource-label rollable flexlarge align-left" data-type="ability"
</div> data-label="{{ key }}">{{ smarttl "ABILITIES" key }}</label>
{{/if}} <input type="number" class="hexa" name="system.abilities.{{key}}.value"
{{/each}} value="{{ability.value}}" data-dtype="Number" min="1" max="5" />
</div> </div>
{{/each}} {{/if}}
{{/each}}
</div> </div>
{{/each}}
</div>
<h3>Compétences</h3> <h3>Compétences</h3>
<div class="grid grid-2col"> <div class="grid grid-2col">
{{#each config.skillCategories as |skillCategory sckey|}} {{#each config.skillCategories as |skillCategory sckey|}}
<div class="col"> <div class="col">
<h4>{{ smarttl "SKILLS_CATEGORIES" sckey }}</h4> <h4>{{ smarttl "SKILLS_CATEGORIES" sckey }}</h4>
{{#each @root.system.skills as |skill skey|}} {{#each @root.system.skills as |skill skey|}}
{{#if (eq skill.category sckey) }} {{#if (eq skill.category sckey) }}
<div class="ability flexrow flex-group-center"> <div class="ability flexrow ">
<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 }} <label for="system.skills.{{skey}}.value"
{{#if (eq skill.rarity 1)}}<sup>(I)</sup>{{/if}}{{#if (eq skill.rarity 2)}}<sup>(II)</sup>{{/if}}</label> class="resource-label rollable flexlarge align-left" data-type="skill"
<span class="die d10 pool" title="pool">{{ skillLevel "dicePool" skill.value }}</span> data-label="{{ skey }}">
<span class="die d10 reroll" title="reroll">{{ skillLevel "reroll" skill.value }}</span> {{ smarttl "SKILLS" skey }}
<input type="number" name="system.skills.{{skey}}.value" value="{{skill.value}}" class="skill" data-dtype="Number" min="0" max="5" /> {{#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> </div>
{{/if}} <select name="system.skills.{{skey}}.value" class="skill-select">
{{/each}} {{#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> </div>
{{/each}}
{{/if}}
{{/each}}
</div>
{{/each}}
</div> </div>
+21 -12
View File
@@ -3,36 +3,45 @@
<section class="char-details"> <section class="char-details">
<h1 class="char-name flexrow flex-group-left w-full"> <h1 class="char-name flexrow flex-group-left w-full">
<label>{{ localize 'IDENTITY.name' }}</label> <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> </h1>
<div class="profile flexrow flex-group-center"> <div class="profile flexrow flex-group-center">
<label>{{ localize 'IDENTITY.profile' }}</label> <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>
<div class="flexrow flex-group-center"> <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"> <div class="flexrow row">
<input type="number" name="system.identity.age" value="{{ system.identity.age }}" data-dtype="Number"/> <input type="number" name="system.identity.age"
<span id="ageType">({{ ageType "name" system.identity.ageType }})</span> value="{{ system.identity.age }}" data-dtype="Number" />
<span id="ageType">({{ ageType "name" system.identity.ageType
}})</span>
</div> </div>
</div> </div>
</section> </section>
<section class="char-level"> <section class="char-level">
<h1 class="char-vermine2047 flexrow flex-group-left w-full"> <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 "")}} {{#if (eq system.identity.totem "")}}
<a name="chooseTotem" class="chooseTotem">Choisissez votre totem</a> <a name="chooseTotem" class="chooseTotem">Choisissez votre totem</a>
{{ else }} {{ else }}
<a name="chooseTotem" class="chooseTotem">{{ smarttl "TOTEMS" system.identity.totem }}</a> <a name="chooseTotem" class="chooseTotem">{{ smarttl "TOTEMS"
system.identity.totem }}</a>
{{/if}} {{/if}}
</h1> </h1>
<div class="reputation flexrow flex-group-center"> <div class="reputation flexrow flex-group-center">
<label>{{ localize 'VERMINE.reputation' }}</label> <label>{{ localize 'VERMINE.reputation' }}</label>
<input name="system.attributes.reputation.value" type="text" value="{{system.attributes.reputation.value }}" data-dtype="Number" /> <input name="system.attributes.reputation.value" type="text"
</div> value="{{system.attributes.reputation.value }}"
<div class="experience flexrow flex-group-center"> data-dtype="Number" />
<label>{{ localize 'VERMINE.experience' }}</label> <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> </div>
</section> </section>
</header> </header>
+63 -50
View File
@@ -1,54 +1,67 @@
<div class="image-wrapper"> <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>
<ul class="padding-with-frieze unstyled paper"> <ul class="padding-with-frieze unstyled paper">
{{#if system.identity.totem }} {{#if system.identity.totem }}
<li class="row lgb"> <li class="row lgb">
<div class="flexcol flex-group-center items-center w-full"> <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" /> <img
</div> src="/systems/vermine2047/assets/images/ui/totems/{{ system.identity.totem }}.webp"
</li> alt="{{ smarttl 'TOTEMS' system.identity.totem 'name' }}" width="80"
{{/if}} height="80"
{{#if system.identity.theme}} data-tooltip="{{localize system.identity.totem}}" />
<li> </div>
<div class="flexcol flex-group-center items-center w-full"> </li>
<label for="system.identity.theme" class="resource-label flexlarge align-left">{{ localize "IDENTITY.theme"}}</label>
<p>{{{ system.identity.theme }}}</p>
</div>
</li>
{{/if}}
{{#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>
<p>{{{ system.identity.instincts }}}</p>
</div>
</li>
{{/if}}
{{#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>
<p>{{{ system.identity.prohibits }}}</p>
</div>
</li>
{{/if}}
{{#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>
<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>
{{{ system.identity.relations }}}
</div>
</li>
</ul>
{{/if}} {{/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"><h4>{{ localize
"IDENTITY.theme"}}</h4></label>
<p>{{{ system.identity.theme }}}</p>
</div>
</li>
{{/if}}
{{#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"><h4>{{ localize
"IDENTITY.instincts"}}</h4></label>
<p>{{{ system.identity.instincts }}}</p>
</div>
</li>
{{/if}}
{{#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"><h4>{{ localize
"IDENTITY.prohibits"}}</h4></label>
<p>{{{ system.identity.prohibits }}}</p>
</div>
</li>
{{/if}}
{{#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"><h4>{{ localize
"IDENTITY.objectives"}}</h4></label>
<p>{{{ system.identity.objectives }}}</p>
</div>
</li>
{{/if}}
{{#if system.identity.relations}}
<li>
<div class="flexcol flex-group-center items-center w-full">
<label for="system.identity.relations"
class="resource-label flexlarge align-left"><h4>{{ localize
"IDENTITY.relations"}}</h4></label>
{{{ system.identity.relations }}}
</div>
</li>
</ul>
{{/if}}
@@ -1,24 +1,30 @@
<section class="flexrow flex-group-left flex-align-left gap-md"> <section class="flexrow flex-group-left flex-align-left gap-md">
<div> <div>
<h4>{{ localize 'IDENTITY.theme'}}</h4> <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> <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>
<div> <div>
<h4>{{ localize 'IDENTITY.instincts'}}</h4> <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> <h4>{{ localize 'IDENTITY.prohibits'}}</h4>
<textarea name="system.identity.prohibits">{{ system.identity.prohibits }}</textarea> <textarea
name="system.identity.prohibits">{{ system.identity.prohibits }}</textarea>
</div> </div>
</section> </section>
<section class="flexcol flex-group-left flex-align-left"> <section class="flexcol ">
<div> <div>
<h4>{{ localize 'IDENTITY.notes'}}</h4> <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>
<div> <div>
<h4>{{ localize 'IDENTITY.relations'}}</h4> <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> </div>
</section> </section>
+130 -100
View File
@@ -1,106 +1,136 @@
{{#if system.identity.totem}}
<h4 class="align-center"> <h4 class="align-center">
{{ smarttl 'TOTEMS' system.identity.totem 'name' }} {{ smarttl 'TOTEMS' system.identity.totem 'name' }}
</h4> </h4>
<p style="font-size:80%;">{{ smarttlk "TOTEMS" system.identity.totem "description"}}</p> <p style="font-size:80%;">{{ smarttlk "TOTEMS" system.identity.totem
<div class="grid grid-2col"> "description"}}</p>
<div class=""> <div class="grid grid-2col">
<div class="item-name"><strong>Principes</strong><br />{{ smarttlk "TOTEMS" system.identity.totem "instincts"}}</div> <div class>
</div> <div class="item-name"><strong>Principes</strong><br />{{ smarttlk "TOTEMS"
<div class=""> system.identity.totem "instincts"}}</div>
<div class="item-name"><strong>Interdits</strong><br />{{ smarttlk "TOTEMS" system.identity.totem "bans"}}</div>
</div>
</div> </div>
<hr> <div class>
<div class="grid grid-2col"> <div class="item-name"><strong>Interdits</strong><br />{{ smarttlk "TOTEMS"
<div> system.identity.totem "bans"}}</div>
<h4> </div>
<span>{{ localize 'ITEMS.abilities'}}</span> </div>
<a class="item-control item-create" title="Create item" data-type="ability"><i class="fas fa-plus"></i></a> <hr>
</h4> <div class="grid grid-2col">
<ol class="list-item"> <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>
</h4>
<ol class="list-item">
{{#each abilities as |item id|}} {{#each abilities as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-name" style="flex:4;"> <div class="item-name" style="flex:4;">
<a class="item-control item-edit" title="Edit Item">{{item.name}}</a> <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>
</div>
</li>
{{/each}}
</ol>
</div>
<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>
</h4>
<ol class="list-item">
{{#each specialties 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>
</div>
</li>
{{/each}}
</ol>
</div>
<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>
</h4>
<ol class="list-item">
{{#each backgrounds 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>
</div>
</li>
{{/each}}
</ol>
</div>
<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>
</h4>
<ol class="list-item">
{{#each traumas 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>
</div>
</li>
{{/each}}
</ol>
</div>
<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>
</h4>
<ol class="list-item">
{{#each evolutions 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>
</div>
</li>
{{/each}}
</ol>
</div>
</div>
</div>
<div class="item-controls flexrow">
<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>
<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>
</h4>
<ol class="list-item">
{{#each specialties 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">
<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>
<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>
</h4>
<ol class="list-item">
{{#each backgrounds 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">
<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>
<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>
</h4>
<ol class="list-item">
{{#each traumas 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">
<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>
<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>
</h4>
<ol class="list-item">
{{#each evolutions 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">
<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>
{{else}}
<h3>choisissez un totem</h3>
{{/if}}
+88 -45
View File
@@ -2,75 +2,118 @@
<div> <div>
<h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4> <h4 class="align-center">{{ localize "VERMINE.self_control"}}</h4>
<p class="align-center"> <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> </p>
</div> </div>
<div> <div>
<h4 class="align-center">{{ localize "VERMINE.effort"}}</h4> <h4 class="align-center">{{ localize "VERMINE.effort"}}</h4>
<p class="align-center"> <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> </p>
</div> </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"> <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 }} {{#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> {{/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 }} {{#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}} {{/range}}
</li> </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 }} {{#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
{{/range}} @root.system.deadlyWound.value this }}checked="checked"{{/ife}}
data-wound="deadlyWound"
class="
{{#iflteq this @root.system.deadlyWound.value }}
checked
{{/iflteq}}
" />
{{/range}}
</li> </li>
</ul> </ul>
<h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4> <h4 class="item-name effect-name flexrow">{{ localize "UI.effects.name"}}</h4>
<ol class="items-list effects-list"> <ol class="items-list effects-list">
{{#each effects as |section sid|}} {{#each effects as |section sid|}}
<li class="items-header flexrow" data-effect-type="{{section.type}}"> <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
{{localize "UI.effects.temporary" }} 'temporary')}}
{{else if (eq section.type 'passive')}} {{localize "UI.effects.temporary" }}
{{localize "UI.effects.passive" }} {{else if (eq section.type 'passive')}}
{{else if (eq section.type 'inactive')}} {{localize "UI.effects.passive" }}
{{localize "UI.effects.inactive" }} {{else if (eq section.type 'inactive')}}
{{/if}} {{localize "UI.effects.inactive" }}
</p> {{/if}}
<div class="effect-source">{{localize 'UI.source'}}</div> </p>
<div class="effect-source">{{localize 'UI.duration'}}</div> <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'}}">
<i class="fas fa-plus"></i> {{localize "UI.add"}}
</a>
</div>
</li>
<ol class="item-list">
{{#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}}" />
<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"> <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="toggle"
<i class="fas fa-plus"></i> {{localize "UI.add"}} 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'}}">
<i class="fas fa-trash"></i>
</a> </a>
</div> </div>
</li> </li>
<ol class="item-list">
{{#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}}"/>
<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>
<a class="effect-control" data-action="delete" title="{{localize 'UI.effect_delete'}}">
<i class="fas fa-trash"></i>
</a>
</div>
</li>
{{/each}} {{/each}}
</ol> </ol>
{{/each}} {{/each}}
</ol> </ol>
+102 -45
View File
@@ -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"> <header class="combat-tracker-header">
{{#if user.isGM}} {{#if user.isGM}}
<nav class="encounters flexrow" aria-label="COMBAT.NavLabel"> <nav class="encounters flexrow" aria-label="COMBAT.NavLabel">
@@ -6,17 +7,24 @@
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> </a>
{{#if combatCount}} {{#if combatCount}}
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterPrevious" <a class="combat-button combat-cycle"
{{#if previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}> data-tooltip="COMBAT.EncounterPrevious"
{{#if
previousId}}data-document-id="{{previousId}}"{{else}}disabled{{/if}}>
<i class="fas fa-caret-left"></i> <i class="fas fa-caret-left"></i>
</a> </a>
<h4 class="encounter">{{localize "COMBAT.Encounter"}} {{currentIndex}} / {{combatCount}}</h4> <h4 class="encounter">{{localize "COMBAT.Encounter"}}
<a class="combat-button combat-cycle" data-tooltip="COMBAT.EncounterNext" {{currentIndex}} / {{combatCount}}</h4>
{{#if nextId}}data-document-id="{{nextId}}"{{else}}disabled{{/if}}> <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> <i class="fas fa-caret-right"></i>
</a> </a>
{{/if}} {{/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> <i class="fas fa-trash"></i>
</a> </a>
</nav> </nav>
@@ -24,34 +32,44 @@
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}"> <div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
{{#if user.isGM}} {{#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> <i class="fas fa-users"></i>
</a> </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> <i class="fas fa-users-cog"></i>
</a> </a>
{{/if}} {{/if}}
{{#if combatCount}} {{#if combatCount}}
{{#if combat.round}} {{#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}} {{else}}
<h3 class="encounter-title noborder">{{localize 'COMBAT.NotStarted'}}</h3> <h3 class="encounter-title noborder">{{localize
'COMBAT.NotStarted'}}</h3>
{{/if}} {{/if}}
{{else}} {{else}}
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3> <h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
{{/if}} {{/if}}
{{#if user.isGM}} {{#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}}> {{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-undo"></i> <i class="fas fa-undo"></i>
</a> </a>
<a class="combat-button combat-control" data-tooltip="{{labels.scope}}" <a class="combat-button combat-control"
data-control="toggleSceneLink" {{#unless hasCombat}}disabled{{/unless}}> data-tooltip="{{labels.scope}}"
data-control="toggleSceneLink" {{#unless
hasCombat}}disabled{{/unless}}>
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i> <i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
</a> </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> <i class="fas fa-cog"></i>
</a> </a>
{{/if}} {{/if}}
@@ -60,34 +78,60 @@
<ol id="combat-tracker" class="directory-list"> <ol id="combat-tracker" class="directory-list">
{{#each turns}} {{#each turns}}
<li class="combatant actor directory-item flexrow {{this.css}}" data-combatant-id="{{this.id}}"> <li class="combatant actor directory-item flexrow {{this.css}}"
<img class="token-image" data-src="{{this.img}}" alt="{{this.name}}"/> data-combatant-id="{{this.id}}">
<img class="token-image" data-src="{{this.img}}"
alt="{{this.name}}" />
<div class="token-name flexcol"> <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"> <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> <i class="fas fa-eye-slash"></i>
</a> </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> <i class="fas fa-skull"></i>
</a> </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}}> <a class="combatant-control offensive status"
<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> 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>
<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}}> <a class="combatant-control active status"
<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> 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>
<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}}> <a class="combatant-control passive status"
<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> 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> </a>
{{#if this.canPing}} {{#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> <i class="fa-solid fa-bullseye-arrow"></i>
</a> </a>
{{/if}} {{/if}}
<div class="token-effects"> <div class="token-effects">
{{#each this.effects}} {{#each this.effects}}
<img class="token-effect" src="{{this}}"/> <img class="token-effect" src="{{this}}" />
{{/each}} {{/each}}
</div> </div>
</div> </div>
@@ -103,30 +147,43 @@
{{#if this.hasRolled}} {{#if this.hasRolled}}
<span class="initiative">{{this.initiative}}</span> <span class="initiative">{{this.initiative}}</span>
{{else if this.owner}} {{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}} {{/if}}
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ol> </ol>
<nav id="combat-controls" class="directory-footer flexrow" data-tooltip-direction="UP"> <nav id="combat-controls" class="directory-footer flexrow"
{{#if hasCombat}} data-tooltip-direction="UP">
{{#if hasCombat}}
{{#if user.isGM}} {{#if user.isGM}}
{{#if round}} {{#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.RoundPrev"
<a class="combat-control" data-tooltip="COMBAT.TurnPrev" data-control="previousTurn"><i class="fas fa-arrow-left"></i></a> data-control="previousRound"><i
<a class="combat-control center" data-control="endCombat">{{localize 'COMBAT.End'}}</a> class="fas fa-step-backward"></i></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"
<a class="combat-control" data-tooltip="COMBAT.RoundNext" data-control="nextRound"><i class="fas fa-step-forward"></i></a> data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
{{else}} <a class="combat-control center" data-control="endCombat">{{localize
<a class="combat-control center" data-control="startCombat">{{localize 'COMBAT.Begin'}}</a> 'COMBAT.End'}}</a>
{{/if}} <a class="combat-control" data-tooltip="COMBAT.TurnNext"
{{else if control}} 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" data-tooltip="COMBAT.RoundNext"
<a class="combat-control center" data-control="nextTurn">{{localize 'COMBAT.TurnEnd'}}</a> data-control="nextRound"><i class="fas fa-step-forward"></i></a>
<a class="combat-control" data-tooltip="COMBAT.TurnNext" data-control="nextTurn"><i class="fas fa-arrow-right"></i></a> {{else}}
<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>
{{/if}}
{{/if}} {{/if}}
{{/if}}
</nav> </nav>
</section> </section>
+35 -23
View File
@@ -1,29 +1,41 @@
<form class="{{cssClass}}" autocomplete="off"> <form
class="{{cssClass}}"
autocomplete="off"
>
<header class="sheet-header"> <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}}"
/>
{{log this}}
<div class="header-fields"> <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> </div>
</header> </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> </form>
+66 -33
View File
@@ -1,72 +1,105 @@
<form id="dice-pool-form" class="ecryme-dv-form" data-actor-id="{{ speakerId }}"> <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="label" id="label" value="{{ label }}" />
<input type="hidden" name="rollType" id="rollType" value="{{ rollType }}" /> <input type="hidden" name="rollType" id="rollType" value="{{ rollType }}" />
<input type="hidden" name="abilityScore" id="abilityScore" value="{{ abilityScore }}" /> <input type="hidden" name="abilityScore" id="abilityScore"
<input type="hidden" name="skillScore" id="skillScore" value="{{ skillScore }}" /> value="{{ abilityScore }}" />
<input type="hidden" name="skillScore" id="skillScore"
value="{{ skillScore }}" />
<div class="dice-pool flexcol"> <div class="dice-pool flexcol">
<div class="flexrow row lgb flex-group-center"> <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>Type de jet <strong>{{#if (eq rollType 'skill')}}{{ localize
<span>{{#if (eq rollType 'skill')}}{{ localize 'VERMINE.skill_title' }}{{else}}{{ localize 'VERMINE.ability' }}{{/if}} 'VERMINE.skill_title' }}{{else}}{{ localize 'VERMINE.ability'
<strong>{{#if (eq rollType 'skill')}}{{ smarttl "SKILLS" label }}{{else}}{{ smarttl "ABILITIES" label }}{{/if}}</strong> </span> }}{{/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>
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label" style="flex: 60%;">{{localize 'VERMINE.difficulty'}}</label> <label class="label" style="flex: 60%;">{{localize
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="difficulty" id="difficulty" min="3" max="10"> '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 }} {{#select difficulty }}
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 1}} - {{ diffLevel 'difficulty' 1}}</option> <option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 1}} -
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 2}} - {{ diffLevel 'difficulty' 2}}</option> {{ diffLevel 'difficulty' 1}}</option>
<option value="{{ diffLevel 'difficulty' 1}}" selected>{{ diffLevel 'label' 3}} - {{ diffLevel 'difficulty' 3}}</option> <option value="{{ diffLevel 'difficulty' 2}}">{{ diffLevel 'label' 2}} -
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 4}} - {{ diffLevel 'difficulty' 4}}</option> {{ diffLevel 'difficulty' 2}}</option>
<option value="{{ diffLevel 'difficulty' 1}}">{{ diffLevel 'label' 5}} - {{ diffLevel 'difficulty' 5}}</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}}
</select> </select>
</div> </div>
<!--div class="flexrow row"> <!--div class="flexrow row">
<input style="text-align: center;" class="numeric-entry" type="number" name="difficulty" value="7" id="difficulty" min="3" max="10"> <input style="text-align: center;" class="numeric-entry" type="number" name="difficulty" value="7" id="difficulty" min="3" max="10">
</div--> </div-->
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label" style="flex: 60%;">{{localize 'VERMINE.ability'}}</label> <label class="label" style="flex: 60%;">{{localize
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="ability" id="ability" min="1" max="5"> 'VERMINE.ability'}}</label>
{{#if (eq rollType 'skill')}}<option>-- Choisissez une caractéristique --</option>{{/if}} <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| }} {{#each abilities as |ability key| }}
<option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}> {{ smarttl "ABILITIES" key }} - {{ ability.value }}</option> <option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}>
{{ smarttl "ABILITIES" key }} - {{ ability.value }}</option>
{{/each}} {{/each}}
</select> </select>
</div> </div>
{{#if (eq rollType 'skill')}} {{#if (eq rollType 'skill')}}
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label" style="flex: 60%;">{{localize 'VERMINE.skill_title'}}</label> <label class="label" style="flex: 60%;">{{localize
<select class="info-value" style="max-width: 40%;" data-dtype="String" type="number" name="skill" id="skill" min="1" max="5"> '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| }} {{#each skills as |skill key| }}
<option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}> {{ smarttl "SKILLS" key }} - {{ skill.value }}</option> <option value="{{ key }}" {{#if (eq key @root.label)}}selected{{/if}}>
{{ smarttl "SKILLS" key }} - {{ skill.value }}</option>
{{/each}} {{/each}}
</select> </select>
</div> </div>
<div class="flexrow row lgb"> <div class="flexrow row lgb">
<span id="skillLevel">{{#if (ne skillScore 0)}}{{ skillLevel 'label' skillScore }}{{/if}}</span> <span id="skillLevel">{{#if (ne skillScore 0)}}{{ skillLevel 'label'
<span>{{localize 'VERMINE.bonus'}} : <em id="skillDicePool">{{#if (ne skillScore 0)}}{{ skillLevel 'dicePool' skillScore }}{{else}}0{{/if}}</em></span> skillScore }}{{/if}}</span>
<span>{{localize 'VERMINE.reroll'}} : <em id="skillReroll">{{#if (ne skillScore 0)}}{{ skillLevel 'reroll' skillScore }}{{else}}0{{/if}}</em></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>
<div class="flexrow row smb"> <div class="flexrow row smb">
<label class="label">{{localize 'VERMINE.specialty'}} (+1D)</label> <label class="label">{{localize 'VERMINE.specialty'}} (+1D)</label>
<input type="checkbox" name="usingSpecialization" id="usingSpecialization" value="1" {{#if specialty}}checked{{/if}}> <input type="checkbox" name="usingSpecialization" id="usingSpecialization"
value="1" {{#if specialty}}checked{{/if}}>
</div> </div>
{{/if}} {{/if}}
<div class="flexrow row smb"> <div class="flexrow row smb">
<label class="label">{{localize 'VERMINE.help'}} (+1D)</label> <label class="label">{{localize 'VERMINE.help'}} (+1D)</label>
<input type="checkbox" name="helped" id="helped" value="1" {{#if help}}checked{{/if}}> <input type="checkbox" name="helped" id="helped" value="1" {{#if
help}}checked{{/if}}>
</div> </div>
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label">{{localize 'VERMINE.tooling'}} (+1D)</label> <label class="label">{{localize 'VERMINE.tooling'}} (+1D)</label>
<input type="checkbox" name="usingTools" id="usingTools" value="1" {{#if help}}checked{{/if}}> <input type="checkbox" name="usingTools" id="usingTools" value="1" {{#if
help}}checked{{/if}}>
</div> </div>
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label" style="flex: 80%;">{{localize 'VERMINE.self_control'}}</label> <label class="label" style="flex: 80%;">{{localize
<input type="number" class="numeric-entry" style="text-align: center;" name="self_control" id="self_control" min="0" max="5" value="0"> '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>
<div class="flexrow row mdb"> <div class="flexrow row mdb">
<label class="label" style="flex: 80%;">{{localize 'VERMINE.group'}}</label> <label class="label" style="flex: 80%;">{{localize
<input type="number" class="numeric-entry" style="text-align: center;" name="group" id="group" min="0" max="" value="0"> 'VERMINE.group'}}</label>
<input type="number" class="numeric-entry" style="text-align: center;"
name="group" id="group" min="0" max value="0">
</div> </div>
</div> </div>
<p><input type="hidden" name="speakerId" value="{{ speakerId }}" /> <p><input type="hidden" name="speakerId" value="{{ speakerId }}" />