1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
//- vim:ts=4:sw=4:
meta(name="viewport" content="width=device-width,initial-scale=1")
meta(name="theme-color" content="#444")
link(rel="icon" type="image/svg+xml" href="/favicon.svg")
link(rel="stylesheet" href="/fonts/fonts.css")
link(rel="stylesheet" href="/style.css")
if SITE_THEME
link(rel="stylesheet" href="/themes/"+SITE_THEME)
mixin social(title,description,game)
meta(property="og:title" content=title)
meta(property="og:type" content="website")
if game
meta(property="og:image" content=SITE_URL+"/"+game+"/cover.2x.jpg")
else
if SITE_ICON
meta(property="og:image" content=SITE_URL+"/images/"+SITE_ICON)
else
meta(property="og:image" content=SITE_URL+"/images/rally-the-troops.png")
meta(property="og:description" content=description)
mixin gamecover(title_id)
a(href="/"+title_id)
img(src=`/${title_id}/cover.1x.jpg` srcset=`/${title_id}/cover.2x.jpg 2x`)
mixin forumpost(row,show_buttons)
.post(id=row.post_id)
.head
.from: b: a.black(href="/user/"+row.author_name)= row.author_name
.time= row.ctime
if row.edited
|
| (edited #{row.mtime})
.body!= row.body
if show_buttons && user
.edit
if user.user_id === 1
| #[a(href="/forum/delete-post/"+row.post_id) DELETE]
|
if row.author_id === user.user_id
| #[a(href="/forum/edit/"+row.post_id) Edit]
|
| #[a(href="/forum/reply/"+row.post_id) Reply]
mixin gamelist(list,hide_title=0)
div.game_list
each item in list
div
-
let className = "game_item"
let pace_icon = ""
let pace_text = ""
let chat_icon = ""
if (item.your_turn) className += " your_turn"
if (item.status === 0 && item.join_count === 0) className += " open replacement"
else if (item.status === 0 && item.join_count !== item.player_count) className += " open"
else if (item.status === 0 && item.join_count === item.player_count) className += " ready"
else if (item.status === 1 && item.join_count !== item.player_count) className += " replacement"
else if (item.status === 1 && item.join_count === item.player_count) className += " active"
else if (item.status === 2) className += " finished"
else if (item.status === 3) className += " archived"
if (item.is_unread) chat_icon = "\u{1f4dd}"
if (item.is_private) pace_icon += EMOJI_PRIVATE
if (item.is_match)
pace_icon += EMOJI_MATCH
else if (item.pace > 0)
pace_icon += PACE_ICON[item.pace], pace_text = PACE_TEXT[item.pace]
div(class=className)
div.game_head
if item.scenario.length <= 2
div
| #{pace_icon} <a href="/join/#{item.game_id}">##{item.game_id} – #{item.title_name} (#{item.scenario})</a> #{chat_icon}
else
div
| #{pace_icon} <a href="/join/#{item.game_id}">##{item.game_id} – #{item.title_name}</a> #{chat_icon}
case item.status
when 0
a(class="command" href=`/join/${item.game_id}`) Join
when 1
if !item.is_ready
a(class="command" href="/join/"+item.game_id) Join
else if item.is_yours
if item.your_role
a(class="command" href=`/${item.title_id}/play.html?game=${item.game_id}&role=${encodeURIComponent(item.your_role)}`) Play
else
a(class="command" href="/join/"+item.game_id) Play
else
a(class="command" href=`/${item.title_id}/play.html?game=${item.game_id}`) Watch
when 2
if item.is_yours
if item.your_role
a(class="command" href=`/${item.title_id}/play.html?game=${item.game_id}&role=${encodeURIComponent(item.your_role)}`) Review
else
a(class="command" href="/join/"+item.game_id) Review
else
a(class="command" href=`/${item.title_id}/play.html?game=${item.game_id}`) Review
when 3
| Archived
div.game_main
div.game_info
if item.is_match
i
a(href="/tm/pool/"+item.notice)= item.notice
else if item.notice
i= item.notice
else
i= pace_text
unless item.is_match
if item.scenario !== "Standard" && item.scenario !== "Historical" && item.scenario.length > 2
div Scenario: #{item.scenario}
unless item.human_options === "None"
div Options: #{item.human_options}
if item.player_names
div Players: !{item.player_names}
else
div Players: <span class="error">Nobody</span>
case item.status
when 0
div Created: #{item.ctime}
when 1
div Last move: #{item.mtime}
if item.your_turn
if item.time_left <= 0
div Time left: none.
else if item.time_left <= 2
div Time left: #{ item.time_left * 24 | 0 } hours
else if item.time_left <= 5
div Time left: #{ item.time_left | 0 } days
when 2
div Finished: #{item.mtime}
div Result: !{item.result}
when 3
div Finished: #{item.mtime}
div Result: !{item.result}
unless hide_title
a(href=`/${item.title_id}`)
img(src=`/${item.title_id}/thumbnail.jpg`)
mixin seedlist(list, title)
if list && list.length > 0
table.half.seeds
if title
thead
tr
th= title
td
td= TM_ICON_QUEUE
tbody
each seed in list
tr
td
a(href="/tm/seed/" + seed.seed_name)= seed.seed_name
td.n #{seed.queue_size}
if user && seed.is_queued
td= TM_ICON_TICKET
else
td
mixin poollist(list, title, icon)
if list && list.length > 0
table.half.pools
if title
thead
tr
th= title
td= icon
tbody
each pool in list
tr
td.w
a(href="/tm/pool/" + pool.pool_name)= pool.pool_name
if pool.is_finished
if pool.status
td!= pool.status.split(",").map(p => `<a class="black" href="/user/${p}">${p}</a>`).join(", ")
else
td Nobody
else
td= pool.status
mixin tourlist(seeds, pools, fin)
if (seeds && seeds.length > 0) || (pools && pools.length > 0) || (fin && fin.length > 0)
h2 Tournaments
div.tour_list
if seeds && seeds.length > 0
div
+seedlist(seeds, "Registrations")
if pools && pools.length > 0
div
+poollist(pools, "Active", TM_ICON_ACTIVE)
if fin && fin.length > 0
div
+poollist(fin, "Finished", TM_ICON_FINISHED)
|