diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..934d49a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +[*.js] +indent_style = space +indent_size = 2 + +[{package.json,*.yml,*.cjson}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e8c6fdf --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +dist +node_modules +*.json +*.md \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..41dd293 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,21 @@ +{ + "extends": [ + "eslint-config-unjs" + ], + "rules": { + "no-undef": 0, + "unicorn/consistent-destructuring": 0, + "unicorn/no-await-expression-member": 0, + "unicorn/numeric-separators-style": 0, + "no-irregular-whitespace": 0, + "quotes": ["error", "single"], + "indent": ["error", 2], + "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }], + "unused-imports/no-unused-imports": "error", + "no-trailing-spaces": ["error"], + "curly": ["error", "multi"] + }, + "plugins": [ + "unused-imports" + ] +} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..968ff41 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: ci + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + ci: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: corepack enable + - name: Install bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + - name: Install dependencies + run: bun install + - run: bun lint + - run: bun typecheck + - run: bun test + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8dbe853 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +logs diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d7332f8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Steven Schoovaerts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8dda22f --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# BGG API Parser + +## Description + +The goal of this package is to provide a simple way to parse the XML data provided by the [BoardGameGeek API](https://boardgamegeek.com/wiki/page/BGG_XML_API). It takes an opinionated approach to the parsed data, renaming properies and culling properties that are not useful for the majority of use cases. The package was primarily written to support my own private board game collection application, but I hope it can be useful to others as well. + +Feel free to open an issue or pull request if you have any suggestions or find any bugs. \ No newline at end of file diff --git a/build.config.ts b/build.config.ts new file mode 100644 index 0000000..23f101d --- /dev/null +++ b/build.config.ts @@ -0,0 +1,17 @@ +import path, { resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + declaration: true, + rollup: { + emitCJS: true + }, + entries: [ + 'src/index', + ], + alias: { + '@': resolve(path.dirname(fileURLToPath(import.meta.url)), 'src'), + // '@': resolve(__dirname, 'src'), + }, +}); \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000..ddc9fe1 Binary files /dev/null and b/bun.lockb differ diff --git a/node.d.ts b/node.d.ts new file mode 100644 index 0000000..e839ee7 --- /dev/null +++ b/node.d.ts @@ -0,0 +1 @@ +export * from './dist/node' \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..efa2c16 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "shelf-optimizer", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..71dbd81 --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "bgg-api-wrapper", + "version": "1.0.0", + "description": "Parses XML responses from the Boardgamegeek API in an opinionated way.", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "browser": "./dist/index.mjs", + "bun": "./dist/index.mjs", + "deno": "./dist/index.mjs", + "edge-light": "./dist/index.mjs", + "edge-routine": "./dist/index.mjs", + "lagon": "./dist/index.mjs", + "netlify": "./dist/index.mjs", + "react-native": "./dist/index.mjs", + "wintercg": "./dist/index.mjs", + "worker": "./dist/index.mjs", + "workerd": "./dist/index.mjs", + "node": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "default": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + } + }, + "./node": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "node.d.ts" + ], + "scripts": { + "build": "unbuild", + "lint": "eslint --ext .ts .", + "lint:fix": "eslint --fix --ext .ts .", + "prepack": "bun run build", + "play": "bun run playground/index.ts", + "release": "bun test && changelogen --release && npm publish && git push --follow-tags", + "test": "bun run lint && bun test --coverage", + "typecheck": "tsc --noEmit" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "fast-xml-parser": "^4.2.4", + "ofetch": "^1.1.0" + }, + "devDependencies": { + "@types/node": "^20.8.7", + "bun-types": "^1.0.7", + "changelogen": "^0.5.5", + "eslint": "^8.52.0", + "eslint-config-unjs": "^0.2.1", + "eslint-plugin-unused-imports": "^3.0.0", + "typescript": "^5.2.2", + "unbuild": "^2.0.0" + }, + "packageManager": "pnpm@8.6.1" +} diff --git a/playground/index.ts b/playground/index.ts new file mode 100644 index 0000000..70e5a6a --- /dev/null +++ b/playground/index.ts @@ -0,0 +1,9 @@ +import { findGameByIds } from 'src/api/games/find-game-by-id'; + +findGameByIds([18, 19], { + comments: true, + historical: true, + stats: true, +}) +// findGame('stroganov') +// findCollection('vanskillz') \ No newline at end of file diff --git a/src/api/games/collection.ts b/src/api/games/collection.ts new file mode 100644 index 0000000..17c3eff --- /dev/null +++ b/src/api/games/collection.ts @@ -0,0 +1,55 @@ +import { writeFileSync } from 'node:fs' +import { ofetch } from 'ofetch' +import { xmlParser , mergeAttributes } from '../../utils/parser' +import { Collection } from 'src/types/collection' + +interface MergedResult { + items: { + item: MergedResultItem[] + totalitems: number + } +} + +interface MergedResultItem { + id: number + titles: Array<{ + name: string + }>, + yearPublished: number + image: string + thumbnail: string +} + +function parseItem(item: MergedResultItem) { + return { + id: item.id, + title: item.titles[0].name, + yearPublished: item.yearPublished, + image: item.image, + thumbnail: item.thumbnail, + } +} + +export function parseCollection(xmlString: string): Collection { + const resultParsed = xmlParser.parse(xmlString) + const mergedItems: MergedResult = mergeAttributes(resultParsed) + const mergedGames = mergedItems.items.item + const games = mergedGames.map((item: MergedResultItem) => parseItem(item)) + const collection: Collection = { + numberOfGames: mergedItems.items.totalitems, + games, + } + // writeFileSync('logs/collection.json', JSON.stringify(collection, undefined, 2)); + return collection +} + +export async function findCollection(userName: string) { + const searchParams = new URLSearchParams({ + own: '1', + }) + const response = await ofetch( + `https://www.boardgamegeek.com/xmlapi/collection/${userName}?${searchParams}` + ) + writeFileSync('logs/collection.xml', response) + parseCollection(response) +} diff --git a/src/api/games/find-game-by-id.ts b/src/api/games/find-game-by-id.ts new file mode 100644 index 0000000..d2a6cc6 --- /dev/null +++ b/src/api/games/find-game-by-id.ts @@ -0,0 +1,106 @@ +import { writeFileSync } from 'node:fs' +import { ofetch } from 'ofetch' +import { mergeAttributes, parsePoll, xmlParser } from '../../utils/parser.js' +import { renameProperties } from '../../utils/names.js' +import type { Game } from 'src/types/games.js' + +export interface findGameByIdOptions { + comments?: boolean + historical?: boolean + stats?: boolean +} + +/** + * Takes in an XML string from BGG and returns a Game object + * @param xmlResponse The XML response from BGG + * @returns A Game object representing the parsed game. + */ +export function parseFindGameById(xmlString: string) { + const resultParsed = xmlParser.parse(xmlString) + // writeFileSync('logs/find-game-by-id-parsed-xml.json', JSON.stringify(resultParsed, undefined, 2)); + const resultMerged = mergeAttributes(resultParsed) + // writeFileSync('logs/find-game-by-id-merged.json', JSON.stringify(resultMerged, undefined, 2)); + const game = parseFindGameByIdGame(resultMerged.boardgames.boardgame[0]) + // writeFileSync('logs/find-game-by-id.json', JSON.stringify(result, undefined, 2)); + return game +} + +/** + * Takes in an XML string from BGG and returns an array of Game objects + * @param xmlResponse The XML response from BGG + * @returns An array of game objects representing the parsed games. + */ +export function parseFindGameByIds(xmlString: string) { + const resultParsed = xmlParser.parse(xmlString) + // writeFileSync('logs/find-game-by-ids-parsed-xml.json', JSON.stringify(resultParsed, undefined, 2)); + const resultMerged = mergeAttributes(resultParsed) + writeFileSync('logs/find-game-by-ids-merged.json', JSON.stringify(resultMerged, undefined, 2)); + const games = resultMerged.boardgames.boardgame.map( + (game: Record) => parseFindGameByIdGame(game) + ) + writeFileSync('logs/find-game-by-ids.json', JSON.stringify(games, undefined, 2)); + return games +} + +/** + * Parses the parsed XML object of a game retrieved by its ID and returns a Game object. + * @param rawGame The parsed XML object of the game to parse. + * @returns A Game object representing the parsed game. + */ +export function parseFindGameByIdGame(merged: Record): Game { + const parsedPoll = parsePoll(merged.poll) + // writeFileSync('logs/poll.json', JSON.stringify(parsedPoll, undefined, 2)); + delete merged.poll + merged = { + ...merged, + ...parsedPoll, + } + const resultRenamedProperties = renameProperties(merged) + return resultRenamedProperties as Game +} + +/** + * Finds a board game by its ID on BGG. + * @param id The id of the board game to find. + * @param options Additional options for the search + * @param options.comments Whether to include comments in the result. + * @param options.historical Whether to include historical data in the result. + * @param options.stats Whether to include stats in the result. + * @returns A Promise that resolves to the found board game. + */ +export async function findGameById(id: number, options: findGameByIdOptions = {}) { + const searchParams = new URLSearchParams({ + ...(options.comments && { comments: '1' }), + ...(options.historical && { historical: '1' }), + ...(options.stats && { stats: '1' }), + }) + const response = await ofetch( + `https://www.boardgamegeek.com/xmlapi/boardgame/${id}?${searchParams}` + ) + // writeFileSync('logs/find-game-by-id.xml', response); + const result = parseFindGameById(response) + return result +} + +/** + * Find multiple board games by their ID on BGG. + * @param ids The ids of the board games to find. + * @param options Additional options for the search + * @param options.comments Whether to include comments in the result. + * @param options.historical Whether to include historical data in the result. + * @param options.stats Whether to include stats in the result. + * @returns A Promise that resolves to the found board game. + */ +export async function findGameByIds(ids: number[], options: findGameByIdOptions = {}) { + const searchParams = new URLSearchParams({ + ...(options.comments && { comments: '1' }), + ...(options.historical && { historical: '1' }), + ...(options.stats && { stats: '1' }), + }) + const response = await ofetch( + `https://www.boardgamegeek.com/xmlapi/boardgame/${ids.join(',')}?${searchParams}` + ) + writeFileSync('logs/find-game-by-ids.xml', response); + const result = parseFindGameByIds(response) + return result +} \ No newline at end of file diff --git a/src/api/games/search.ts b/src/api/games/search.ts new file mode 100644 index 0000000..ff8462c --- /dev/null +++ b/src/api/games/search.ts @@ -0,0 +1,57 @@ +import { writeFileSync } from 'node:fs' +import { ofetch } from 'ofetch' +import { mergeAttributes, xmlParser } from '../../utils/parser' + +interface GameSearchResult { + id: number + title: string + yearPublished: number +} + +interface MergedResult { + boardgames: { + boardgame?: MergedResultGame[] + } +} + +interface MergedResultGame { + id: number + titles: Array<{ + name: string + primary?: boolean + }>, + yearPublished: number +} + +function parseBoardGame(boardGame: MergedResultGame) { + return { + id: boardGame.id, + title: typeof boardGame.titles[0] === 'string' + ? boardGame.titles[0] + : boardGame.titles[0].name, + yearPublished: boardGame.yearPublished, + } +} + +export function parseSearchGame(xmlString: string): GameSearchResult[] { + const resultParsed = xmlParser.parse(xmlString) + const resultMerged: MergedResult = mergeAttributes(resultParsed) + if (!resultMerged.boardgames.boardgame) + return [] + + writeFileSync('logs/search-merged.json', JSON.stringify(resultMerged, undefined, 2)); + const games = resultMerged.boardgames.boardgame.map( + (boardGame: MergedResultGame) => parseBoardGame(boardGame) + ) + writeFileSync('logs/search.json', JSON.stringify(games, undefined, 2)); + return games +} + +export async function findGame(name: string) { + const searchParams = new URLSearchParams({ + search: name, + }) + const response = await ofetch(`https://www.boardgamegeek.com/xmlapi/search?${searchParams}`) + writeFileSync('logs/search.xml', response); + parseSearchGame(response) +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..824bd99 --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,3 @@ +export { parseFindGameById, parseFindGameByIds } from './games/find-game-by-id.js' +export { parseSearchGame } from './games/search.js' +export { parseCollection } from './games/collection.js' \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7f125f9 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,2 @@ +export * from './api/index.js' +export * from './types/index.js' \ No newline at end of file diff --git a/src/types/collection.ts b/src/types/collection.ts new file mode 100644 index 0000000..19bb0da --- /dev/null +++ b/src/types/collection.ts @@ -0,0 +1,13 @@ + +export interface Collection { + numberOfGames: number + games: CollectionItem[] +} + +export interface CollectionItem { + id: number + title: string, + yearPublished: number + image: string + thumbnail: string +} diff --git a/src/types/games.ts b/src/types/games.ts new file mode 100644 index 0000000..cb0a466 --- /dev/null +++ b/src/types/games.ts @@ -0,0 +1,132 @@ +import { LanguageDependence, SuggestedPlayerAge, SuggestedPlayers } from './poll' + +export interface Title { + title: string + primary?: boolean + sortIndex: number +} + +export interface Publisher { + id: number + name: string +} +export interface Honor { + id: number + name: string +} + +export interface Version { + id: number + name: string +} + +export interface Category { + id: number + name: string +} + +export interface Mechanic { + id: number + name: string +} + +export interface PodcastEpisode { + id: number + title: string +} + +export interface Developer { + id: number + name: string +} + +export interface Family { + id: number + name: string +} + +export interface Artist { + id: number + name: string +} + +export interface Designer { + id: number + name: string +} + +export interface GraphicDesigner { + id: number + name: string +} + +export interface Implementation { + id: number + title: string +} + +export interface Expansion { + id: number + title: string +} + +export interface Accessory { + id: number + name: string +} + +export interface VideoGame { + id: number + title: string +} + +export interface CardSet { + id: number + name: string +} + +export interface SubDomain { + id: number + name: string +} + +export interface GameComment { + comment: string + username: string + rating: number | string +} + +export interface Game { + id: number + yearPublished: number + minPlayers: number + maxPlayers: number + playingTime: number + minPlayTime: number + maxPlayTime: number + age: number + titles: Title[] | string + description: string + thumbnail: string + image: string + publishers: Publisher[] + honors: Honor[] + versions: Version[] + categories: Category[] + mechanics: Mechanic[] + podcastEpisodes: PodcastEpisode[] + families: Family[] + artists: Artist[] + designers: Designer[] + graphicDesigners?: GraphicDesigner[] + implementations?: Implementation[] + expansions?: Expansion[] + accessories?: Accessory[] + videoGames?: VideoGame[] + cardSets?: CardSet[] + subdomains: SubDomain[] + suggestedPlayers?: SuggestedPlayers + languageDependence?: LanguageDependence + suggestedPlayerAge?: SuggestedPlayerAge + comments?: GameComment[] +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..440d8fd --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1 @@ +export type { Game } from './games' \ No newline at end of file diff --git a/src/types/poll.ts b/src/types/poll.ts new file mode 100644 index 0000000..b90d109 --- /dev/null +++ b/src/types/poll.ts @@ -0,0 +1,81 @@ +export type RawSuggestedPlayersResultItem = { + numPlayers: string + result: Array<{ + value: string + numVotes: number + }> +} + +export interface RawLanguageDependenceResultItem { + result: Array<{ + level: number + value: string + numVotes: number + }> +} + +export interface RawSuggestedPlayerAgeResultItem { + result: Array<{ + value: string + numVotes: number + }> +} + +export interface RawSuggestedPlayersResult { + results: RawSuggestedPlayersResultItem[] + name: 'suggested_numplayers' + title: 'User Suggested Number of Players' + totalVotes: number +} +export interface RawLanguageDependenceResult { + results: RawLanguageDependenceResultItem + name: 'language_dependence' + title: 'Language Dependence' + totalVotes: number +} + +export interface RawSuggestedPlayerAgeResult { + results: RawSuggestedPlayerAgeResultItem + name: 'suggested_playerage' + title: 'User Suggested Player Age' + totalVotes: number +} + +export type Poll = [ + RawSuggestedPlayersResult, + RawLanguageDependenceResult, + RawSuggestedPlayerAgeResult +] + +export interface SuggestedPlayersResult { + numPlayers: string + 'best': number + 'recommended': number + 'notRecommended': number +} + +export interface SuggestedPlayers { + totalVotes: number + results: SuggestedPlayersResult[] +} + +export interface LanguageDependenceResult { + level: number + description: string + numVotes: number +} + +export interface LanguageDependence { + totalVotes: number + results: LanguageDependenceResult[] +} + +export type SuggestedPlayerAgeResult = { + age: string, + numVotes: number +} + +export interface SuggestedPlayerAge { + totalVotes: number + results: SuggestedPlayerAgeResult[] +} \ No newline at end of file diff --git a/src/utils/names.ts b/src/utils/names.ts new file mode 100644 index 0000000..cbffe61 --- /dev/null +++ b/src/utils/names.ts @@ -0,0 +1,137 @@ +/** + * A mapping of BGG API property names to their corresponding property names in the application. + */ +const nameMapping: Record = { + objectid: 'id', + yearpublished: 'yearPublished', + minplayers: 'minPlayers', + maxplayers: 'maxPlayers', + playingtime: 'playingTime', + minplaytime: 'minPlayTime', + maxplaytime: 'maxPlayTime', + name: 'titles', + sortindex: 'sortIndex', + boardgamepublisher: 'publishers', + boardgamehonor: 'honors', + boardgameversion: 'versions', + boardgamecategory: 'categories', + boardgamemechanic: 'mechanics', + boardgamepodcastepisode: 'podcastEpisodes', + boardgamedeveloper: 'developers', + boardgamefamily: 'families', + boardgameartist: 'artists', + boardgamedesigner: 'designers', + boardgamegraphicdesigner: 'graphicDesigners', + boardgameimplementation: 'implementations', + boardgameaccessory: 'accessories', + boardgameexpansion: 'expansions', + videogamebg: 'videoGames', + boardgamesubdomain: 'subdomains', + numvotes: 'numVotes', + numplayers: 'numPlayers', + totalvotes: 'totalVotes', + cardset: 'cardSets', + comment: 'comments' +} + +/** + * An array of strings representing the names of properties that should always be returned as an + * array instead of a single key-value pair. + */ +export const alwaysArray = [ + 'boardgame', + 'item', + 'names', + 'titles', + 'publishers', + 'honors', + 'versions', + 'categories', + 'mechanics', + 'podcastEpisodes', + 'developers', + 'families', + 'artists', + 'designers', + 'graphicDesigners', + 'implementations', + 'accessories', + 'videoGames', + 'subdomains', +] + +/** + * Transforms a given BGG attribute name using a predefined mapping object, if available. + * @param name - The name to transform. + * @returns The transformed name, or the original name if no mapping is available. + */ +export function transformName(name: string): string { + return nameMapping[name] || name +} + +/** + * A mapping of property names to their corresponding old and new names. + * Used to rename properties from the BGG API to the names used in the application. + */ +const propertyNameMappings: Record = { + comments: { + oldName: 'name', + newName: 'comment', + }, + titles: { + oldName: 'name', + newName: 'title', + }, + podcastEpisodes: { + oldName: 'name', + newName: 'title', + }, + implementations: { + oldName: 'name', + newName: 'title', + }, + expansions: { + oldName: 'name', + newName: 'title', + }, + videoGames: { + oldName: 'name', + newName: 'title', + } +} + +/** + * A set of property names that should always be returned as an object, even if they only have one value. + */ +const alwaysObject = new Set([ + 'titles' +]) + +/** + * Recursively renames properties of an object or array of objects based on a mapping of old property names to new ones. + * @param obj - The object or array of objects to rename properties for. + * @param parentKey - The parent key of the object being renamed. Only used during recursive operations. + * @returns The object or array of objects with renamed properties. + */ +export function renameProperties(obj: any, parentKey?: string): any { + if (Array.isArray(obj)) + return obj.map((item) => renameProperties(item, parentKey)) + else if (typeof obj === 'object' && obj !== null) { + const newObj: Record = {} + if (parentKey && Object.keys(propertyNameMappings).includes(parentKey)) { + obj[propertyNameMappings[parentKey].newName] = obj[propertyNameMappings[parentKey].oldName] + delete obj[propertyNameMappings[parentKey].oldName] + } + for (const [key, value] of Object.entries(obj)) + newObj[key] = renameProperties(value, key) + + return newObj + } else + if (parentKey && alwaysObject.has(parentKey)) + return { [propertyNameMappings[parentKey].newName]: obj } + else + return obj +} diff --git a/src/utils/parser.ts b/src/utils/parser.ts new file mode 100644 index 0000000..371346e --- /dev/null +++ b/src/utils/parser.ts @@ -0,0 +1,136 @@ +import { XMLParser } from 'fast-xml-parser' +import { alwaysArray, transformName } from './names'; +import type { + LanguageDependence, + Poll, + RawLanguageDependenceResult, + RawSuggestedPlayerAgeResult, + RawSuggestedPlayersResult, + SuggestedPlayerAge, + SuggestedPlayers +} from 'src/types/poll'; + +/** + * An instance of the XMLParser class with customized options for parsing XML + * data coming back from the BGG API. + */ +export const xmlParser = new XMLParser({ + attributesGroupName: 'attributes', + attributeNamePrefix: '', + attributeValueProcessor: (name, val, jPath) => { + if (jPath.includes('poll.results.result') && name === 'value') + return undefined + if (name === 'numplayers') + return undefined + if (name === 'username') + return undefined + return val + }, + ignoreAttributes: false, + ignoreDeclaration: true, + isArray: name => { + if (alwaysArray.includes(name)) + return true + return false + }, + parseAttributeValue: true, + textNodeName: 'name', + transformAttributeName: (attributeName) => transformName(attributeName), + transformTagName: (tagName) => transformName(tagName), + trimValues: true, +}) + +/** + * Transform a parsed XML string so that attributes are merged into the object. + * Also deletes terms of use property. + * @param obj Parsed XML object + * @returns object with attributes properties merged into the object +*/ + +export function mergeAttributes( + obj: Record | Array> +): any { + if (Array.isArray(obj)) + return obj.map(item => mergeAttributes(item)); + else if (typeof obj === 'object' && obj !== null) { + if (obj.attributes?.id) + obj.id = obj.attributes.id + if (obj.termsofuse) + delete obj.termsofuse + if (obj.attributes && + Object.keys(obj.attributes).length < 2 && + obj.attributes.value + ) + return obj.attributes.value + const mergedObj: any = {}; + for (const key in obj) + if (key === 'attributes') + Object.assign(mergedObj, obj[key]) + else + mergedObj[key] = mergeAttributes(obj[key]); + + return mergedObj; + } else + return obj; +} + +/** + * Transform suggested player amount data from a poll into a different format. + * @param result The raw suggested players object from a poll + * @returns Transformed object in the new format +*/ +export function parseSuggestedPlayers(result: RawSuggestedPlayersResult): SuggestedPlayers { + return { + results: result.results.map(item => ({ + numPlayers: item.numPlayers, + best: item.result[0].numVotes, + recommended: item.result[1].numVotes, + notRecommended: item.result[2].numVotes, + })), + totalVotes: result.totalVotes, + } +} + +/** + * Transform language dependency data from a poll into a different format. + * @param result The raw language dependency object from a poll + * @returns Transformed object in the new format +*/ +export function parseLanguageDependence(result: RawLanguageDependenceResult): LanguageDependence { + return { + results: result.results.result.map(item => ({ + level: item.level, + description: item.value, + numVotes: item.numVotes, + })), + totalVotes: result.totalVotes, + } +} + +/** + * Transform player age data from a poll into a different format. + * @param result The raw player age object from a poll + * @returns Transformed object in the new format +*/ +export function parseSuggestedPlayerAge(result: RawSuggestedPlayerAgeResult): SuggestedPlayerAge { + return { + results: result.results.result.map(item => ({ + age: item.value, + numVotes: item.numVotes, + })), + totalVotes: result.totalVotes, + } +} + +/** + * Parse the poll property of an attribute-merged object. + * @param poll The raw poll object. + * @returns Transformed object in the new format, internally calls separate functions to parse data. +*/ +export function parsePoll(poll: Poll) { + return { + suggestedPlayers: parseSuggestedPlayers(poll[0]), + languageDependence: parseLanguageDependence(poll[1]), + suggestedPlayerAge: parseSuggestedPlayerAge(poll[2]), + } +} diff --git a/test/collection.test.ts b/test/collection.test.ts new file mode 100644 index 0000000..9161fae --- /dev/null +++ b/test/collection.test.ts @@ -0,0 +1,43 @@ +import { test, describe, expect } from 'bun:test' +import { XML_SINGLE_GAME, XML_MULTIPLE_GAMES } from './fixtures/collection' +import { parseCollection } from 'src' + +describe('collection parser', () => { + test('correctly parses collection if only one game is inside', () => { + const result = parseCollection(XML_SINGLE_GAME) + expect(result).toEqual({ + numberOfGames: 1, + games: [ + { + id: 173346, + title: '7 Wonders Duel', + yearPublished: 2021, + image: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg', + thumbnail: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg' + }, + ], + }) + }) + test('correctly parses collection of multiple games', () => { + const result = parseCollection(XML_MULTIPLE_GAMES) + expect(result).toEqual({ + numberOfGames: 2, + games: [ + { + id: 173346, + title: '7 Wonders Duel', + yearPublished: 2021, + image: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg', + thumbnail: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg' + }, + { + id: 173346, + title: '7 Wonders Duel', + yearPublished: 2021, + image: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg', + thumbnail: 'https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg' + }, + ], + }) + }) +}) \ No newline at end of file diff --git a/test/find-game-by-id.test.ts b/test/find-game-by-id.test.ts new file mode 100644 index 0000000..ed9432d --- /dev/null +++ b/test/find-game-by-id.test.ts @@ -0,0 +1,10 @@ +import { test, describe, expect } from 'bun:test' +import { XML, GAME_RESULT } from './fixtures/find-game-by-id' +import { parseFindGameById } from 'src' + +describe('find game by id parser', () => { + test('correctly parses a single game found by id', () => { + const result = parseFindGameById(XML) + expect(result).toEqual(GAME_RESULT) + }) +}) \ No newline at end of file diff --git a/test/find-game-by-ids.test.ts b/test/find-game-by-ids.test.ts new file mode 100644 index 0000000..63c455f --- /dev/null +++ b/test/find-game-by-ids.test.ts @@ -0,0 +1,10 @@ +import { test, describe, expect } from 'bun:test' +import { XML, GAME_RESULT } from './fixtures/find-game-by-ids' +import { parseFindGameByIds } from 'src' + +describe('find game by multiple ids parser', () => { + test('correctly parses a multiple games found by id', () => { + const result = parseFindGameByIds(XML) + expect(result).toEqual(GAME_RESULT) + }) +}) \ No newline at end of file diff --git a/test/fixtures/collection.ts b/test/fixtures/collection.ts new file mode 100644 index 0000000..c74635e --- /dev/null +++ b/test/fixtures/collection.ts @@ -0,0 +1,76 @@ +export const XML_SINGLE_GAME = ` + + + +7 Wonders Duel +2021 + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg + + + + + + + + + + +0 + + +` + +export const XML_MULTIPLE_GAMES = ` + + + +7 Wonders Duel +2021 + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg + + + + + + + + + + +0 + + +7 Wonders Duel +2021 + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__original/img/rcsOrUHL8HdYKDt6WNl8rO5ONUQ=/0x0/filters:format(jpeg)/pic6617327.jpg + +https://cf.geekdo-images.com/zdWuX3vm_DziVdTwTQh4mg__thumb/img/EDUqlbAQB_5SrdZDhdndHSwAc0s=/fit-in/200x150/filters:strip_icc()/pic6617327.jpg + + + + + + + + + + +0 + + +` diff --git a/test/fixtures/find-game-by-id.ts b/test/fixtures/find-game-by-id.ts new file mode 100644 index 0000000..5482ecd --- /dev/null +++ b/test/fixtures/find-game-by-id.ts @@ -0,0 +1,1343 @@ +export const XML = ` + + +1994 +2 +8 +120 +45 +120 +12 +Robo Rally +RoboRally +The robots of the Robo Rally automobile factory spend their weekdays toiling at the assembly line. They put in hard hours building high-speed supercars they never get to see in action. But on Saturday nights, the factory becomes a world of mad machines and dangerous schemes as these robots engage in their own epic race.It takes speed, wits, and dirty tricks to become a racing legend! Each player chooses a robot and directs its moves by playing cards. Chaos ensues as all players reveal the cards they've chosen. Players face obstacles like industrial lasers, gaping pits, and moving conveyor belts -- but those can also be used to their advantage! Each player aims to make it to each of the checkpoints in numerical order. The first player to reach all of the checkpoints wins. (source: <a target='_blank' href="http://avalonhill.wizards.com/games/robo-rally/comingsoon" rel="nofollow noreferrer noopener">http://avalonhill.wizards.com/games/robo-rally/comingsoon</a>)<br/><br/>In RoboRally players each control a different robot in a race through a dangerous factory floor. Several goals will be placed on the board and you must navigate your robot to them in a specific order. The boards can be combined in several different ways to accommodate different player counts and races can be as long or as short as player's desire.<br/><br/>In general, players will first fill all of their robot's &quot;registers&quot; with facedown movement cards. This happens simultaneously and there is a time element involved. If you don't act fast enough you are forced to place cards randomly to fill the rest. Then, starting with the first register, everyone reveals their card. The card with the highest number moves first. After everyone resolves their movement they reveal the next card and so on. Examples of movement cards may be to turn 90 degrees left or right, move forward 2 spaces, or move backward 1 space though there are a bigger variety than that. You can plan a perfect route, but if another robot runs into you it can push you off course. This can be disastrous since you can't reprogram any cards to fix it!<br/><br/>Robots fire lasers and factory elements resolve after each movement and robots may become damaged. If they take enough damage certain movement cards become fixed and can no longer be changed. If they take more they may be destroyed entirely. The first robot to claim all the goals in the correct order wins, though some may award points and play tournament style.<br/><br/>The game was reprinted by Avalon Hill (Hasbro/WotC) in 2005.<br/><br/>UPC 742818050029<br/><br/> +https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__thumb/img/J1PlqFqtN-hxuXM4eEi-ekANPP4=/fit-in/200x150/filters:strip_icc()/pic1000553.jpg +https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__original/img/-9I8B82hDOO1n0h9urwZUdz6bqc=/0x0/filters:format(jpeg)/pic1000553.jpg +Wizards of the Coast +1994 Origins Awards Best Fantasy or Science Fiction Boardgame Winner +1994 Origins Awards Best Graphic Presentation of a Boardgame Winner +2005 Årets Spill Best Strategy Game Nominee +999 Games +Action Queue +ADC Blackfire Entertainment +AMIGO +AMIGO German ed (1999) +Avalon Hill +Avalon Hill ed (2005) +Avalon Hill edition 2005 +Avalon Hill edition 2010 +Peter Bergting +BGTG - June 11, 2005 (Mike Mayer and Robo Rally) +BGTG 136 - 100 Great Games, part 3 (with Stephen Glenn and Mark Jackson) +Bias +Bob Carasca +Components: 12 x 12 Grids +Components: Miniatures +Components: Sand Timers +Czech edition +Dutch edition +Ep 39 Real Time +Ep 42 Illustrations with Henning Ludvigsen +Ep 47 Grey Fox Games with Josh Lebkowicz +Episode 10: Cosmic Encounter/Why We Play +Episode 19 - Programmed Action +Episode 33 - Top 50, Picks 20-11 +Phil Foglio +French edition +GameBreak Audio Episode #013 - Domo Arigato, Mister Roboto +Richard Garfield +Daniel Gelon +German edition +Grid Movement +Hasbro +I’ve Been Diced! episode 10: Gateway games +I’ve Been Diced! episode 3: Games that stood the test of time +Jennifer Lathrop +Lose a Turn +Ludology Episode 78 - Here We Are Now, Entertain Us +Maze +Miniatures +MN 0035 Racing Games +Modular Board +OBG 30: Start Your Engines +Play Factory +Polyhedron Collider Cast Episode 2 +Programmed Movement +Race +Racing +Robo Rally +Robo Rally: Master Builder +RoboRally: Armed and Dangerous +RoboRally: Crash and Burn +RoboRally: Grand Prix +RoboRally: King of the Hill +RoboRally: Radioactive +Robot Rally: Board game chaos +Scenario / Mission / Campaign Game +Science Fiction +Simultaneous Action Selection +Paul Sottosanti +Strategy Games +The Good, the Board, and the Producers Episode 168 Publisher Profiles 1 EXPRESS +Thematic Games +Theme: Robots +Theme: Sci-Fi Sports +Franz Vohwinkel +Peter Whitley +Wizards of the Coast 1st (1994) and 2nd (1995) eds +Wizards of the Coast first edition +Wizards of the Coast second edition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[size=12][COLOR=#009900][b]MIKE'S[/b][/COLOR][/size] +Rating after 1 play of a 2 player game. +It was fun. It was chaos. And that with only 2 players. +It took longer than expected, but I loved it. I can see how with a lot of players/a long map it could get frustrating/incredibly long, but I'd still like to give that a go. + +Second game with 7 players. We didn't finish. But it was fun. I realised it probably isn't a good idea to sabotage your robot with a load of red wine. It really doesn't work as well. + +Have played quite a lot now and just really think it is a great fun game. Just played a short, deadly, 6 player game. Only 2 survived. Loads of fun. +Upgraded to a 9. +The game is pretty unique and can be great fun. It's also at risk of becoming long, drawn out & tedious. If you can avoid this then it is recommended. Just be prepared to put up with the odd nightmare game +Starting from 4 players, it is enjoyable. +Mind bending game, the first time you play this, you will mess up royally! +2005 version-St. Johns +A fun and chaotic game. I get a little disappointed when it just boils down to who gets the cards they need and who doesn't. I have gotten too many "all turns" hands to love the game as much as some people do. +a good game to play ,also you can play solo . +Missing some components. Trade to only benefit JVMF. +C:B1 +reviewed on my blog. +B&K +spoken for in BGG.Con Math Trade +Had a really fun experience with this one at Kristen's 21st birthday / end of the semester party. It was just the four of us and a lot of rum, but we had a blast. Somehow I managed to roll straight into a pit my first turn. Can't wait to play some more. + +Session report: Happy Birthday, Squashbot! + +http://www.boardgamegeek.com/article/1471464#1471464 +played +I don't get all the hype. Makes me feel like a mechanical rat in a maze. I don't like games where players can die early and have to watch the other players finish the game. Someone else here says it well, "too long and too light." Plenty of other games I'd play before this one. +The design is a bit dated perhaps, but it is a fun programmed movement game. If you can deal with randomness or chaos. +131224 Its a legitimate classic, lots of fun and chaos, look forward to playing it with the right folks. +The classic programming game of robotic mayhem. +My favorite programming game. You will get messed up by someone else. +Good game to play with my kids to pass the time on weekends. +With the lead minis. +I found this to be a really frustrating slow paced game. There was a couple funny moments when robots died, but it's mostly a slow slow grind. Too much randomness for me. +Controlled/uncontrolled chaos. Great! +Good chaotic fun. I think I'd only ever be willing to play short course though. +unplayed +D1 +I'm drawn to racing games but there are very few good ones. Robo Rally is the best racing game I've played, and a great game in general. Puzzling out the most efficient use of cards while trying to predict where your opponents are going to end up makes for a fun a challenging game. + +There is a learning curve regarding being able to visualize where the cards in your hand will land you on the board. Until you know how to drive your robot it's best if you stick to simple one board tracks. +I am thinking of using this game in a robotics workshop I run for high schoolers, to introduce programming in an informal way. +brendanm, ndru +Used to rate this an 8, fast fast forward about 6 years and I'd rate this a 6. + +Suffers from runaway leader issues. Can outstay it's welcome in game length. +Painted +Pretty standard action programming game, okay if you're into that type of mechanic. Theme is appropriate to the game but nothing special. +I like the programming element, but this game is just to chaotic for me. +If you don't know left from right, you'll hate it. ;) + +Chaotic but fun. Surely not for the serious strategist. The worse you do in your planning, the funnier the game becomes. I suggest to play with just 1 map and not more than 2-3 way-points, otherwise the game will overstay its welcome. +Erik hermans +Great Game! Most requested game to be played at work. Really fun with full 8 players (extremely hectic). +I'm glad to have tried RoboRally, but it really isn't the type of game that interests me. +Missing 2 figures +Learning: +Teaching: +Comment: +5/13/2018 - First play rating, so subject to change. Very entertaining and fun. It does require a certain type of thinking to program the actions effectively, but it's not terribly difficult and the mistakes are hilarious. Also, the bot powers really make things more tricky in interesting ways. I need to play it more to really master the strategy of the game, but I can definitely see why this a classic. I was worried it might not seem very interesting after Mechs vs. Minions, but I was mistaken, it's a very different game and quite special. +Best party game for me, there is always a lot of fun when playing in it +One of the first games I ever owned and I still love it. A classic. +old favourite, but ideally need 4 players +Tolles Spiel für Programmierer, oder die die es mal werden wollen ;-) Programmiert euren Roboter, das er auch richtig den Weg findet, aber vertauscht nicht die Richtung und kollidiert möglichst nicht mit anderen, denn das bringt alles durcheinander. Obwohl dann machts erst Spaß ;-) +Great fun, especially when players are close enough that they influence each other. Occasionally, a player can get off to a fast start (thanks to the luck factor involved) which reduces interactivity, but all of the games I've played have been fairly close at the end, so I'm not sure it's that big of a problem. The game can be extremely frantic, and player elimination can become a problem, so it's probably best to take this game in limited amounts +Second edition WoTC +Played by lo +Have tried the puzzle levels online. Liked those. +But do I only like the puzzle aspect or will I like the game? +It's like Logo (that old kid's computer programming language, remember?), only now your turtle is a killer robot, racing towards the final goal. + +Fun, and easy to get confused due to turns and board interaction (there are things that turn and move you on the board, as well as other robots that can push you around). +A brilliant streamlined system of programming, and a great race game. I loved my first play and can see the huge variety which is present in the multiple boards and options. I imagine AP could set in with some players and slow the game down, but with the right crowd this game is fantastic. +Move, turn, shoot... WATCH OUT!!! +2022-05-08 (rate 5): + +I was interested in the game because I like the mechanic, the theme seemed fine, and [person=14] as the designer attracted me as well. Also, I had the impression this is a well-established classic in its category. + +However, after a few games, I grew skeptical. With a little number of players, the board was too empty. With more players, the moves were too chaotic. While lack of control was an immense impression. + +In the end, I decided there are other games with the mechanics ([boardgamemechanic=2953]) that I like more and got rid of this one. +From Oktoberfest math trade oct 2007 +Wow can someone say CHAOS!! This game can be sooooo frustrating but still fun. +Fun game for the family, but be careful with the setup.. The games can run very long! +I could see this being fun in the right circumstances (ie playing with children), but the level of chaos is bound to frustrate many. +Awesome programming game. Easy to learn, the more people play, the more chaos and fun it will be. +Lovely game in many ways - actually better with more players. Fun-loving, but not terribly strategic. For a good time, it's good. For a good game it's.... feh. My variant now is to play one card at a time. Sure, it's really easy, but it removes the frustration of this game and still maintains the fun at least for me. Feels more strategic too and substantially less chaotic. Sold it. +Some people can direct their robot to the goals with no missteps or confusion. I have infinite respect for those people. My robots bump into walls and lasers, but I still love the chaos. +Brutalmente divertido xD Es una risa y es bastante rápido si juegas con la gente adecuada! jeje Mi segunda partida ganada de forma muy épica tras morir rápidamente 2 veces a principio de partida! :P +I don't know of a game I've laughed harder during than this game. Perhaps maybe Galaxy trucker... Just a FUN game. Gotta expect to be messed up by other players. Can be taught in 10-15 minutes +2009-01-12 +Again, here's a game that is at its best with more players due to the chaotic nature of the game. + +2016-05-24 +Robo Rally is one of those games in which the journey is more important than destination. This is due to the extremely chaotic nature of the game. Your plans are most guaranteed to fail. + +But the magic of the game is in failing. It is like throwing things down into a gorge just to see what happens. For non-serious gamers Robo Rally offers great laughs and fun. +WaffleT +Try the variants! Needs 5+ +Despite the fact that I'm rubbish at this, I did enjoy it a bit and think it is very replayable. A lot of fun and quite a bit of a brain-burner when you get near the fast conveyors and twizzles. +Really enjoy RoboRally and one of the games that got me back into board gaming. Prefer playing on smaller boards to get more interaction and can find large maps just degenerate into a race for the flags with little interaction which is the most fun part of the game. +Traded away because it never hit the table. +One of the few games that gets better with more people. Only play with 4 or more. Great fun. +Can't really give it a good rating as I've only played one game. + +Interesting premise. Several programmer friends of mine love the game, and so a friend of a friend brought it out and we finally got to play it. They said that all programmers love it... but my husband wasn't too thrilled by it. Sure, you "program" your robot, but the entire game is about spacial awareness. I'm great at that... my husband, not so much. + +The game would have gone better if all of us had been allowed to read the rules. Two of the people playing had played it many times before, and three of us (me included) had never played it before. We would have benefited from having more things explained. But that is not a failing of the game, so much as a failing of the people we were playing with... + +That said, my husband and I didn't do too poorly. We were playing the "tag the flag" gametype where we had to go from one flag to another, in order from one to three, and the first bot to reach three would win. Everyone in the game at least made it to the second flag. Some of us got almost to three. And again, would have been better if we had known more of the rules. + +Hopefully next time (if there is a next time) will be better. +I've yet to play this game sober. I'm sure it prove more strategic if I were, but drinking just makes this game fun. Nothing quite like watching your friends twist from side to side in their chair trying to figure out just what the heck their cards are going to do. +?CULL +A good game but one best enjoyed very infrequently; you don't want the novelty to wear off. A few times a year allows you to appreciate the game; any more than that and I'm afraid it would degenerate into tedium.... +Unplayed +Most games are a blast. More players with lots of havoc are the best games. +This reminds me of a cross between the Hannah Barbara racing cartoon and the movie short circuits Johnny 5. It was the game Richard Garfield was pitching without success when he ended up having to fall back on his backup prototype a little game known as mtg. Robo Rally is about a crazy robot race through a series of modular boards with different kinds of obstacles and environmental conditions in order to be the first bot to take flags in each board in sequential order. The catch is you have to program your bots and then execute the actions in order so this leads to all kinds of crazy shenanigans. Especially when you damage other robots and start locking certain commands into their tableu. Robo rally is a good racing game. As far as race games go, I think it is probably one of the better ones. +Please no! +JUGADORES: 5 - 6 +TIEMPO: 20 - 120 + +PARTIDAS GANADAS/PERDIDAS +Alvaro 2/0 +Oca 0/2 +Fina 0/2 +Emilio 0/2 +Alba 0/2 +Navir 0/2 +The theme just throws me off +programming race game +No idea why DarAng does not like RR. I think this is better than M:tG. :P Provided you know what you are doing when you set up the board and plant those flags. +played at least 30 times. I like the style of the game, with lots of planning ahead and complexity. Also, being able to crush others is fun. I not only own that (the original WotC), but I bought it (huge difference!), and I have all extensions. +This game is far from perfect, but I always have such a good time when I play that I have to assume there is more here than the sum of it's parts. I have played both the old and new version, but the one I own is the new one (which, despite a setback in component quality, is worth owning for the suggested course layouts alone) +(Sold to make room on my shelves.) + +A fun game that always gets laughter at the table. Plays better with more players. There's a little bit of a problem with runaway leaders, though. If someone can break away from the pack, they'll have a much easier time for the rest of the game. + +Update: I've had to bump this down to a 6 for my group. The runaway leader is a huge problem with the number of players we are able to bring together. Maybe if we could get more to the table, it would be harder to break away from the pack. +Acquired Jan 10. +Fun but takes far too long. +Game 8 of our 4th 10 x 10 Board Game Challenge +Hardcore grognards may not appreciate it, but if you are in the mood for a light, chaotic racing game, Roborally delivers! +Played 1/2 game. +Party game, but if more than 5 players the match will be long and chaos. +Good, clean fun. Needs a sober head to play well. +Wizard's version infinitely preferable to the new AH one. +This game is like a retarded math excercise. Would rather gouge my eyes out than play it. +Very fun game for those who have good spacial skills. Not so fun for those who don't. I had fun painting the figs. +Great with loads of players +Had fun with this one on its first play, even though I played terribly! Am interested to see how the capture the flag or some of the team variants play. +Extreme nostalgia here. Whatever flaws the game might have I can easily overlook, given how much fun this game has given me over the years. +Madness ^^ +This was my FIRST ONE... + +RoboRally (WotC 2nd Ed) + + RoboRally - Radioactive (WotC Ed) + +*** 2024 NOT PLAYED *** +### 2022-2011 NOT PLAYED ### + + +Sledge pimped our 'bots and they look great! +Own 1994 and 2005 now. + +Mmm...computer programming. Always fun, but I hate shuffling that huge stack every time. Can have serious runaway leader problems if you use more than one board. + + + + + + + +` + +export const GAME_RESULT = { + yearPublished: 1994, + minPlayers: 2, + maxPlayers: 8, + playingTime: 120, + minPlayTime: 45, + maxPlayTime: 120, + age: 12, + titles: [ + { + sortIndex: 1, + title: 'Robo Rally' + }, + { + primary: true, + sortIndex: 1, + title: 'RoboRally' + } + ], + description: 'The robots of the Robo Rally automobile factory spend their weekdays toiling at the assembly line. They put in hard hours building high-speed supercars they never get to see in action. But on Saturday nights, the factory becomes a world of mad machines and dangerous schemes as these robots engage in their own epic race.It takes speed, wits, and dirty tricks to become a racing legend! Each player chooses a robot and directs its moves by playing cards. Chaos ensues as all players reveal the cards they\'ve chosen. Players face obstacles like industrial lasers, gaping pits, and moving conveyor belts -- but those can also be used to their advantage! Each player aims to make it to each of the checkpoints in numerical order. The first player to reach all of the checkpoints wins. (source: http://avalonhill.wizards.com/games/robo-rally/comingsoon)

In RoboRally players each control a different robot in a race through a dangerous factory floor. Several goals will be placed on the board and you must navigate your robot to them in a specific order. The boards can be combined in several different ways to accommodate different player counts and races can be as long or as short as player\'s desire.

In general, players will first fill all of their robot\'s "registers" with facedown movement cards. This happens simultaneously and there is a time element involved. If you don\'t act fast enough you are forced to place cards randomly to fill the rest. Then, starting with the first register, everyone reveals their card. The card with the highest number moves first. After everyone resolves their movement they reveal the next card and so on. Examples of movement cards may be to turn 90 degrees left or right, move forward 2 spaces, or move backward 1 space though there are a bigger variety than that. You can plan a perfect route, but if another robot runs into you it can push you off course. This can be disastrous since you can\'t reprogram any cards to fix it!

Robots fire lasers and factory elements resolve after each movement and robots may become damaged. If they take enough damage certain movement cards become fixed and can no longer be changed. If they take more they may be destroyed entirely. The first robot to claim all the goals in the correct order wins, though some may award points and play tournament style.

The game was reprinted by Avalon Hill (Hasbro/WotC) in 2005.

UPC 742818050029

', + thumbnail: 'https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__thumb/img/J1PlqFqtN-hxuXM4eEi-ekANPP4=/fit-in/200x150/filters:strip_icc()/pic1000553.jpg', + image: 'https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__original/img/-9I8B82hDOO1n0h9urwZUdz6bqc=/0x0/filters:format(jpeg)/pic1000553.jpg', + publishers: [ + { + name: 'Wizards of the Coast', + id: 13 + }, + { + name: '999 Games', + id: 267 + }, + { + name: 'ADC Blackfire Entertainment', + id: 23043 + }, + { + name: 'AMIGO', + id: 8 + }, + { + name: 'Avalon Hill', + id: 4871 + }, + { + name: 'Hasbro', + id: 51 + }, + { + name: 'Play Factory', + id: 7365 + } + ], + honors: [ + { + name: '1994 Origins Awards Best Fantasy or Science Fiction Boardgame Winner', + id: 12956 + }, + { + name: '1994 Origins Awards Best Graphic Presentation of a Boardgame Winner', + id: 12955 + }, + { + name: '2005 Årets Spill Best Strategy Game Nominee', + id: 9286 + } + ], + mechanics: [ + { + name: 'Action Queue', + id: 2689 + }, + { + name: 'Bias', + id: 2957 + }, + { + name: 'Grid Movement', + id: 2676 + }, + { + name: 'Lose a Turn', + id: 2836 + }, + { + name: 'Modular Board', + id: 2011 + }, + { + name: 'Programmed Movement', + id: 2953 + }, + { + name: 'Race', + id: 2876 + }, + { + name: 'Scenario / Mission / Campaign Game', + id: 2822 + }, + { + name: 'Simultaneous Action Selection', + id: 2020 + } + ], + cardSets: [ + { + name: 'AMIGO German ed (1999)', + id: 92597 + }, + { + name: 'Avalon Hill ed (2005)', + id: 92596 + }, + { + name: 'Wizards of the Coast 1st (1994) and 2nd (1995) eds', + id: 92594 + } + ], + versions: [ + { + name: 'Avalon Hill edition 2005', + id: 24196 + }, + { + name: 'Avalon Hill edition 2010', + id: 100127 + }, + { + name: 'Czech edition', + id: 522948 + }, + { + name: 'Dutch edition', + id: 24045 + }, + { + name: 'French edition', + id: 85627 + }, + { + name: 'German edition', + id: 31686 + }, + { + name: 'Wizards of the Coast first edition', + id: 23719 + }, + { + name: 'Wizards of the Coast second edition', + id: 24190 + } + ], + artists: [ + { + name: 'Peter Bergting', + id: 12500 + }, + { + name: 'Bob Carasca', + id: 28513 + }, + { + name: 'Phil Foglio', + id: 616 + }, + { + name: 'Daniel Gelon', + id: 14508 + }, + { + name: 'Jennifer Lathrop', + id: 18431 + }, + { + name: 'Paul Sottosanti', + id: 28512 + }, + { + name: 'Franz Vohwinkel', + id: 11883 + }, + { + name: 'Peter Whitley', + id: 18317 + } + ], + podcastEpisodes: [ + { + id: 86295, + title: 'BGTG - June 11, 2005 (Mike Mayer and Robo Rally)' + }, + { + id: 101144, + title: 'BGTG 136 - 100 Great Games, part 3 (with Stephen Glenn and Mark Jackson)' + }, + { + id: 173150, + title: 'Ep 39 Real Time' + }, + { + id: 174863, + title: 'Ep 42 Illustrations with Henning Ludvigsen' + }, + { + id: 177083, + title: 'Ep 47 Grey Fox Games with Josh Lebkowicz' + }, + { + id: 108270, + title: 'Episode 10: Cosmic Encounter/Why We Play' + }, + { + id: 333109, + title: 'Episode 19 - Programmed Action' + }, + { + id: 176593, + title: 'Episode 33 - Top 50, Picks 20-11' + }, + { + id: 80468, + title: 'GameBreak Audio Episode #013 - Domo Arigato, Mister Roboto' + }, + { + id: 446012, + title: 'I’ve Been Diced! episode 10: Gateway games' + }, + { + id: 446020, + title: 'I’ve Been Diced! episode 3: Games that stood the test of time' + }, + { + id: 116605, + title: 'Ludology Episode 78 - Here We Are Now, Entertain Us' + }, + { + id: 135494, + title: 'MN 0035 Racing Games' + }, + { + id: 5675, + title: 'OBG 30: Start Your Engines' + }, + { + id: 176377, + title: 'Polyhedron Collider Cast Episode 2' + }, + { + id: 244742, + title: 'The Good, the Board, and the Producers Episode 168 Publisher Profiles 1 EXPRESS' + } + ], + families: [ + { + name: 'Components: 12 x 12 Grids', + id: 78568 + }, + { + name: 'Components: Miniatures', + id: 25158 + }, + { + name: 'Components: Sand Timers', + id: 75031 + }, + { + name: 'Theme: Robots', + id: 22232 + }, + { + name: 'Theme: Sci-Fi Sports', + id: 6924 + } + ], + designers: [ + { + name: 'Richard Garfield', + id: 14 + } + ], + categories: [ + { + name: 'Maze', + id: 1059 + }, + { + name: 'Miniatures', + id: 1047 + }, + { + name: 'Racing', + id: 1031 + }, + { + name: 'Science Fiction', + id: 1016 + } + ], + implementations: [ + { + id: 216201, + title: 'Robo Rally' + } + ], + expansions: [ + { + id: 400748, + title: 'Robo Rally: Master Builder' + }, + { + id: 1569, + title: 'RoboRally: Armed and Dangerous' + }, + { + id: 1968, + title: 'RoboRally: Crash and Burn' + }, + { + id: 1967, + title: 'RoboRally: Grand Prix' + }, + { + id: 88354, + title: 'RoboRally: King of the Hill' + }, + { + id: 1966, + title: 'RoboRally: Radioactive' + } + ], + videoGames: [ + { + id: 315736, + title: 'Robot Rally: Board game chaos' + } + ], + subdomains: [ + { + name: 'Strategy Games', + id: 5497 + }, + { + name: 'Thematic Games', + id: 5496 + } + ], + comments: [ + { + username: '1 Family Meeple', + rating: 5, + comment: '[size=12][COLOR=#009900][b]MIKE'S[/b][/COLOR][/size]' + }, + { + username: '1000rpm', + rating: 9, + comment: 'Rating after 1 play of a 2 player game.\nIt was fun. It was chaos. And that with only 2 players.\nIt took longer than expected, but I loved it. I can see how with a lot of players/a long map it could get frustrating/incredibly long, but I'd still like to give that a go.\n\nSecond game with 7 players. We didn't finish. But it was fun. I realised it probably isn't a good idea to sabotage your robot with a load of red wine. It really doesn't work as well.\n\nHave played quite a lot now and just really think it is a great fun game. Just played a short, deadly, 6 player game. Only 2 survived. Loads of fun.\nUpgraded to a 9.' + }, + { + username: '100pcBlade', + rating: 6, + comment: 'The game is pretty unique and can be great fun. It's also at risk of becoming long, drawn out & tedious. If you can avoid this then it is recommended. Just be prepared to put up with the odd nightmare game' + }, + { + username: '1arska', + rating: 7.5, + comment: 'Starting from 4 players, it is enjoyable.' + }, + { + username: '1in36', + rating: 7, + comment: 'Mind bending game, the first time you play this, you will mess up royally!' + }, + { + username: '2d20', + rating: 'N/A', + comment: '2005 version-St. Johns' + }, + { + username: '3dicebombers', + rating: 6, + comment: 'A fun and chaotic game. I get a little disappointed when it just boils down to who gets the cards they need and who doesn't. I have gotten too many "all turns" hands to love the game as much as some people do.' + }, + { + username: '420017', + rating: 6, + comment: 'a good game to play ,also you can play solo .' + }, + { + username: '42Genie', + rating: 'N/A', + comment: 'Missing some components. Trade to only benefit JVMF.' + }, + { + username: '4McTavish', + rating: 10, + comment: 'C:B1' + }, + { + username: '5th Beatles', + rating: 7, + comment: 'reviewed on my blog.' + }, + { + username: '70 Shilling', + rating: 'N/A', + comment: 'B&K' + }, + { + username: 'A Jaded Panda', + rating: 7, + comment: 'spoken for in BGG.Con Math Trade' + }, + { + username: 'A Strange Aeon', + rating: 8, + comment: 'Had a really fun experience with this one at Kristen's 21st birthday / end of the semester party. It was just the four of us and a lot of rum, but we had a blast. Somehow I managed to roll straight into a pit my first turn. Can't wait to play some more. \n\nSession report: Happy Birthday, Squashbot! \n\nhttp://www.boardgamegeek.com/article/1471464#1471464' + }, + { + username: 'a100000001', + rating: 'N/A', + comment: 'played' + }, + { + username: 'a2greg', + rating: 4, + comment: 'I don't get all the hype. Makes me feel like a mechanical rat in a maze. I don't like games where players can die early and have to watch the other players finish the game. Someone else here says it well, "too long and too light." Plenty of other games I'd play before this one.' + }, + { + username: 'AAAlone', + rating: 6, + comment: 'The design is a bit dated perhaps, but it is a fun programmed movement game. If you can deal with randomness or chaos.' + }, + { + username: 'aaarg_ink', + rating: 6, + comment: '131224 Its a legitimate classic, lots of fun and chaos, look forward to playing it with the right folks.' + }, + { + username: 'Aack', + rating: 10, + comment: 'The classic programming game of robotic mayhem.' + }, + { + username: 'aalotr13', + rating: 9, + comment: 'My favorite programming game. You will get messed up by someone else.' + }, + { + username: 'aanemesis', + rating: 7, + comment: 'Good game to play with my kids to pass the time on weekends.' + }, + { + username: 'aardrian', + rating: 7, + comment: 'With the lead minis.' + }, + { + username: 'AaronD', + rating: 2, + comment: 'I found this to be a really frustrating slow paced game. There was a couple funny moments when robots died, but it's mostly a slow slow grind. Too much randomness for me.' + }, + { + username: 'aarondesk', + rating: 7.5, + comment: 'Controlled/uncontrolled chaos. Great!' + }, + { + username: 'aaronseeber', + rating: 8, + comment: 'Good chaotic fun. I think I'd only ever be willing to play short course though.' + }, + { + username: 'abbeynormal', + rating: 'N/A', + comment: 'unplayed' + }, + { + username: 'ABCafe', + rating: 'N/A', + comment: 'D1' + }, + { + username: 'abdiel', + rating: 9, + comment: 'I'm drawn to racing games but there are very few good ones. Robo Rally is the best racing game I've played, and a great game in general. Puzzling out the most efficient use of cards while trying to predict where your opponents are going to end up makes for a fun a challenging game.\n\nThere is a learning curve regarding being able to visualize where the cards in your hand will land you on the board. Until you know how to drive your robot it's best if you stick to simple one board tracks.' + }, + { + username: 'abeille_joyeuse', + rating: 8, + comment: 'I am thinking of using this game in a robotics workshop I run for high schoolers, to introduce programming in an informal way.' + }, + { + username: 'abgg', + rating: 'N/A', + comment: 'brendanm, ndru' + }, + { + username: 'abodi', + rating: 6, + comment: 'Used to rate this an 8, fast fast forward about 6 years and I'd rate this a 6.\n\nSuffers from runaway leader issues. Can outstay it's welcome in game length.' + }, + { + username: 'Abraxox', + rating: 9, + comment: 'Painted' + }, + { + username: 'ABrissey', + rating: 6.5, + comment: 'Pretty standard action programming game, okay if you're into that type of mechanic. Theme is appropriate to the game but nothing special.' + }, + { + username: 'abrocker', + rating: 6, + comment: 'I like the programming element, but this game is just to chaotic for me.' + }, + { + username: 'Abysmul', + rating: 6, + comment: 'If you don't know left from right, you'll hate it. ;)' + }, + { + username: 'abyssal_Tome', + rating: 6.65, + comment: 'Chaotic but fun. Surely not for the serious strategist. The worse you do in your planning, the funnier the game becomes. I suggest to play with just 1 map and not more than 2-3 way-points, otherwise the game will overstay its welcome.' + }, + { + username: 'Aceleci', + rating: 'N/A', + comment: 'Erik hermans' + }, + { + username: 'acellama88', + rating: 10, + comment: 'Great Game! Most requested game to be played at work. Really fun with full 8 players (extremely hectic).' + }, + { + username: 'acetate3', + rating: 5, + comment: 'I'm glad to have tried RoboRally, but it really isn't the type of game that interests me.' + }, + { + username: 'ace_schtevo', + rating: 'N/A', + comment: 'Missing 2 figures' + }, + { + username: 'acharland', + rating: 10, + comment: 'Learning:\nTeaching:\nComment:' + }, + { + username: 'Achire', + rating: 8, + comment: '5/13/2018 - First play rating, so subject to change. Very entertaining and fun. It does require a certain type of thinking to program the actions effectively, but it's not terribly difficult and the mistakes are hilarious. Also, the bot powers really make things more tricky in interesting ways. I need to play it more to really master the strategy of the game, but I can definitely see why this a classic. I was worried it might not seem very interesting after Mechs vs. Minions, but I was mistaken, it's a very different game and quite special.' + }, + { + username: 'aciosek', + rating: 7.75, + comment: 'Best party game for me, there is always a lot of fun when playing in it' + }, + { + username: 'acolyte', + rating: 8, + comment: 'One of the first games I ever owned and I still love it. A classic.' + }, + { + username: 'acooper1004', + rating: 8, + comment: 'old favourite, but ideally need 4 players' + }, + { + username: 'ACTC', + rating: 9, + comment: 'Tolles Spiel für Programmierer, oder die die es mal werden wollen ;-) Programmiert euren Roboter, das er auch richtig den Weg findet, aber vertauscht nicht die Richtung und kollidiert möglichst nicht mit anderen, denn das bringt alles durcheinander. Obwohl dann machts erst Spaß ;-)' + }, + { + username: 'Actherion', + rating: 7, + comment: 'Great fun, especially when players are close enough that they influence each other. Occasionally, a player can get off to a fast start (thanks to the luck factor involved) which reduces interactivity, but all of the games I've played have been fairly close at the end, so I'm not sure it's that big of a problem. The game can be extremely frantic, and player elimination can become a problem, so it's probably best to take this game in limited amounts' + }, + { + username: 'ActionJakson1412', + rating: 'N/A', + comment: 'Second edition WoTC' + }, + { + username: 'ACTP', + rating: 'N/A', + comment: 'Played by lo' + }, + { + username: 'ad79', + rating: 'N/A', + comment: 'Have tried the puzzle levels online. Liked those.\nBut do I only like the puzzle aspect or will I like the game?' + }, + { + username: 'adam.skinner', + rating: 7.5, + comment: 'It's like Logo (that old kid's computer programming language, remember?), only now your turtle is a killer robot, racing towards the final goal.\n\nFun, and easy to get confused due to turns and board interaction (there are things that turn and move you on the board, as well as other robots that can push you around).' + }, + { + username: 'Adam78', + rating: 8, + comment: 'A brilliant streamlined system of programming, and a great race game. I loved my first play and can see the huge variety which is present in the multiple boards and options. I imagine AP could set in with some players and slow the game down, but with the right crowd this game is fantastic.' + }, + { + username: 'adamb2k9', + rating: 9, + comment: 'Move, turn, shoot... WATCH OUT!!!' + }, + { + username: 'adambadura', + rating: 5, + comment: '2022-05-08 (rate 5):\n\nI was interested in the game because I like the mechanic, the theme seemed fine, and [person=14] as the designer attracted me as well. Also, I had the impression this is a well-established classic in its category.\n\nHowever, after a few games, I grew skeptical. With a little number of players, the board was too empty. With more players, the moves were too chaotic. While lack of control was an immense impression.\n\nIn the end, I decided there are other games with the mechanics ([boardgamemechanic=2953]) that I like more and got rid of this one.' + }, + { + username: 'adamdynris', + rating: 7.5, + comment: 'From Oktoberfest math trade oct 2007' + }, + { + username: 'adamhess89', + rating: 8, + comment: 'Wow can someone say CHAOS!! This game can be sooooo frustrating but still fun.' + }, + { + username: 'Adamino', + rating: 7, + comment: 'Fun game for the family, but be careful with the setup.. The games can run very long!' + }, + { + username: 'adamscott', + rating: 6, + comment: 'I could see this being fun in the right circumstances (ie playing with children), but the level of chaos is bound to frustrate many.' + }, + { + username: 'adamtaylorhouston', + rating: 9, + comment: 'Awesome programming game. Easy to learn, the more people play, the more chaos and fun it will be.' + }, + { + username: 'adamw', + rating: 6, + comment: 'Lovely game in many ways - actually better with more players. Fun-loving, but not terribly strategic. For a good time, it's good. For a good game it's.... feh. My variant now is to play one card at a time. Sure, it's really easy, but it removes the frustration of this game and still maintains the fun at least for me. Feels more strategic too and substantially less chaotic. Sold it.' + }, + { + username: 'adamxt', + rating: 6, + comment: 'Some people can direct their robot to the goals with no missteps or confusion. I have infinite respect for those people. My robots bump into walls and lasers, but I still love the chaos.' + }, + { + username: 'Adanedhel', + rating: 8.6, + comment: 'Brutalmente divertido xD Es una risa y es bastante rápido si juegas con la gente adecuada! jeje Mi segunda partida ganada de forma muy épica tras morir rápidamente 2 veces a principio de partida! :P' + }, + { + username: 'addamaniac', + rating: 9, + comment: 'I don't know of a game I've laughed harder during than this game. Perhaps maybe Galaxy trucker... Just a FUN game. Gotta expect to be messed up by other players. Can be taught in 10-15 minutes' + }, + { + username: 'adebisi', + rating: 6, + comment: '2009-01-12\nAgain, here's a game that is at its best with more players due to the chaotic nature of the game.\n\n2016-05-24\nRobo Rally is one of those games in which the journey is more important than destination. This is due to the extremely chaotic nature of the game. Your plans are most guaranteed to fail.\n\nBut the magic of the game is in failing. It is like throwing things down into a gorge just to see what happens. For non-serious gamers Robo Rally offers great laughs and fun.' + }, + { + username: 'AdelaideLN', + rating: 'N/A', + comment: 'WaffleT' + }, + { + username: 'Adesazz', + rating: 'N/A', + comment: 'Try the variants! Needs 5+' + }, + { + username: 'Admiral Fisher', + rating: 5, + comment: 'Despite the fact that I'm rubbish at this, I did enjoy it a bit and think it is very replayable. A lot of fun and quite a bit of a brain-burner when you get near the fast conveyors and twizzles.' + }, + { + username: 'AdmiralGT', + rating: 9, + comment: 'Really enjoy RoboRally and one of the games that got me back into board gaming. Prefer playing on smaller boards to get more interaction and can find large maps just degenerate into a race for the flags with little interaction which is the most fun part of the game.' + }, + { + username: 'Adria', + rating: 8, + comment: 'Traded away because it never hit the table.' + }, + { + username: 'Adrian Hill', + rating: 7.5, + comment: 'One of the few games that gets better with more people. Only play with 4 or more. Great fun.' + }, + { + username: 'adularia25', + rating: 6, + comment: 'Can't really give it a good rating as I've only played one game. \n\nInteresting premise. Several programmer friends of mine love the game, and so a friend of a friend brought it out and we finally got to play it. They said that all programmers love it... but my husband wasn't too thrilled by it. Sure, you "program" your robot, but the entire game is about spacial awareness. I'm great at that... my husband, not so much. \n\nThe game would have gone better if all of us had been allowed to read the rules. Two of the people playing had played it many times before, and three of us (me included) had never played it before. We would have benefited from having more things explained. But that is not a failing of the game, so much as a failing of the people we were playing with...\n\nThat said, my husband and I didn't do too poorly. We were playing the "tag the flag" gametype where we had to go from one flag to another, in order from one to three, and the first bot to reach three would win. Everyone in the game at least made it to the second flag. Some of us got almost to three. And again, would have been better if we had known more of the rules.\n\nHopefully next time (if there is a next time) will be better.' + }, + { + username: 'Advocator', + rating: 7, + comment: 'I've yet to play this game sober. I'm sure it prove more strategic if I were, but drinking just makes this game fun. Nothing quite like watching your friends twist from side to side in their chair trying to figure out just what the heck their cards are going to do.' + }, + { + username: 'aerial7', + rating: 7.5, + comment: '?CULL\nA good game but one best enjoyed very infrequently; you don't want the novelty to wear off. A few times a year allows you to appreciate the game; any more than that and I'm afraid it would degenerate into tedium....' + }, + { + username: 'Aerothorn', + rating: 'N/A', + comment: 'Unplayed' + }, + { + username: 'aetwitch', + rating: 6, + comment: 'Most games are a blast. More players with lots of havoc are the best games.' + }, + { + username: 'AFABBI', + rating: 5, + comment: 'This reminds me of a cross between the Hannah Barbara racing cartoon and the movie short circuits Johnny 5. It was the game Richard Garfield was pitching without success when he ended up having to fall back on his backup prototype a little game known as mtg. Robo Rally is about a crazy robot race through a series of modular boards with different kinds of obstacles and environmental conditions in order to be the first bot to take flags in each board in sequential order. The catch is you have to program your bots and then execute the actions in order so this leads to all kinds of crazy shenanigans. Especially when you damage other robots and start locking certain commands into their tableu. Robo rally is a good racing game. As far as race games go, I think it is probably one of the better ones.' + }, + { + username: 'afafard', + rating: 3, + comment: 'Please no!' + }, + { + username: 'AfarOca', + rating: 6, + comment: 'JUGADORES: 5 - 6\nTIEMPO: 20 - 120\n\nPARTIDAS GANADAS/PERDIDAS \nAlvaro 2/0\nOca 0/2\nFina 0/2\nEmilio 0/2\nAlba 0/2\nNavir 0/2' + }, + { + username: 'afcgamer3', + rating: 2, + comment: 'The theme just throws me off' + }, + { + username: 'Aftonkatt', + rating: 6, + comment: 'programming race game' + }, + { + username: 'Againsto', + rating: 9, + comment: 'No idea why DarAng does not like RR. I think this is better than M:tG. :P Provided you know what you are doing when you set up the board and plant those flags.' + }, + { + username: 'Aganju', + rating: 7.4, + comment: 'played at least 30 times. I like the style of the game, with lots of planning ahead and complexity. Also, being able to crush others is fun. I not only own that (the original WotC), but I bought it (huge difference!), and I have all extensions.' + }, + { + username: 'agent easy', + rating: 7, + comment: 'This game is far from perfect, but I always have such a good time when I play that I have to assume there is more here than the sum of it's parts. I have played both the old and new version, but the one I own is the new one (which, despite a setback in component quality, is worth owning for the suggested course layouts alone)' + }, + { + username: 'AgentOddball', + rating: 6, + comment: '(Sold to make room on my shelves.)\n\nA fun game that always gets laughter at the table. Plays better with more players. There's a little bit of a problem with runaway leaders, though. If someone can break away from the pack, they'll have a much easier time for the rest of the game.\n\nUpdate: I've had to bump this down to a 6 for my group. The runaway leader is a huge problem with the number of players we are able to bring together. Maybe if we could get more to the table, it would be harder to break away from the pack.' + }, + { + username: 'Aging One', + rating: 'N/A', + comment: 'Acquired Jan 10.' + }, + { + username: 'agius1520', + rating: 6, + comment: 'Fun but takes far too long.' + }, + { + username: 'agiusti3', + rating: 8, + comment: 'Game 8 of our 4th 10 x 10 Board Game Challenge' + }, + { + username: 'Aglar', + rating: 8.5, + comment: 'Hardcore grognards may not appreciate it, but if you are in the mood for a light, chaotic racing game, Roborally delivers!' + }, + { + username: 'Agrajag', + rating: 6, + comment: 'Played 1/2 game.' + }, + { + username: 'ah3Dog', + rating: 6, + comment: 'Party game, but if more than 5 players the match will be long and chaos.' + }, + { + username: 'Ahiksking', + rating: 7.5, + comment: 'Good, clean fun. Needs a sober head to play well.\nWizard's version infinitely preferable to the new AH one.' + }, + { + username: 'AHShole', + rating: 2, + comment: 'This game is like a retarded math excercise. Would rather gouge my eyes out than play it.' + }, + { + username: 'ahtitan', + rating: 7, + comment: 'Very fun game for those who have good spacial skills. Not so fun for those who don't. I had fun painting the figs.' + }, + { + username: 'ahudston', + rating: 7, + comment: 'Great with loads of players' + }, + { + username: 'ahwood23', + rating: 7.5, + comment: 'Had fun with this one on its first play, even though I played terribly! Am interested to see how the capture the flag or some of the team variants play.' + }, + { + username: 'Ah_Pook', + rating: 10, + comment: 'Extreme nostalgia here. Whatever flaws the game might have I can easily overlook, given how much fun this game has given me over the years.' + }, + { + username: 'Aiko Akemi', + rating: 7.6, + comment: 'Madness ^^' + }, + { + username: 'Aingeru', + rating: 8.5, + comment: 'This was my FIRST ONE...\n\nRoboRally (WotC 2nd Ed)\n + RoboRally - Radioactive (WotC Ed)\n\n*** 2024 NOT PLAYED ***\n### 2022-2011 NOT PLAYED ###' + }, + { + username: 'airydisk', + rating: 6.9, + comment: 'Sledge pimped our 'bots and they look great!' + }, + { + username: 'Ajax', + rating: 8, + comment: 'Own 1994 and 2005 now.\n\nMmm...computer programming. Always fun, but I hate shuffling that huge stack every time. Can have serious runaway leader problems if you use more than one board.' + } + ], + id: 18, + suggestedPlayers: { + results: [ + { + numPlayers: '1', + best: 0, + recommended: 5, + notRecommended: 189 + }, + { + numPlayers: '2', + best: 7, + recommended: 66, + notRecommended: 162 + }, + { + numPlayers: '3', + best: 18, + recommended: 155, + notRecommended: 64 + }, + { + numPlayers: '4', + best: 103, + recommended: 135, + notRecommended: 13 + }, + { + numPlayers: '5', + best: 163, + recommended: 83, + notRecommended: 10 + }, + { + numPlayers: '6', + best: 163, + recommended: 74, + notRecommended: 12 + }, + { + numPlayers: '7', + best: 64, + recommended: 120, + notRecommended: 45 + }, + { + numPlayers: '8', + best: 56, + recommended: 120, + notRecommended: 51 + }, + { + numPlayers: '8+', + best: 7, + recommended: 17, + notRecommended: 130 + } + ], + totalVotes: 295 + }, + languageDependence: { + results: [ + { + level: 1, + description: 'No necessary in-game text', + numVotes: 7 + }, + { + level: 2, + description: 'Some necessary text - easily memorized or small crib sheet', + numVotes: 22 + }, + { + level: 3, + description: 'Moderate in-game text - needs crib sheet or paste ups', + numVotes: 50 + }, + { + level: 4, + description: 'Extensive use of text - massive conversion needed to be playable', + numVotes: 1 + }, + { + level: 5, + description: 'Unplayable in another language', + numVotes: 0 + } + ], + totalVotes: 80 + }, + suggestedPlayerAge: { + results: [ + { + age: '2', + numVotes: 0 + }, + { + age: '3', + numVotes: 0 + }, + { + age: '4', + numVotes: 0 + }, + { + age: '5', + numVotes: 0 + }, + { + age: '6', + numVotes: 3 + }, + { + age: '8', + numVotes: 23 + }, + { + age: '10', + numVotes: 36 + }, + { + age: '12', + numVotes: 20 + }, + { + age: '14', + numVotes: 4 + }, + { + age: '16', + numVotes: 0 + }, + { + age: '18', + numVotes: 0 + }, + { + age: '21 and up', + numVotes: 0 + } + ], + totalVotes: 86 + } +} \ No newline at end of file diff --git a/test/fixtures/find-game-by-ids.ts b/test/fixtures/find-game-by-ids.ts new file mode 100644 index 0000000..e97b7cf --- /dev/null +++ b/test/fixtures/find-game-by-ids.ts @@ -0,0 +1,2371 @@ +export const XML = ` + + +1994 +2 +8 +120 +45 +120 +12 + +Robo Rally +RoboRally + +The robots of the Robo Rally automobile factory spend their weekdays toiling at the assembly line. They put in hard hours building high-speed supercars they never get to see in action. But on Saturday nights, the factory becomes a world of mad machines and dangerous schemes as these robots engage in their own epic race.It takes speed, wits, and dirty tricks to become a racing legend! Each player chooses a robot and directs its moves by playing cards. Chaos ensues as all players reveal the cards they've chosen. Players face obstacles like industrial lasers, gaping pits, and moving conveyor belts -- but those can also be used to their advantage! Each player aims to make it to each of the checkpoints in numerical order. The first player to reach all of the checkpoints wins. (source: <a target='_blank' href="http://avalonhill.wizards.com/games/robo-rally/comingsoon" rel="nofollow noreferrer noopener">http://avalonhill.wizards.com/games/robo-rally/comingsoon</a>)<br/><br/>In RoboRally players each control a different robot in a race through a dangerous factory floor. Several goals will be placed on the board and you must navigate your robot to them in a specific order. The boards can be combined in several different ways to accommodate different player counts and races can be as long or as short as player's desire.<br/><br/>In general, players will first fill all of their robot's &quot;registers&quot; with facedown movement cards. This happens simultaneously and there is a time element involved. If you don't act fast enough you are forced to place cards randomly to fill the rest. Then, starting with the first register, everyone reveals their card. The card with the highest number moves first. After everyone resolves their movement they reveal the next card and so on. Examples of movement cards may be to turn 90 degrees left or right, move forward 2 spaces, or move backward 1 space though there are a bigger variety than that. You can plan a perfect route, but if another robot runs into you it can push you off course. This can be disastrous since you can't reprogram any cards to fix it!<br/><br/>Robots fire lasers and factory elements resolve after each movement and robots may become damaged. If they take enough damage certain movement cards become fixed and can no longer be changed. If they take more they may be destroyed entirely. The first robot to claim all the goals in the correct order wins, though some may award points and play tournament style.<br/><br/>The game was reprinted by Avalon Hill (Hasbro/WotC) in 2005.<br/><br/>UPC 742818050029<br/><br/> + +https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__thumb/img/J1PlqFqtN-hxuXM4eEi-ekANPP4=/fit-in/200x150/filters:strip_icc()/pic1000553.jpg +https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__original/img/-9I8B82hDOO1n0h9urwZUdz6bqc=/0x0/filters:format(jpeg)/pic1000553.jpg + +Wizards of the Coast +1994 Origins Awards Best Fantasy or Science Fiction Boardgame Winner +1994 Origins Awards Best Graphic Presentation of a Boardgame Winner +2005 Årets Spill Best Strategy Game Nominee +999 Games +Action Queue +ADC Blackfire Entertainment +AMIGO +AMIGO German ed (1999) +Avalon Hill +Avalon Hill ed (2005) +Avalon Hill edition 2005 +Avalon Hill edition 2010 +Peter Bergting +BGTG - June 11, 2005 (Mike Mayer and Robo Rally) +BGTG 136 - 100 Great Games, part 3 (with Stephen Glenn and Mark Jackson) +Bias +Bob Carasca +Components: 12 x 12 Grids +Components: Miniatures +Components: Sand Timers +Czech edition +Dutch edition +Ep 39 Real Time +Ep 42 Illustrations with Henning Ludvigsen +Ep 47 Grey Fox Games with Josh Lebkowicz +Episode 10: Cosmic Encounter/Why We Play +Episode 19 - Programmed Action +Episode 33 - Top 50, Picks 20-11 +Phil Foglio +French edition +GameBreak Audio Episode #013 - Domo Arigato, Mister Roboto +Richard Garfield +Daniel Gelon +German edition +Grid Movement +Hasbro +I’ve Been Diced! episode 10: Gateway games +I’ve Been Diced! episode 3: Games that stood the test of time +Jennifer Lathrop +Lose a Turn +Ludology Episode 78 - Here We Are Now, Entertain Us +Maze +Miniatures +MN 0035 Racing Games +Modular Board +OBG 30: Start Your Engines +Play Factory +Polyhedron Collider Cast Episode 2 +Programmed Movement +Race +Racing +Robo Rally +Robo Rally: Master Builder +RoboRally: Armed and Dangerous +RoboRally: Crash and Burn +RoboRally: Grand Prix +RoboRally: King of the Hill +RoboRally: Radioactive +Robot Rally: Board game chaos +Scenario / Mission / Campaign Game +Science Fiction +Simultaneous Action Selection +Paul Sottosanti +Strategy Games +The Good, the Board, and the Producers Episode 168 Publisher Profiles 1 EXPRESS +Thematic Games +Theme: Robots +Theme: Sci-Fi Sports +Franz Vohwinkel +Peter Whitley +Wizards of the Coast 1st (1994) and 2nd (1995) eds +Wizards of the Coast first edition +Wizards of the Coast second edition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[size=12][COLOR=#009900][b]MIKE'S[/b][/COLOR][/size] +Rating after 1 play of a 2 player game. +It was fun. It was chaos. And that with only 2 players. +It took longer than expected, but I loved it. I can see how with a lot of players/a long map it could get frustrating/incredibly long, but I'd still like to give that a go. + +Second game with 7 players. We didn't finish. But it was fun. I realised it probably isn't a good idea to sabotage your robot with a load of red wine. It really doesn't work as well. + +Have played quite a lot now and just really think it is a great fun game. Just played a short, deadly, 6 player game. Only 2 survived. Loads of fun. +Upgraded to a 9. +The game is pretty unique and can be great fun. It's also at risk of becoming long, drawn out & tedious. If you can avoid this then it is recommended. Just be prepared to put up with the odd nightmare game +Starting from 4 players, it is enjoyable. +Mind bending game, the first time you play this, you will mess up royally! +2005 version-St. Johns +A fun and chaotic game. I get a little disappointed when it just boils down to who gets the cards they need and who doesn't. I have gotten too many "all turns" hands to love the game as much as some people do. +a good game to play ,also you can play solo . +Missing some components. Trade to only benefit JVMF. +C:B1 +reviewed on my blog. +B&K +spoken for in BGG.Con Math Trade +Had a really fun experience with this one at Kristen's 21st birthday / end of the semester party. It was just the four of us and a lot of rum, but we had a blast. Somehow I managed to roll straight into a pit my first turn. Can't wait to play some more. + +Session report: Happy Birthday, Squashbot! + +http://www.boardgamegeek.com/article/1471464#1471464 +played +I don't get all the hype. Makes me feel like a mechanical rat in a maze. I don't like games where players can die early and have to watch the other players finish the game. Someone else here says it well, "too long and too light." Plenty of other games I'd play before this one. +The design is a bit dated perhaps, but it is a fun programmed movement game. If you can deal with randomness or chaos. +131224 Its a legitimate classic, lots of fun and chaos, look forward to playing it with the right folks. +The classic programming game of robotic mayhem. +My favorite programming game. You will get messed up by someone else. +Good game to play with my kids to pass the time on weekends. +With the lead minis. +I found this to be a really frustrating slow paced game. There was a couple funny moments when robots died, but it's mostly a slow slow grind. Too much randomness for me. +Controlled/uncontrolled chaos. Great! +Good chaotic fun. I think I'd only ever be willing to play short course though. +unplayed +D1 +I'm drawn to racing games but there are very few good ones. Robo Rally is the best racing game I've played, and a great game in general. Puzzling out the most efficient use of cards while trying to predict where your opponents are going to end up makes for a fun a challenging game. + +There is a learning curve regarding being able to visualize where the cards in your hand will land you on the board. Until you know how to drive your robot it's best if you stick to simple one board tracks. +I am thinking of using this game in a robotics workshop I run for high schoolers, to introduce programming in an informal way. +brendanm, ndru +Used to rate this an 8, fast fast forward about 6 years and I'd rate this a 6. + +Suffers from runaway leader issues. Can outstay it's welcome in game length. +Painted +Pretty standard action programming game, okay if you're into that type of mechanic. Theme is appropriate to the game but nothing special. +I like the programming element, but this game is just to chaotic for me. +If you don't know left from right, you'll hate it. ;) + +Chaotic but fun. Surely not for the serious strategist. The worse you do in your planning, the funnier the game becomes. I suggest to play with just 1 map and not more than 2-3 way-points, otherwise the game will overstay its welcome. +Erik hermans +Great Game! Most requested game to be played at work. Really fun with full 8 players (extremely hectic). +I'm glad to have tried RoboRally, but it really isn't the type of game that interests me. +Missing 2 figures +Learning: +Teaching: +Comment: +5/13/2018 - First play rating, so subject to change. Very entertaining and fun. It does require a certain type of thinking to program the actions effectively, but it's not terribly difficult and the mistakes are hilarious. Also, the bot powers really make things more tricky in interesting ways. I need to play it more to really master the strategy of the game, but I can definitely see why this a classic. I was worried it might not seem very interesting after Mechs vs. Minions, but I was mistaken, it's a very different game and quite special. +Best party game for me, there is always a lot of fun when playing in it +One of the first games I ever owned and I still love it. A classic. +old favourite, but ideally need 4 players +Tolles Spiel für Programmierer, oder die die es mal werden wollen ;-) Programmiert euren Roboter, das er auch richtig den Weg findet, aber vertauscht nicht die Richtung und kollidiert möglichst nicht mit anderen, denn das bringt alles durcheinander. Obwohl dann machts erst Spaß ;-) +Great fun, especially when players are close enough that they influence each other. Occasionally, a player can get off to a fast start (thanks to the luck factor involved) which reduces interactivity, but all of the games I've played have been fairly close at the end, so I'm not sure it's that big of a problem. The game can be extremely frantic, and player elimination can become a problem, so it's probably best to take this game in limited amounts +Second edition WoTC +Played by lo +Have tried the puzzle levels online. Liked those. +But do I only like the puzzle aspect or will I like the game? +It's like Logo (that old kid's computer programming language, remember?), only now your turtle is a killer robot, racing towards the final goal. + +Fun, and easy to get confused due to turns and board interaction (there are things that turn and move you on the board, as well as other robots that can push you around). +A brilliant streamlined system of programming, and a great race game. I loved my first play and can see the huge variety which is present in the multiple boards and options. I imagine AP could set in with some players and slow the game down, but with the right crowd this game is fantastic. +Move, turn, shoot... WATCH OUT!!! +2022-05-08 (rate 5): + +I was interested in the game because I like the mechanic, the theme seemed fine, and [person=14] as the designer attracted me as well. Also, I had the impression this is a well-established classic in its category. + +However, after a few games, I grew skeptical. With a little number of players, the board was too empty. With more players, the moves were too chaotic. While lack of control was an immense impression. + +In the end, I decided there are other games with the mechanics ([boardgamemechanic=2953]) that I like more and got rid of this one. +From Oktoberfest math trade oct 2007 +Wow can someone say CHAOS!! This game can be sooooo frustrating but still fun. +Fun game for the family, but be careful with the setup.. The games can run very long! +I could see this being fun in the right circumstances (ie playing with children), but the level of chaos is bound to frustrate many. +Awesome programming game. Easy to learn, the more people play, the more chaos and fun it will be. +Lovely game in many ways - actually better with more players. Fun-loving, but not terribly strategic. For a good time, it's good. For a good game it's.... feh. My variant now is to play one card at a time. Sure, it's really easy, but it removes the frustration of this game and still maintains the fun at least for me. Feels more strategic too and substantially less chaotic. Sold it. +Some people can direct their robot to the goals with no missteps or confusion. I have infinite respect for those people. My robots bump into walls and lasers, but I still love the chaos. +Brutalmente divertido xD Es una risa y es bastante rápido si juegas con la gente adecuada! jeje Mi segunda partida ganada de forma muy épica tras morir rápidamente 2 veces a principio de partida! :P +I don't know of a game I've laughed harder during than this game. Perhaps maybe Galaxy trucker... Just a FUN game. Gotta expect to be messed up by other players. Can be taught in 10-15 minutes +2009-01-12 +Again, here's a game that is at its best with more players due to the chaotic nature of the game. + +2016-05-24 +Robo Rally is one of those games in which the journey is more important than destination. This is due to the extremely chaotic nature of the game. Your plans are most guaranteed to fail. + +But the magic of the game is in failing. It is like throwing things down into a gorge just to see what happens. For non-serious gamers Robo Rally offers great laughs and fun. +WaffleT +Try the variants! Needs 5+ +Despite the fact that I'm rubbish at this, I did enjoy it a bit and think it is very replayable. A lot of fun and quite a bit of a brain-burner when you get near the fast conveyors and twizzles. +Really enjoy RoboRally and one of the games that got me back into board gaming. Prefer playing on smaller boards to get more interaction and can find large maps just degenerate into a race for the flags with little interaction which is the most fun part of the game. +Traded away because it never hit the table. +One of the few games that gets better with more people. Only play with 4 or more. Great fun. +Can't really give it a good rating as I've only played one game. + +Interesting premise. Several programmer friends of mine love the game, and so a friend of a friend brought it out and we finally got to play it. They said that all programmers love it... but my husband wasn't too thrilled by it. Sure, you "program" your robot, but the entire game is about spacial awareness. I'm great at that... my husband, not so much. + +The game would have gone better if all of us had been allowed to read the rules. Two of the people playing had played it many times before, and three of us (me included) had never played it before. We would have benefited from having more things explained. But that is not a failing of the game, so much as a failing of the people we were playing with... + +That said, my husband and I didn't do too poorly. We were playing the "tag the flag" gametype where we had to go from one flag to another, in order from one to three, and the first bot to reach three would win. Everyone in the game at least made it to the second flag. Some of us got almost to three. And again, would have been better if we had known more of the rules. + +Hopefully next time (if there is a next time) will be better. +I've yet to play this game sober. I'm sure it prove more strategic if I were, but drinking just makes this game fun. Nothing quite like watching your friends twist from side to side in their chair trying to figure out just what the heck their cards are going to do. +?CULL +A good game but one best enjoyed very infrequently; you don't want the novelty to wear off. A few times a year allows you to appreciate the game; any more than that and I'm afraid it would degenerate into tedium.... +Unplayed +Most games are a blast. More players with lots of havoc are the best games. +This reminds me of a cross between the Hannah Barbara racing cartoon and the movie short circuits Johnny 5. It was the game Richard Garfield was pitching without success when he ended up having to fall back on his backup prototype a little game known as mtg. Robo Rally is about a crazy robot race through a series of modular boards with different kinds of obstacles and environmental conditions in order to be the first bot to take flags in each board in sequential order. The catch is you have to program your bots and then execute the actions in order so this leads to all kinds of crazy shenanigans. Especially when you damage other robots and start locking certain commands into their tableu. Robo rally is a good racing game. As far as race games go, I think it is probably one of the better ones. +Please no! +JUGADORES: 5 - 6 +TIEMPO: 20 - 120 + +PARTIDAS GANADAS/PERDIDAS +Alvaro 2/0 +Oca 0/2 +Fina 0/2 +Emilio 0/2 +Alba 0/2 +Navir 0/2 +The theme just throws me off +programming race game +No idea why DarAng does not like RR. I think this is better than M:tG. :P Provided you know what you are doing when you set up the board and plant those flags. +played at least 30 times. I like the style of the game, with lots of planning ahead and complexity. Also, being able to crush others is fun. I not only own that (the original WotC), but I bought it (huge difference!), and I have all extensions. +This game is far from perfect, but I always have such a good time when I play that I have to assume there is more here than the sum of it's parts. I have played both the old and new version, but the one I own is the new one (which, despite a setback in component quality, is worth owning for the suggested course layouts alone) +(Sold to make room on my shelves.) + +A fun game that always gets laughter at the table. Plays better with more players. There's a little bit of a problem with runaway leaders, though. If someone can break away from the pack, they'll have a much easier time for the rest of the game. + +Update: I've had to bump this down to a 6 for my group. The runaway leader is a huge problem with the number of players we are able to bring together. Maybe if we could get more to the table, it would be harder to break away from the pack. +Acquired Jan 10. +Fun but takes far too long. +Game 8 of our 4th 10 x 10 Board Game Challenge +Hardcore grognards may not appreciate it, but if you are in the mood for a light, chaotic racing game, Roborally delivers! +Played 1/2 game. +Party game, but if more than 5 players the match will be long and chaos. +Good, clean fun. Needs a sober head to play well. +Wizard's version infinitely preferable to the new AH one. +This game is like a retarded math excercise. Would rather gouge my eyes out than play it. +Very fun game for those who have good spacial skills. Not so fun for those who don't. I had fun painting the figs. +Great with loads of players +Had fun with this one on its first play, even though I played terribly! Am interested to see how the capture the flag or some of the team variants play. +Extreme nostalgia here. Whatever flaws the game might have I can easily overlook, given how much fun this game has given me over the years. +Madness ^^ +This was my FIRST ONE... + +RoboRally (WotC 2nd Ed) + + RoboRally - Radioactive (WotC Ed) + +*** 2024 NOT PLAYED *** +### 2022-2011 NOT PLAYED ### + + +Sledge pimped our 'bots and they look great! +Own 1994 and 2005 now. + +Mmm...computer programming. Always fun, but I hate shuffling that huge stack every time. Can have serious runaway leader problems if you use more than one board. + + + + + + + +1991 +2 +4 +45 +30 +45 +9 + +Drunter & Drüber +Sans dessus dessous +Wacky Wacky West + +A long time ago, in a village far, far away, some disturbed townsfolk decided to destroy their entire town in order to rid themselves of an evil menace (it's technically a dog-mouse, but I think it's an idiomatic thing). Anyway, so the villagers rebuilt all the buildings in the town (including their precious outhouses), but forgot to include city walls, a river, or roads. To rectify this, players lay tiles with one of these three things onto the board, and any building caught underneath them is automatically eliminated, except for outhouses. When an outhouse would be destroyed, players take a vote on whether to place that particular section. Each player is trying to retain the most of one type of building, and once all the pieces have been placed the winner is the person with the highest valued buildings still standing.<br/><br/>Wacky, Wacky West re-make description:<br/><br/>Fans of Klaus Teuber will be interested in this remake/redesign of Drunter und Dr&uuml;ber, a 1991 Spiel des Jahres winner.<br/><br/><br/>Just south of nowhere, there's the junction of the Mayfair &amp; Rossdorf RR and the Turvy Trunk Line. Springing up from the desert like a tumbleweed lies the eccentric little town of Rossdorf. Like most western towns, Rossdorf has a Land Agent: Guy Dough, the brother of that wicked varmint Black Benny. A shrewd opportunist, Guy's done sold all the town land ('ceptin' the outhouses) four times over! Every acre in town that ain't got an outhouse on it is owned by the miners, the railroads, AND the fort captain. Just about a year ago, miners digging in the shadow of Fort Rossdorf struck the mother lode! But it wasn't gold, and it wasn't silver. No, my friend, it was just a little spring. Not any ordinary spring, though! It was a torrent of that mind-marbling drink the locals call &quot;Wacky Water!&quot; <br/><br/><br/>Now that water's done what the sun and the wind couldn't do: it's made those landholders brave enough to take matters into their own hands. Now they'll use whatever means they can to bowl over the competition and lay claim to the only fertile spots left in town! Now the only thing stoppin' 'em is the Town Charter Amendment #5, which states: &quot;no landholder may move, remove, or detonate any outhouse without a majority vote of the Town Citizens...&quot; Now one thing's for sure: something's gonna stink in Rossdorf, purty darn soon.....<br/><br/><br/>In Wacky Wacky West you and your fellow townfolk place track tiles, street tiles, and river tiles hoping to destroy your rivals' buildings. Every time someone tries to build over a precious outhouse, the town votes! You try to enlist your supporters (represented by cards) to vote with you to stop or encourage the play of certain tiles-perhaps saving some of your buildings or taking out those of your dastardly opponents.<br/><br/> + +https://cf.geekdo-images.com/Jc9Is7OyYz0NdWN_CDBi5g__thumb/img/SY3pxFgAkFbx2o7okAWQdNIpfEY=/fit-in/200x150/filters:strip_icc()/pic786075.jpg +https://cf.geekdo-images.com/Jc9Is7OyYz0NdWN_CDBi5g__original/img/XmlNNTdyuc3L-TIV2xbSda54ldw=/0x0/filters:format(jpeg)/pic786075.jpg + + +1991 Deutscher Spiele Preis Best Family/Adult Game 3rd Place +1991 Spiel des Jahres Winner +53. In Honor of Klaus Teuber +American West +BGTG 115 - Spiel des Jahres, Then &amp; Now +Bluffing +City Building +Drunter and Druber +Durchgespielt – Spiel des Jahres 1991: Drunter und Drüber +English edition +Family Games +German fifth edition +German first edition +German fourth edition +German second edition +German third edition +Hans im Glück +Mayfair Games +Chris McGloughlin +OBG 049: Social Contracts +Klaus Teuber +Tile Placement +Franz Vohwinkel +Voting +Wacky Wacky West +Wacky Wacky West + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Not played this for years and I can remember little about it other than it was ok +Combines tile-laying with a very good bluffing component, resulting in silly fun. Decent for 2, much better for 3-4 players. A good "gateway" game, very light, and actually quite language independent, provided you print off a copy of the rules in English. +played +คล้ายๆ Clans ตรงที่สีของตัวเองเป็นความลับ แต่อันนี้เล่นง่ายกว่า setup สั้นกว่า ดักทางง่ายกว่า แต่ยังไงก็ชอบ clans มากกว่านะ +130923 Cute hidden identity game. I wouldn't say its the most awesome thing out there, but not a bad SDJ winner either. +An interesting game where you make walls/roads/rivers by laying tiles. You try to destroy other people's buildings while keeping your own in tact, the twist being that everyone's building type is secret until the end of the game. The theme and back story is absolutely zany and nonsensical, but funny. :p +Played by lo +in Eda (Karton 4) + +Sleeved with Ultimate Guard - Mini European: Premium (UGD010277, 50/pack) - (46 x 71mm) - 48 cards +Druntering and Drubering is a hell of a lot of fun, which is good since you do a hell of a [b]lot[/b] of Druntering [b]and[/b] Drubering in this game, sometimes both at once. By the end you'll be too tired to Drunt and too exhausted to Drube. + + +Got this game when I was very young and while a lot of games can't stand the test of time this one is still super fun +Owned and sold. Not bad but we'll never play it again. +play once, don't get it... maybe play with wrong rules. +3 - 4 (4) +Not bad. Good amount of bluffing and limited voting/veto power. I'm not the biggest fan of hidden identities, but at least this one is pretty short. It seems like the luck of the draw is a fairly big factor in the game. +A very good game - and the variant cards included are a nice change of pace. Shame I don&#039;t get to play it more. +麻美実家 +Hieroným +Never played + +Bought for 1.50€ on ebay because it was nominated Spiel des Jahres in the year that I was born. It's probably gonna be unplayed for a long time. +15 +always looked intriguing to me, never been sufficently omtivated to get it. +Purchased from Jon Pessano on September 2007 +Great, ending is a little weird + +[youtube=3UlemM6lR2k] + +https://youtu.be/3UlemM6lR2k +7 +Attractive art, unique theme, and hidden "characters" adds up to a pretty decent game. Another "Step 2 Gateway Game." +in Poznan +334 +Collected dust for ages, as I bought it when I was buying almost every game possible, tought about selling it but wanted to try it at least once (only normal!). + +Turned out to be a clever game, quite enjoyable, so I keep it, even if it is one the ugliest box I own. +I have to rate it highly. I won first time out. +ドリュンタードリューバー (3〜4) +Fun? No,fuaaaaahhh...sleepy. +should've played again maybe, but not compelled to do so... +J0014 +gespendet +Sleeved +I can only take so many advance-the-cause-of-your-secret-identity games; with Familienbande in my collection, I don't really feel the need for another. (The shortness of the game and the fun of building the family tree in that game outweighs any concern I have about unfairness/lack-of-subtlety-in-my-play.) Still, once it started, this was playable enough. + +That may be the most hyphens I've ever used in one comment. +3 +Odd game with an odd theme. the game plays out will many similar aspects to a connection game, but with no clear objective of where you are going. Amusing the first time it is played, the game on its own over time is not all that gripping. Has a definite feel of an early design when the hobby explosion of the 90s took place, +Bontott, hibátlan és hiánytalan. Kártyák fóliázva, minden jelölő külön zacskózva. Német nyelvű. 3.000 Ft +Hunk Lin +NIS (ff) +Standort: Düsseldorf +simple but good... +no hidden tiles, minimum luck... :) +I really like the "Jaaaaa!!" and "Neinnnn!" cards, but nothing else about the game sticks out in my mind. +1 25.1 +07.01.01.02 +07.01.01.02 +07.01.01.02 +07.01.01.02 +Was ok - don't mind if I never play it again. +Once Spiel des Jahres but it seems that this game hasn't survive its age. +I bought this game long time ago, but can't remember me playing it anymore. +Drunter & Drüber +Route building game with a vote triggered when building over toilets. It was not as much fun as I hoped for, but I enjoyed it. +Signiert von: Klaus Teuber +Drunter & Drüber +Purchased at GameStorm 18--Side deal +funny concept, but gameplay gets really repetitive after you've played it a couple of times. +Drunter und Druber +$10 +Gekauft als Spiel des Jahres. +Die Anleitung war damals doof, und wir haben das Spiel immer wieder begonnen, aber nicht beendet. Klaus Teuber ist ein genialer Spieleerfinder, aber das hier macht uns keinen Spaß. +Simple yet highly strategic game. Very quick filler but quite deep. Variant seems a bit lame. +A simple, light game that you have little control over. Basically, you are trying to divert the city growth away from your establishments which wouldn't be difficult, but you have three other people trying to cover your territory up. You make the best tactical decision you can and move on. Just okay for me, but would recommend for those who like light games and don't mind a bit of choas. +Kind of fun, sort of odd... only played once, but I found myself thinking "why even put the 5 buildings on the board.. or the 4s... or the 3s... or..." +Played this game in army for the first time with buddies and we all liked the game. +One of the oldest building games and quite good one as well. +This was a pretty massive let-down that really didn't scratch ANY itch. It sucked, because I was sure this was going to be a hoot, and while it wasn't bad, I definitely have some better stuff. + +Taken by itself, it's not a horrible game... it's just very bland. +(Drunter und Druber) bought from Mark +Everyone talks about how the Spiel des Jahres is a huge factor in the gaming industry. They say that games which attain that title are bound for greatness (at least in sales figures.) So I found it very strange that a game which won the SdJ in 1991 took almost 20 years to reach the American market. But, in general, SdJ winners have gone over very well with my family, so I knew it needed to be added to my collection ASAP. When I read the rules I had really high hopes for the game too, because of the wacky theme and one of my favorite mechanisms (hidden goals.) + +Unfortunately this game just didn't light my world on fire. It is OK, but there doesn't seem to be anything really special or unique about the game that makes me want to play it again. Perhaps with some more plays I'll understand more of the strategies, but upon the first play it seemed really difficult to have much control over what buildings get covered. The voting almost seems like a sideshow that doesn't really give the players enough power to change what others are doing. I'll try the game some more, but I'm really not expecting much. The game is just kind of meh, nothing great and nothing awful. +I'm not sure I see the Spiele des Jahres winner here. I think the western theme is boring and would rather have the German version. +German version. +D 11 +[COLOR=#006600][size=14]Owned and unplayed.[/size][/COLOR] +I really want to revisit this game sometimes. So much fun! +Interesting and enjoyably nasty little game with hidden objectives and the opportunity for plenty of spite. +Very fun bluffing game. Cool tiles, neat voting mechanism. +Spiel des Jahres 1991 +My gaming group just couldn't get into this one. +I played this in the boardgameclub February 2004. We played it with 4 players. It was real fun. I had to expose the building under my protection quite fast already but it didn't ruin the game that much. +0 +Rene H | Erklärer: , , , , +game looks fun, reading the rules it sounds fun...fell flat everytime I've played it +Silly is the first word I think of to describe this game. Good to pull out with non-gamers on occasion. +One of the earliest games in the German genre I remember playing. Played it a lot an dloved it as a two player game. Since then have come to see it as a nice and simple intersting game but not so wildly thrilling or challenging. A load of luck involved basically, but a very nice threme and graphic and easy to introduce people to, with a reasonable amount of tension behind the luck elemnt. In its own way this has parallels to Ticket to Ride. +[b]-- After 1 play --[/b] + +Slightly dated, but still enjoyable. + +Interesting is that players start with random assortment of tiles, which create fun asymmetry - some will have more tiles to expand river, some will have more tiles for building walls, so they have different impact on different parts of the board. +Unfortunately, it sometimes cause you to be at mercy of your opponents, and it seems like frequently there is nothing to be done to prevent major loss of points. + +Still, there are moments when you can do some sneaky and clever moves, and secret goals of opponents are not easy to deduce. + +It is impressive, given age of this game and simple rules, that designer was able to cram it with asymmetric starting conditions, bluffing, negotiations and subtle subterfuge. +Quite good at that time. But you don't have much control in multiplayer base game. +I was really pleasantly surprised by the gameplay in this one. I like deduction games and this one is a fun, quick one. + +14 +14 +Spiel des Jahres 1991 +9/27/06 - recent order from Germany. +Recently acquired original German version...still waiting for delivery (and hoping I didn't get scammed). +Good family fun. I'm not sure that it really feels like an SdJ winner, but it was fairly early on in SdJ history and I am not familiar with what it was up against. +Light, amusing negotiation game with a touch of strategic tile play. Goofy theme keeps the game lightheared, which is a must since watching everyone vote &quot;Jaaa!&quot; to plow under your &quot;5&quot; building can hurt your feelings! ;-) +Sounds interesting. I may be willing to trade for a copy. +Purge guy made it sound fairly forgettable, but the comments changed my mind. Tom Vassel seemed to really like it in his video review, as well, gave it 6.5 + +2-4; 8+; 60min +A pre-Catan Teuber; who could tell that was ahead from this fun but rather peculiar game of 'don't knock down the public toilet'! +ENG, niezależna językowo. +I love how outhouses are the most important buildings! A silly enough game that's sorta fun once in a while. +Fine family game. FUN. But my wee brother is less keen on it, so it doesn't often make it to the table. +First play finally had of this game which is unbelieveably 20 years old. Went down really well. Nice and simple voting game with lots of options. Try to steer the walls, streets and river away from your buildings by placing tiles. Tricky but so simple and easy. 1 Play. +The card-bidding can be fun, but for such a game mechanic I would rather play "Adel Verpflichtet" at any given time. The building and blocking, sounds nice, but the game always ends way before your ingenious schemes can be truly completed... +Ridiculous theme. Simple tile laying game with an interesting voting mechanic. This mechanical duo sounds like it could be refined and slipped into a newer game + + + + + + + + +` + +export const GAME_RESULT = [ + { + yearPublished: 1994, + minPlayers: 2, + maxPlayers: 8, + playingTime: 120, + minPlayTime: 45, + maxPlayTime: 120, + age: 12, + titles: [ + { + sortIndex: 1, + title: 'Robo Rally' + }, + { + primary: true, + sortIndex: 1, + title: 'RoboRally' + } + ], + description: 'The robots of the Robo Rally automobile factory spend their weekdays toiling at the assembly line. They put in hard hours building high-speed supercars they never get to see in action. But on Saturday nights, the factory becomes a world of mad machines and dangerous schemes as these robots engage in their own epic race.It takes speed, wits, and dirty tricks to become a racing legend! Each player chooses a robot and directs its moves by playing cards. Chaos ensues as all players reveal the cards they\'ve chosen. Players face obstacles like industrial lasers, gaping pits, and moving conveyor belts -- but those can also be used to their advantage! Each player aims to make it to each of the checkpoints in numerical order. The first player to reach all of the checkpoints wins. (source: http://avalonhill.wizards.com/games/robo-rally/comingsoon)

In RoboRally players each control a different robot in a race through a dangerous factory floor. Several goals will be placed on the board and you must navigate your robot to them in a specific order. The boards can be combined in several different ways to accommodate different player counts and races can be as long or as short as player\'s desire.

In general, players will first fill all of their robot\'s "registers" with facedown movement cards. This happens simultaneously and there is a time element involved. If you don\'t act fast enough you are forced to place cards randomly to fill the rest. Then, starting with the first register, everyone reveals their card. The card with the highest number moves first. After everyone resolves their movement they reveal the next card and so on. Examples of movement cards may be to turn 90 degrees left or right, move forward 2 spaces, or move backward 1 space though there are a bigger variety than that. You can plan a perfect route, but if another robot runs into you it can push you off course. This can be disastrous since you can\'t reprogram any cards to fix it!

Robots fire lasers and factory elements resolve after each movement and robots may become damaged. If they take enough damage certain movement cards become fixed and can no longer be changed. If they take more they may be destroyed entirely. The first robot to claim all the goals in the correct order wins, though some may award points and play tournament style.

The game was reprinted by Avalon Hill (Hasbro/WotC) in 2005.

UPC 742818050029

', + thumbnail: 'https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__thumb/img/J1PlqFqtN-hxuXM4eEi-ekANPP4=/fit-in/200x150/filters:strip_icc()/pic1000553.jpg', + image: 'https://cf.geekdo-images.com/eJx8hRJ6-86C2VrhECwEPA__original/img/-9I8B82hDOO1n0h9urwZUdz6bqc=/0x0/filters:format(jpeg)/pic1000553.jpg', + publishers: [ + { + name: 'Wizards of the Coast', + id: 13 + }, + { + name: '999 Games', + id: 267 + }, + { + name: 'ADC Blackfire Entertainment', + id: 23043 + }, + { + name: 'AMIGO', + id: 8 + }, + { + name: 'Avalon Hill', + id: 4871 + }, + { + name: 'Hasbro', + id: 51 + }, + { + name: 'Play Factory', + id: 7365 + } + ], + honors: [ + { + name: '1994 Origins Awards Best Fantasy or Science Fiction Boardgame Winner', + id: 12956 + }, + { + name: '1994 Origins Awards Best Graphic Presentation of a Boardgame Winner', + id: 12955 + }, + { + name: '2005 Årets Spill Best Strategy Game Nominee', + id: 9286 + } + ], + mechanics: [ + { + name: 'Action Queue', + id: 2689 + }, + { + name: 'Bias', + id: 2957 + }, + { + name: 'Grid Movement', + id: 2676 + }, + { + name: 'Lose a Turn', + id: 2836 + }, + { + name: 'Modular Board', + id: 2011 + }, + { + name: 'Programmed Movement', + id: 2953 + }, + { + name: 'Race', + id: 2876 + }, + { + name: 'Scenario / Mission / Campaign Game', + id: 2822 + }, + { + name: 'Simultaneous Action Selection', + id: 2020 + } + ], + cardSets: [ + { + name: 'AMIGO German ed (1999)', + id: 92597 + }, + { + name: 'Avalon Hill ed (2005)', + id: 92596 + }, + { + name: 'Wizards of the Coast 1st (1994) and 2nd (1995) eds', + id: 92594 + } + ], + versions: [ + { + name: 'Avalon Hill edition 2005', + id: 24196 + }, + { + name: 'Avalon Hill edition 2010', + id: 100127 + }, + { + name: 'Czech edition', + id: 522948 + }, + { + name: 'Dutch edition', + id: 24045 + }, + { + name: 'French edition', + id: 85627 + }, + { + name: 'German edition', + id: 31686 + }, + { + name: 'Wizards of the Coast first edition', + id: 23719 + }, + { + name: 'Wizards of the Coast second edition', + id: 24190 + } + ], + artists: [ + { + name: 'Peter Bergting', + id: 12500 + }, + { + name: 'Bob Carasca', + id: 28513 + }, + { + name: 'Phil Foglio', + id: 616 + }, + { + name: 'Daniel Gelon', + id: 14508 + }, + { + name: 'Jennifer Lathrop', + id: 18431 + }, + { + name: 'Paul Sottosanti', + id: 28512 + }, + { + name: 'Franz Vohwinkel', + id: 11883 + }, + { + name: 'Peter Whitley', + id: 18317 + } + ], + podcastEpisodes: [ + { + id: 86295, + title: 'BGTG - June 11, 2005 (Mike Mayer and Robo Rally)' + }, + { + id: 101144, + title: 'BGTG 136 - 100 Great Games, part 3 (with Stephen Glenn and Mark Jackson)' + }, + { + id: 173150, + title: 'Ep 39 Real Time' + }, + { + id: 174863, + title: 'Ep 42 Illustrations with Henning Ludvigsen' + }, + { + id: 177083, + title: 'Ep 47 Grey Fox Games with Josh Lebkowicz' + }, + { + id: 108270, + title: 'Episode 10: Cosmic Encounter/Why We Play' + }, + { + id: 333109, + title: 'Episode 19 - Programmed Action' + }, + { + id: 176593, + title: 'Episode 33 - Top 50, Picks 20-11' + }, + { + id: 80468, + title: 'GameBreak Audio Episode #013 - Domo Arigato, Mister Roboto' + }, + { + id: 446012, + title: 'I’ve Been Diced! episode 10: Gateway games' + }, + { + id: 446020, + title: 'I’ve Been Diced! episode 3: Games that stood the test of time' + }, + { + id: 116605, + title: 'Ludology Episode 78 - Here We Are Now, Entertain Us' + }, + { + id: 135494, + title: 'MN 0035 Racing Games' + }, + { + id: 5675, + title: 'OBG 30: Start Your Engines' + }, + { + id: 176377, + title: 'Polyhedron Collider Cast Episode 2' + }, + { + id: 244742, + title: 'The Good, the Board, and the Producers Episode 168 Publisher Profiles 1 EXPRESS' + } + ], + families: [ + { + name: 'Components: 12 x 12 Grids', + id: 78568 + }, + { + name: 'Components: Miniatures', + id: 25158 + }, + { + name: 'Components: Sand Timers', + id: 75031 + }, + { + name: 'Theme: Robots', + id: 22232 + }, + { + name: 'Theme: Sci-Fi Sports', + id: 6924 + } + ], + designers: [ + { + name: 'Richard Garfield', + id: 14 + } + ], + categories: [ + { + name: 'Maze', + id: 1059 + }, + { + name: 'Miniatures', + id: 1047 + }, + { + name: 'Racing', + id: 1031 + }, + { + name: 'Science Fiction', + id: 1016 + } + ], + implementations: [ + { + id: 216201, + title: 'Robo Rally' + } + ], + expansions: [ + { + id: 400748, + title: 'Robo Rally: Master Builder' + }, + { + id: 1569, + title: 'RoboRally: Armed and Dangerous' + }, + { + id: 1968, + title: 'RoboRally: Crash and Burn' + }, + { + id: 1967, + title: 'RoboRally: Grand Prix' + }, + { + id: 88354, + title: 'RoboRally: King of the Hill' + }, + { + id: 1966, + title: 'RoboRally: Radioactive' + } + ], + videoGames: [ + { + id: 315736, + title: 'Robot Rally: Board game chaos' + } + ], + subdomains: [ + { + name: 'Strategy Games', + id: 5497 + }, + { + name: 'Thematic Games', + id: 5496 + } + ], + comments: [ + { + username: '1 Family Meeple', + rating: 5, + comment: '[size=12][COLOR=#009900][b]MIKE'S[/b][/COLOR][/size]' + }, + { + username: '1000rpm', + rating: 9, + comment: 'Rating after 1 play of a 2 player game.\nIt was fun. It was chaos. And that with only 2 players.\nIt took longer than expected, but I loved it. I can see how with a lot of players/a long map it could get frustrating/incredibly long, but I'd still like to give that a go.\n\nSecond game with 7 players. We didn't finish. But it was fun. I realised it probably isn't a good idea to sabotage your robot with a load of red wine. It really doesn't work as well.\n\nHave played quite a lot now and just really think it is a great fun game. Just played a short, deadly, 6 player game. Only 2 survived. Loads of fun.\nUpgraded to a 9.' + }, + { + username: '100pcBlade', + rating: 6, + comment: 'The game is pretty unique and can be great fun. It's also at risk of becoming long, drawn out & tedious. If you can avoid this then it is recommended. Just be prepared to put up with the odd nightmare game' + }, + { + username: '1arska', + rating: 7.5, + comment: 'Starting from 4 players, it is enjoyable.' + }, + { + username: '1in36', + rating: 7, + comment: 'Mind bending game, the first time you play this, you will mess up royally!' + }, + { + username: '2d20', + rating: 'N/A', + comment: '2005 version-St. Johns' + }, + { + username: '3dicebombers', + rating: 6, + comment: 'A fun and chaotic game. I get a little disappointed when it just boils down to who gets the cards they need and who doesn't. I have gotten too many "all turns" hands to love the game as much as some people do.' + }, + { + username: '420017', + rating: 6, + comment: 'a good game to play ,also you can play solo .' + }, + { + username: '42Genie', + rating: 'N/A', + comment: 'Missing some components. Trade to only benefit JVMF.' + }, + { + username: '4McTavish', + rating: 10, + comment: 'C:B1' + }, + { + username: '5th Beatles', + rating: 7, + comment: 'reviewed on my blog.' + }, + { + username: '70 Shilling', + rating: 'N/A', + comment: 'B&K' + }, + { + username: 'A Jaded Panda', + rating: 7, + comment: 'spoken for in BGG.Con Math Trade' + }, + { + username: 'A Strange Aeon', + rating: 8, + comment: 'Had a really fun experience with this one at Kristen's 21st birthday / end of the semester party. It was just the four of us and a lot of rum, but we had a blast. Somehow I managed to roll straight into a pit my first turn. Can't wait to play some more. \n\nSession report: Happy Birthday, Squashbot! \n\nhttp://www.boardgamegeek.com/article/1471464#1471464' + }, + { + username: 'a100000001', + rating: 'N/A', + comment: 'played' + }, + { + username: 'a2greg', + rating: 4, + comment: 'I don't get all the hype. Makes me feel like a mechanical rat in a maze. I don't like games where players can die early and have to watch the other players finish the game. Someone else here says it well, "too long and too light." Plenty of other games I'd play before this one.' + }, + { + username: 'AAAlone', + rating: 6, + comment: 'The design is a bit dated perhaps, but it is a fun programmed movement game. If you can deal with randomness or chaos.' + }, + { + username: 'aaarg_ink', + rating: 6, + comment: '131224 Its a legitimate classic, lots of fun and chaos, look forward to playing it with the right folks.' + }, + { + username: 'Aack', + rating: 10, + comment: 'The classic programming game of robotic mayhem.' + }, + { + username: 'aalotr13', + rating: 9, + comment: 'My favorite programming game. You will get messed up by someone else.' + }, + { + username: 'aanemesis', + rating: 7, + comment: 'Good game to play with my kids to pass the time on weekends.' + }, + { + username: 'aardrian', + rating: 7, + comment: 'With the lead minis.' + }, + { + username: 'AaronD', + rating: 2, + comment: 'I found this to be a really frustrating slow paced game. There was a couple funny moments when robots died, but it's mostly a slow slow grind. Too much randomness for me.' + }, + { + username: 'aarondesk', + rating: 7.5, + comment: 'Controlled/uncontrolled chaos. Great!' + }, + { + username: 'aaronseeber', + rating: 8, + comment: 'Good chaotic fun. I think I'd only ever be willing to play short course though.' + }, + { + username: 'abbeynormal', + rating: 'N/A', + comment: 'unplayed' + }, + { + username: 'ABCafe', + rating: 'N/A', + comment: 'D1' + }, + { + username: 'abdiel', + rating: 9, + comment: 'I'm drawn to racing games but there are very few good ones. Robo Rally is the best racing game I've played, and a great game in general. Puzzling out the most efficient use of cards while trying to predict where your opponents are going to end up makes for a fun a challenging game.\n\nThere is a learning curve regarding being able to visualize where the cards in your hand will land you on the board. Until you know how to drive your robot it's best if you stick to simple one board tracks.' + }, + { + username: 'abeille_joyeuse', + rating: 8, + comment: 'I am thinking of using this game in a robotics workshop I run for high schoolers, to introduce programming in an informal way.' + }, + { + username: 'abgg', + rating: 'N/A', + comment: 'brendanm, ndru' + }, + { + username: 'abodi', + rating: 6, + comment: 'Used to rate this an 8, fast fast forward about 6 years and I'd rate this a 6.\n\nSuffers from runaway leader issues. Can outstay it's welcome in game length.' + }, + { + username: 'Abraxox', + rating: 9, + comment: 'Painted' + }, + { + username: 'ABrissey', + rating: 6.5, + comment: 'Pretty standard action programming game, okay if you're into that type of mechanic. Theme is appropriate to the game but nothing special.' + }, + { + username: 'abrocker', + rating: 6, + comment: 'I like the programming element, but this game is just to chaotic for me.' + }, + { + username: 'Abysmul', + rating: 6, + comment: 'If you don't know left from right, you'll hate it. ;)' + }, + { + username: 'abyssal_Tome', + rating: 6.65, + comment: 'Chaotic but fun. Surely not for the serious strategist. The worse you do in your planning, the funnier the game becomes. I suggest to play with just 1 map and not more than 2-3 way-points, otherwise the game will overstay its welcome.' + }, + { + username: 'Aceleci', + rating: 'N/A', + comment: 'Erik hermans' + }, + { + username: 'acellama88', + rating: 10, + comment: 'Great Game! Most requested game to be played at work. Really fun with full 8 players (extremely hectic).' + }, + { + username: 'acetate3', + rating: 5, + comment: 'I'm glad to have tried RoboRally, but it really isn't the type of game that interests me.' + }, + { + username: 'ace_schtevo', + rating: 'N/A', + comment: 'Missing 2 figures' + }, + { + username: 'acharland', + rating: 10, + comment: 'Learning:\nTeaching:\nComment:' + }, + { + username: 'Achire', + rating: 8, + comment: '5/13/2018 - First play rating, so subject to change. Very entertaining and fun. It does require a certain type of thinking to program the actions effectively, but it's not terribly difficult and the mistakes are hilarious. Also, the bot powers really make things more tricky in interesting ways. I need to play it more to really master the strategy of the game, but I can definitely see why this a classic. I was worried it might not seem very interesting after Mechs vs. Minions, but I was mistaken, it's a very different game and quite special.' + }, + { + username: 'aciosek', + rating: 7.75, + comment: 'Best party game for me, there is always a lot of fun when playing in it' + }, + { + username: 'acolyte', + rating: 8, + comment: 'One of the first games I ever owned and I still love it. A classic.' + }, + { + username: 'acooper1004', + rating: 8, + comment: 'old favourite, but ideally need 4 players' + }, + { + username: 'ACTC', + rating: 9, + comment: 'Tolles Spiel für Programmierer, oder die die es mal werden wollen ;-) Programmiert euren Roboter, das er auch richtig den Weg findet, aber vertauscht nicht die Richtung und kollidiert möglichst nicht mit anderen, denn das bringt alles durcheinander. Obwohl dann machts erst Spaß ;-)' + }, + { + username: 'Actherion', + rating: 7, + comment: 'Great fun, especially when players are close enough that they influence each other. Occasionally, a player can get off to a fast start (thanks to the luck factor involved) which reduces interactivity, but all of the games I've played have been fairly close at the end, so I'm not sure it's that big of a problem. The game can be extremely frantic, and player elimination can become a problem, so it's probably best to take this game in limited amounts' + }, + { + username: 'ActionJakson1412', + rating: 'N/A', + comment: 'Second edition WoTC' + }, + { + username: 'ACTP', + rating: 'N/A', + comment: 'Played by lo' + }, + { + username: 'ad79', + rating: 'N/A', + comment: 'Have tried the puzzle levels online. Liked those.\nBut do I only like the puzzle aspect or will I like the game?' + }, + { + username: 'adam.skinner', + rating: 7.5, + comment: 'It's like Logo (that old kid's computer programming language, remember?), only now your turtle is a killer robot, racing towards the final goal.\n\nFun, and easy to get confused due to turns and board interaction (there are things that turn and move you on the board, as well as other robots that can push you around).' + }, + { + username: 'Adam78', + rating: 8, + comment: 'A brilliant streamlined system of programming, and a great race game. I loved my first play and can see the huge variety which is present in the multiple boards and options. I imagine AP could set in with some players and slow the game down, but with the right crowd this game is fantastic.' + }, + { + username: 'adamb2k9', + rating: 9, + comment: 'Move, turn, shoot... WATCH OUT!!!' + }, + { + username: 'adambadura', + rating: 5, + comment: '2022-05-08 (rate 5):\n\nI was interested in the game because I like the mechanic, the theme seemed fine, and [person=14] as the designer attracted me as well. Also, I had the impression this is a well-established classic in its category.\n\nHowever, after a few games, I grew skeptical. With a little number of players, the board was too empty. With more players, the moves were too chaotic. While lack of control was an immense impression.\n\nIn the end, I decided there are other games with the mechanics ([boardgamemechanic=2953]) that I like more and got rid of this one.' + }, + { + username: 'adamdynris', + rating: 7.5, + comment: 'From Oktoberfest math trade oct 2007' + }, + { + username: 'adamhess89', + rating: 8, + comment: 'Wow can someone say CHAOS!! This game can be sooooo frustrating but still fun.' + }, + { + username: 'Adamino', + rating: 7, + comment: 'Fun game for the family, but be careful with the setup.. The games can run very long!' + }, + { + username: 'adamscott', + rating: 6, + comment: 'I could see this being fun in the right circumstances (ie playing with children), but the level of chaos is bound to frustrate many.' + }, + { + username: 'adamtaylorhouston', + rating: 9, + comment: 'Awesome programming game. Easy to learn, the more people play, the more chaos and fun it will be.' + }, + { + username: 'adamw', + rating: 6, + comment: 'Lovely game in many ways - actually better with more players. Fun-loving, but not terribly strategic. For a good time, it's good. For a good game it's.... feh. My variant now is to play one card at a time. Sure, it's really easy, but it removes the frustration of this game and still maintains the fun at least for me. Feels more strategic too and substantially less chaotic. Sold it.' + }, + { + username: 'adamxt', + rating: 6, + comment: 'Some people can direct their robot to the goals with no missteps or confusion. I have infinite respect for those people. My robots bump into walls and lasers, but I still love the chaos.' + }, + { + username: 'Adanedhel', + rating: 8.6, + comment: 'Brutalmente divertido xD Es una risa y es bastante rápido si juegas con la gente adecuada! jeje Mi segunda partida ganada de forma muy épica tras morir rápidamente 2 veces a principio de partida! :P' + }, + { + username: 'addamaniac', + rating: 9, + comment: 'I don't know of a game I've laughed harder during than this game. Perhaps maybe Galaxy trucker... Just a FUN game. Gotta expect to be messed up by other players. Can be taught in 10-15 minutes' + }, + { + username: 'adebisi', + rating: 6, + comment: '2009-01-12\nAgain, here's a game that is at its best with more players due to the chaotic nature of the game.\n\n2016-05-24\nRobo Rally is one of those games in which the journey is more important than destination. This is due to the extremely chaotic nature of the game. Your plans are most guaranteed to fail.\n\nBut the magic of the game is in failing. It is like throwing things down into a gorge just to see what happens. For non-serious gamers Robo Rally offers great laughs and fun.' + }, + { + username: 'AdelaideLN', + rating: 'N/A', + comment: 'WaffleT' + }, + { + username: 'Adesazz', + rating: 'N/A', + comment: 'Try the variants! Needs 5+' + }, + { + username: 'Admiral Fisher', + rating: 5, + comment: 'Despite the fact that I'm rubbish at this, I did enjoy it a bit and think it is very replayable. A lot of fun and quite a bit of a brain-burner when you get near the fast conveyors and twizzles.' + }, + { + username: 'AdmiralGT', + rating: 9, + comment: 'Really enjoy RoboRally and one of the games that got me back into board gaming. Prefer playing on smaller boards to get more interaction and can find large maps just degenerate into a race for the flags with little interaction which is the most fun part of the game.' + }, + { + username: 'Adria', + rating: 8, + comment: 'Traded away because it never hit the table.' + }, + { + username: 'Adrian Hill', + rating: 7.5, + comment: 'One of the few games that gets better with more people. Only play with 4 or more. Great fun.' + }, + { + username: 'adularia25', + rating: 6, + comment: 'Can't really give it a good rating as I've only played one game. \n\nInteresting premise. Several programmer friends of mine love the game, and so a friend of a friend brought it out and we finally got to play it. They said that all programmers love it... but my husband wasn't too thrilled by it. Sure, you "program" your robot, but the entire game is about spacial awareness. I'm great at that... my husband, not so much. \n\nThe game would have gone better if all of us had been allowed to read the rules. Two of the people playing had played it many times before, and three of us (me included) had never played it before. We would have benefited from having more things explained. But that is not a failing of the game, so much as a failing of the people we were playing with...\n\nThat said, my husband and I didn't do too poorly. We were playing the "tag the flag" gametype where we had to go from one flag to another, in order from one to three, and the first bot to reach three would win. Everyone in the game at least made it to the second flag. Some of us got almost to three. And again, would have been better if we had known more of the rules.\n\nHopefully next time (if there is a next time) will be better.' + }, + { + username: 'Advocator', + rating: 7, + comment: 'I've yet to play this game sober. I'm sure it prove more strategic if I were, but drinking just makes this game fun. Nothing quite like watching your friends twist from side to side in their chair trying to figure out just what the heck their cards are going to do.' + }, + { + username: 'aerial7', + rating: 7.5, + comment: '?CULL\nA good game but one best enjoyed very infrequently; you don't want the novelty to wear off. A few times a year allows you to appreciate the game; any more than that and I'm afraid it would degenerate into tedium....' + }, + { + username: 'Aerothorn', + rating: 'N/A', + comment: 'Unplayed' + }, + { + username: 'aetwitch', + rating: 6, + comment: 'Most games are a blast. More players with lots of havoc are the best games.' + }, + { + username: 'AFABBI', + rating: 5, + comment: 'This reminds me of a cross between the Hannah Barbara racing cartoon and the movie short circuits Johnny 5. It was the game Richard Garfield was pitching without success when he ended up having to fall back on his backup prototype a little game known as mtg. Robo Rally is about a crazy robot race through a series of modular boards with different kinds of obstacles and environmental conditions in order to be the first bot to take flags in each board in sequential order. The catch is you have to program your bots and then execute the actions in order so this leads to all kinds of crazy shenanigans. Especially when you damage other robots and start locking certain commands into their tableu. Robo rally is a good racing game. As far as race games go, I think it is probably one of the better ones.' + }, + { + username: 'afafard', + rating: 3, + comment: 'Please no!' + }, + { + username: 'AfarOca', + rating: 6, + comment: 'JUGADORES: 5 - 6\nTIEMPO: 20 - 120\n\nPARTIDAS GANADAS/PERDIDAS \nAlvaro 2/0\nOca 0/2\nFina 0/2\nEmilio 0/2\nAlba 0/2\nNavir 0/2' + }, + { + username: 'afcgamer3', + rating: 2, + comment: 'The theme just throws me off' + }, + { + username: 'Aftonkatt', + rating: 6, + comment: 'programming race game' + }, + { + username: 'Againsto', + rating: 9, + comment: 'No idea why DarAng does not like RR. I think this is better than M:tG. :P Provided you know what you are doing when you set up the board and plant those flags.' + }, + { + username: 'Aganju', + rating: 7.4, + comment: 'played at least 30 times. I like the style of the game, with lots of planning ahead and complexity. Also, being able to crush others is fun. I not only own that (the original WotC), but I bought it (huge difference!), and I have all extensions.' + }, + { + username: 'agent easy', + rating: 7, + comment: 'This game is far from perfect, but I always have such a good time when I play that I have to assume there is more here than the sum of it's parts. I have played both the old and new version, but the one I own is the new one (which, despite a setback in component quality, is worth owning for the suggested course layouts alone)' + }, + { + username: 'AgentOddball', + rating: 6, + comment: '(Sold to make room on my shelves.)\n\nA fun game that always gets laughter at the table. Plays better with more players. There's a little bit of a problem with runaway leaders, though. If someone can break away from the pack, they'll have a much easier time for the rest of the game.\n\nUpdate: I've had to bump this down to a 6 for my group. The runaway leader is a huge problem with the number of players we are able to bring together. Maybe if we could get more to the table, it would be harder to break away from the pack.' + }, + { + username: 'Aging One', + rating: 'N/A', + comment: 'Acquired Jan 10.' + }, + { + username: 'agius1520', + rating: 6, + comment: 'Fun but takes far too long.' + }, + { + username: 'agiusti3', + rating: 8, + comment: 'Game 8 of our 4th 10 x 10 Board Game Challenge' + }, + { + username: 'Aglar', + rating: 8.5, + comment: 'Hardcore grognards may not appreciate it, but if you are in the mood for a light, chaotic racing game, Roborally delivers!' + }, + { + username: 'Agrajag', + rating: 6, + comment: 'Played 1/2 game.' + }, + { + username: 'ah3Dog', + rating: 6, + comment: 'Party game, but if more than 5 players the match will be long and chaos.' + }, + { + username: 'Ahiksking', + rating: 7.5, + comment: 'Good, clean fun. Needs a sober head to play well.\nWizard's version infinitely preferable to the new AH one.' + }, + { + username: 'AHShole', + rating: 2, + comment: 'This game is like a retarded math excercise. Would rather gouge my eyes out than play it.' + }, + { + username: 'ahtitan', + rating: 7, + comment: 'Very fun game for those who have good spacial skills. Not so fun for those who don't. I had fun painting the figs.' + }, + { + username: 'ahudston', + rating: 7, + comment: 'Great with loads of players' + }, + { + username: 'ahwood23', + rating: 7.5, + comment: 'Had fun with this one on its first play, even though I played terribly! Am interested to see how the capture the flag or some of the team variants play.' + }, + { + username: 'Ah_Pook', + rating: 10, + comment: 'Extreme nostalgia here. Whatever flaws the game might have I can easily overlook, given how much fun this game has given me over the years.' + }, + { + username: 'Aiko Akemi', + rating: 7.6, + comment: 'Madness ^^' + }, + { + username: 'Aingeru', + rating: 8.5, + comment: 'This was my FIRST ONE...\n\nRoboRally (WotC 2nd Ed)\n + RoboRally - Radioactive (WotC Ed)\n\n*** 2024 NOT PLAYED ***\n### 2022-2011 NOT PLAYED ###' + }, + { + username: 'airydisk', + rating: 6.9, + comment: 'Sledge pimped our 'bots and they look great!' + }, + { + username: 'Ajax', + rating: 8, + comment: 'Own 1994 and 2005 now.\n\nMmm...computer programming. Always fun, but I hate shuffling that huge stack every time. Can have serious runaway leader problems if you use more than one board.' + } + ], + id: 18, + suggestedPlayers: { + results: [ + { + numPlayers: '1', + best: 0, + recommended: 5, + notRecommended: 189 + }, + { + numPlayers: '2', + best: 7, + recommended: 66, + notRecommended: 162 + }, + { + numPlayers: '3', + best: 18, + recommended: 155, + notRecommended: 64 + }, + { + numPlayers: '4', + best: 103, + recommended: 135, + notRecommended: 13 + }, + { + numPlayers: '5', + best: 163, + recommended: 83, + notRecommended: 10 + }, + { + numPlayers: '6', + best: 163, + recommended: 74, + notRecommended: 12 + }, + { + numPlayers: '7', + best: 64, + recommended: 120, + notRecommended: 45 + }, + { + numPlayers: '8', + best: 56, + recommended: 120, + notRecommended: 51 + }, + { + numPlayers: '8+', + best: 7, + recommended: 17, + notRecommended: 130 + } + ], + totalVotes: 295 + }, + languageDependence: { + results: [ + { + level: 1, + description: 'No necessary in-game text', + numVotes: 7 + }, + { + level: 2, + description: 'Some necessary text - easily memorized or small crib sheet', + numVotes: 22 + }, + { + level: 3, + description: 'Moderate in-game text - needs crib sheet or paste ups', + numVotes: 50 + }, + { + level: 4, + description: 'Extensive use of text - massive conversion needed to be playable', + numVotes: 1 + }, + { + level: 5, + description: 'Unplayable in another language', + numVotes: 0 + } + ], + totalVotes: 80 + }, + suggestedPlayerAge: { + results: [ + { + age: '2', + numVotes: 0 + }, + { + age: '3', + numVotes: 0 + }, + { + age: '4', + numVotes: 0 + }, + { + age: '5', + numVotes: 0 + }, + { + age: '6', + numVotes: 3 + }, + { + age: '8', + numVotes: 23 + }, + { + age: '10', + numVotes: 36 + }, + { + age: '12', + numVotes: 20 + }, + { + age: '14', + numVotes: 4 + }, + { + age: '16', + numVotes: 0 + }, + { + age: '18', + numVotes: 0 + }, + { + age: '21 and up', + numVotes: 0 + } + ], + totalVotes: 86 + } + }, + { + yearPublished: 1991, + minPlayers: 2, + maxPlayers: 4, + playingTime: 45, + minPlayTime: 30, + maxPlayTime: 45, + age: 9, + titles: [ + { + sortIndex: 1, + title: 'Drunter & Drüber' + }, + { + sortIndex: 1, + title: 'Sans dessus dessous' + }, + { + primary: true, + sortIndex: 1, + title: 'Wacky Wacky West' + } + ], + description: 'A long time ago, in a village far, far away, some disturbed townsfolk decided to destroy their entire town in order to rid themselves of an evil menace (it\'s technically a dog-mouse, but I think it\'s an idiomatic thing). Anyway, so the villagers rebuilt all the buildings in the town (including their precious outhouses), but forgot to include city walls, a river, or roads. To rectify this, players lay tiles with one of these three things onto the board, and any building caught underneath them is automatically eliminated, except for outhouses. When an outhouse would be destroyed, players take a vote on whether to place that particular section. Each player is trying to retain the most of one type of building, and once all the pieces have been placed the winner is the person with the highest valued buildings still standing.

Wacky, Wacky West re-make description:

Fans of Klaus Teuber will be interested in this remake/redesign of Drunter und Drüber, a 1991 Spiel des Jahres winner.


Just south of nowhere, there\'s the junction of the Mayfair & Rossdorf RR and the Turvy Trunk Line. Springing up from the desert like a tumbleweed lies the eccentric little town of Rossdorf. Like most western towns, Rossdorf has a Land Agent: Guy Dough, the brother of that wicked varmint Black Benny. A shrewd opportunist, Guy\'s done sold all the town land (\'ceptin\' the outhouses) four times over! Every acre in town that ain\'t got an outhouse on it is owned by the miners, the railroads, AND the fort captain. Just about a year ago, miners digging in the shadow of Fort Rossdorf struck the mother lode! But it wasn\'t gold, and it wasn\'t silver. No, my friend, it was just a little spring. Not any ordinary spring, though! It was a torrent of that mind-marbling drink the locals call "Wacky Water!"


Now that water\'s done what the sun and the wind couldn\'t do: it\'s made those landholders brave enough to take matters into their own hands. Now they\'ll use whatever means they can to bowl over the competition and lay claim to the only fertile spots left in town! Now the only thing stoppin\' \'em is the Town Charter Amendment #5, which states: "no landholder may move, remove, or detonate any outhouse without a majority vote of the Town Citizens..." Now one thing\'s for sure: something\'s gonna stink in Rossdorf, purty darn soon.....


In Wacky Wacky West you and your fellow townfolk place track tiles, street tiles, and river tiles hoping to destroy your rivals\' buildings. Every time someone tries to build over a precious outhouse, the town votes! You try to enlist your supporters (represented by cards) to vote with you to stop or encourage the play of certain tiles-perhaps saving some of your buildings or taking out those of your dastardly opponents.

', + thumbnail: 'https://cf.geekdo-images.com/Jc9Is7OyYz0NdWN_CDBi5g__thumb/img/SY3pxFgAkFbx2o7okAWQdNIpfEY=/fit-in/200x150/filters:strip_icc()/pic786075.jpg', + image: 'https://cf.geekdo-images.com/Jc9Is7OyYz0NdWN_CDBi5g__original/img/XmlNNTdyuc3L-TIV2xbSda54ldw=/0x0/filters:format(jpeg)/pic786075.jpg', + cardSets: { + id: 96210 + }, + honors: [ + { + name: '1991 Deutscher Spiele Preis Best Family/Adult Game 3rd Place', + id: 19890 + }, + { + name: '1991 Spiel des Jahres Winner', + id: 8684 + } + ], + podcastEpisodes: [ + { + id: 492522, + title: '53. In Honor of Klaus Teuber' + }, + { + id: 86191, + title: 'BGTG 115 - Spiel des Jahres, Then & Now' + }, + { + id: 87673, + title: 'Drunter and Druber' + }, + { + id: 95270, + title: 'Durchgespielt – Spiel des Jahres 1991: Drunter und Drüber' + }, + { + id: 14673, + title: 'OBG 049: Social Contracts' + }, + { + id: 86518, + title: 'Wacky Wacky West' + }, + { + id: 22341, + title: 'Wacky Wacky West' + } + ], + categories: [ + { + name: 'American West', + id: 1055 + }, + { + name: 'Bluffing', + id: 1023 + }, + { + name: 'City Building', + id: 1029 + } + ], + versions: [ + { + name: 'English edition', + id: 64618 + }, + { + name: 'German fifth edition', + id: 29526 + }, + { + name: 'German first edition', + id: 24704 + }, + { + name: 'German fourth edition', + id: 402042 + }, + { + name: 'German second edition', + id: 24705 + }, + { + name: 'German third edition', + id: 402041 + } + ], + subdomains: [ + { + name: 'Family Games', + id: 5499 + } + ], + publishers: [ + { + name: 'Hans im Glück', + id: 133 + }, + { + name: 'Mayfair Games', + id: 10 + } + ], + artists: [ + { + name: 'Chris McGloughlin', + id: 35234 + }, + { + name: 'Franz Vohwinkel', + id: 11883 + } + ], + designers: [ + { + name: 'Klaus Teuber', + id: 11 + } + ], + mechanics: [ + { + name: 'Tile Placement', + id: 2002 + }, + { + name: 'Voting', + id: 2017 + } + ], + comments: [ + { + username: '100pcBlade', + rating: 6, + comment: 'Not played this for years and I can remember little about it other than it was ok' + }, + { + username: '4Corners', + rating: 6.5, + comment: 'Combines tile-laying with a very good bluffing component, resulting in silly fun. Decent for 2, much better for 3-4 players. A good "gateway" game, very light, and actually quite language independent, provided you print off a copy of the rules in English.' + }, + { + username: 'a100000001', + rating: 'N/A', + comment: 'played' + }, + { + username: 'a2b2c517', + rating: 6, + comment: 'คล้ายๆ Clans ตรงที่สีของตัวเองเป็นความลับ แต่อันนี้เล่นง่ายกว่า setup สั้นกว่า ดักทางง่ายกว่า แต่ยังไงก็ชอบ clans มากกว่านะ' + }, + { + username: 'aaarg_ink', + rating: 5, + comment: '130923 Cute hidden identity game. I wouldn't say its the most awesome thing out there, but not a bad SDJ winner either.' + }, + { + username: 'Aarontu', + rating: 7, + comment: 'An interesting game where you make walls/roads/rivers by laying tiles. You try to destroy other people's buildings while keeping your own in tact, the twist being that everyone's building type is secret until the end of the game. The theme and back story is absolutely zany and nonsensical, but funny. :p' + }, + { + username: 'ACTP', + rating: 'N/A', + comment: 'Played by lo' + }, + { + username: 'AdlerCiv', + rating: 'N/A', + comment: 'in Eda (Karton 4)\n\nSleeved with Ultimate Guard - Mini European: Premium (UGD010277, 50/pack) - (46 x 71mm) - 48 cards' + }, + { + username: 'Aelf', + rating: 6.9, + comment: 'Druntering and Drubering is a hell of a lot of fun, which is good since you do a hell of a [b]lot[/b] of Druntering [b]and[/b] Drubering in this game, sometimes both at once. By the end you'll be too tired to Drunt and too exhausted to Drube.' + }, + { + username: 'AgentMeat', + rating: 8, + comment: 'Got this game when I was very young and while a lot of games can't stand the test of time this one is still super fun' + }, + { + username: 'Agrajag', + rating: 5, + comment: 'Owned and sold. Not bad but we'll never play it again.' + }, + { + username: 'ahchong', + rating: 5, + comment: 'play once, don't get it... maybe play with wrong rules.' + }, + { + username: 'Airball', + rating: 'N/A', + comment: '3 - 4 (4)' + }, + { + username: 'Ajax', + rating: 6, + comment: 'Not bad. Good amount of bluffing and limited voting/veto power. I'm not the biggest fan of hidden identities, but at least this one is pretty short. It seems like the luck of the draw is a fairly big factor in the game.' + }, + { + username: 'akapastorguy', + rating: 7, + comment: 'A very good game - and the variant cards included are a nice change of pace. Shame I don't get to play it more.' + }, + { + username: 'akio', + rating: 5, + comment: '麻美実家' + }, + { + username: 'Alea Istropolitana', + rating: 'N/A', + comment: 'Hieroným' + }, + { + username: 'AlexFab4', + rating: 'N/A', + comment: 'Never played\n\nBought for 1.50€ on ebay because it was nominated Spiel des Jahres in the year that I was born. It's probably gonna be unplayed for a long time.' + }, + { + username: 'altair79', + rating: 6.5, + comment: 15 + }, + { + username: 'alturniansky', + rating: 'N/A', + comment: 'always looked intriguing to me, never been sufficently omtivated to get it.' + }, + { + username: 'alvae64', + rating: 'N/A', + comment: 'Purchased from Jon Pessano on September 2007' + }, + { + username: 'AmassGames', + rating: 8, + comment: 'Great, ending is a little weird\n\n[youtube=3UlemM6lR2k]\n\nhttps://youtu.be/3UlemM6lR2k' + }, + { + username: 'amortera', + rating: 7, + comment: 7 + }, + { + username: 'AnakinOU', + rating: 6, + comment: 'Attractive art, unique theme, and hidden "characters" adds up to a pretty decent game. Another "Step 2 Gateway Game."' + }, + { + username: 'AnKot', + rating: 'N/A', + comment: 'in Poznan' + }, + { + username: 'Antimage27', + rating: 9, + comment: 334 + }, + { + username: 'antoinedebruxelles', + rating: 7, + comment: 'Collected dust for ages, as I bought it when I was buying almost every game possible, tought about selling it but wanted to try it at least once (only normal!).\n\nTurned out to be a clever game, quite enjoyable, so I keep it, even if it is one the ugliest box I own.' + }, + { + username: 'apecage', + rating: 6, + comment: 'I have to rate it highly. I won first time out.' + }, + { + username: 'arasawa', + rating: 'N/A', + comment: 'ドリュンタードリューバー (3〜4)' + }, + { + username: 'Area51', + rating: 4, + comment: 'Fun? No,fuaaaaahhh...sleepy.' + }, + { + username: 'arnest_r', + rating: 6.5, + comment: 'should've played again maybe, but not compelled to do so...' + }, + { + username: 'asccnes', + rating: 'N/A', + comment: 'J0014' + }, + { + username: 'aspillner', + rating: 'N/A', + comment: 'gespendet' + }, + { + username: 'ataniker', + rating: 6, + comment: 'Sleeved' + }, + { + username: 'atholbrose', + rating: 6, + comment: 'I can only take so many advance-the-cause-of-your-secret-identity games; with Familienbande in my collection, I don't really feel the need for another. (The shortness of the game and the fun of building the family tree in that game outweighs any concern I have about unfairness/lack-of-subtlety-in-my-play.) Still, once it started, this was playable enough.\n\nThat may be the most hyphens I've ever used in one comment.' + }, + { + username: 'Attila', + rating: 'N/A', + comment: 3 + }, + { + username: 'Audacon', + rating: 5.5, + comment: 'Odd game with an odd theme. the game plays out will many similar aspects to a connection game, but with no clear objective of where you are going. Amusing the first time it is played, the game on its own over time is not all that gripping. Has a definite feel of an early design when the hobby explosion of the 90s took place,' + }, + { + username: 'Aurry86', + rating: 'N/A', + comment: 'Bontott, hibátlan és hiánytalan. Kártyák fóliázva, minden jelölő külön zacskózva. Német nyelvű. 3.000 Ft' + }, + { + username: 'avct', + rating: 'N/A', + comment: 'Hunk Lin' + }, + { + username: 'backpacker', + rating: 'N/A', + comment: 'NIS (ff)' + }, + { + username: 'Baldur12c', + rating: 6, + comment: 'Standort: Düsseldorf' + }, + { + username: 'BaluMG', + rating: 8.5, + comment: 'simple but good...\nno hidden tiles, minimum luck... :)' + }, + { + username: 'Bankler', + rating: 5, + comment: 'I really like the "Jaaaaa!!" and "Neinnnn!" cards, but nothing else about the game sticks out in my mind.' + }, + { + username: 'BastardCafe', + rating: 'N/A', + comment: '1 25.1' + }, + { + username: 'bayspiel', + rating: 'N/A', + comment: '07.01.01.02' + }, + { + username: 'bayspiel', + rating: 'N/A', + comment: '07.01.01.02' + }, + { + username: 'bayspiel', + rating: 'N/A', + comment: '07.01.01.02' + }, + { + username: 'bayspiel', + rating: 'N/A', + comment: '07.01.01.02' + }, + { + username: 'bb-allerlei', + rating: 5, + comment: 'Was ok - don't mind if I never play it again.' + }, + { + username: 'bbkoene', + rating: 5, + comment: 'Once Spiel des Jahres but it seems that this game hasn't survive its age.' + }, + { + username: 'Bellaatje', + rating: 'N/A', + comment: 'I bought this game long time ago, but can't remember me playing it anymore.' + }, + { + username: 'BeloW06', + rating: 6, + comment: 'Drunter & Drüber\nRoute building game with a vote triggered when building over toilets. It was not as much fun as I hoped for, but I enjoyed it.' + }, + { + username: 'Bengst', + rating: 'N/A', + comment: 'Signiert von: Klaus Teuber' + }, + { + username: 'Benjamin1109', + rating: 6, + comment: 'Drunter & Drüber' + }, + { + username: 'Benjaminviking', + rating: 6.5, + comment: 'Purchased at GameStorm 18--Side deal' + }, + { + username: 'benni_jolink', + rating: 6.5, + comment: 'funny concept, but gameplay gets really repetitive after you've played it a couple of times.' + }, + { + username: 'betsychuck', + rating: 7, + comment: 'Drunter und Druber' + }, + { + username: 'BettyEgan', + rating: 6, + comment: '$10' + }, + { + username: 'BGGJeffBergziege', + rating: 2.8, + comment: 'Gekauft als Spiel des Jahres.\nDie Anleitung war damals doof, und wir haben das Spiel immer wieder begonnen, aber nicht beendet. Klaus Teuber ist ein genialer Spieleerfinder, aber das hier macht uns keinen Spaß.' + }, + { + username: 'Big Bad Lex', + rating: 7, + comment: 'Simple yet highly strategic game. Very quick filler but quite deep. Variant seems a bit lame.' + }, + { + username: 'bigchief', + rating: 5, + comment: 'A simple, light game that you have little control over. Basically, you are trying to divert the city growth away from your establishments which wouldn't be difficult, but you have three other people trying to cover your territory up. You make the best tactical decision you can and move on. Just okay for me, but would recommend for those who like light games and don't mind a bit of choas.' + }, + { + username: 'BillSkulley', + rating: 5, + comment: 'Kind of fun, sort of odd... only played once, but I found myself thinking "why even put the 5 buildings on the board.. or the 4s... or the 3s... or..."' + }, + { + username: 'binraix', + rating: 9, + comment: 'Played this game in army for the first time with buddies and we all liked the game.\nOne of the oldest building games and quite good one as well.' + }, + { + username: 'bippi', + rating: 5, + comment: 'This was a pretty massive let-down that really didn't scratch ANY itch. It sucked, because I was sure this was going to be a hoot, and while it wasn't bad, I definitely have some better stuff.\n\nTaken by itself, it's not a horrible game... it's just very bland.' + }, + { + username: 'Black Saint', + rating: 7, + comment: '(Drunter und Druber) bought from Mark' + }, + { + username: 'Blott', + rating: 6, + comment: 'Everyone talks about how the Spiel des Jahres is a huge factor in the gaming industry. They say that games which attain that title are bound for greatness (at least in sales figures.) So I found it very strange that a game which won the SdJ in 1991 took almost 20 years to reach the American market. But, in general, SdJ winners have gone over very well with my family, so I knew it needed to be added to my collection ASAP. When I read the rules I had really high hopes for the game too, because of the wacky theme and one of my favorite mechanisms (hidden goals.)\n\nUnfortunately this game just didn't light my world on fire. It is OK, but there doesn't seem to be anything really special or unique about the game that makes me want to play it again. Perhaps with some more plays I'll understand more of the strategies, but upon the first play it seemed really difficult to have much control over what buildings get covered. The voting almost seems like a sideshow that doesn't really give the players enough power to change what others are doing. I'll try the game some more, but I'm really not expecting much. The game is just kind of meh, nothing great and nothing awful.' + }, + { + username: 'blutovs', + rating: 5, + comment: 'I'm not sure I see the Spiele des Jahres winner here. I think the western theme is boring and would rather have the German version.' + }, + { + username: 'bmyork', + rating: 'N/A', + comment: 'German version.' + }, + { + username: 'Boardgamebudapest', + rating: 'N/A', + comment: 'D 11' + }, + { + username: 'Bobby4th', + rating: 'N/A', + comment: '[COLOR=#006600][size=14]Owned and unplayed.[/size][/COLOR]' + }, + { + username: 'bohemian_eye', + rating: 7.2, + comment: 'I really want to revisit this game sometimes. So much fun!' + }, + { + username: 'boltongeordie', + rating: 7.5, + comment: 'Interesting and enjoyably nasty little game with hidden objectives and the opportunity for plenty of spite.' + }, + { + username: 'BonnieD24', + rating: 8, + comment: 'Very fun bluffing game. Cool tiles, neat voting mechanism.' + }, + { + username: 'boris74', + rating: 'N/A', + comment: 'Spiel des Jahres 1991' + }, + { + username: 'botez', + rating: 5, + comment: 'My gaming group just couldn't get into this one.' + }, + { + username: 'Brainwash', + rating: 6.5, + comment: 'I played this in the boardgameclub February 2004. We played it with 4 players. It was real fun. I had to expose the building under my protection quite fast already but it didn't ruin the game that much.' + }, + { + username: 'bresano', + rating: 'N/A', + comment: 0 + }, + { + username: 'brettspielverein_kuf', + rating: 'N/A', + comment: 'Rene H | Erklärer: , , , ,' + }, + { + username: 'BUCFAN', + rating: 4, + comment: 'game looks fun, reading the rules it sounds fun...fell flat everytime I've played it' + }, + { + username: 'bullseye008', + rating: 5, + comment: 'Silly is the first word I think of to describe this game. Good to pull out with non-gamers on occasion.' + }, + { + username: 'bwechner', + rating: 6, + comment: 'One of the earliest games in the German genre I remember playing. Played it a lot an dloved it as a two player game. Since then have come to see it as a nice and simple intersting game but not so wildly thrilling or challenging. A load of luck involved basically, but a very nice threme and graphic and easy to introduce people to, with a reasonable amount of tension behind the luck elemnt. In its own way this has parallels to Ticket to Ride.' + }, + { + username: 'cactusse', + rating: 5, + comment: '[b]-- After 1 play --[/b]\n\nSlightly dated, but still enjoyable.\n\nInteresting is that players start with random assortment of tiles, which create fun asymmetry - some will have more tiles to expand river, some will have more tiles for building walls, so they have different impact on different parts of the board. \nUnfortunately, it sometimes cause you to be at mercy of your opponents, and it seems like frequently there is nothing to be done to prevent major loss of points.\n\nStill, there are moments when you can do some sneaky and clever moves, and secret goals of opponents are not easy to deduce.\n\nIt is impressive, given age of this game and simple rules, that designer was able to cram it with asymmetric starting conditions, bluffing, negotiations and subtle subterfuge.' + }, + { + username: 'Califax', + rating: 6, + comment: 'Quite good at that time. But you don't have much control in multiplayer base game.' + }, + { + username: 'candoo', + rating: 7, + comment: 'I was really pleasantly surprised by the gameplay in this one. I like deduction games and this one is a fun, quick one.' + }, + { + username: 'carlosmlisboa', + rating: 'N/A', + comment: 14 + }, + { + username: 'carlosmlisboa', + rating: 'N/A', + comment: 14 + }, + { + username: 'CassieB27', + rating: 'N/A', + comment: 'Spiel des Jahres 1991' + }, + { + username: 'casterman', + rating: 'N/A', + comment: '9/27/06 - recent order from Germany.' + }, + { + username: 'catsy83', + rating: 'N/A', + comment: 'Recently acquired original German version...still waiting for delivery (and hoping I didn't get scammed).' + }, + { + username: 'cberg', + rating: 6, + comment: 'Good family fun. I'm not sure that it really feels like an SdJ winner, but it was fairly early on in SdJ history and I am not familiar with what it was up against.' + }, + { + username: 'cbrua', + rating: 6, + comment: 'Light, amusing negotiation game with a touch of strategic tile play. Goofy theme keeps the game lightheared, which is a must since watching everyone vote "Jaaa!" to plow under your "5" building can hurt your feelings! ;-)' + }, + { + username: 'CDRodeffer', + rating: 'N/A', + comment: 'Sounds interesting. I may be willing to trade for a copy.' + }, + { + username: 'cdscholl', + rating: 'N/A', + comment: 'Purge guy made it sound fairly forgettable, but the comments changed my mind. Tom Vassel seemed to really like it in his video review, as well, gave it 6.5\n\n2-4; 8+; 60min' + }, + { + username: 'Celtic', + rating: 7, + comment: 'A pre-Catan Teuber; who could tell that was ahead from this fun but rather peculiar game of 'don't knock down the public toilet'!' + }, + { + username: 'Chaaber', + rating: 'N/A', + comment: 'ENG, niezależna językowo.' + }, + { + username: 'chaddyboy_2000', + rating: 5, + comment: 'I love how outhouses are the most important buildings! A silly enough game that's sorta fun once in a while.' + }, + { + username: 'charlesf', + rating: 6.5, + comment: 'Fine family game. FUN. But my wee brother is less keen on it, so it doesn't often make it to the table.' + }, + { + username: 'CharlieWonka', + rating: 7, + comment: 'First play finally had of this game which is unbelieveably 20 years old. Went down really well. Nice and simple voting game with lots of options. Try to steer the walls, streets and river away from your buildings by placing tiles. Tricky but so simple and easy. 1 Play.' + }, + { + username: 'Chazar', + rating: 4, + comment: 'The card-bidding can be fun, but for such a game mechanic I would rather play "Adel Verpflichtet" at any given time. The building and blocking, sounds nice, but the game always ends way before your ingenious schemes can be truly completed...' + }, + { + username: 'cheeseviking', + rating: 6, + comment: 'Ridiculous theme. Simple tile laying game with an interesting voting mechanic. This mechanical duo sounds like it could be refined and slipped into a newer game' + } + ], + id: 19, + suggestedPlayers: { + results: [ + { + numPlayers: '1', + best: 0, + recommended: 0, + notRecommended: 12 + }, + { + numPlayers: '2', + best: 3, + recommended: 4, + notRecommended: 13 + }, + { + numPlayers: '3', + best: 6, + recommended: 9, + notRecommended: 3 + }, + { + numPlayers: '4', + best: 18, + recommended: 3, + notRecommended: 0 + }, + { + numPlayers: '4+', + best: 0, + recommended: 0, + notRecommended: 9 + } + ], + totalVotes: 25 + }, + languageDependence: { + results: [ + { + level: 6, + description: 'No necessary in-game text', + numVotes: 3 + }, + { + level: 7, + description: 'Some necessary text - easily memorized or small crib sheet', + numVotes: 4 + }, + { + level: 8, + description: 'Moderate in-game text - needs crib sheet or paste ups', + numVotes: 0 + }, + { + level: 9, + description: 'Extensive use of text - massive conversion needed to be playable', + numVotes: 0 + }, + { + level: 10, + description: 'Unplayable in another language', + numVotes: 0 + } + ], + totalVotes: 7 + }, + suggestedPlayerAge: { + results: [ + { + age: '2', + numVotes: 0 + }, + { + age: '3', + numVotes: 0 + }, + { + age: '4', + numVotes: 0 + }, + { + age: '5', + numVotes: 0 + }, + { + age: '6', + numVotes: 2 + }, + { + age: '8', + numVotes: 4 + }, + { + age: '10', + numVotes: 3 + }, + { + age: '12', + numVotes: 0 + }, + { + age: '14', + numVotes: 0 + }, + { + age: '16', + numVotes: 0 + }, + { + age: '18', + numVotes: 0 + }, + { + age: '21 and up', + numVotes: 0 + } + ], + totalVotes: 9 + } + } +] \ No newline at end of file diff --git a/test/fixtures/language.ts b/test/fixtures/language.ts new file mode 100644 index 0000000..2c8ec18 --- /dev/null +++ b/test/fixtures/language.ts @@ -0,0 +1,34 @@ +export const MERGED_LANGUAGE = { + results: { + result: [ + { + level: 1, + value: 'No necessary in-game text', + numVotes: 7 + }, + { + level: 2, + value: 'Some necessary text - easily memorized or small crib sheet', + numVotes: 22 + }, + { + level: 3, + value: 'Moderate in-game text - needs crib sheet or paste ups', + numVotes: 50 + }, + { + level: 4, + value: 'Extensive use of text - massive conversion needed to be playable', + numVotes: 1 + }, + { + level: 5, + value: 'Unplayable in another language', + numVotes: 0 + } + ] + }, + titles: 'language_dependence', + title: 'Language Dependence', + totalVotes: 80 +} \ No newline at end of file diff --git a/test/fixtures/parser.ts b/test/fixtures/parser.ts new file mode 100644 index 0000000..a8270b2 --- /dev/null +++ b/test/fixtures/parser.ts @@ -0,0 +1,60 @@ +export const XML_STRING = ` + + +Battleground: Crossbows & Catapults +2007 + + +Battleground: Crossbows & Catapults – Tower Attack Expansion Pack +2007 + + +` + +export const PARSED_XML = { + boardgames: { + boardgame: [ + { + titles: [ + { + name: 'Battleground: Crossbows & Catapults', + attributes: { + primary: true + } + } + ], + yearPublished: 2007, + attributes: { + id: 30328 + } + }, { + titles: [ + { + name: 'Battleground: Crossbows & Catapults – Tower Attack Expansion Pack', + attributes: { + primary: true + } + } + ], + yearPublished: 2007, + attributes: { + id: 30326 + } + } + ], + attributes: { + termsofuse: 'https://boardgamegeek.com/xmlapi/termsofuse' + } + } +} + +export const MERGED_ATTRIBUTES = { + titles: [ + { + name: 'Battleground: Crossbows & Catapults', + primary: true + } + ], + yearPublished: 2007, + id: 30328 +} \ No newline at end of file diff --git a/test/fixtures/player-age.ts b/test/fixtures/player-age.ts new file mode 100644 index 0000000..40fadbd --- /dev/null +++ b/test/fixtures/player-age.ts @@ -0,0 +1,57 @@ +export const MERGED_PLAYER_AGE = { + results: { + result: [ + { + value: '2', + numVotes: 0 + }, + { + value: '3', + numVotes: 0 + }, + { + value: '4', + numVotes: 0 + }, + { + value: '5', + numVotes: 0 + }, + { + value: '6', + numVotes: 3 + }, + { + value: '8', + numVotes: 23 + }, + { + value: '10', + numVotes: 36 + }, + { + value: '12', + numVotes: 20 + }, + { + value: '14', + numVotes: 4 + }, + { + value: '16', + numVotes: 0 + }, + { + value: '18', + numVotes: 0 + }, + { + value: '21 and up', + numVotes: 0 + } + ] + }, + titles: 'suggested_playerage', + title: 'User Suggested Player Age', + totalVotes: 86 +} \ No newline at end of file diff --git a/test/fixtures/poll.ts b/test/fixtures/poll.ts new file mode 100644 index 0000000..6dcb634 --- /dev/null +++ b/test/fixtures/poll.ts @@ -0,0 +1,160 @@ +export const POLL_MERGED = { + results: [ + { + result: [ + { + value: 'Best', + numVotes: 0 + }, + { + value: 'Recommended', + numVotes: 5 + }, + { + value: 'Not Recommended', + numVotes: 189 + } + ], + numPlayers: '1' + }, + { + result: [ + { + value: 'Best', + numVotes: 7 + }, + { + value: 'Recommended', + numVotes: 66 + }, + { + value: 'Not Recommended', + numVotes: 162 + } + ], + numPlayers: '2' + }, + { + result: [ + { + value: 'Best', + numVotes: 18 + }, + { + value: 'Recommended', + numVotes: 155 + }, + { + value: 'Not Recommended', + numVotes: 64 + } + ], + numPlayers: '3' + }, + { + result: [ + { + value: 'Best', + numVotes: 103 + }, + { + value: 'Recommended', + numVotes: 135 + }, + { + value: 'Not Recommended', + numVotes: 13 + } + ], + numPlayers: '4' + }, + { + result: [ + { + value: 'Best', + numVotes: 163 + }, + { + value: 'Recommended', + numVotes: 83 + }, + { + value: 'Not Recommended', + numVotes: 10 + } + ], + numPlayers: '5' + }, + { + result: [ + { + value: 'Best', + numVotes: 163 + }, + { + value: 'Recommended', + numVotes: 74 + }, + { + value: 'Not Recommended', + numVotes: 12 + } + ], + numPlayers: '6' + }, + { + result: [ + { + value: 'Best', + numVotes: 64 + }, + { + value: 'Recommended', + numVotes: 120 + }, + { + value: 'Not Recommended', + numVotes: 45 + } + ], + numPlayers: '7' + }, + { + result: [ + { + value: 'Best', + numVotes: 56 + }, + { + value: 'Recommended', + numVotes: 120 + }, + { + value: 'Not Recommended', + numVotes: 51 + } + ], + numPlayers: '8' + }, + { + result: [ + { + value: 'Best', + numVotes: 7 + }, + { + value: 'Recommended', + numVotes: 17 + }, + { + value: 'Not Recommended', + numVotes: 130 + } + ], + numPlayers: '8+' + } + ], + titles: 'suggested_numplayers', + title: 'User Suggested Number of Players', + totalVotes: 295 +} \ No newline at end of file diff --git a/test/fixtures/search.ts b/test/fixtures/search.ts new file mode 100644 index 0000000..85ef806 --- /dev/null +++ b/test/fixtures/search.ts @@ -0,0 +1,25 @@ +export const XML_NONE = ` + + +` +export const XML_SINGLE = ` + + +Evenfall +2023 + + +` +export const XML_MULTIPLE = ` + + +Stroganov +2021 + + +Stroganov: Big Box +2024 + + +` + diff --git a/test/language.test.ts b/test/language.test.ts new file mode 100644 index 0000000..37266ed --- /dev/null +++ b/test/language.test.ts @@ -0,0 +1,39 @@ +import { test, describe, expect } from 'bun:test' +import { parseLanguageDependence } from '../src/utils/parser' +import { MERGED_LANGUAGE } from './fixtures/language' + +describe('language parser', () => { + test('correctly parses language dependencies', () => { + const result = parseLanguageDependence(MERGED_LANGUAGE as any) + expect(result).toEqual({ + results: [ + { + level: 1, + description: 'No necessary in-game text', + numVotes: 7 + }, + { + level: 2, + description: 'Some necessary text - easily memorized or small crib sheet', + numVotes: 22 + }, + { + level: 3, + description: 'Moderate in-game text - needs crib sheet or paste ups', + numVotes: 50 + }, + { + level: 4, + description: 'Extensive use of text - massive conversion needed to be playable', + numVotes: 1 + }, + { + level: 5, + description: 'Unplayable in another language', + numVotes: 0 + } + ], + totalVotes: 80 + }) + }) +}) \ No newline at end of file diff --git a/test/parser.test.ts b/test/parser.test.ts new file mode 100644 index 0000000..7cee6a4 --- /dev/null +++ b/test/parser.test.ts @@ -0,0 +1,59 @@ +import { test, describe, expect } from 'bun:test' +import { mergeAttributes, xmlParser } from '../src/utils/parser' +import { XML_STRING, PARSED_XML } from './fixtures/parser' + +describe('xml parser', () => { + test('correctly parses XML from BGG Api', () => { + const response = xmlParser.parse(XML_STRING) + expect(response).toEqual({ + boardgames: { + boardgame: [ + { + titles: [ + { + name: 'Battleground: Crossbows & Catapults', + attributes: { + primary: true + } + } + ], + yearPublished: 2007, + attributes: { + id: 30328 + } + }, { + titles: [ + { + name: 'Battleground: Crossbows & Catapults – Tower Attack Expansion Pack', + attributes: { + primary: true + } + } + ], + yearPublished: 2007, + attributes: { + id: 30326 + } + } + ], + attributes: { + termsofuse: 'https://boardgamegeek.com/xmlapi/termsofuse' + } + } + }) + }) + + test('correctly merge attributes', () => { + const merged = mergeAttributes(PARSED_XML.boardgames.boardgame[0]) + expect(merged).toEqual({ + titles: [ + { + name: 'Battleground: Crossbows & Catapults', + primary: true + } + ], + yearPublished: 2007, + id: 30328 + }) + }) +}) \ No newline at end of file diff --git a/test/player-age.test.ts b/test/player-age.test.ts new file mode 100644 index 0000000..696039e --- /dev/null +++ b/test/player-age.test.ts @@ -0,0 +1,62 @@ +import { test, describe, expect } from 'bun:test' +import { parseSuggestedPlayerAge } from '../src/utils/parser' +import { MERGED_PLAYER_AGE } from './fixtures/player-age' + +describe('player age parser', () => { + test('correctly parses player age recommendations', () => { + const result = parseSuggestedPlayerAge(MERGED_PLAYER_AGE as any) + expect(result).toEqual({ + results: [ + { + age: '2', + numVotes: 0 + }, + { + age: '3', + numVotes: 0 + }, + { + age: '4', + numVotes: 0 + }, + { + age: '5', + numVotes: 0 + }, + { + age: '6', + numVotes: 3 + }, + { + age: '8', + numVotes: 23 + }, + { + age: '10', + numVotes: 36 + }, + { + age: '12', + numVotes: 20 + }, + { + age: '14', + numVotes: 4 + }, + { + age: '16', + numVotes: 0 + }, + { + age: '18', + numVotes: 0 + }, + { + age: '21 and up', + numVotes: 0 + } + ], + totalVotes: 86 + }) + }) +}) \ No newline at end of file diff --git a/test/poll.test.ts b/test/poll.test.ts new file mode 100644 index 0000000..ce76ad9 --- /dev/null +++ b/test/poll.test.ts @@ -0,0 +1,68 @@ +import { test, describe, expect } from 'bun:test' +import { parseSuggestedPlayers } from '../src/utils/parser' +import { POLL_MERGED } from './fixtures/poll' + +describe('poll parser', () => { + test('correctly parses polls', () => { + const result = parseSuggestedPlayers(POLL_MERGED as any) + expect(result).toEqual({ + results: [ + { + numPlayers: '1', + best: 0, + recommended: 5, + notRecommended: 189 + }, + { + numPlayers: '2', + best: 7, + recommended: 66, + notRecommended: 162 + }, + { + numPlayers: '3', + best: 18, + recommended: 155, + notRecommended: 64 + }, + { + numPlayers: '4', + best: 103, + recommended: 135, + notRecommended: 13 + }, + { + numPlayers: '5', + best: 163, + recommended: 83, + notRecommended: 10 + }, + { + numPlayers: '6', + best: 163, + recommended: 74, + notRecommended: 12 + }, + { + numPlayers: '7', + best: 64, + recommended: 120, + notRecommended: 45 + }, + { + numPlayers: '8', + best: 56, + recommended: 120, + notRecommended: 51 + }, + { + numPlayers: '8+', + best: 7, + recommended: 17, + notRecommended: 130 + } + ], + totalVotes: 295 + }) + }) +}) \ No newline at end of file diff --git a/test/rename-properties.test.ts b/test/rename-properties.test.ts new file mode 100644 index 0000000..6ac26be --- /dev/null +++ b/test/rename-properties.test.ts @@ -0,0 +1,21 @@ +import { test, describe, expect } from 'bun:test' +import { renameProperties } from 'src/utils/names' + +describe('rename properties', () => { + test('correctly renames properties in object', () => { + const result = renameProperties({ + titles: [ + { + name: 'Battleground: Crossbows & Catapults', + } + ] + }) + expect(result).toEqual({ + titles: [ + { + title: 'Battleground: Crossbows & Catapults' + } + ] + }) + }) +}) \ No newline at end of file diff --git a/test/search.test.ts b/test/search.test.ts new file mode 100644 index 0000000..a36f351 --- /dev/null +++ b/test/search.test.ts @@ -0,0 +1,35 @@ +import { test, describe, expect } from 'bun:test' +import { XML_NONE, XML_SINGLE, XML_MULTIPLE } from './fixtures/search' +import { parseSearchGame } from 'src' + +describe('search game parser', () => { + test('correctly parses searched games when there is no result found', () => { + const result = parseSearchGame(XML_NONE) + expect(result).toEqual([]) + }) + test('correctly parses searched games when there is exactly one result', () => { + const result = parseSearchGame(XML_SINGLE) + expect(result).toEqual([ + { + id: 396989, + title: 'Evenfall', + yearPublished: 2023 + } + ]) + }) + test('correctly parses searched games when there are multiple results', () => { + const result = parseSearchGame(XML_MULTIPLE) + expect(result).toEqual([ + { + id: 323156, + title: 'Stroganov', + yearPublished: 2021 + }, + { + id: 388170, + title: 'Stroganov: Big Box', + yearPublished: 2024 + }, + ]) + }) +}) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4a0950e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "lib": ["ESNext"], + "moduleResolution": "bundler", + "esModuleInterop": true, + "noEmit": true, + "allowJs": true, + "allowImportingTsExtensions": true, + "moduleDetection": "force", + "outDir": "dist", + "baseUrl": ".", + "strict": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "declaration": true, + "types": [ + "bun-types" + ], + }, + "include": [ + "src", + "test", + "playground" + ] +} \ No newline at end of file