Ringworld sheets v2.1 — weapons wrap, armour column, no back-page equipment

WEAPONS — damage column word-wrap:
  Before: character-count split at 14 chars (broke 'paralytic' → 'paralyti/c')
  After: textwrap.wrap() at word boundaries, width=17
  Long values: two lines, both at correct baselines with proper spacing

BACK PAGE — equipment removed:
  Before: equipment listed again (solid black block, white text) — duplicate of front
  After: full-width white SESSION NOTES area with ruled lines for writing

ARMOUR COLUMN — now populated from character data:
  Yashti Korr: Chest AP 2, Abdomen AP 2 (body armour torso)
  RR'raan: AP 1 all locations (natural Kzin hide)
  Tomas Veld: AP 1 all locations (hard environment suit)
  Dr. Mira Chen: no armour
  Whisper-of-Distant-Worlds: no armour
  Sola Reyes: no armour
  Armour cells: green tint when protection present, white when none
This commit is contained in:
timevans666
2026-05-19 16:32:41 +00:00
parent 2ee60adefc
commit 0a11f611de
+26 -26
View File
@@ -430,21 +430,17 @@ def draw_front(c, char, page_num, total_pages):
text(c, str(wpn[1]), c_skill + (uw*0.14/2), row_y+4.5*mm,
'OrbB', 11, AD, align='centre')
# Col 3: Damage — bold, prominent
# Col 3: Damage — word-boundary wrapping, two lines max
if len(wpn) > 2:
dmg = str(wpn[2])
# Two lines if long
if len(dmg) > 12:
parts = dmg.split('/')
if len(parts) == 2:
text(c, parts[0].strip(), c_dmg+3, row_y+6*mm, 'Bar', 9, INK)
text(c, parts[1].strip(), c_dmg+3, row_y+2*mm, 'Mono', 7,
HexColor('#555566'))
else:
text(c, dmg[:14], c_dmg+3, row_y+5.5*mm, 'Bar', 8.5, INK)
text(c, dmg[14:], c_dmg+3, row_y+1.8*mm, 'Bar', 7, INK)
# Word-wrap at ~17 chars to stay within damage column
import textwrap as _tw
lines = _tw.wrap(dmg, width=17) or [dmg]
if len(lines) == 1:
text(c, lines[0], c_dmg+3, row_y+4.5*mm, 'Bar', 10, INK)
else:
text(c, dmg, c_dmg+3, row_y+4.5*mm, 'Bar', 10, INK)
text(c, lines[0], c_dmg+3, row_y+6.2*mm, 'Bar', 9, INK)
text(c, lines[1], c_dmg+3, row_y+2.2*mm, 'Bar', 8.5, INK)
# Col 4: Range
if len(wpn) > 3:
@@ -791,10 +787,16 @@ def draw_back(c, char, page_num, total_pages):
text(c, r_rng, c3+9*mm, mid_y, 'Mono', 9.5, MID, align='centre')
text(c, str(loc_hp), c4+8*mm, mid_y, 'OrbB', 14, A, align='centre')
bh = row_h - 4*mm
# CURR HP — blank write-in box
filled_rect(c, c5, ry+2*mm, 16*mm, bh, white)
outline_rect(c, c5, ry+2*mm, 16*mm, bh, A, lw=1.3)
filled_rect(c, c6, ry+2*mm, 16*mm, bh, white)
# ARMOUR — populate from char data if present
arm_val = char.get('armour', {}).get(loc, '')
arm_bg = HexColor('#e8f4e8') if arm_val and arm_val != '—' else white
filled_rect(c, c6, ry+2*mm, 16*mm, bh, arm_bg)
outline_rect(c, c6, ry+2*mm, 16*mm, bh, A, lw=1.3)
if arm_val:
text(c, arm_val, c6+8*mm, ry+2*mm+bh*0.38, 'OrbB', 7, A, align='centre')
hline(c, tbl_x-1, PW-PAD, ry, HexColor('#181830'), lw=0.5)
# Unconscious / dying banner — clear gap above
@@ -910,27 +912,19 @@ def draw_back(c, char, page_num, total_pages):
text(c, line, PW/2+PAD, hy, 'Bar', 7.5, HexColor('#222233'))
hy -= 8.5
# ── EQUIPMENT & NOTES ─────────────────────────────────────────────────────
# ── SESSION NOTES (full-width — equipment is on front page) ──────────────
eq_h = hook_y
eq_y = 8*mm
eq_sec_h = eq_h - eq_y
filled_rect(c, 0, eq_y, PW/2, eq_sec_h, INK)
filled_rect(c, PW/2+1.5, eq_y, PW/2-1.5, eq_sec_h, HexColor('#f8f8ff'))
filled_rect(c, 0, eq_y, PW, eq_sec_h, white)
hline(c, 0, PW, hook_y, A, lw=1.5)
filled_rect(c, 0, eq_y+eq_sec_h-9, PW/2, 9, A)
text(c, 'EQUIPMENT', PAD, eq_y+eq_sec_h-6, 'OrbB', 6.5, INK)
ey = eq_y + eq_sec_h - 17
for item in char['equip_detail']:
text(c, '▸ ' + item, PAD, ey, 'Mono', 6.5, HexColor('#bbbbdd'))
ey -= 8
filled_rect(c, PW/2+1.5, eq_y+eq_sec_h-9, PW/2-1.5, 9, A)
text(c, 'SESSION NOTES', PW/2+PAD, eq_y+eq_sec_h-6, 'OrbB', 6.5, INK)
filled_rect(c, 0, eq_y+eq_sec_h-9, PW, 9, A)
text(c, 'SESSION NOTES', PAD, eq_y+eq_sec_h-6, 'OrbB', 6.5, INK)
ny = eq_y + eq_sec_h - 17
while ny > eq_y + 6:
hline(c, PW/2+PAD, PW-PAD, ny, HexColor('#ccccdd'), lw=0.4)
hline(c, PAD, PW-PAD, ny, HexColor('#ccccdd'), lw=0.4)
ny -= 10
# ── BACK FOOTER ───────────────────────────────────────────────────────────
@@ -988,6 +982,7 @@ CHARACTERS = [
'Will care about Serenthis before',
'she realises she is doing it.',
],
'armour': {}, # No armour
'hook95':['Your bio-scanner shows the zone\'s ecological void as sharply as a',
'wound. Linguistics translates system logs. Medicine reads Marr\'s',
'condition. In Act Three the system displays your xenobiological',
@@ -1032,6 +1027,7 @@ CHARACTERS = [
'they\'re fine." The needle gun is',
'preferred. Wunderland aristocracy.',
],
'armour': {'Chest':'AP 2','Abdomen':'AP 2'}, # Body armour AP2 torso
'hook95':['Awareness makes you first to notice repetition. You\'ll set perimeters',
'when no one else thinks to. In Act Three, when Vorn orders withdrawal,',
'the crew looks to you: follow orders, or stay for the science?',
@@ -1076,6 +1072,7 @@ CHARACTERS = [
'Patience is real. Frustration also.',
'Kzin honour = a weapon humans can\'t use.',
],
'armour': {'Head':'AP 1','Chest':'AP 1','Abdomen':'AP 1','Right Arm':'AP 1','Left Arm':'AP 1','Right Leg':'AP 1','Left Leg':'AP 1'}, # Natural Kzin hide AP 1
'hook95':['The quiet zone registers as total absence of biological signal — your',
'prey-senses detect it before instruments. Track + Awareness in Act 1.',
'In Act Three: a threat you cannot fight. The frustration is yours.',
@@ -1121,6 +1118,7 @@ CHARACTERS = [
'manipulate. Timing is everything.',
'Knows more than it shares. Always.',
],
'armour': {}, # No armour (Puppeteer)
'hook95':['You identify the constructing singularity before anyone else does.',
'Computer + Science (Physics) cracks the system logs in Act Two.',
'In Act Three you understand the system\'s logic better than anyone.',
@@ -1165,6 +1163,7 @@ CHARACTERS = [
'about what can\'t change. Does argue',
'about what can. Loves the Ringworld.',
],
'armour': {'Head':'AP 1','Chest':'AP 1','Abdomen':'AP 1','Right Arm':'AP 1','Left Arm':'AP 1','Right Leg':'AP 1','Left Leg':'AP 1'}, # Hard environment suit
'hook95':['Your Engineering immediately flags the Spire drawing power far beyond',
'stated function. Science (Physics) + Computer crack the logs together.',
'In Act Three, you can feed the system the structural data it needs.',
@@ -1210,6 +1209,7 @@ CHARACTERS = [
'17 Ringworld surveys. Still looks',
'at the arc overhead every time.',
],
'armour': {}, # No armour
'hook95':['The quiet zone is a perfect geometrical absence — nothing matches it.',
'Your Awareness spots the overlapping footprints before anyone else.',
'In Act Three the system\'s display of your data is cartographic.',