A book for a Mage: the Awakened game set in a cyberpunk dystopia.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
24KB

  1. require "prawn"
  2. require "prawn/table"
  3. require "prawn/grouping"
  4. require "pry"
  5. require_relative "spell"
  6. require_relative "spells"
  7. require_relative "merit"
  8. require_relative "merits"
  9. require_relative "primitive_adds"
  10. class Prawn::Document
  11. def background_color(color)
  12. tmp_color = fill_color
  13. canvas do
  14. fill_color color
  15. fill_rectangle [bounds.left, bounds.top], bounds.right, bounds.top
  16. end
  17. fill_color tmp_color
  18. end
  19. end
  20. class Awakened2069
  21. FONT_SIZE_CHAPTER = 48
  22. FONT_SIZE_BODY = 11
  23. FONT_SIZE_SECTION = 24
  24. FONT_SIZE_SUBSECTION = 18
  25. INDENT_SIZE = 25
  26. attr_accessor :pdf, :chapter_title, :section_name
  27. def start_chapter(chapter_name)
  28. @chapter_title = chapter_name
  29. puts "Starting #{chapter_title}"
  30. pdf.start_new_page
  31. pdf.outline.update do
  32. puts "\tAdding #{@awakened2069.chapter_title} on page #{page_number}"
  33. section(@awakened2069.chapter_title, :destination => page_number)
  34. end
  35. puts "\tSetting font size"
  36. pdf.font_size Awakened2069::FONT_SIZE_CHAPTER
  37. pdf.font "Ultramarines"
  38. puts "\tPrinting chapter to document"
  39. pdf.text chapter_title, :align => :center
  40. puts "\tRestoring body text"
  41. pdf.font "Goudy"
  42. pdf.font_size FONT_SIZE_BODY
  43. end
  44. def start_section(section_name)
  45. puts "Beginning section #{section_name}: "
  46. @section_name = section_name
  47. pdf.outline.add_subsection_to(chapter_title) do
  48. @pdf.outline.section section_name, :destination => @pdf.page_number
  49. end
  50. puts "\tSetting font size"
  51. pdf.font "Ultramarines"
  52. pdf.font_size FONT_SIZE_SECTION
  53. pdf.text section_name, :align => :center
  54. puts "\tRestoring body text"
  55. pdf.font_size FONT_SIZE_BODY
  56. pdf.font "Goudy"
  57. end
  58. def generate
  59. @pdf = Prawn::Document.new(:margin => 0)
  60. pdf.font_families.update(
  61. "Goudy" => {
  62. :normal => "goudy.ttf",
  63. :bold => "goudy-bold.ttf",
  64. :italic => "goudy-italic.ttf"
  65. },
  66. "Abess" => {
  67. :normal => "abess.ttf"
  68. },
  69. "Lilith" => {
  70. :normal => "lilith.ttf"
  71. },
  72. "Goblin Hand" => {
  73. :normal => "VTCGoblinHand.ttf",
  74. :bold => "VTCGoblinHandBold.ttf",
  75. :italic => "VTCGoblinHandItalic.ttf"
  76. },
  77. "Ultramarines" => {
  78. :normal => "ultramarines.ttf"
  79. },
  80. "Unispace" => {
  81. :normal => "unispace rg.ttf"
  82. }
  83. )
  84. pdf.outline.instance_variable_set(:@awakened2069, self)
  85. pdf.image("cover.png", :width => 612, :height => 792)
  86. pdf.start_new_page(:margin => 50)
  87. pdf.font "Ultramarines"
  88. pdf.font_size 72
  89. pdf.text "Awakened 2069", :align => :center
  90. pdf.font "Goudy"
  91. pdf.font_size 36
  92. pdf.text "\nGuide To The Mage: the Awakening, Second Edition Game On Discord. \n\nInvite Code:", :align => :center
  93. pdf.font "Unispace"
  94. pdf.text "25MpfjP", :align => :center
  95. pdf.font "Goudy"
  96. pdf.font_size 24
  97. pdf.text "\n\nAll content in this manual is inspired by the Storyteller and the players", :align => :center
  98. start_chapter "Introduction"
  99. pdf.default_leading 5
  100. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  101. start_section "So Last Century"
  102. pdf.text "In the year 2020, they said that \"the future is now!\" In some ways, they were right, but in others they were decidedly incorrect. A lot of the technological promises that were made in past decades never realized, and others entirely unconceived materialized instead. The optimism of the 1950's and 1960's gave way to the policies of the 1990's that would lead to the economic collapse in the 2000's, and from there into the first serious Internet-aged political conflict in the 2010's. The conflict emerged as a combination of bottom-up, grass-roots submovements, and as a consequence of various entities from above meddling in the affairs of the populace.\nNobody was prepared for that conflict, as sociopathic social justice advocates and their opposition, the frustrated, nihilistic dank memers took control of the mainstream institutions. While some of this came about on their own, everybody wanted to blame some higher authority, some foreign government, some ethnic group, or political minority. These people were not entirely off, since only so much can come from above or below, but instead of grand conspiracies of Russian governments, most of the deterioration of society was generated opportunistically by malignant spirits, by Elder Kindred, by Changelings and the True Fae, and, yes, by <b>the Exarchs</b>.\nYouTube, Facebook, Twitter, and every other social media company banned noteworthy voices in the time's contemporary discourse. Universities put a hard clamp down on which perspectives their undergraduate students were allowed to hold, and large corporations mass terminated people who failed to toe the party line. Sure, the political party these institutions were playing favorites with were surely controlled by the Exarchs themselves, but the <i>real</i> thing they were desperately trying to keep under wraps is that the world people lived in was a Lie. A direct consequence of freedom of speech in practice combined with hundreds of millions of smartphones is that people are one idiot supernatural away from turning large swathes of the population into Sleepwalkers, and a decent chunk of them into the Awakened. These Exarchs could have none of that.", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  103. start_section "Changing Times"
  104. pdf.text "The Guardians of the Veil played right into the plans of the Exarchs. They tried to distract the Sleeping world with two approaches. One, they did the standard controlled opposition stunts, where they created immense Labyrinths of nonsensical conspiracy theories that ultimately meant nothing. However, they also tried to distract the Sleeping world with the banning of Holocaust denial videos and the termination of everybody with a wacky conspiracy theory from any form of conventional employment (which is a departure from their historical <i>modus operandi</i>), since they were also frantically deleting videos of vampires coercing children to give them their blood, posts describing exactly how to eliminate Uratha who predated the wives and daughters of the citizenry, and, most importantly, any content betraying or, heaven forbid, detailing the way Supernal magic functioned. Too many were appearing too quickly; it was almost as though supernatural entities became more brazen about exposing their true natures as people's personal recording technology and communication skills increased.\nThe views of the people who knew they were being shut up for political reasons mixed with the realities that politically unaligned people were uploading. The two groups intermingled creating bizarre supernatural conspiracy theories that got many details right, but never quite got the whole picture. There was always something off, something missing or incorrect. The pace of this mixture increased as Guardian and Exarch alike lost control of the conversation. Everybody knew that <i>something fucking huge</i> was up, but very few people knew exactly what. Those holding taboo political views banded together with those openly discussing the supernatural, and began retaliating against this suppression. As the world entered 2020's, the United States fell into civil war from all of this, descending into a Weimerica scenario borne directly of the nightmarish rants of every no-name YouTuber with thirty to fifty subscribers.\n\n", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  105. start_section "The Hammer Comes Down"
  106. pdf.text "During that civil war, the videos stopped. The Internet went black. Cell phone networks suddenly got shut off without explanation. People were plunged into a long-term media blackout as every mainstream institution insisted that nothing out of the ordinary was taking place. This went on for a decade, where Internet access was considered a privilege that could be revoked for any or no reason, at the discretion of one's employer, university, or the government. Almost nobody was granted this access because unrestricted Internet access was considered \"dangerous.\" When it became normal for regular citizens to gain access to this service again, there were no conspiracy theories on the Internet anymore. Everything was normal again.\nThe 2030's were when different corporate entities became the new feudal lords of American society. It was the decade that travel between continents became trivial if you had the money, and a trip to the grocery store became untenable if you did not. Compulsory tracking devices were installed in every newborn American citizen as well as the European Union. The Chinese were even more severe, installing chips that could neural override their citizens on a whim. It was the decade that sophisticated cybernetics and brain-computer-interfaces became commonplace for the wealthy, and cheaper, crappier versions of the same, riddled with bugs, problems, and advertisements became legally mandatory for the poor. It was the decade that all of humankind forever traded away wonder for reason. Or so it seemed...", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  107. start_section "A Dark Age In The Computing Era"
  108. pdf.text "The 2040's and 2050's are now a blur. Nobody knows what really happened. Every week, the news, the university professors, the government, insists something different happened in those two decades. Yet everybody just plays along. It's hard to tell for the Awakened if these people are fully brainwashed or if they are merely pretending so as to avoid getting into some sort of trouble. Possession of books is forbidden, since they are less mutable than websites.\nOne thing is understood, however, is that Pentacle society more or less collapsed in this period. Some people think that the civil war and its consequences were responsible. However, the lack of any known Pentacle Mages born in the 2020's or earlier is an indication that the ones existing in the 2030's through the 2050's either jumped ships to the Seers or were disappeared. Blaming the Seers of the Throne directly for this phenomena is common, but unconfirmed. It's also speculated that Exarchs, Oracles, and other Archmages essentially destroyed the world during this period, and the one that people live in for 2069 is a cheap facsimile of what once was, hence the gap and the nonsensical \"history\" everybody gets fed.\nIt took until the late 2060's for Awakened society to even partially recover. That recovery is ongoing. The old Pentacle Orders have re-emerged, in part due to forbidden records of their existence and histories being uncovered. However, it also seems as though these Orders exist naturally. Maybe they were re-seeded by the Oracles. Maybe it's just the way of the world. People were on the brink of a global Awakening in 2020, but as with all things, the more things change, they more they stay the same. Awakened society in 2069 is easily the most underground of the noteworthy supernatural entities. Demons and Beasts appear to be largely defeated, while Vampires and Werewolves appear to be given a deliberate <i>carte blanche</i>. When an Awakened individual gets too arrogant and betrays what they're <i>actually</i> about, they have a habit of disappearing; not every time, but often enough for \"it's a coincidence\" to be a big reach. It's uncanny the efficiency with which this happens.\nWhat is known, however, is that no Awakened soul today appears to be born before 2030. The young scholars that have emerged seem to have formed a consensus that they were all disappeared much in the way their new friends will be if they get too Hubristic, but nobody seems to have concrete proof of this. It's one of those things that \"everybody knows\" in the Awakened community, yet nobody can prove. This may be because it's total hogwash, but it seems plausible enough that nobody questions it.", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  109. end
  110. start_chapter "Orders"
  111. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  112. pdf.text "The Five Pentacle Orders have re-emerged in spirit if not in the specifics from the previous generations, or at least the ones before 2020. This short chapter should detail the ways in which they are unique to Awakened 2069.", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  113. start_section "The Free Council"
  114. pdf.text "The Free Council is easily the largest Order that has re-emerged. While they were the young bucks, the punks before 2020, they borderline on the norm outright in 2069. Technomages through the 2000's, but pro-LGBT activists in the 2010's, their resurgence has restored them to their more dignified pre-2010 roots. The Free Council are the foremost authorities on cybernetics, artificial intelligence, brain computer interfaces among the Awakened community. Their claim to this domain carries Supernal weight. As such, all such Supernal Cybernetics that are permanent must be acquired through a member of the Free Council of appropriate status. This is no orthopractic issue; it carries such weight that losing one's stature in the Free Council seems to remove one's ability to create permanent Supernal Cybernetics. One simply cannot cast their way into Lasting cybernetic technology. Period.\n<b>Sample Character Concepts:</b> transhumanist ideologue, corporate saboteur, cryptocurrency thief, digital grimoire seeder, cryptographic cracker", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  115. start_section "The Guardians of the Veil"
  116. pdf.text "The Guardians of the Veil hold the least graceful position among the Pentacle Orders due to the fact that they were ultimately Seer pawns in the 2020's. However, they play an important role in 2069 that is not to be disregarded. Since Mages are routinely disappeared whenever they get a bit too obnoxious with their magic in public, the Veil isn't just to protect Sleepers from noticing, but more importantly, Pentacle Mages from Seers and other such malicious entities. Guardians in 2069, as a consequence of being duped in the past, are likely the most rabidly anti-Seer among the Awakened, in that fascists have historically been reformed socialists.\n<b>Sample Character Concepts:</b> safehouse manager, anti-Paradox ideologue, abyssal removal specialist, forcer of memes, good cop/bad cop dualist", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  117. start_section "The Mysterium"
  118. pdf.text "The Mysterium's core beliefs have definitely come to the fore for many Mages, and one thing that has caught the attention of its current members more than any other Order is the verifiable existence of lost history. It is up for debate if Sleepers know that the history from recent decades is entirely lost or if they are merely deluded. Mind-readers seem to get different reads from person to person. However, it is not up for debate to Awakened society; most of what people are told about these decades is completely fabricated. The Mysterium takes particular note of this and Obsessions to the effect of \"what actually happened, here?\" are common themes among its scholarly class.\n<b>Sample Character Concepts:</b> technoarchaeologist, digital archivist, Obsession-addler, secret broker, Artifact hoarder", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  119. start_section "The Silver Ladder"
  120. pdf.text "The Silver Ladder has not lost faith in the possibility of a global Awakening, and will consistently cite the late 2010's as an example of this. They insist that if Awakened society creates conditions similar to it, but precludes more authoritarian elements from cropping up, that this global Awakening will realize. Sometimes this gets derided by the rest of Awakened society, but never to an extent that they are denounced or discarded completely. These people often lead worthy Mystery Cults, and endeavor to create as many Sleepwalkers as possible to in turn maximize their chance of Awakening. So far, this has created mixed results, partly due to the fact that Guardians create their own Mystery Cults that are about distracting the unworthy and stupid with nonsensical gibberish and forced memes.\n<b>Sample Character Concepts:</b> redpilled Internet personality, intersplat negotiator, cult leader, newbie mentor, Awakened judicial watchdog", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  121. start_section "The Adamantine Arrow"
  122. pdf.text "The Adamantine Arrow continues in its old footsteps, but that doesn't mean every single thing is the same. They know that these days, there are too many well-equipped enemy combatants out there to simply go at them hand-to-hand, or to be so simple in their approach as to start shooting fireballs out of their eyes. They know to manipulate the crowd to come for them. They know to be agile, and stealthy, and appear where they are not expected. Ensuring that someone they intend to protect can escape is often more important than looking like a hero, and using a magically-enhanced drone to kill someone from afar is more important than the satisfaction they might gain by looking them in the eye as they sink their knife into that quarry.\n<b>Sample Character Concepts:</b> stochastic terrorist, urban guerrilla, drone general, trojan horse, technothug", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  123. end
  124. start_chapter "New Merits"
  125. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  126. Merit.merits(pdf).each(&:render)
  127. end
  128. start_chapter "Rules & Guidelines"
  129. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  130. pdf.text "These rules are a combination of my own ideas, plus some other people's ideas. Many are designed with making the game grittier. Some of these are <i>inspired</i> by other people's ideas, but aren't theirs directly.", :inline_format => true
  131. start_section "Withstand"
  132. pdf.table([ ["•", "All supernatural entities can spend their Mana, Essence, Vitae, Glamour or similar stat to boost their Withstand rating against any aggressive spell and know to do so intuitively if they so desire"],
  133. ["•", "Add Withstand to the required number of successes for an Exceptional Success. For example, a Praxis requires three successes for an exceptional success, and if that Praxis is used on someone who Withstands at four, then seven successes are needed for an exceptional success on the casting of that spell."],
  134. ["•", "Withstand reduces the Potency of the spell being cast on it. Players should not be told what the Withstand rating of a spell is directly; they need to find out on their own through some other means, or take a guess."] ]) do
  135. row(0..3).border_width = 0
  136. end
  137. start_section "Paradox"
  138. pdf.table([ ["•", "All willworkers in the same scene share a single Paradox pool. Once one has overreached, everybody runs the risk of Paradox on further castings of spells."],
  139. ["•", "When containing a Paradox, successes on the Wisdom roll deal resistant bashing as normal. However, after Wisdom is rolled, the willworker may choose to forcefully contain as much as whatever is left as he likes; they may take one resistant lethal damage to absorb one success from the Paradox roll."],
  140. ["•", "Whenever a Paradox roll is made, the Abyss forces the Magic used to be obvious. Dissonance occurs to all Sleepers present."],
  141. ["•", "Demesnes do not fully obviate Paradox. Instead, they reduce the Paradox dice pool by the number of soul stones used to create it. Additionally, if the Paradox dice pool is reduced to a chance die, it does not occur, even if Sleepers are present."],
  142. ["•", "The first Paradox roll must have a dice pool of at least one. The accumulation of additional Paradox dice begins once a finalized Paradox dice pool is at least one."] ]) do
  143. row(0..1000).border_width = 0
  144. end
  145. start_section "Spellcasting"
  146. pdf.table([ ["•", "Successive attempts do not yield a cumulative dice pool penalty. Instead, they yield a cumulative +1 Reach penalty. Spells that are functionally the same as determined by the Storyteller qualify as successive."],
  147. ["•", "Spellcasting dice pools may not fall below zero. You can Reach to increase the dice pool of a spell by +2, until the spell is at least zero. This Reach option cannot be used to boost a spell's dice pool past a non-negative dice pool."],
  148. ["•", "You may use Creative Thaumaturgy to change the primary factor in a spell without using a Reach."],
  149. ["•", "You my use Scale as the primary factor."],
  150. ["•", "For +1 Reach, you may distribute the spell factor table advances however you please."],
  151. ["•", "Infinite loop combos don't work. Period."]
  152. ] ) do
  153. row(0..1000).border_width = 0
  154. end
  155. end
  156. start_chapter "The Upper & Lower Layers"
  157. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  158. pdf.text "The Internet had been taken down completely, and for a long while Internet access was limited. In this decade, the nature of the Internet was transformed. TCP/IP was abandoned completely and several competing protocols replaced it. They came one after the other, in such rapid succession that keeping up seemed useless. There was no longer one Internet, but many, and interoperability between them was quite limited to say the least. The limitations of TCP/IP and the protocols built on top of it were transcended in some ways, but many vestigial elements of the old Internet persist even in 2069.", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  159. start_section "The Lower Layer"
  160. pdf.text "Awakened society views the post-Internet computer networks as a bifurcate structure. The aforementioned disparate computer networks, with some of the problems and benefits of the now-antiquituous Internet, along with their mundane improvements, are typically referred to as the Lower Layer. Sometimes this is called the Fallen Layer, although that is not as popular. While it is definitely possible for someone to transmit their written or spoken thoughts, their full body motion, and even their mundane consciousness outright into these Fallen networks, can a person transmit the contents of their <i>soul</i> through it. Simply put: not really.\nThe lower layer has many systems in place. Users can communicate but cannot do so freely; government and corporate controls abound restrict who can speak to who. Ridiculous fees have been added to adding people to contact lists, so as to control who people speak to more than how much they do so. Adding someone to your contacts list is a Resources 1 expenditure. Creating a network connection where many people may speak freely to each other, like a chat room or web forum, is a Resources 2 expenditure. Naturally, this can be bypassed, either with a successful Intelligence + Computer roll (at a -2 penalty for a group chat) or a successful casting of the Forces 2 spell \"Control Computer.\" For a group setting, the willworker must use +1 Reach to create a group chat. Finally, to give these group chats plot armor, one can also purchase the Secure Forum Merit.", :inline_format => true, :indent_paragraphs => INDENT_SIZE
  161. end
  162. start_chapter "Spells"
  163. Spell.spells(pdf).group_by(&:primary_arcanum).sort_by { |arcanum, spells| arcanum }.to_h.each do |arcanum, arcanum_spells|
  164. arcanum_name = arcanum.to_s.titleize
  165. puts "Compiling spells for #{arcanum_name}..."
  166. start_section("#{arcanum_name} Spells")
  167. pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width) do
  168. arcanum_spells.group_by(&arcanum).sort_by { |rating, spells| rating }.to_h.each do |rating, rating_spells|
  169. rating_title = "#{rating.to_dots} #{Spell::RANKS[rating - 1]} of #{arcanum_name}"
  170. puts "\tCompiling #{rating_title} spells..."
  171. pdf.outline.add_subsection_to("#{arcanum_name} Spells") do
  172. @pdf.outline.section rating_title, :destination => @pdf.page_number
  173. end
  174. rating_spells.first.render(rating_title)
  175. rating_spells
  176. .reject { |spell| spell == rating_spells.first }
  177. .each(&:render)
  178. end
  179. end
  180. end
  181. pdf.render_file("writeup.pdf")
  182. end
  183. end
  184. awakened2069 = Awakened2069.new
  185. awakened2069.generate