#tile #tilemap #position #map #svg #text #edge

bin+lib map18xx

18xx 地图和拼图设计器

4 个版本

使用旧的 Rust 2015

0.0.5 2018年2月19日
0.0.4 2018年2月8日
0.0.3 2018年2月4日
0.0.1 2018年1月15日

#496 in 图像

MIT 许可证

110KB
2K SLoC

18xx 地图和拼图生成器

将以确定的方式构建18xx资源。目前专注于拼图清单、可打印的拼图纸和地图。程序接受一组JSON文件,这些文件指定了它应该做什么。它输出到SVG文件,缩放到适合A4纸张。

六边形空间

六边形内的项目通常以六边形空间给出。这是一个三维空间,其中轴相互之间呈60°。下面给出了轴的示例。请注意,当六边形以水平边定向时,轴的方向与以垂直边定向的六边形不同。

除了使用六边形空间中的坐标外,还可以使用以下位置代码作为快捷方式。北是一个具有水平边的六边形的上边,对于垂直定向的六边形,它是顶部左边的边。

  • N: 北边
  • NE: 东北边
  • NW: 西北边
  • S: 南边
  • SE: 东南边
  • SW: 西南边
  • C: 六边形中心

Coordinate system

在指定坐标时,可以使用位置码,通过在适当位置插入上述六个码之一作为字符串(例如:"N""NE"等)来实现。作为替代,您可以使用以下格式指定六边形空间坐标:[<x>, <y>, <z>]其中<x><y><z>都是浮点数。这两种指定坐标的方法可以自由互换。

颜色

以下是可以使用颜色的列表,任何其他颜色字符串都将为黑色。

  • 地面
  • 黄色
  • 绿色
  • 赤褐色
  • 灰色
  • 棕色
  • 红色
  • 蓝色
  • 障碍物
  • 白色

位置

瓦片和标记在地图上有一个位置。可以通过以下两种方式之一指定此位置。第一种是使用与地图坐标相对应的字符串,例如:"G19"是一个这样的坐标。还可以指定为[x, y],其中xy是指定时显示的坐标,当指定了c/--debug-coordinates标志时。前者应该更直观。这些位置指定仅用于地图上的瓦片和标记。

模式

程序可以以几种不同的模式运行,它们在这里进行了描述。

定义

默认情况下,程序以“定义”模式运行,这意味着它将所有当前已知的瓦片定义输出到单个文件definitions.svg。输出包含一个瓦片列表,没有颜色,可用于在游戏中定义其他瓦片。

资产模式

生成瓦片清单(列出游戏中每个瓦片及其总数)和瓦片打印和游戏表,以及打印和玩特定18xx游戏的瓦片。它还会生成一个可以放置瓦片的地图。

新游戏模式

创建一个可用于PBEM的新游戏。游戏允许您在地图上放置瓦片和标记,而不会修改原始地图。

状态模式

生成用于显示由新游戏模式启动的游戏当前状态的文件。它将创建一个地图和清单,反映已放置的瓦片和标记。清单列出了仍然可以放置的瓦片数量。

命令行参数

以下列出了命令行选项:

  • -h--help:显示用法和帮助。当您指定一个模式后跟-h时,将提供该模式的相关帮助。
  • -V--version:显示版本信息并退出
  • -v--verbose:输出调试信息。
  • -c--debug-coordinates:在每个行/列处放置坐标,而不是每隔一行/列。

瓦片定义

要构建一个游戏,首先需要知道有哪些瓦片可用。为了简化瓦片规格,存在瓦片定义,它覆盖了瓦片的可能配置。这些定义包括瓦片上的轨道和车站,但它们还规定了收入圈和其他文本在瓦片上的位置。瓦片定义位于 tiledefs/,每个文件有一个瓦片定义。文件名(.json之前的部分)决定了如何从其他文件引用瓦片。文件内容可以包括

  • 一个名为 paths 的数组,定义瓦片上的线路。
  • 一个名为 cities 的数组,定义瓦片上的可标记地点。
  • 一个名为 stops 的数组,定义瓦片上的不可标记收入位置。
  • 一个名为 text 的数组,定义可以出现在瓦片上的附加文本。
  • 一个 is_lawson 参数,使瓦片中心看起来更漂亮。

is_lawson 参数是一个布尔值,默认为 false。当多条线路在此处交汇时,它将整齐地绘制瓦片中心。瓦片编号始终绘制在右下角,且 text_id = 0

文本 ID

在讨论瓦片上可以定义的内容之前,有必要了解如何指定文本。为了简化起见,瓦片定义指定了瓦片上文本应该放置的位置。这样的位置可以赋予一个名称,名称 number 被保留用于出现在角落之一的瓦片编号。瓦片清单或地图可以指定瓦片上的文本,通过使用以下映射 {"<id>": "text"}。对于某些 ID 可以不指定文本,这些文本将不会被添加。

text 数组

瓦片上的自由文本可以通过 text array 指定。每个条目定义一个写入文本的位置。它们通常看起来像

{
	"id": "code",
	"position": [0.5, 0.0, 0.0],
	"anchor": "Start",
	"size": "120%",
	"weight": 900,
}

idpositionanchor 字段是必需的。sizeweight 字段可以省略,它们分别定义字母的大小和它们的粗细。默认的 size 是 80%,而默认的 weight 由 SVG 渲染器确定。id 字段是上述描述的文本 ID。position 可以是一个十六进制空格坐标或上述“六边形空间”部分中指定的坐标代码。anchor 字段可以是 StartMiddleEnd 中的任何一个。它确定文本如何与指定的 position 对齐。由于只有文本列表可能会令人困惑,因此可以添加一个 purpose 字段。该字段被忽略,但对于人类读者很有用。

paths 数组

为了定义跨过瓦片的线条,您可以使用paths数组。每个条目定义一个路径。它们通常看起来像:

{
	"start": "N",
	"end": [0.1, 0.2, 0.3],
	"is_bridge": true
}

这里有几个要点。首先,是startend键,它们分别定义了路径的起始和结束位置。这些可以采用在“六边形空间”部分定义的位置代码和六边形坐标。

通常路径会绘制有水平交叉。如果路径交叉但不允许在此处切换,可以使用is_bridge键。它的默认值是false。当设置为true时,它会在指定路径与另一路径交叉时绘制白色线条。只需在交叉路径之一上指定即可。

cities数组

可以使用cities数组来定义有代币空间的城镇。每个城镇定义一组最多4个代币圆圈,每个城镇都有自己的收益圆圈。目前无法旋转城镇。城镇可以定义为:

{
	"circles": 2,
	"position": "C",
	"text_id": 1,
	"revenue_position": [0.0, 0.6, 0.0]
}

第一个键是circles键,这决定了可用的代币位置数量。这可以是1到4之间的任何数字,如果指定了其他数量,则会绘制一个红色圆圈,表示这是一个无效的数量。position键指定放置城镇的位置。通常,除了C之外的位置代码没有意义,因为城镇将绘制在瓦片的半边。

要定义收益应位于的位置,可以使用revenue_position键。建议使用六边形坐标。除了revenue_position之外,还有一个text_id,它指定哪个字符串成为收益数字。建议将其设置为1以保持一致性。如果不同城镇获得不同的收益,则它们应具有不同的text_id

stops数组

小型城镇始终以小黑圈的形式呈现。将来,它们可能也可以以虚线形式呈现。一个停靠点定义为:

{
	"position": [0.0, 0.0, 0.0],
	"text_id": 1,
	"revenue_angle": 30
}

停靠点必须具有这三个字段,其他字段将被忽略。position键定义了停靠点的位置。text_id字段指定用于收益的字符串。收益圆圈始终与停靠点保持相同的距离。您可以使用revenue_angle键指定其位置。这是相对于停靠点的收益圆圈应绘制的角度(以度为单位)。

游戏资产模式

通过使用assets作为模式选项,可以将程序置于游戏模式,该模式将生成所有文件以进行PnP游戏。资产模式需要一个额外的NAME参数;这是为生成文件的游戏名称。可用的游戏位于games目录的子目录中。它输出一个名为manifest.svg的瓦片清单和一个名为NAME-sheet-x.svg的文件列表,其中NAME是游戏的名称,x是一个序列号。清单文件包含游戏中每个瓦片的示例以及表示游戏过程中可用的瓦片数量的数字。可以将在A4纸上直接打印的编号图,以创建游戏所需的所有瓦片。还有一个文件指定了公司、它们的颜色和它们的主车站。

瓦片清单

游戏的地砖清单定义在games/GAME/manifest.json中。地砖清单包含一组地砖和一组该地砖在游戏中可使用的频率。可用地砖的定义由tiles数组给出。一个条目看起来像

{
	"color": "green",
	"base_tile": "52",
	"text": {
		"number": "59",
		"revenue": "40",
		"code": "OO"
	}
}

这里有几个元素。第一个是color键,这定义了地砖的颜色。常用的选择有黄色、绿色、栗色和灰色。下一个键是base_tile,它指定了使用哪个地砖定义。这可以是tiledefs/目录中的任何JSON文件。最后是text数组,它指定了地砖定义中的文本ID所引用的字符串。第一个条目总是显示的地砖编号,这不必与base_tile键相同。其他条目的意义取决于用作text_id的地砖定义。

要指定每种地砖的可用数量,有一个amounts映射,它看起来像

"amounts": {
	"1": 1,
	"2": 1,
	"3": 2,
	"4": 2,
	"7": 4
}

它有几个字符串键,这些是在地砖的text映射中定义的"number"对中的地砖编号。冒号之后是游戏过程中可放置的地砖数量。

游戏地图

游戏地图定义在games/GAME/map.json中。它指定了几个字段

{
	"orientation": "Horizontal",
	"scale": 3.81,
	"width": 12,
	"height": 11,
	"barriers": [ ... ],
	"tiles": [ ... ]
}

唯一不需要指定的字段是barriers数组。orientation字段可以是设置为HorizontalVertical,这决定了六边形是否有平边或顶角。scale字段决定了六边形的厘米大小。这是从一个平边测量到其对边。大多数18xx使用3.81的值。widthheight字段分别决定了每行和每列的六边形数量。barriers数组指定了不可通行的六边形边。数组中的每个条目看起来像

{
	"location": "C17",
	"side": "N"
}

location指定了障碍应该出现的地砖,它由一个x和一个y坐标组成。[0, 0]是左上角的地砖。side字段决定了障碍应该出现在哪个边上。只能使用名称,不允许使用六边形空间坐标。因为每个边由两个地砖共享,所以障碍可以指定在任何一个边上。

最后是tiles数组,其条目看起来像

{
	"location": "D1",
	"color": "red",
	"tile": "8,
	"orientation": "S",
	"text": [ ... ],
	"revenue": { ... },
	"arrows": [ ... ],
	"terrain": { ... }
}

在所有这些字段中,只有location是必需的,它定义了指定瓦片的x和y坐标。坐标[0, 0]是左上角的瓦片。也可以使用地图上显示的坐标。这些坐标以"A1"表示,map18xx不支持"1A"格式。color字段指定瓦片的颜色,可以是任何可用的颜色(见‘颜色’)。默认颜色为groundtile字段改变使用的瓦片定义。这应该是一个数字,如tiledefs/目录中所示,而不是游戏清单中指定的。默认瓦片是plain瓦片。text数组定义了用于瓦片定义中每个文本条目的文本。指定瓦片编号的字段被忽略,因此此数组中的第一个元素是用于文本ID的字符串

  1. orientation字段根据需要旋转瓦片。它可以任何瓦片边缘代码,但不能是十六进制-空格坐标。旋转表示瓦片的哪个边缘应该放在北边。revenue对象指定一个可选的收入轨道,关于这个的更多细节稍后说明。arrows数组指定轨道延续箭头的位置,如off-boards上所见。它的每个元素都可以是一个坐标,但将它们放在边缘之外几乎没有意义。

revenue对象看起来像

{
	"position": "C",
	"yellow": "20",
	"green": "30",
	"russet": "40",
	"grey": "50"
}

在这些字段中,只有positionyellow是必需的。position字段指定收入轨道的中心坐标。其他字段都定义了该颜色字段应包含的值。

您可以使用terrain对象指定建筑成本,它看起来像

"terrain": {
	"type": "mountain",
	"cost": "$120",
	"position": "C"
}

其中type可以是roughhillmountainrivermarsh中的任何一个。这指定了表示成本的符号。cost是一个字符串,指定放置瓦片的成本。position确定符号和成本在瓦片上的绘制位置。

公司

游戏中的公司由games/GAME/companies.json指定。此文件由公司映射组成。一个典型的条目看起来像

"B&O" : {
	"name": "Baltimore & Ohio Railroad",
	"color": "blue",
	"home": [7, 8]
},

这里的键(B&O)用于从其他文件引用此公司。它也是将打印在代币上的文本。name字段目前未使用,但它必须存在。color字段指示代币和家预订的颜色。home字段指定家色子和该色子上的家城市(可选)。如果一个瓦片上有多个城市,那么可以使用它来在这些城市之间移动家车站。当你这样做时,你可以将城市编号添加到数组中,使其变为"home": [7, 8, 1]。当你不指定此城市编号时,它默认为0。

新游戏模式

要使用新的游戏模式,您需要使用以下命令:map18xx newgame <game> <name>。这将在当前目录下生成一个名为 <name>.json 的文件,可用于播放 <game>

状态模式

要显示您正在玩的游戏的当前状态,您可以使用状态模式。要使用它,请运行命令 map18xx state <name>,其中 <name> 是您在“新游戏模式”中使用的游戏名称。它将在当前目录中查找名为 <name>.json 的文件。它还接受 --debug-coordinates 命令行参数

要能够玩游戏,您必须修改 log 数组,该数组位于您的 <name>.json 文件中。在这个数组中,您可以放置两种类型的行为:铺设瓷砖和放置代币。要执行这些操作之一,只需将它们追加到数组的末尾。后续操作优先于早期操作,map18xx 不强制执行升级路径。放置瓷砖看起来像

{
	"type": "tilelay",
	"location": "G19",
	"tile": "62",
	"orientation": "NE"
}

要放置瓷砖,必须将 type 字段设置为 tilelaylocation 字段指定了要放置瓷砖的瓷砖。目前,这必须是您使用 --debug-coordinates 时给出的坐标。 tile 字段是如清单中给出的瓷砖编号。 orientation 可以用于旋转瓷砖,清单中显示的瓷砖方向是 N

要放置代币,日志条目看起来像

{
	"type": "token",
	"location": "G19",
	"company": "B&O",
	"city": 1
}

要将 type 字段设置为 token 以放置代币。 location 字段与放置瓷砖相同。 company 字段是公司的缩写。 city 字段是可选的,默认值是 0。您可以使用它来指定在哪个城市放置代币,当瓷砖有多个城市时(例如 1830 中的 OO 或 NY)。对于只有一个城市的瓷砖,这并不是必需的。当您没有指定它,而一个城市有多个车站时,代币将被放置在城市 0。

依赖关系

~6MB
~107K SLoC