-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathorder.html
243 lines (242 loc) · 13.6 KB
/
order.html
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
{{$cap := DB_CapCurrent true}}
{{$discounts := DB_DiscountOffers}}
{{- template "cap.html" $cap -}}
{{- if not $cap.Reached -}}
<h2>Order</h2>
<aside>
<span class="icon-cell">🐶</span>
<div>
Need some investment advice?
{{Blog_PostLink "2021-05-13" "Here's a blog post that summarizes what would regularly come next in each game."}}
</div>
<span class="icon-cell">🐶</span>
</aside>
<aside>
<span></span>
<form action="/thankyou" method="post">
<label for="cust_name">
Name (leave blank to stay anonymous)
</label>
<input type="text" id="cust_name">
<label for="cust_url">
URL (optional, will turn your name into a link)
</label>
<input type="text" id="cust_url">
<label for="metric">
This contribution should go towards…
</label>
<select id="metric" onchange="handleSelect(this.options[this.selectedIndex])">
<option data-info="Won't go to Seihou by default, unless you explicitly allow me to.">Anything (including tooling)</option>
<optgroup label="PC-98 Touhou source code reconstruction">
<option>Reverse-engineering</option>
<option>Finalization</option>
<option>Position independence</option>
<option data-info="<ul>
<li>Will reveal any changes between the trial and full versions. Most of those are likely to be uninteresting software architecture details, though.</li>
<li>Will mostly stick to and catch up with features that have already been RE'd for the full version, unless I come across trial-exclusive code.</li>
<li>The trial versions will be a separate build artifact on the <code>master</code> branch, sharing all previously decompiled and reverse-engineered code with the full version of the respective game.
</ul>" data-micro>Reconstructing the trial versions</option>
<option>Reconstructing the original installers</option>
</optgroup>
<optgroup label="PC-98 Touhou mods and ports">
<option data-info='<ul>
<li>Removes <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-bloat">bloat</a> and <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-landmine">landmines</a>, and cleans up the architecture of a 100% position-independent game, to build a better foundation for both mods and ports to other systems.</li>
<li>Will not fix any <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-bug">bugs</a> or <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-quirk">quirks</a>. Gameplay and visuals will remain unchanged, and hypothetical replays will remain compatible with the original game.
<li>Please specify whether I should focus on portability or moddability for this order.</li>
</ul>' data-goal-mandatory data-micro>ZUN code cleanup</option>
<option data-info='<ul>
<li>Will fix everything that matches the definition of a <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-bug">bug</a>, achieving a smoother, flicker-free gameplay experience on the PC-98 platform.</li>
<li>Includes the <i>ZUN code cleanup</i> goal.
<li>Will not attempt to fix any <a href="https://github.com/nmlgc/ReC98/blob/master/CONTRIBUTING.md#zun-quirk">quirks</a>. Hypothetical replays will remain compatible with the original game.</li>
<li>Replay support itself is not included, and sold separately.</li>
</ul>'data-micro>TH01 Anniversary Edition</option>
<option data-info="<ul>
<li>For copyright reasons, this will ship <a href='/static/blargzargo_th01_pmd.zip'>Blargzargo's PMD port of TH01's soundtrack with MDRV2 instruments</a>, but it will come with instructions for replacing it with ZUN's PMD arrangements.</li>
<li>Not eligible for microtransactions because porting TH01's sound effects to PMD is the whole challenge here, and will require considerable research.</li>
</ul>">TH01 PMD support</option>
<option data-info="<ul>
<li>Please specify which game(s) would be most important to you.</li>
<li>Requires all movement-related code of the games in question to be reverse-engineered. If the backlog contains no other pushes which could cover that code, I will use this order to cover them.</li>
<li>As replays are critical infrastructure, this will <i>not</i> require 100% position independence, and be implemented in an <span class='hovertext' title='That is, as a TSR with a minimal amount of hooks in original game code.'>easily diffable way</span> even for games where 100% PI has been reached.</li>
</ul>" data-goal-mandatory data-micro>Replay support (on PC-98)</option>
<option data-info="<ul>
<li>Please specify which game I should start with.</li>
<li>TH02 will be slightly more expensive as long as it's not fully position-independent.</li>
</ul>" data-goal-mandatory data-micro>TH01/TH02 joystick support (on PC-98)</option>
<option data-info="Please specify which game(s) would be most important to you. Will consist of the following steps, in order:<ol>
<li>Decompilations of ZUN's hand-written ASM</li>
<li>Building a PC-98 abstraction interface in C++ and routing all the game's hardware accesses through it. Ports to generic 640×400×16-color framebuffers, other retro systems with hardware sprites, or headless servers with no graphical output, would then only reimplement that interface, and don't need to touch any game code.</li>
<li>Getting rid of master.lib, PiLoad, and SPRITE16</li>
</ol>All new code will make appropriate use of the C++ language features available in Turbo C++. Requires 100% position independence of the game(s) in question, as they will continue to run on PC-98 hardware during the entire process, perhaps even at higher performance. Does <i>not</i> imply a port to any specific system; these can be ordered separately once they become realistic." data-goal-mandatory data-micro>Portability to non-PC-98 systems</option>
<option data-info="Please specify which game(s) would be most important to you. Will be more efficient after that game reached 100% position independence, but definitely possible before. No guarantees that it will actually <i>perform</i> well on such old systems, though!" data-goal-mandatory data-micro>Compatibility with pre-386 PC-98 models</option>
<option data-info="If you <i>really</i> insist on building this code with ancient C-only compilers, rather than hacking support for your target platform into modern C++ toolchains… Will only focus on the pieces of code that wouldn't also be touched by the portability goal initially. Note that C89 conformance will in fact be a <i>mod</i>, as it's impossible to generate ZUN's original machine code without C++ and only C89 features. However, that means that the resulting code can (and will) be refactored into more clean and idiomatic C. Requires 100% position independence of the game(s) in question." data-micro>C89 conformance</option>
</optgroup>
<optgroup label="Free/libre software development">
<option data-info='<ul>
<li>For Shuusou Gyoku: Pick any of the <a href="https://github.com/nmlgc/ssg/issues">existing GitHub issues</a>, or suggest your own.</li>
<li>For Kioh Gyoku: The first goal will be to get <a href="https://github.com/pbghogehoge/kog">pbg's source code release</a> into a working and compilable state, by adding clean-room reimplementations of missing functionality as necessary.</li>
</ul>If you use Discord, also tell me your account name if you want to join the group chat with the current developer team as well as all other Seihou backers.' data-goal-mandatory data-micro>Seihou</option>
<option data-info='Cleans up the hacks I made for recording the Shuusou Gyoku BGM loop quirks, and makes the features publicly available as cross-platform open-source code. If you purchase at least 0.1 pushes or microtransactions, you will get a Windows binary with the current hacked-in changes as a bonus, immediately after I confirmed your order.' data-micro>MIDI Visualizer</option>
<option data-info='Will mostly refine the current code, remove arbitrary limits, and work on <a href="https://github.com/nmlgc/mly/issues/1">a cross-vendor SysEx decoder library</a>, unless you specify a different priority.' data-micro>mly (command-line MIDI toolset)</option>
</optgroup>
<optgroup label="Infrastructure">
<option data-micro>Easier verification against original binaries</option>
<option data-micro>Improving the website</option>
<option>Build server experiments</option>
</optgroup>
<optgroup>
<option>Something else?</option>
</optgroup>
</select>
<label for="goal">
Any specific game or aspect?
</label>
<input type="text" id="goal" onInput="this.reportValidity()" placeholder="Be as specific as you like. What would you like to see out of this project? What did you always want to know about?">
{{- if len $discounts -}}
<label id="discount_label" for="discount">
Any discount offer?
(Only available for one-time contributions matching the
goals listed above.)
</label>
<select id="discount" onchange="amount.onchange()">
<option selected>(none)</option>
{{- range $discounts -}}
{{$name := DB_CustomerByID .Sponsor}}<option
value="{{.Sponsor}}"
data-name="{{$name}}"
data-fraction="{{.FractionCovered}}"
>{{$name}}</option>
{{- end -}}
</select>
{{- end -}}
<aside id="info" class="left" style="display: none;">
<span class="icon-cell">ℹ️</span>
<p id="info_text"></p>
<span class="icon-cell">ℹ️</span>
</aside>
<div id="micro_container"class="left" hidden>
<input type="checkbox" id="micro" name="micro">
<label for="micro">Turn into a microtransaction<span id="micro_available"></span><ul>
<li>This order will be directly delivered as a smaller piece of work, proportional to a regular push. No need to rely on other backers to fund a complete push first.</li>
<li>No blog post will be written for it, and the only summary will be inside the Git commit messages. The results will be briefly mentioned and explained as part of other blog posts for regular pushes towards the same goal, though.</li>
<li>In exchange, you get the same amount of coding work/features for half the price.</li>
</ul></label>
</div>
<div>
This is a…
</div>
<div>
<input type="radio" id="onetime" onChange="onCycle()" name="cycle" value="onetime" checked>
<label for="onetime">… one-time contribution</label>
</div>
<div>
<input type="radio" id="monthly" onChange="onCycle()" name="cycle" value="monthly">
<label for="monthly">… monthly contribution</label>
</div>
<div>
of
<input id="amount" type="number" max="{{$cap.FreeEuros}}">
<span class="amount">€</span>
</div>
<div>
that will pay for <span class="push_amount"><span
id="push_amount"
data-price-push="{{$cap.PushPrice}}"
data-price-micro="{{$cap.MicroPrice}}"></span><span
id="push_noun">
</span></span>.
<span id="discount_breakdown" hidden>
If the goal is part of <span id="discount_sponsor"></span>'s
discount offer, they are going to fund an additional <span
class="push_amount" id="roundup_amount">
</span>, or <span class="push_amount"><span
id="roundup_pushes"></span><span
id="roundup_noun"></span></span>.
</span>
</div>
<hr>
<div id="provider_label">
Pick a payment provider: <small>
(Will load remote content from or redirect to the respective domain.)
</small>
</div>
<div id="providers">
<div id="paypal_container">
<button type="button" onclick='
activateProvider(this, [
"https://www.paypal.com/sdk/js?client-id={{PayPal_ClientID}}&vault=true¤cy=EUR",
"{{call $.StaticFileURL "paypal.js"}}"
]);
document.getElementById("paypal_label").textContent = "Loading…"'
>
{{HTML_Emoji "paypal"}}
<span id="paypal_label">
PayPal <code>(paypal.com)</code>
</span>
</button>
</div>
<button type="button" onclick='stripe(this, "stripe_label");'>
{{HTML_Emoji "stripe"}}
<span id="stripe_label">
Stripe <code>(stripe.com)</code>
</span>
</button>
</div>
<p>Key differences:</p>
<table class="differences"><thead>
<tr>
<th></th>
<th>{{HTML_Emoji "paypal"}} PayPal</th>
<th>{{HTML_Emoji "stripe"}} Stripe</th>
</tr>
</thead><tbody>
<tr>
<th>Payment methods</th>
<td>itself, debit / credit cards</td>
<td>lots of them, including country-specific ones</td>
</tr>
<tr>
<th>Subscription cancellation</th>
<td>through PayPal website</td>
<td>through my server (via custom link), or by contacting me</td>
</tr>
<tr>
<th>Data shared with me</th>
<td><ul>
<li>PayPal account/business name</li>
<li>Email address</li>
<li>Customer verification flag</li>
<li>USA or non-USA citizen</li>
</ul></td>
<td><ul>
<li>Name</li>
<li>Email address</li>
<li>For credit cards:<ul>
<li>Zip code and country</li>
<li>Credit card details (number reduced to last 4 digits)</li>
</ul></li>
<li>For bank accounts:<ul>
<li>BIC</li>
</ul></li>
<li>For Link:<ul>
<li>Full billing address</li>
</ul></li>
</ul></td>
</tr>
</tbody></table>
<hr>
<div id="error" hidden></div>
</form>
<span></span>
</aside>
<script src="{{call $.StaticFileURL "order.js"}}"></script>
<script src="{{call $.StaticFileURL "stripe.js"}}"></script>
<aside>
<span class="icon-cell">❓</span>
<div>
Questions? Problems?
<script>document.write(HTMLSupportMail());</script>.
</div>
<span class="icon-cell">❓</span>
</aside>
{{end}}