diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-07-28 23:47:14 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-07-28 23:47:14 +0200 |
| commit | 15e36f1147d4b8cba7ca8308da128392b2607851 (patch) | |
| tree | 15d24c9ff2b63c710f56b864281cbaabb593272e | |
| parent | 24aad8335be3612f26134736fae5e6c3041718a3 (diff) | |
| download | muhqs-game-15e36f1147d4b8cba7ca8308da128392b2607851.tar.gz muhqs-game-15e36f1147d4b8cba7ca8308da128392b2607851.zip | |
update rules
Define state-based actions, game zones, priority.
Use more enumerations to make more rules linkable.
| -rw-r--r-- | html/Makefile | 5 | ||||
| -rw-r--r-- | rules/de/rules.md | 4 | ||||
| -rw-r--r-- | rules/en/rules.md | 161 |
3 files changed, 112 insertions, 58 deletions
diff --git a/html/Makefile b/html/Makefile index ea38b578..78638fcd 100644 --- a/html/Makefile +++ b/html/Makefile @@ -2,7 +2,7 @@ VERBOSE ?= @ SHELL := bash HTML_TEMPLATE := template.html -PANDOC_FLAGS := -f markdown --embed-resources --standalone --template=$(HTML_TEMPLATE) --metadata-file=pandoc/default-metadata.yml +PANDOC_FLAGS := -f markdown+tex_math_dollars --embed-resources --standalone --template=$(HTML_TEMPLATE) --metadata-file=pandoc/default-metadata.yml # The full path to the Makefile MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) @@ -69,7 +69,8 @@ FILES_TO_COPY := hover-placeholder.png tools.html wasm.html $(subst $(HTML_ROOT) FILES_TO_COPY_TARGETS := $(addprefix $(BUILDDIR)/,$(FILES_TO_COPY)) .PHONY: all clean maps misc -all: $(HTML) $(RULES_HTML) maps misc $(BLOG_POSTS_HTML) +all: $(HTML) $(RULES_HTML) misc $(BLOG_POSTS_HTML) +#all: $(HTML) $(RULES_HTML) maps misc $(BLOG_POSTS_HTML) misc: $(BUILDDIR)/latex-build $(BUILDDIR)/cards-data $(FILES_TO_COPY_TARGETS) \ $(BUILDDIR)/webtools.wasm $(BUILDDIR)/boss/ai-companion.wasm \ diff --git a/rules/de/rules.md b/rules/de/rules.md index 744969f3..6e3fa3f9 100644 --- a/rules/de/rules.md +++ b/rules/de/rules.md @@ -76,7 +76,7 @@ packgröße = number # Zug Struktur * Spieler sind alternierend am Zug -* Ein Zuge besteht aus fünf Phasen: +* Ein Zug besteht aus sechs Phasen: * [Ersetze leeres **Deck** mit Ablagestapel] * [Ziehe auf drei Karten auf] * **Upkeep** @@ -108,7 +108,7 @@ packgröße = number * Es muss zuerst die konkrete auszuführende **Aktion** und all ihre **Ziele** angekündigt, sowie ihre Kosten bezahlt werden * Das atomare Umsetzen aller Auswirkungen der **Aktion** * **Aktionen** haben unterschiedliche Zeitpunkte an denen ein Spieler sie ausführen kann - * **Langsame Aktionen** können nur in der eigenen **Aktionsphase** ausgeführt werden + * **Langsame Aktionen** können nur in der eigenen **Aktionsphase** ausgeführt werden und wenn keine andere **Aktion** *angekündigt* ist * **Schnelle Aktionen** können jeder Zeit ausgeführt werden ## Aktionsphase diff --git a/rules/en/rules.md b/rules/en/rules.md index 24ea0798..2a1a4a73 100644 --- a/rules/en/rules.md +++ b/rules/en/rules.md @@ -57,13 +57,13 @@ packsize = number `packsize` spcifies how many cards are in one pack > For example `3x[2;8]` means that there are three rounds starting with packs of eight cards and they rotate until each player has taken two cards from each pack. -> This means after the draft each player has a deck containing ${3 \cdot Players \cdot 2}$ cards. +> This means after the draft each player has a deck containing $3 \cdot Players \cdot 2$ cards. ## Drafting 1. The pool of cards must have enough cards to be able to separate them in the required amount of packs 1. If there are not enough cards in the pool add a copy of each card and repeat if necessary -2. Start each draft by creating ${Players \cdot rounds}$ randomly distributed packs from the pool +2. Start each draft by creating $Players \cdot rounds$ randomly distributed packs from the pool 3. Process: ``` For each round @@ -74,56 +74,80 @@ packsize = number # Player Turns -* Players take turns alternating -* A turn consists of five steps: - * [shuffle **pile** and replace empty **deck**] +1. Players take turns alternating +2. A turn consists of six steps: + * [shuffle **discard pile** and replace empty **deck**] * [draw cards until you have three cards in hand] - * **Upkeep** + * [**Upkeep**](#upkeep) * [**actions phase**](#action-phase) * [**buying phase**](#buying-phase) - * [put any number of cards from your hand onto your pile] + * [put any number of cards from your hand onto your **discard pile**] + +## Turn Phases + +1. A player's turn always consists at least of the three **phases**: + * **Upkeep** + * **Action phase** + * **Buying phase** +2. The three optional **steps** (shuffling, drawing, discarding) are not consider **phases** + 2.1 During the optional **steps** no player can *declare* actions +3. Effects, that last until the turn's end, stop after the **discard step** ## Upkeep -* Gain amount of resource defined by the map -* Process all triggered effects -* Pay your **units**: - ``` - For each of your units - Pay upkeep cost or destroy unit - ``` +1. Gain amount of resource defined by the map +2. Process all triggered effects +3. Pay your **units**: + 1. Paying for the units is an **action** + 2. The player has to declare the units they are going to *disband* (not pay for) + 3. The effect of the **upkeep action** is resolved as: + ``` + For each not declared unit + Pay upkeep cost or destroy unit if paying the total cost is not possible + ``` + 4. A player is only allow to not pay for and destroy a not declared unit if they can not pay the total amount + 5. If the active player controls no **units** no **upkeep action** is declared ## Actions -* **Actions** model everything happening in muhq's game -* **Actions** can be issued by a player or *triggered* by some condition -* A condition *triggering* an **action** is called a **trigger** -* **Actions** caused by a **trigger** are *triggered* - * **Triggers** are usually recognizable by their conditional language and commonly written as: `"Whenever <condition> <action>, If <condition> <action> ..., When <condition> <action> ..."` - * Example: "Whenever the equipped **unit** *attacks* gain 1 **resource**" - "the equipped **unit** *attacks*" is the condition and "gain 1 **resource**" is the *triggered* **action** -* All game activities a player does are **actions** -* Playing a card is an **action**, in doing so they must pay the card's **playing cost** as the cost for the **action** -* Cards without **playing cost** (not cards with `playing cost = 0`) can not be played as an action in this way. -* *Controlled* **permanents** (e.g. **units**) can be "used" via their **actions** -* Actions are processed in two steps: - * By *declaring* an **action** the player announces the desired effects, all its *targets* and pays all required costs - * The execution of an **action** is the atomic applying of all its effect. -* **Actions** have different timing restriction when a player can *declare* them - * **Slow actions** can only be *declared* during ones **action phase** - * **Fast actions** can always be *declared* +1. **Actions** model nearly everything happening in muhq's game +2. **Actions** can be issued by a player or *triggered* by some condition +3. A condition *triggering* an **action** is called a **trigger** +4. **Actions** caused by a **trigger** are *triggered* + 1. **Triggers** are usually recognizable by their conditional language and commonly written as: `"Whenever <condition> <action>, If <condition> <action> ..., When <condition> <action> ..."` + + > Example: "Whenever the equipped **unit** *attacks* gain 1 **resource**" - "the equipped **unit** *attacks*" is the condition and "gain 1 **resource**" is the *triggered* **action** + +5. If multiple **Actions** are triggered at once the Players declare their **actions** in turn order +6. All game activities a player does are **actions** +7. Playing a card is an **action**, in doing so they must pay the card's **playing cost** as the cost for the **action** +8. Cards without **playing cost** (not cards with `playing cost = 0`) can not be played as an action in this way +9. *Controlled* **permanents** (e.g. **units**) can be "used" via their **actions** +10. Actions are processed in two steps: + 1. By *declaring* an **action** the player announces the desired effects, all its *targets* and pays all required costs + 2. The execution of an **action** is the atomic applying of all its effect +11. **Actions** have different timing restriction when a player can *declare* them + 1. **Slow actions** can only be *declared* during ones **action phase** and if no other **action** is already *declared* + 2. **Fast actions** can always be *declared* when a player has **priority** + +### Priority + +1. **Priority** is the time a player is allowed to declare **Actions** +2. To change from a turn's phase into the next each player has to pass **priority** without *declaring* an **action** +3. **Priority** is asigned in turn order ### Action Phase -* **Slow actions** can be declared during a players own **action phase** -* The action phase sequence: - ``` - While you control an untapped permanent or have a playable card in hand - You may play a card from your hand - Or select an untapped permanent <P> you control - While <P> is untapped and has actions left - You may declare/execute an available action of <P> - Tap <P>'s card - ``` +1. **Slow actions** can be declared during a players own **action phase** +2. The action phase sequence: + ``` + While you control an untapped permanent or have a playable card in hand + You may play a card from your hand + Or select an untapped permanent <P> you control + While <P> is untapped and has actions left + You may declare/execute an available action of <P> + Tap <P>'s card + ``` ### Action-Stack @@ -149,6 +173,16 @@ packsize = number * To *declare* a **free action** you must pay its cost * **Permanents** can have **free actions** +### State-based actions + +1. **State-based actions** are not **actions** as defined by [actions](#actions), there are not *declared* and do not use the **action stack** +2. **State-based actions** are performed every time before a player receives **priority** +3. **State-based actions** handle the following: + 1. **Units** with more damage than health are destroyed + 1. *Poisoned* **units** with more **poison** marks than health are destroyed + 2. **Equipments** without **durability** are destroyed + 3. Granted effects end, which's condition are no longer satisfied + ## Buying * Cards must be *bought* from the own **store** @@ -162,24 +196,43 @@ packsize = number * Section of a players turn in which the active player may *buy* a card -# Deck +# Zones + +1. Muhq's game features 6 distinct zones, where cards can be during the game: + * In a player's **Deck** + * In a player's **Hand** + * In a player's **Discard Pile** + * In a player's **Store** + * On the **Map** + * In **Exile* + +## Deck + +1. Each player has an individual **Deck** +2. Initialy a **deck** contains only the start-cards defined by the **map** +3. The **deck** can be changed by *buying* cards or effects +4. If your **deck** is empty during your **upkeep** shuffle your **discard pile** into your **deck** +5. It is possible to have a permanently empty **deck** + +## Discard Pile + +1. A player's **discard pile** contains all their used cards +2. Each player's **discard pile** is public information and can be looked at anytime +3. **Discard piles** have no card order + +## Store -* The game features dynamic **Decks** -* A **deck** starts with *X* start cards which are defined by the map -* The **deck** can be changed by *buying* cards or effects -* If your **deck** is empty during your **upkeep** shuffle your **discard pile** into your **deck** -* It is possible to have a permanently empty **deck** +1. Each player has its own **store** +2. When the game starts the **store** contains all cards of a player -# Discard Pile +## Hand -* The **discard pile** contains all used cards -* Each player's **discard pile** is public information and can be looked at anytime -* **Discard piles** have no card order +1. The cards in a player's **hand** are secret information and only known by them +2. A player's hand may contain any number of cards -# Store +## Exile -* Each player has its own **store** -* When the game starts the **store** contains all cards of a player +1. Cards in **Exile** are no longer part of the game # Map @@ -265,7 +318,7 @@ packsize = number * **Ranges** have a radius `r` * **Ranges** with the radius `r` include all **tiles** which are reachable with `r` **steps** from the origin, counting each second diagonal **step** twice * More precisely: a **tile** (x, y), where x and y are relative to the its origin (0, 0), is in the **range** r iff $$x > y$$ and $$abs(x) + floor(abs(y) / 2) <= r$$ else $$abs(y) + floor(abs(x) / 2) <= r$$ -* *Adjacent* is a common Abbreviation for "in **range** 1" +* *Adjacent* is a common abbreviation for "in **range** 1" ## Step |
