You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

116 lines
4.1 KiB

require 'forwardable'
require 'pp'
require_relative '../squib'
require_relative 'args/unit_conversion'
require_relative 'card'
require_relative 'conf'
require_relative 'constants'
require_relative 'graphics/hand'
require_relative 'graphics/showcase'
require_relative 'layout_parser'
require_relative 'progress'
# The project module
#
# @api public
module Squib
# The main interface to Squib. Provides a front-end porcelain whereas the Card class interacts with the graphics plumbing.
#
# @api public
class Deck
include Enumerable
extend Forwardable
# Attributes for the width, height (in pixels) and number of cards
# These are expected to be immuatble for the life of Deck
# @api private
attr_reader :width, :height, :cards, :progress_bar
# Delegate these configuration options to the Squib::Conf object
def_delegators :conf, :antialias, :backend, :count_format, :custom_colors, :dir,
:img_dir, :prefix, :text_hint, :typographer
# :nodoc:
# @api private
attr_reader :layout, :conf, :dpi, :font
#
# deck.size is really just @cards.size
def_delegators :cards, :size
# Squib's constructor that sets the immutable properties.
#
# This is the starting point for Squib. In providing a block to the constructor, you have access to all of Deck's instance methods.
# The documented methods in Deck are the ones intended for use by most users.
# If your game requires multiple different sizes or orientations, I recommend using multiple `Squib::Deck`s in your `deck.rb`. You can modify the internals of `Squib::Deck` (e.g. `@cards`), but that's not recommended.
# @example
# require 'squib'
# Squib::Deck.new do
# text str: 'Hello, World!"
# end
#
# @param width [Integer] the width of each card in pixels. Supports unit conversion (e.g. '2.5in').
# @param height [Integer] the height of each card in pixels. Supports unit conversion (e.g. '3.5in').
# @param cards [Integer] the number of cards in the deck
# @param dpi [Integer] the pixels per inch when rendering out to PDF or calculating using inches.
# @param config [String] the file used for global settings of this deck
# @param layout [String, Array] load a YML file of custom layouts. Multiple files are merged sequentially, redefining collisons. See README and sample for details.
# @param block [Block] the main body of the script.
# @api public
def initialize(width: 825, height: 1125, cards: 1, dpi: 300, config: 'config.yml', layout: nil, &block)
@dpi = dpi
@font = DEFAULT_FONT
@cards = []
@conf = Conf.load(config)
@progress_bar = Progress.new(@conf.progress_bars) # FIXME this is evil. Using something different with @ and non-@
show_info(config, layout)
@width = Args::UnitConversion.parse width, dpi
@height = Args::UnitConversion.parse height, dpi
cards.times{ |i| @cards << Squib::Card.new(self, @width, @height, i) }
@layout = LayoutParser.new(dpi).load_layout(layout)
enable_groups_from_env!
if block_given?
instance_eval(&block) # here we go. wheeeee!
end
@cards.each { |c| c.finish! }
end
# Directly accesses the array of cards in the deck
#
# @api private
def [](key)
@cards[key]
end
# Iterates over each card in the deck
#
# @api private
def each(&block)
@cards.each { |card| block.call(card) }
end
# Use Logger to show more detail on the run
# :nodoc:
# @api private
def show_info(config, layout)
Squib::logger.info "Squib v#{Squib::VERSION}"
Squib::logger.info " building #{@cards.size} #{@width}x#{@height} cards"
Squib::logger.info " using #{@backend}"
end
##################
### PUBLIC API ###
##################
require_relative 'api/background'
require_relative 'api/data'
require_relative 'api/groups'
require_relative 'api/image'
require_relative 'api/save'
require_relative 'api/settings'
require_relative 'api/shapes'
require_relative 'api/text'
require_relative 'api/units'
end
end