Compare commits

...

28 Commits

Author SHA1 Message Date
417885eeb7 Reorganize 2023-05-11 21:57:43 -04:00
7380b4df57 Cards with more suits are weaker now 2023-05-11 21:55:13 -04:00
341be68005 Add card back 2023-05-07 13:25:26 -04:00
d017c53b81 Adjust deck 2023-04-19 19:07:36 -04:00
870511a678 Jeremiah's feedback 2023-04-15 20:29:23 -04:00
ff8f27f850 Remove unused data file 2023-04-15 19:28:10 -04:00
f7d40ec831 Merge branch 'main' of https://git.msoucy.me/msoucy/18cards 2023-04-15 19:00:41 -04:00
ad6200f7cb Clarify rules 2023-04-15 19:00:39 -04:00
2698a9df10 Typoes 2023-04-06 20:02:57 -04:00
9c1e9fc00c Remaining abilities 2023-02-26 22:42:19 -05:00
1a948f1d9c Get rid of ugly nil 2023-02-24 22:49:35 -05:00
871bc93220 Setlist card abilities (mostly) 2023-02-24 22:47:36 -05:00
68f84d33c6 Audience on setlist cards 2023-02-24 22:47:22 -05:00
68cc57cc27 Start CSV cards 2023-01-14 15:44:16 -05:00
624109beda Fix icon import 2023-01-13 20:24:33 -05:00
4debce853b Icon setup 2023-01-13 19:17:22 -05:00
2aa09e4fe9 Add volume numbers for non-musicians 2023-01-02 22:27:14 -05:00
7ae9f66a1c Add sheet save 2023-01-01 21:28:20 -05:00
b6dc73540f Add Setlist prototype 2023-01-01 20:54:41 -05:00
9e96fbda7d Setlist card prototypes 2022-11-23 18:46:58 -05:00
5632861ae4 Add an outline for Setlist 2022-11-18 23:08:08 -05:00
d40d486ad2 Feedback results 2022-05-27 14:13:02 -04:00
e1d717eaa5 TTS file 2022-05-26 21:25:45 -04:00
4a86fd611f Rule changes 2022-05-26 21:10:40 -04:00
a1d302d33a Update Air rule 2022-05-26 20:54:40 -04:00
dbab5b3dc6 Cleanup 2022-05-25 18:59:11 -04:00
9c9fe3e37d Merge branch 'main' of https://git.msoucy.me/msoucy/18cards 2022-05-25 18:47:47 -04:00
61182c9190 Pandoc rakefile 2022-05-25 18:47:44 -04:00
40 changed files with 395 additions and 13 deletions

15
hexpertise/Rakefile Normal file
View 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

View File

@ -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. 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. 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 left elements in the fixed hexes (nexus) 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 right elements in the fixed hexes (nexus) on the corners in clockwise order from the bottom.
The center hex represents you, the mage. The center hex represents you, the mage.
It is neutral (not aligned with any element). It is neutral (not aligned with any element).
Each turn, flip the top card of the mana deck. Each turn, flip the top card of the mana deck.
It shows two elements. 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. If either of the following elements are touching, cross them out.
They have nullified each other. They have nullified each other.
@ -22,7 +30,7 @@ For reference, these pairs are on the nexus cards.
- Fire and Water - Fire and Water
- Earth and Air - 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. See how the audience liked your display with the following rules.
Do not count nullified elements. Do not count nullified elements.
@ -32,14 +40,19 @@ Do not count nullified elements.
- Darkness tries to swallow everything - Darkness tries to swallow everything
- Fire = 2 points for each connection between adjacent fire hexes - Fire = 2 points for each connection between adjacent fire hexes
- Fire grows and burns - 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 - 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 - 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 - 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 - 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! 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. In case of a tie, use the scores for the individual elements, in clockwise order starting from the top.

View File

@ -3,10 +3,10 @@ require 'squib'
element_descs = { element_descs = {
"light" => "3 per cluster", "light" => "3 per cluster",
"dark" => "3 each after first in clusters", "dark" => "3 each after first in clusters",
"fire" => "2 points per connected pair", "fire" => "2 points per connection between hexes",
"water" => "3 times length for straight line of 3+", "water" => "3 points for each in longest path",
"earth" => "4 per triangle cluster", "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 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 format: :png, prefix: 'card_'
save_pdf trim: 37.5, file: 'pnp.pdf' save_pdf trim: 37.5, file: 'pnp.pdf'
save_sheet prefix: "tts_", columns: 3, rows: 6, trim: '0.125in', count_format: ''
end end
Squib::Deck.new(cards: 6, width: '3in', height: '4in') do 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' 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 text x: '0.5in', y: '2.75in', width: '2in', height: '0.5in', str: 'Scoring', align: :center
(0..6).each do |i| syms = %w(light dark fire water earth air)
rect x: inches(0.5) + i * inches(2.0/7.0), y: '3.0in', width: '0.25in', height: '0.25in' (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' rect x: inches(0.5) + i * inches(2.0/7.0), y: '3.25in', width: '0.25in', height: '0.25in'
end end
star x: inches(0.5) + 6 * inches(2.0/7.0) + inches(0.125), y: '3.125in', star x: inches(0.5) + 6 * inches(2.0/7.0) + inches(0.125), y: '3.125in',

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 KiB

4
setlist/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
_output/*.png
_output/*.pdf
~$*
.DS_Store

19
setlist/ABOUT.md Normal file
View File

@ -0,0 +1,19 @@
My Awesome Game
===============
Check out my awesome game!
Objective
---------
Gameplay
--------
Ending the Game
---------------

4
setlist/Gemfile Normal file
View File

@ -0,0 +1,4 @@
source 'https://rubygems.org'
gem 'squib'
gem 'game_icons'

68
setlist/Gemfile.lock Normal file
View 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
View 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
View 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
View 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
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

50
setlist/config.yml Normal file
View 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
View 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,,
1 name volume traits audience effect blurb
2 Crazy Little Thing Called Love f l 2 +2 {A} if the first {l} song in your setlist
3 War Cry f a 2 +1 {A} for each song quieter than this in this time block
4 Opener mp j 0 +3 {A} if the first song in your set
5 Dirge ppp s 0
6 Love Ballad f l 3 +2 {A} if in the first two songs of your setlist
7 Rage Against The Man fff a 2 +1 {A} for each {a} song in this time block
8 Everything Is Awesome mf j 3 +2 {A} if in the last two songs if your setlist
9 Tears in the Rain p s 2 +3 {A} if this is the quietest song in this time block
10 Breakup Song ff la 3 +3 {A} if another band played a {l} song in this time block
11 New Relationship mf lj 2 +4 {A} if there are no {l} song before this in any band's setlist
12 Brokenhearted p ls 3 +1 {A} if the next song in your setlist is a {l} song
13 Mixed Messages ff aj 2 +3 {A} if this is the loudest song in this time block
14 Betrayed f as 2 +3 {A} if this is immediately following a {j} song in your setlist
15 Happy To Be Sad f js 1 +2 {A} for each {s} song already in your setlist
16 Indignant Love f laj 3
17 Unrequited Love mp las 3
18 Butterflies In The Stomach mf ljs 3
19 Rampage fff ajs 3

70
setlist/deck.rb Normal file
View 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

View 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
View File

@ -0,0 +1,11 @@
volume:
x: 90
y: 955
width: 320
height: 50
align: left
audience:
extends: volume
x: += 329
align: right