Blog/Components/Pages/Warframe.razor 7.8 K · 198 lines · raw · history

1 @page "/Warframe"
2 <PageTitle>Warframe drops</PageTitle>
3
4 <main>
5 <h1>Warframe drops</h1>
6
7 <form method="get" action="/Warframe" class="flex-row">
8 <label for="q">Search for a part</label>
9 <input type="search" id="q" name="q" value="@Query" list="drop-names" autofocus
10 placeholder="Nikana Prime Blade" autocomplete="off"/>
11 <button type="submit">Search</button>
12 </form>
13
14 @* Filled in by script from /api/warframe/names. *@
15 <datalist id="drop-names"></datalist>
16
17 @if (Status.Error is { } error)
18 {
19 <p class="error">@error</p>
20 }
21
22 @if (Tables is not { } tables)
23 {
24 @if (Status.Error is null)
25 {
26 <p>Reading the drop tables…</p>
27 }
28 }
29 else
30 {
31 @if (Matches.Count > 1)
32 {
33 <Panel Legend="@($"{Matches.Count} matches")">
34 <ul class="matches">
35 @foreach (var name in Matches)
36 {
37 <li>
38 <a href="@SearchLink(name)" class="@(name == Item?.Name ? "active" : null)">@name</a>
39 </li>
40 }
41 </ul>
42 </Panel>
43 }
44
45 @if (Item is { } item)
46 {
47 <h2 class="item-name">@item.Name</h2>
48
49 @if (item.Sources.Count == 0 && !item.FromRelics)
50 {
51 <p>Nothing in the drop tables gives this out.</p>
52 }
53
54 @if (item.FromRelics)
55 {
56 <Panel Legend="From relics">
57 <p>
58 <b>Intact</b> is the chance in an unrefined relic, <b>Radiant</b> after
59 four upgrades. Relics you can still farm are listed first.
60 </p>
61
62 @foreach (var (line, relicSources) in RelicRoutes(item))
63 {
64 <div class="relic">
65 <h3>
66 <a href="@ItemLink(line.Relic)">@line.Relic</a>
67 <span class="muted">@line.Rarity</span>
68 <span>@Percent(line.Intact) intact → @Percent(line.Radiant) radiant</span>
69 </h3>
70
71 @if (relicSources.Count == 0)
72 {
73 <p class="muted">Vaulted: nothing currently drops this relic.</p>
74 }
75 else
76 {
77 <p class="muted relic-lead">Best places to farm this relic</p>
78 <div class="table-scroll">
79 <table>
80 <tbody>
81 @foreach (var source in relicSources)
82 {
83 <tr>
84 <td>@source.Location</td>
85 <td class="muted">@source.Context</td>
86 <td class="muted">@CategoryLabel(source.Category)</td>
87 <td class="chance">@Percent(source.Chance)</td>
88 </tr>
89 }
90 </tbody>
91 </table>
92 </div>
93 }
94 </div>
95 }
96 </Panel>
97 }
98
99 @if (item.Sources.Count > 0)
100 {
101 <Panel Legend="@(item.FromRelics ? "Also drops directly from" : "Drops from")">
102 <div class="table-scroll">
103 <table>
104 <thead>
105 <tr>
106 <th>Where</th>
107 <th>Rotation / stage</th>
108 <th>Kind</th>
109 <th class="chance">Chance</th>
110 </tr>
111 </thead>
112 <tbody>
113 @foreach (var source in item.Sources.Take(MaxSources))
114 {
115 <tr>
116 <td>@source.Location</td>
117 <td class="muted">@source.Context</td>
118 <td class="muted">@CategoryLabel(source.Category)</td>
119 <td class="chance" title="@source.Rarity">@Percent(source.Chance)</td>
120 </tr>
121 }
122 </tbody>
123 </table>
124 </div>
125
126 @if (item.Sources.Count > MaxSources)
127 {
128 <p class="muted">
129 @(item.Sources.Count - MaxSources) more places with a lower chance.
130 </p>
131 }
132 </Panel>
133 }
134
135 @if (item.IsRelic)
136 {
137 <Panel Legend="Contains">
138 <div class="table-scroll">
139 <table>
140 <thead>
141 <tr>
142 <th>Reward</th>
143 <th>Rarity</th>
144 <th class="chance">Intact</th>
145 <th class="chance">Radiant</th>
146 </tr>
147 </thead>
148 <tbody>
149 @foreach (var line in item.Contents)
150 {
151 <tr>
152 <td><a href="@ItemLink(line.Item)">@line.Item</a></td>
153 <td class="muted">@line.Rarity</td>
154 <td class="chance">@Percent(line.Intact)</td>
155 <td class="chance">@Percent(line.Radiant)</td>
156 </tr>
157 }
158 </tbody>
159 </table>
160 </div>
161 </Panel>
162 }
163 }
164 else if (Matches.Count == 0 && !string.IsNullOrWhiteSpace(Query))
165 {
166 <p>Nothing called “@Query” drops anywhere. Try part of the name.</p>
167 }
168 else if (Matches.Count == 0)
169 {
170 <Panel Legend="What this is">
171 <p>
172 @ItemCount(tables) items from Warframe's published drop tables. Search a
173 part to see where it drops, sorted by chance; for prime parts, the relics
174 holding it and where to farm those.
175 </p>
176 <p>
177 Chances are per reward roll, as published. For enemies, the enemy's drop
178 chance multiplied by the item's share of it.
179 </p>
180 <p>
181 Try
182 <a href="/Warframe?q=Gyre+Prime">Gyre Prime</a>,
183 <a href="/Warframe?q=Tellurium">Tellurium</a>,
184 <a href="/Warframe?q=Nitain+Extract">Nitain Extract</a> or
185 <a href="/Warframe?q=Lith+Q3">Lith Q3</a>.
186 </p>
187 </Panel>
188 }
189
190 <p class="muted">
191 <a href="https://www.warframe.com/droptables">Drop tables</a> by Digital Extremes,
192 last updated @tables.LastUpdate. This copy was pulled @Age(tables.FetchedAt) and
193 refreshes when the site is deployed.
194 </p>
195 }
196 </main>
197
198 <script type="module" src="@Assets["Components/Pages/Warframe.razor.js"]"></script>