1<?php
2/**
3 * Monster loot checker.
4 *
5 * Prepared by monster_loot.php:
6 * $monsterLootError message when an XML file could not be read, else ''
7 * $itemList [item id => item name]
8 * $rarity [label => minimum percent], highest first
9 * $monsterList name / state ('loot','empty','failed') / file / loot rows
10 *
11 * Nothing is read from disk here.
12 */
13
14/** The rarity label for a drop chance. */
15function znote_loot_rarity(float $chance, array $rarity): string {
16 foreach ($rarity as $label => $percent) {
17 if ($chance >= $percent) {
18 return $label;
19 }
20 }
21 return '';
22}
23
24$lootParam = isset($_GET['lootrate']) ? '&lootrate' : '';
25?>
26<script>
27 function toggleVisibility(obj) {
28 var el = document.getElementById('d' + obj.id);
29 var name = obj.innerHTML.substring(4);
30
31 if (el.style.display == 'none') {
32 obj.innerHTML = '[ -]';
33 el.style.display = 'block';
34 } else {
35 obj.innerHTML = '[+]';
36 el.style.display = 'none';
37 }
38 obj.innerHTML += ' ' + name;
39 }
40</script>
41
42<div class="znx-acct">
43
44<div class="znx-acct-head"><?= t_default('loot.title', 'Monster Loot') ?></div>
45
46<div class="znx-pill-nav">
47 <a href="monster_loot.php<?= $lootParam ? '?lootrate' : '' ?>"><?= t('loot.hide_none') ?></a>
48 <a href="?hidefail<?= $lootParam ?>"><?= t('loot.hide_notfound') ?></a>
49 <a href="?hideempty<?= $lootParam ?>"><?= t('loot.hide_empty') ?></a>
50 <a href="?hideempty&hidefail<?= $lootParam ?>"><?= t('loot.hide_all') ?></a>
51 <a href="monster_loot.php"><?= t('loot.normal_rate') ?></a>
52 <a href="?lootrate"><?= t('loot.server_rate') ?></a>
53</div>
54
55<?php if ($monsterLootError !== ''): ?>
56
57 <div class="znx-empty-box"><?= htmlspecialchars($monsterLootError, ENT_QUOTES, 'UTF-8') ?></div>
58
59<?php else: ?>
60
61 <div class="znx-acct-info">
62
63 <?php $i = 0; foreach ($monsterList as $monster): $i++; ?>
64
65 <?php if ($monster['state'] === 'loot'): ?>
66
67 <a id="<?= $i ?>" href="javascript:void(0);" onclick="toggleVisibility(this)"
68 style="text-decoration:none; font:bold 14px verdana; color:orange;">
69 [+] <?= htmlspecialchars($monster['name'], ENT_QUOTES, 'UTF-8') ?>
70 </a>
71 <br>
72 <div id="d<?= $i ?>" style="display:none;"><br>
73 <?php foreach ($monster['loot'] as $drop): ?>
74 <?= str_repeat('... ', $drop['level']) ?>
75 <u><?= $drop['count'] ?: 1 ?></u>
76 <span style="color:#7878FF; font-weight:bold;"><?= htmlspecialchars($itemList[$drop['id']] ?? '?', ENT_QUOTES, 'UTF-8') ?></span>
77 - <span style="color:#C45; font-weight:bold;"><?= htmlspecialchars(znote_loot_rarity($drop['chance'], $rarity), ENT_QUOTES, 'UTF-8') ?></span>
78 (<span style="color:#FF9A9A;"><?= $drop['chance'] ?>%</span>)<br>
79 <?php endforeach; ?>
80 <br>
81 </div>
82
83 <?php elseif ($monster['state'] === 'empty' && !isset($_GET['hideempty'])): ?>
84
85 <span style="font:bold 14px verdana; color:red;">[x] <?= htmlspecialchars($monster['name'], ENT_QUOTES, 'UTF-8') ?></span><br>
86
87 <?php elseif ($monster['state'] === 'failed' && !isset($_GET['hidefail'])): ?>
88
89 <span><?= t('loot.failed') ?> <b><?= htmlspecialchars($monster['name'], ENT_QUOTES, 'UTF-8') ?></b>
90 <i>(<?= htmlspecialchars($monster['file'], ENT_QUOTES, 'UTF-8') ?>)</i></span><br>
91
92 <?php endif; ?>
93
94 <?php endforeach; ?>
95
96 </div>
97
98<?php endif; ?>
99
100</div><!-- .znx-acct -->
101