Sha256: fa769cdbe4c7375983daa0f7d15ddaaaf960ee3cc9e74657ff4fca67501a1244
Contents?: true
Size: 1.52 KB
Versions: 3
Compression:
Stored size: 1.52 KB
Contents
# frozen string_literal: true require 'dry-initializer' require 'dry-struct' require 'spy_alley_application/types/equipment' require 'spy_alley_application/types/game_board' module SpyAlleyApplication module Models class GameBoard < Dry::Struct class EquipmentBought include Dry::Initializer.define -> do option :equipment_cost, default: ->{{password: 1, disguise: 5, codebook: 15, key: 30}}, type: ::Types::Hash.schema( password: ::Types::CoercibleNonnegativeInteger, disguise: ::Types::CoercibleNonnegativeInteger, codebook: ::Types::CoercibleNonnegativeInteger, key: ::Types::CoercibleNonnegativeInteger) end def call(game_board:, equipment_bought:) player = game_board.current_player total_cost = 0 equipment_bought = equipment_bought .map{|equipment| SpyAlleyApplication::Types::Equipment.call(equipment)} equipment_bought.each{|equipment| total_cost += equipment_cost[equipment.type.to_sym]} unaffected_players = game_board.players.reject{|p| p.equal?(player)} player = player.to_h.tap do |p| p[:equipment] = (p[:equipment] + equipment_bought).sort p[:money] = p[:money] - total_cost end players = unaffected_players.push(player).sort_by{|p| p[:seat]} SpyAlleyApplication::Types::GameBoard.call( game_board.to_h.tap{|g| g[:players] = players}) end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems