Compare commits
28 Commits
7cbbb4432d
...
main
Author | SHA1 | Date | |
---|---|---|---|
417885eeb7
|
|||
7380b4df57
|
|||
341be68005 | |||
d017c53b81 | |||
870511a678 | |||
ff8f27f850 | |||
f7d40ec831 | |||
ad6200f7cb | |||
2698a9df10
|
|||
9c1e9fc00c
|
|||
1a948f1d9c | |||
871bc93220 | |||
68f84d33c6 | |||
68cc57cc27 | |||
624109beda | |||
4debce853b
|
|||
2aa09e4fe9
|
|||
7ae9f66a1c
|
|||
b6dc73540f
|
|||
9e96fbda7d
|
|||
5632861ae4 | |||
d40d486ad2 | |||
e1d717eaa5
|
|||
4a86fd611f
|
|||
a1d302d33a
|
|||
dbab5b3dc6 | |||
9c9fe3e37d | |||
61182c9190 |
15
hexpertise/Rakefile
Normal file
@ -0,0 +1,15 @@
|
||||
require 'squib'
|
||||
|
||||
task default: [:deck, :rules]
|
||||
|
||||
task :deck do
|
||||
load 'deck.rb'
|
||||
end
|
||||
|
||||
desc 'Build the rules PDF'
|
||||
task rules: "_output/RULES.pdf"
|
||||
|
||||
file "_output/RULES.pdf" => ["Rules.md", "_output"] do |t|
|
||||
respaths = [".", "docs/"]
|
||||
sh "pandoc", "-o", t.name, t.source, "--resource-path=#{respaths.join(File::PATH_SEPARATOR)}"
|
||||
end
|
@ -4,15 +4,23 @@ You are all mages competing to put on the flashiest magic display for the festiv
|
||||
Arrange the elements to put on a good show.
|
||||
|
||||
Shuffle the three nexus cards, flipping some upside down during shuffling, and deal each one faceup.
|
||||
Place the left elements in the fixed hexes on the corners in clockwise order from the top.
|
||||
Place the right elements in the fixed hexes on the corners in clockwise order from the bottom.
|
||||
Place the left elements in the fixed hexes (nexus) on the corners in clockwise order from the top.
|
||||
Place the right elements in the fixed hexes (nexus) on the corners in clockwise order from the bottom.
|
||||
|
||||
The center hex represents you, the mage.
|
||||
It is neutral (not aligned with any element).
|
||||
|
||||
Each turn, flip the top card of the mana deck.
|
||||
It shows two elements.
|
||||
Place the elements in a hex connected to the mage by other filled hexes, in either order.
|
||||
Choose one element to be the one placed, and the other to decide the direction it has to be placed in.
|
||||
|
||||
> **Example:** Light and Fire are the elements on the mana card.
|
||||
> Light is positioned in the top-right nexus, and Fire is in the bottom nexus.
|
||||
> This means that the players can place a Fire to the top-right of a filled hex,
|
||||
> or a Light below a filled hex.
|
||||
|
||||
If you are unable to place either element in any direction, you must nullify (cross out) an empty hex instead.
|
||||
Nullified hexes count as being filled, but have no element associated.
|
||||
|
||||
If either of the following elements are touching, cross them out.
|
||||
They have nullified each other.
|
||||
@ -22,7 +30,7 @@ For reference, these pairs are on the nexus cards.
|
||||
- Fire and Water
|
||||
- Earth and Air
|
||||
|
||||
When all 15 mana cards have been flipped, the festival is over.
|
||||
When all 15 mana cards have been flipped twice, the festival is over.
|
||||
See how the audience liked your display with the following rules.
|
||||
Do not count nullified elements.
|
||||
|
||||
@ -32,14 +40,19 @@ Do not count nullified elements.
|
||||
- Darkness tries to swallow everything
|
||||
- Fire = 2 points for each connection between adjacent fire hexes
|
||||
- Fire grows and burns
|
||||
- Water = 3 times length for straight line of 3 or more
|
||||
- Water = 3 points for each in longest path
|
||||
- Water flows like a river
|
||||
- Earth = 4 points for each cluster of 3
|
||||
- Earth = 4 points for each triangular cluster
|
||||
- Earth is solid and clustered together
|
||||
- Air = 3 points for each time the line curves
|
||||
- Air = 4 points for every fork in the line
|
||||
- Air is flowing
|
||||
- Harmonic Convergence = flower or line of all 6 elements = 10 points
|
||||
|
||||
Advanced scoring conditions:
|
||||
|
||||
- Harmonic Convergence = flower or line of all 6 elements = 15 points
|
||||
- Perfect convergence of elements puts on a flashy show
|
||||
- Void = flower of nullified hexes = 10 points
|
||||
- Making good use of negative space
|
||||
|
||||
The highest scoring display wins the festival!
|
||||
In case of a tie, use the scores for the individual elements, in clockwise order starting from the top.
|
@ -3,10 +3,10 @@ require 'squib'
|
||||
element_descs = {
|
||||
"light" => "3 per cluster",
|
||||
"dark" => "3 each after first in clusters",
|
||||
"fire" => "2 points per connected pair",
|
||||
"water" => "3 times length for straight line of 3+",
|
||||
"fire" => "2 points per connection between hexes",
|
||||
"water" => "3 points for each in longest path",
|
||||
"earth" => "4 per triangle cluster",
|
||||
"air" => "3 points for each curve in line"
|
||||
"air" => "4 points for every fork in line"
|
||||
}
|
||||
|
||||
Squib::Deck.new(cards: 18, layout: 'layout.yml', width: '3.5in', height: '2.5in') do
|
||||
@ -28,6 +28,7 @@ Squib::Deck.new(cards: 18, layout: 'layout.yml', width: '3.5in', height: '2.5in'
|
||||
|
||||
save format: :png, prefix: 'card_'
|
||||
save_pdf trim: 37.5, file: 'pnp.pdf'
|
||||
save_sheet prefix: "tts_", columns: 3, rows: 6, trim: '0.125in', count_format: ''
|
||||
end
|
||||
|
||||
Squib::Deck.new(cards: 6, width: '3in', height: '4in') do
|
||||
@ -36,8 +37,10 @@ Squib::Deck.new(cards: 6, width: '3in', height: '4in') do
|
||||
svg x: '0.5in', y: '0.5in', width: '2.0in', height: '2.0in', file: 'images/hexgrid.svg'
|
||||
|
||||
text x: '0.5in', y: '2.75in', width: '2in', height: '0.5in', str: 'Scoring', align: :center
|
||||
(0..6).each do |i|
|
||||
rect x: inches(0.5) + i * inches(2.0/7.0), y: '3.0in', width: '0.25in', height: '0.25in'
|
||||
syms = %w(light dark fire water earth air)
|
||||
(0..5).each do |i|
|
||||
svg x: inches(0.5) + i * inches(2.0/7.0), y: '3.0in', width: '0.25in', height: '0.25in',
|
||||
file: "images/#{syms[i]}.svg"
|
||||
rect x: inches(0.5) + i * inches(2.0/7.0), y: '3.25in', width: '0.25in', height: '0.25in'
|
||||
end
|
||||
star x: inches(0.5) + 6 * inches(2.0/7.0) + inches(0.125), y: '3.125in',
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
9
hexpertise/plays/Feedback.md
Normal file
@ -0,0 +1,9 @@
|
||||
Luke
|
||||
"Directional stuff" hardest to wrap head around
|
||||
Cancelation good, maybe suggest playing without for the first game
|
||||
Compass rose for the elements?
|
||||
It *is* cool that it reuses the board as a compass
|
||||
Ignored certain elements, which helped him focus
|
||||
Elk in Cascadia
|
||||
Scoring was familiar and straightforward
|
||||
Put symbols directly scoring sheet
|
BIN
hexpertise/plays/luke.bmp
Normal file
After Width: | Height: | Size: 835 KiB |
4
setlist/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
_output/*.png
|
||||
_output/*.pdf
|
||||
~$*
|
||||
.DS_Store
|
19
setlist/ABOUT.md
Normal file
@ -0,0 +1,19 @@
|
||||
My Awesome Game
|
||||
===============
|
||||
|
||||
Check out my awesome game!
|
||||
|
||||
|
||||
Objective
|
||||
---------
|
||||
|
||||
|
||||
|
||||
Gameplay
|
||||
--------
|
||||
|
||||
|
||||
|
||||
Ending the Game
|
||||
---------------
|
||||
|
4
setlist/Gemfile
Normal file
@ -0,0 +1,4 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'squib'
|
||||
gem 'game_icons'
|
68
setlist/Gemfile.lock
Normal file
@ -0,0 +1,68 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
cairo (1.17.8)
|
||||
native-package-installer (>= 1.0.3)
|
||||
pkg-config (>= 1.2.2)
|
||||
red-colors
|
||||
cairo-gobject (3.5.1)
|
||||
cairo (>= 1.16.2)
|
||||
glib2 (= 3.5.1)
|
||||
classy_hash (1.0.0)
|
||||
fiddle (1.1.1)
|
||||
game_icons (0.46.0.20221129)
|
||||
gdk_pixbuf2 (3.5.1)
|
||||
gio2 (= 3.5.1)
|
||||
gio2 (3.5.1)
|
||||
fiddle
|
||||
gobject-introspection (= 3.5.1)
|
||||
glib2 (3.5.1)
|
||||
native-package-installer (>= 1.0.3)
|
||||
pkg-config (>= 1.3.5)
|
||||
gobject-introspection (3.5.1)
|
||||
glib2 (= 3.5.1)
|
||||
highline (2.0.3)
|
||||
matrix (0.4.2)
|
||||
mercenary (0.4.0)
|
||||
native-package-installer (1.1.5)
|
||||
nokogiri (1.13.10-x64-mingw32)
|
||||
racc (~> 1.4)
|
||||
pango (3.5.1)
|
||||
cairo-gobject (= 3.5.1)
|
||||
gobject-introspection (= 3.5.1)
|
||||
pkg-config (1.5.1)
|
||||
racc (1.6.2)
|
||||
rainbow (3.1.1)
|
||||
red-colors (0.3.0)
|
||||
matrix
|
||||
roo (2.9.0)
|
||||
nokogiri (~> 1)
|
||||
rubyzip (>= 1.3.0, < 3.0.0)
|
||||
rsvg2 (3.5.1)
|
||||
cairo-gobject (= 3.5.1)
|
||||
gdk_pixbuf2 (= 3.5.1)
|
||||
ruby-progressbar (1.11.0)
|
||||
rubyzip (2.3.2)
|
||||
squib (0.18.0)
|
||||
cairo (~> 1.17)
|
||||
classy_hash (= 1.0.0)
|
||||
gio2 (~> 3.4)
|
||||
gobject-introspection (~> 3.4)
|
||||
highline (= 2.0.3)
|
||||
mercenary (= 0.4.0)
|
||||
nokogiri (~> 1.11)
|
||||
pango (~> 3.4)
|
||||
rainbow (~> 3.0)
|
||||
roo (~> 2.8)
|
||||
rsvg2 (~> 3.4)
|
||||
ruby-progressbar (~> 1.11)
|
||||
|
||||
PLATFORMS
|
||||
x64-mingw32
|
||||
|
||||
DEPENDENCIES
|
||||
game_icons
|
||||
squib
|
||||
|
||||
BUNDLED WITH
|
||||
2.1.4
|
22
setlist/IDEAS.md
Normal file
@ -0,0 +1,22 @@
|
||||
# Title Ideas
|
||||
|
||||
* First idea
|
||||
* Second idea
|
||||
|
||||
|
||||
# Things to Try
|
||||
|
||||
* Idea
|
||||
* Idea
|
||||
|
||||
# Feedback Ideas
|
||||
|
||||
* Feedback
|
||||
* Feedback
|
||||
|
||||
# Problems To Work On
|
||||
|
||||
* Problem
|
||||
* Problem
|
||||
|
||||
|
26
setlist/PLAYTESTING.md
Normal file
@ -0,0 +1,26 @@
|
||||
# Playtesting Log
|
||||
|
||||
# Playtest Report Survey
|
||||
|
||||
## Basic Info
|
||||
* Num. Players:
|
||||
* How many sessions of this game have you played before?
|
||||
* How long did you play?
|
||||
* How did you prepare for teaching the rules? Read the sheet with everyone there, or did someone read it ahead of time?
|
||||
* What types of players played with you? What are their favorite games?
|
||||
* What version were you testing?
|
||||
* What date did you play?
|
||||
|
||||
## Did it work?
|
||||
* Was there a moment that you felt the game was "broken"? Describe what happened.
|
||||
* How close were the scores? Did everyone feel like they had a fair chance at winning?
|
||||
* Were there any moments that you had to go back to the rules for clarification? What resulted of that - are you still unclear, or was it just a misunderstanding?
|
||||
* Any ideas for clearer rules?
|
||||
* Any ideas for clearer icons, artwork, in-game helps, etc?
|
||||
|
||||
## Was it fun?
|
||||
* Based on the description, artwork, branding, etc. was this game what you expected?
|
||||
* Were the theme, artwork, and icons engaging?
|
||||
* Did this game have the depth of strategy that you were expecting?
|
||||
* What were the moments that people felt like they were having the most fun? The least fun?
|
||||
* Assuming trivial issues are fixed, would you recommend this to someone else?
|
4
setlist/PNP NOTES.md
Normal file
@ -0,0 +1,4 @@
|
||||
Print and Play Notes
|
||||
====================
|
||||
|
||||
Fill this out to give tips on how to play this with print and play.
|
21
setlist/RULES.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Intro
|
||||
|
||||
2-4 players arranging their setlists at a music festival
|
||||
|
||||
# Objective
|
||||
|
||||
Draw the most fans by performing the best in each time block
|
||||
|
||||
# Components
|
||||
|
||||
18 Song cards
|
||||
|
||||
# Gameplay
|
||||
|
||||
Phase 1: Four cards are handed to each player. Players draft one card and pass the rest on until all cards are chosen.
|
||||
Phase 2: Players arrange their songs face-down in the order they'll perform in
|
||||
Phase 3: All players flip cards face-up. They resolve in order of Volume from loudest to quietest
|
||||
|
||||
# Scoring
|
||||
|
||||
How is victory assigned?
|
1
setlist/_output/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
Keep this here so that Git knows to keep the _output directory on a fresh clone
|
BIN
setlist/back.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
50
setlist/config.yml
Normal file
@ -0,0 +1,50 @@
|
||||
# Settings in the config.yml are overriding Squib's defaults. Anything in the main script will override this.
|
||||
|
||||
# Looking for DPI? It needs to be a parameter to Squib::Deck.new
|
||||
|
||||
#antialias: best #recommended. Only about 10% slower than fast
|
||||
#antialias: default # set the anti-aliasing algorithm. default defers to the underlying graphics device. See http://www.cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t
|
||||
|
||||
# Text hints are used to show the boundaries of text boxes.
|
||||
# Can be enabled/disabled at the command-level, or set globally with `set`
|
||||
#text_hint: '#F00'
|
||||
|
||||
# Show progress bars on the command line for potentially long-running operations
|
||||
#progress_bars: true
|
||||
|
||||
#Enable some custom colors that can be used in any color
|
||||
#custom_colors:
|
||||
# foo: '#abc'
|
||||
|
||||
#For reading image file command (e.g. png and svg), read from this directory instead
|
||||
#img_dir: img-color
|
||||
#img_dir: img-bw
|
||||
|
||||
# Use a SVG cairo back end, instead of an in-memory buffer
|
||||
# backend: :memory # default
|
||||
# backend: :svg # can create scalable pdfs, but rendering done at the printer level is not as good as Cairo.
|
||||
|
||||
# Configure what text markup uses replace characters
|
||||
# Below are the defaults
|
||||
# lsquote: "\u2018" #note that Yaml wants double quotes here to use escape chars
|
||||
# rsquote: "\u2019"
|
||||
# ldquote: "\u201C"
|
||||
# rdquote: "\u201D"
|
||||
# em_dash: "\u2014"
|
||||
# en_dash: "\u2013"
|
||||
# ellipsis: "\u2026"
|
||||
|
||||
# We can also disallow smart quotes and only allow explicit replacements with ``LaTeX-style'' quotes.
|
||||
# smart_quotes: false
|
||||
|
||||
# By default, Squib warns when a text box is ellipsized. This can get verbose
|
||||
# and can be turned off here
|
||||
# warn_ellipsize: true # default
|
||||
# warn_ellipsize: false # turn off entirely
|
||||
|
||||
# By default, Squib will warn if a PNG is being up-scaled.
|
||||
# warn_png_scale: true # default
|
||||
# warn_png_scale: false # turn off entirely
|
||||
|
||||
# How many pixels are in a "cell"?
|
||||
# cell_px: 37.5 # default
|
19
setlist/data.csv
Normal file
@ -0,0 +1,19 @@
|
||||
name,volume,traits,audience,effect,blurb
|
||||
Crazy Little Thing Called Love,f,l,2,+2 {A} if the first {l} song in your setlist,
|
||||
War Cry,f,a,2,+1 {A} for each song quieter than this in this time block,
|
||||
Opener,mp,j,0,+3 {A} if the first song in your set,
|
||||
Dirge,ppp,s,0,,
|
||||
Love Ballad,f,l,3,+2 {A} if in the first two songs of your setlist,
|
||||
Rage Against The Man,fff,a,2,+1 {A} for each {a} song in this time block,
|
||||
Everything Is Awesome,mf,j,3,+2 {A} if in the last two songs if your setlist,
|
||||
Tears in the Rain,p,s,2,+3 {A} if this is the quietest song in this time block,
|
||||
Breakup Song,ff,la,3,+3 {A} if another band played a {l} song in this time block,
|
||||
New Relationship,mf,lj,2,+4 {A} if there are no {l} song before this in any band's setlist,
|
||||
Brokenhearted,p,ls,3,+1 {A} if the next song in your setlist is a {l} song,
|
||||
Mixed Messages,ff,aj,2,+3 {A} if this is the loudest song in this time block,
|
||||
Betrayed,f,as,2,+3 {A} if this is immediately following a {j} song in your setlist,
|
||||
Happy To Be Sad,f,js,1,+2 {A} for each {s} song already in your setlist,
|
||||
Indignant Love,f,laj,3,,
|
||||
Unrequited Love,mp,las,3,,
|
||||
Butterflies In The Stomach,mf,ljs,3,,
|
||||
Rampage,fff,ajs,3,,
|
|
70
setlist/deck.rb
Normal file
@ -0,0 +1,70 @@
|
||||
require 'squib'
|
||||
require 'game_icons'
|
||||
|
||||
module Icons
|
||||
|
||||
def self.getIcon(name, color = 'black')
|
||||
return GameIcons.get(name).
|
||||
recolor(fg: color, bg: 'white', fg_opacity: 1.0, bg_opacity: 0.0).
|
||||
string
|
||||
end
|
||||
|
||||
AUDIENCE = getIcon 'delapouite/person'
|
||||
MUSIC = getIcon 'delapouite/musical-score'
|
||||
|
||||
LOVE = getIcon 'skoll/hearts'
|
||||
ANGER = getIcon 'skoll/fist'
|
||||
JOY = getIcon 'lorc/delighted'
|
||||
SAD = getIcon 'lorc/tear-tracks'
|
||||
end
|
||||
|
||||
VOLUMES = {
|
||||
"ppp" => 1,
|
||||
"pp" => 2,
|
||||
"p" => 3,
|
||||
"mp" => 4,
|
||||
"mf" => 5,
|
||||
"f" => 6,
|
||||
"ff" => 7,
|
||||
"fff" => 8,
|
||||
}
|
||||
|
||||
data = Squib.csv file: 'data.csv'
|
||||
|
||||
Squib::Deck.new(cards: data.nrows) do
|
||||
use_layout file: 'economy.yml'
|
||||
use_layout file: 'layout.yml'
|
||||
background color: 'white'
|
||||
cut_zone
|
||||
safe_zone
|
||||
|
||||
text layout: :title, str: data.name, ellipsize: :autoscale
|
||||
|
||||
# svg layout: :art, data: Icons::MUSIC
|
||||
text layout: :art, align: :center, valign: :middle, str: data.traits do |embed|
|
||||
embed.svg key: 'l', width: 128, height: 128, data: Icons::LOVE
|
||||
embed.svg key: 'a', width: 128, height: 128, data: Icons::ANGER
|
||||
embed.svg key: 'j', width: 128, height: 128, data: Icons::JOY
|
||||
embed.svg key: 's', width: 128, height: 128, data: Icons::SAD
|
||||
end
|
||||
|
||||
rect layout: :description
|
||||
text layout: :description, str: data.effect.zip(data.blurb).map { |e, b|
|
||||
"#{e}#{if b then "\n<i>#{b}</i>" end}"
|
||||
} do |embed|
|
||||
embed.svg key: '{A}', width: 32, height: 32, data: Icons::AUDIENCE
|
||||
embed.svg key: '{l}', width: 32, height: 32, data: Icons::LOVE
|
||||
embed.svg key: '{a}', width: 32, height: 32, data: Icons::ANGER
|
||||
embed.svg key: '{j}', width: 32, height: 32, data: Icons::JOY
|
||||
embed.svg key: '{s}', width: 32, height: 32, data: Icons::SAD
|
||||
end
|
||||
text layout: :volume, markup: true, str: data.volume.map { |v| "<b><i>#{v} (#{VOLUMES[v]})</i></b>" }
|
||||
text layout: :audience, ellipsize: :autoscale, str: data.audience.map { |au| "{A}#{au}"} do |embed|
|
||||
embed.svg key: '{A}', width: 48, height: 48, data: Icons::AUDIENCE
|
||||
end
|
||||
|
||||
save format: :png
|
||||
save_sheet prefix: "sheet",
|
||||
columns: 5, rows: 4, trim: '0.125in', count_format: ''
|
||||
|
||||
end
|
23
setlist/feedback/2023/04/15-Jeremiah.md
Normal file
@ -0,0 +1,23 @@
|
||||
Make sure specify time blocks
|
||||
|
||||
5 - 2
|
||||
8 - 5
|
||||
13 - 11
|
||||
18 - 16
|
||||
|
||||
More cards for fewer players - ex. start with 7 but only end up with 4
|
||||
Volume might not really be a useful mechanic
|
||||
Everything At Once, and Wildcard, might be overpowered
|
||||
- Maybe reduce the number of points it's worth
|
||||
Cards without abilities probably wouldn't get chosen
|
||||
|
||||
Screentop: make a second set of hidden containers for tracking chosen cards
|
||||
|
||||
5 - 6
|
||||
8 - 11
|
||||
12 - 15
|
||||
16 - 20
|
||||
|
||||
Once you have your set, you can choose the order as they're revealed?
|
||||
Possible to "lean into" a suit
|
||||
Focus more on volume, less on suits
|
11
setlist/layout.yml
Normal file
@ -0,0 +1,11 @@
|
||||
volume:
|
||||
x: 90
|
||||
y: 955
|
||||
width: 320
|
||||
height: 50
|
||||
align: left
|
||||
|
||||
audience:
|
||||
extends: volume
|
||||
x: += 329
|
||||
align: right
|