Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f4403c164 | |||
| f1038b6b02 | |||
| 0abeff8fce | |||
| b35b0809d4 | |||
| a468a35e4f | |||
| 1aff4c5985 | |||
| 07d5c786eb | |||
| ba5f6826cc | |||
| 79c926a98a |
@@ -1,3 +1,80 @@
|
|||||||
# Hamalron JDR
|
# Hamalron JDR
|
||||||
|
|
||||||
Par Alkonost
|
_Hamalron_ est un jeu de rôle sur table médiéval-fantastique dark fantasy créé par **Alkonost**. Ce système Foundry VTT vous permet de jouer à _Hamalron_ en utilisant son mécanisme original : **le tirage de cartes de tarot** en remplacement des dés.
|
||||||
|
|
||||||
|
Ce systeme a été développé pour Foundry VTT par **LeRatierBretonnien** et est distribué gratuitement sous licence Creative Commons, avec l'approbation et la validation de l'auteur du jeu.
|
||||||
|
|
||||||
|
Par **Uberwald** (LeRatierBretonnien).
|
||||||
|
|
||||||
|
- **Repository** : https://www.uberwald.me/gitea/public/fvtt-hamalron
|
||||||
|
- **Uberwald** : https://www.uberwald.me
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Dans Foundry VTT, allez dans **Systèmes** → **Installer un système**.
|
||||||
|
2. Cherchez "Hamalron"
|
||||||
|
3. Cliquez sur **Installer**.
|
||||||
|
|
||||||
|
## Fonctionnalités
|
||||||
|
|
||||||
|
### Système de tarot
|
||||||
|
|
||||||
|
- **Pas de dés** : toutes les résolutions se font par tirage de cartes de tarot.
|
||||||
|
- **Gestionnaire de deck** complet : pioche, défausse, redistribution, collecte des mains.
|
||||||
|
- **Cartes de tarot** (22 atouts + 56 numérotées : Bâton, Coupe, Denier, Épée) + le Mat.
|
||||||
|
- Implémentation des règles de **tirage sous tension** (pioche MJ avec bonus de difficulté).
|
||||||
|
- Jet d'**initiative** par tirage automatique d'une carte au début du combat.
|
||||||
|
- **Tests d'épreuve** : dialogue de difficulté, tirage de carte, résistance d'objectif.
|
||||||
|
|
||||||
|
### Personnages
|
||||||
|
|
||||||
|
- **Compétences**
|
||||||
|
- **Blessures incapacitantes** à la perte d'une carte Épée (malus -2, bannière).
|
||||||
|
- **Récupération des résistances** : Denier/Coupe (test difficulté 7), Épée (tirage +1/test), Bâton (tirage +1).
|
||||||
|
- **Main de tarot** : les personnages peuvent recevoir jusqu'à 8 cartes en main.
|
||||||
|
|
||||||
|
### Équipement et combat
|
||||||
|
|
||||||
|
- **Armes** : dégâts, type, mains requises, portée.
|
||||||
|
- **Armures** : protection, type.
|
||||||
|
- **Équipement** divers.
|
||||||
|
|
||||||
|
### Magie
|
||||||
|
|
||||||
|
- **Lancement de sortilèges** : dialogue complet avec choix du rang, modificateurs circonstanciels.
|
||||||
|
- **Grille 3×3 de modificateurs** : Puissance magique / Sur-sollicitation du Néant / Blessure.
|
||||||
|
- **Rang de magicien** : influence le nombre de cartes tirées.
|
||||||
|
- **Table des échecs magiques** : conséquences en cas d'échec.
|
||||||
|
- Interface de **pioche** intégrée au dialogue de lancement.
|
||||||
|
|
||||||
|
### Univers
|
||||||
|
|
||||||
|
- **Peuples** jouables avec description et traits.
|
||||||
|
- **Langues** et factions.
|
||||||
|
- **Régions** géographiques.
|
||||||
|
- **Tarot divinatoire** : cartes avec description ésotérique.
|
||||||
|
|
||||||
|
### Interface et confort
|
||||||
|
|
||||||
|
- **Drag & drop** des compétences, sorts, armes et acteurs vers la barre de raccourcis.
|
||||||
|
- **Boutons "Sous tension" et "Opposé"** sur les messages de chat.
|
||||||
|
- **Bouton Tarot** rapide pour tirer une carte depuis le chat.
|
||||||
|
- **Bouton Actions** pour les actions complexes.
|
||||||
|
- **Bouton Épreuve** pour les tests de difficulté avec sélection de carte et choix de difficulté.
|
||||||
|
- **Fiches personnage et PNJ** complètes avec onglets.
|
||||||
|
- **Compendium** système intégré (78 cartes de tarot pré-créées).
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
1. Créez un monde avec le système **Hamalron JDR**.
|
||||||
|
2. Ouvrez le **Gestionnaire de deck de tarot** (bouton dans la barre des outils MJ ou `game.system.api.openTarotDeckManager()`).
|
||||||
|
3. Créez vos personnages et PNJ via les fiches appropriées.
|
||||||
|
4. Utilisez le chat pour lancer des épreuves, des attaques, ou des sorts.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Code : **CC BY-NC-SA 4.0** (Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International)
|
||||||
|
|
||||||
|
Droits d'auteur : © LeRatierBretonnien / www.uberwald.me
|
||||||
|
|
||||||
|
Les contenus artistiques et littéraires appartiennent à leurs auteurs respectifs (Alkonost).
|
||||||
|
|||||||
@@ -3151,6 +3151,37 @@ i.fvtt-hamalron {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
}
|
}
|
||||||
|
/* Chat sidebar tools (Tarot, Actions, Épreuve) */
|
||||||
|
.hamalron-chat-tools {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-bottom: 1px solid #444;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
.hamalron-chat-btn {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 3px 8px;
|
||||||
|
background: #2a2a4a;
|
||||||
|
color: #e0e0e0;
|
||||||
|
border: 1px solid #555;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 11px;
|
||||||
|
white-space: nowrap;
|
||||||
|
pointer-events: auto;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.hamalron-chat-btn:hover {
|
||||||
|
background: #3a3a6a;
|
||||||
|
}
|
||||||
.application.dialog.fvtt-hamalron {
|
.application.dialog.fvtt-hamalron {
|
||||||
color: var(--color-dark-1);
|
color: var(--color-dark-1);
|
||||||
background-color: var(--color-light-1);
|
background-color: var(--color-light-1);
|
||||||
|
|||||||
+14
-7
@@ -210,22 +210,19 @@ Hooks.on("getSceneControlButtons", (controls) => {
|
|||||||
|
|
||||||
// Add system buttons to the chat sidebar
|
// Add system buttons to the chat sidebar
|
||||||
function addChatTools() {
|
function addChatTools() {
|
||||||
const controls = document.querySelector("#chat-controls")
|
const chatEl = document.querySelector("#chat")
|
||||||
if (!controls || controls.querySelector(".hamalron-chat-tools")) return
|
if (!chatEl || chatEl.querySelector(".hamalron-chat-tools")) return
|
||||||
|
|
||||||
const tools = document.createElement("div")
|
const tools = document.createElement("div")
|
||||||
tools.className = "hamalron-chat-tools"
|
tools.className = "hamalron-chat-tools"
|
||||||
tools.style.cssText = "display:flex;gap:4px;padding:4px 8px;border-bottom:1px solid #444;margin-bottom:2px;flex-wrap:wrap"
|
|
||||||
|
|
||||||
const addBtn = (icon, label, title, onClick) => {
|
const addBtn = (icon, label, title, onClick) => {
|
||||||
const btn = document.createElement("button")
|
const btn = document.createElement("button")
|
||||||
btn.type = "button"
|
btn.type = "button"
|
||||||
btn.style.cssText = "display:flex;align-items:center;gap:4px;padding:3px 8px;background:#2a2a4a;color:#e0e0e0;border:1px solid #555;border-radius:4px;cursor:pointer;font-size:11px;white-space:nowrap"
|
btn.className = "hamalron-chat-btn"
|
||||||
btn.innerHTML = `<i class="${icon}"></i> <span>${label}</span>`
|
btn.innerHTML = `<i class="${icon}"></i> <span>${label}</span>`
|
||||||
btn.title = title
|
btn.title = title
|
||||||
btn.addEventListener("click", onClick)
|
btn.addEventListener("click", onClick)
|
||||||
btn.addEventListener("mouseenter", () => { btn.style.background = "#3a3a6a" })
|
|
||||||
btn.addEventListener("mouseleave", () => { btn.style.background = "#2a2a4a" })
|
|
||||||
tools.appendChild(btn)
|
tools.appendChild(btn)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +241,17 @@ function addChatTools() {
|
|||||||
await HamalronTirageTarot.promptEpreuve(actor)
|
await HamalronTirageTarot.promptEpreuve(actor)
|
||||||
})
|
})
|
||||||
|
|
||||||
controls.parentNode.insertBefore(tools, controls)
|
// Insérer dans .sidebar-tab-core avant .sidebar-tab-scroll
|
||||||
|
const core = chatEl.querySelector(".sidebar-tab-core")
|
||||||
|
const scroll = core?.querySelector(".sidebar-tab-scroll")
|
||||||
|
if (core && scroll) {
|
||||||
|
core.insertBefore(tools, scroll)
|
||||||
|
} else {
|
||||||
|
// Fallback: en haut de #chat
|
||||||
|
const firstChild = chatEl.firstElementChild
|
||||||
|
if (firstChild) chatEl.insertBefore(tools, firstChild)
|
||||||
|
else chatEl.appendChild(tools)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Hooks.on("renderChatLog", () => setTimeout(addChatTools, 0))
|
Hooks.on("renderChatLog", () => setTimeout(addChatTools, 0))
|
||||||
|
|||||||
@@ -291,7 +291,9 @@ export default class HamalronTirageTarot extends Roll {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
|
const rollModes = Object.fromEntries(
|
||||||
|
Object.entries(CONFIG.ChatMessage.modes ?? {}).map(([k, v]) => [k, v.label])
|
||||||
|
)
|
||||||
const fieldRollMode = new foundry.data.fields.StringField({
|
const fieldRollMode = new foundry.data.fields.StringField({
|
||||||
choices: rollModes,
|
choices: rollModes,
|
||||||
blank: false,
|
blank: false,
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000006
|
MANIFEST-000011
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -959,3 +959,37 @@
|
|||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Chat sidebar tools (Tarot, Actions, Épreuve) */
|
||||||
|
.hamalron-chat-tools {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-bottom: 1px solid #444;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hamalron-chat-btn {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 3px 8px;
|
||||||
|
background: #2a2a4a;
|
||||||
|
color: #e0e0e0;
|
||||||
|
border: 1px solid #555;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 11px;
|
||||||
|
white-space: nowrap;
|
||||||
|
pointer-events: auto;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #3a3a6a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user