noita update
This commit is contained in:
parent
79f469a393
commit
754b0b0803
@ -65,52 +65,96 @@ DEATH_PENALTY = 1
|
|||||||
# All scoreable events: base 1 pt for every spell and perk, overrides below.
|
# All scoreable events: base 1 pt for every spell and perk, overrides below.
|
||||||
POINTS = {
|
POINTS = {
|
||||||
# ── Spells ───────────────────────────────────────────────────────────────
|
# ── Spells ───────────────────────────────────────────────────────────────
|
||||||
**{sid: 1 for sid in ALL_SPELLS},
|
**{sid: 3 for sid in ALL_SPELLS},
|
||||||
"ADD_TRIGGER": 10,
|
"ADD_TRIGGER": 10,
|
||||||
|
"ADD_TIMER": 10,
|
||||||
|
"ADD_DEATH_TRIGGER": 10,
|
||||||
"NOLLA": 10,
|
"NOLLA": 10,
|
||||||
"CHAOTIC_TRANSMUTATION": 10,
|
"CHAOTIC_TRANSMUTATION": 10,
|
||||||
"DUPLICATE": 5,
|
"DUPLICATE": 5,
|
||||||
"OMEGA": 10,
|
"OMEGA": 10,
|
||||||
"HEALING_BOLT": 5,
|
"BURST_2": 10,
|
||||||
|
"BURST_3": 15,
|
||||||
|
"BURST_4": 20,
|
||||||
|
"BURST_8": 20,
|
||||||
|
"BURST_X": 20,
|
||||||
|
"HEAL_BULLET": 5,
|
||||||
|
"ANTIHEAL": 5,
|
||||||
|
"NUKE": 5,
|
||||||
|
"NUKE_GIGA": 5,
|
||||||
|
"TELEPORT_PROJECTILE": 5,
|
||||||
|
"TELEPORT_PROJECTILE_SHORT": 5,
|
||||||
|
"TOUCH_BLOOD": 100,
|
||||||
|
"TOUCH_GOLD": 100,
|
||||||
|
"TOUCH_PISS": 100,
|
||||||
|
"TOUCH_GRASS": 100,
|
||||||
|
"TOUCH_OIL": 100,
|
||||||
|
"TOUCH_SMOKE": 100,
|
||||||
|
"TOUCH_ALCOHOL": 100,
|
||||||
|
"TOUCH_WATER": 100,
|
||||||
|
"SPELLS_TO_POWER": 10,
|
||||||
|
"ALL_SPELLS": 100,
|
||||||
|
"DIVIDE_2": 10,
|
||||||
|
"DIVIDE_3": 15,
|
||||||
|
"DIVIDE_4": 20,
|
||||||
|
"DIVIDE_10": 50,
|
||||||
|
"ALPHA": 50,
|
||||||
|
"GAMMA": 50,
|
||||||
|
"MU": 50,
|
||||||
|
"OMEGA": 50,
|
||||||
|
"PHI": 50,
|
||||||
|
"SIGMA": 50,
|
||||||
|
"TAU": 50,
|
||||||
|
"ZETA": 50,
|
||||||
|
"DISC_BULLET_BIGGER": 20,
|
||||||
|
"SUMMON_WANDGHOST": 50,
|
||||||
|
"ALL_BLACKHOLES": 20,
|
||||||
|
"ALL_DEATHCROSSES": 20,
|
||||||
|
"ALL_ROCKETS": 20,
|
||||||
|
"ALL_NUKES": 20,
|
||||||
|
"ALL_DISCS": 20,
|
||||||
# ── Perks ─────────────────────────────────────────────────────────────────
|
# ── Perks ─────────────────────────────────────────────────────────────────
|
||||||
**{pid: 1 for pid in ALL_PERKS},
|
**{pid: 15 for pid in ALL_PERKS},
|
||||||
"EDIT_WANDS_EVERYWHERE": 10,
|
"PROTECTION_FIRE": 30,
|
||||||
|
"PROTECTION_RADIOACTIVITY": 30,
|
||||||
|
"PROTECTION_EXPLOSION": 30,
|
||||||
|
"PROTECTION_MELEE": 30,
|
||||||
|
"PROTECTION_ELECTRICITY": 30,
|
||||||
# ── Spell combos ─────────────────────────────────────────────────────────
|
# ── Spell combos ─────────────────────────────────────────────────────────
|
||||||
"PING_PONG_DRILL": 10,
|
"PING_PONG_DRILL": 40,
|
||||||
"HEAVY_SHOT_DISC": 10,
|
"HEAVY_SHOT_DISC": 40,
|
||||||
"TOUCH_OF_ANY": 5,
|
"TWO_ARC_MODIFIERS": 50,
|
||||||
"TWO_ARC_MODIFIERS": 10,
|
"TWO_TRAIL_MODIFIERS": 50,
|
||||||
"TWO_TRAIL_MODIFIERS": 10,
|
|
||||||
# ── Perk combos ──────────────────────────────────────────────────────────
|
# ── Perk combos ──────────────────────────────────────────────────────────
|
||||||
"CRIMSON_ALCHEMIST": 15,
|
"CRIMSON_ALCHEMIST": 50,
|
||||||
"GREEDY_GOBLIN_KING": 15,
|
"GREEDY_GOBLIN_KING": 50,
|
||||||
"STORM_TOUCHED_ASCENDANT": 15,
|
"STORM_TOUCHED_ASCENDANT": 50,
|
||||||
"ARCHMAGE_OF_CONTROL": 15,
|
"ARCHMAGE_OF_CONTROL": 50,
|
||||||
"HAUNTED_MAGE": 15,
|
"HAUNTED_MAGE": 50,
|
||||||
"GLASS_CANNON_MESSIAH": 15,
|
"GLASS_CANNON_MESSIAH": 50,
|
||||||
"INFINITE_ENGINE": 15,
|
"INFINITE_ENGINE": 50,
|
||||||
"PERFECT_ACCURACY_LOOP": 15,
|
"PERFECT_ACCURACY_LOOP": 50,
|
||||||
"HOMING_DEATH_SWARM": 15,
|
"HOMING_DEATH_SWARM": 50,
|
||||||
"UNTOUCHABLE_FIELD": 15,
|
"UNTOUCHABLE_FIELD": 50,
|
||||||
"ELECTRIC_SUSTAIN_LOOP": 15,
|
"ELECTRIC_SUSTAIN_LOOP": 50,
|
||||||
"IMMORTAL_LEECH_CORE": 15,
|
"IMMORTAL_LEECH_CORE": 50,
|
||||||
"PROJECTILE_OVERLOAD": 15,
|
"PROJECTILE_OVERLOAD": 50,
|
||||||
"CLOSE_RANGE_DEATH_MACHINE": 15,
|
"CLOSE_RANGE_DEATH_MACHINE": 50,
|
||||||
"CRITICAL_MASS": 15,
|
"CRITICAL_MASS": 50,
|
||||||
"HOLY_MOUNTAIN_ABUSER": 15,
|
"HOLY_MOUNTAIN_ABUSER": 50,
|
||||||
"DEFLECTOR_MATRIX": 15,
|
"DEFLECTOR_MATRIX": 50,
|
||||||
"STORMBORNE_LEVITATOR": 15,
|
"STORMBORNE_LEVITATOR": 50,
|
||||||
# ── Objectives ───────────────────────────────────────────────────────────
|
# ── Objectives ───────────────────────────────────────────────────────────
|
||||||
"HP_200": 5,
|
"HP_200": 50,
|
||||||
"HP_500": 5,
|
"HP_500": 50,
|
||||||
"HP_2000": 5,
|
"HP_2000": 100,
|
||||||
"HP_5000": 5,
|
"HP_5000": 500,
|
||||||
"GOLD_1000": 5,
|
"GOLD_1000": 5,
|
||||||
"GOLD_10000": 5,
|
"GOLD_10000": 50,
|
||||||
"GOLD_100000": 5,
|
"GOLD_100000": 100,
|
||||||
"GOLD_1000000": 5,
|
"GOLD_1000000": 200,
|
||||||
**{f"ORB_{i}": 5 for i in range(34)},
|
**{f"ORB_{i}": 25 for i in range(34)},
|
||||||
"FIND_AMBROSIA": 10,
|
**{f"BOSS_KILL_{i}": 75 * i for i in range(34)},
|
||||||
"WAND_MANA_500": 10,
|
"WAND_MANA_500": 10,
|
||||||
"WAND_MANA_1000": 10,
|
"WAND_MANA_1000": 10,
|
||||||
"WAND_MANA_1500": 10,
|
"WAND_MANA_1500": 10,
|
||||||
|
|||||||
@ -28,7 +28,7 @@ def parse_objectives_and_store(logfile: LogfileSubmission) -> None:
|
|||||||
counter = parse_objectives_from_logfile(logfile)
|
counter = parse_objectives_from_logfile(logfile)
|
||||||
|
|
||||||
for idx, count in counter.items():
|
for idx, count in counter.items():
|
||||||
if idx in {"-", "DEBUG"}:
|
if idx in {"-", "DEBUG", "polylan-mod"}:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
obj, created = Objectiv.objects.get_or_create(
|
obj, created = Objectiv.objects.get_or_create(
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted } from "vue";
|
import { ref, computed, onMounted } from "vue";
|
||||||
|
|
||||||
interface Objective {
|
interface Objective {
|
||||||
objectiv_id: string;
|
objectiv_id: string;
|
||||||
count: number;
|
count: number;
|
||||||
|
points_per_objectiv?: number;
|
||||||
|
total_points?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const userInfo = ref({
|
const userInfo = ref({
|
||||||
@ -18,11 +20,62 @@ const uploadedFiles = ref<File[]>([]);
|
|||||||
const isUploading = ref(false);
|
const isUploading = ref(false);
|
||||||
const isDragover = ref(false);
|
const isDragover = ref(false);
|
||||||
const objectives = ref<Objective[]>([]);
|
const objectives = ref<Objective[]>([]);
|
||||||
const isLoadingObjectives = ref(false);
|
const objectiveSearchQuery = ref("");
|
||||||
|
const objectiveSortBy = ref<"id" | "count" | "points_per" | "total_points">("id");
|
||||||
|
const objectiveSortDesc = ref(false);
|
||||||
const isLoadingLeaderboard = ref(false);
|
const isLoadingLeaderboard = ref(false);
|
||||||
const leaderboard = ref<any[]>([]);
|
const leaderboard = ref<any[]>([]);
|
||||||
const isLeaderboardModalOpen = ref(false);
|
const isLeaderboardModalOpen = ref(false);
|
||||||
|
|
||||||
|
const filteredObjectives = computed(() => {
|
||||||
|
const query = objectiveSearchQuery.value.toLowerCase();
|
||||||
|
|
||||||
|
let filtered = objectives.value;
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
filtered = filtered.filter(
|
||||||
|
(obj) =>
|
||||||
|
obj.objectiv_id.toLowerCase().includes(query) ||
|
||||||
|
obj.count.toString().includes(query)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const sorted = [...filtered].sort((a, b) => {
|
||||||
|
let aValue: number | string;
|
||||||
|
let bValue: number | string;
|
||||||
|
|
||||||
|
switch (objectiveSortBy.value) {
|
||||||
|
case "points_per":
|
||||||
|
aValue = a.points_per_objectiv || 0;
|
||||||
|
bValue = b.points_per_objectiv || 0;
|
||||||
|
break;
|
||||||
|
case "total_points":
|
||||||
|
aValue = a.total_points || 0;
|
||||||
|
bValue = b.total_points || 0;
|
||||||
|
break;
|
||||||
|
case "id":
|
||||||
|
default:
|
||||||
|
aValue = a.objectiv_id.toLowerCase();
|
||||||
|
bValue = b.objectiv_id.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aValue < bValue) return objectiveSortDesc.value ? 1 : -1;
|
||||||
|
if (aValue > bValue) return objectiveSortDesc.value ? -1 : 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
return sorted;
|
||||||
|
});
|
||||||
|
|
||||||
|
const toggleObjectiveSort = (column: "id" | "points_per" | "total_points") => {
|
||||||
|
if (objectiveSortBy.value === column) {
|
||||||
|
objectiveSortDesc.value = !objectiveSortDesc.value;
|
||||||
|
} else {
|
||||||
|
objectiveSortBy.value = column;
|
||||||
|
objectiveSortDesc.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleFileUpload = (event: Event) => {
|
const handleFileUpload = (event: Event) => {
|
||||||
const input = event.target as HTMLInputElement;
|
const input = event.target as HTMLInputElement;
|
||||||
if (input.files) {
|
if (input.files) {
|
||||||
@ -81,7 +134,6 @@ const submitRun = async () => {
|
|||||||
|
|
||||||
// Refresh objectives, score, and rank after successful submission
|
// Refresh objectives, score, and rank after successful submission
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
fetchObjectives(),
|
|
||||||
fetchUserResults(),
|
fetchUserResults(),
|
||||||
fetchLeaderboard(),
|
fetchLeaderboard(),
|
||||||
]);
|
]);
|
||||||
@ -97,20 +149,6 @@ const goHome = () => {
|
|||||||
window.location.href = "/";
|
window.location.href = "/";
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchObjectives = async () => {
|
|
||||||
isLoadingObjectives.value = true;
|
|
||||||
try {
|
|
||||||
const response = await fetch("/api/noita/objectives");
|
|
||||||
if (!response.ok) throw new Error("Failed to fetch objectives");
|
|
||||||
|
|
||||||
objectives.value = await response.json();
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error fetching objectives:", error);
|
|
||||||
} finally {
|
|
||||||
isLoadingObjectives.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const fetchUserResults = async () => {
|
const fetchUserResults = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch("/api/noita/results");
|
const response = await fetch("/api/noita/results");
|
||||||
@ -119,6 +157,7 @@ const fetchUserResults = async () => {
|
|||||||
const results = await response.json();
|
const results = await response.json();
|
||||||
userInfo.value.score = results.total_score;
|
userInfo.value.score = results.total_score;
|
||||||
userInfo.value.runsSubmitted = results.objectives.length;
|
userInfo.value.runsSubmitted = results.objectives.length;
|
||||||
|
objectives.value = results.objectives;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching results:", error);
|
console.error("Error fetching results:", error);
|
||||||
}
|
}
|
||||||
@ -159,7 +198,6 @@ const clearCache = async () => {
|
|||||||
alert("Cache cleared successfully!");
|
alert("Cache cleared successfully!");
|
||||||
// Refresh data after clearing cache
|
// Refresh data after clearing cache
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
fetchObjectives(),
|
|
||||||
fetchUserResults(),
|
fetchUserResults(),
|
||||||
fetchLeaderboard(),
|
fetchLeaderboard(),
|
||||||
]);
|
]);
|
||||||
@ -188,9 +226,8 @@ const loadUserData = async () => {
|
|||||||
console.error("Error fetching user info:", error);
|
console.error("Error fetching user info:", error);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch objectives, results, and leaderboard
|
// Fetch results and leaderboard
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
fetchObjectives(),
|
|
||||||
fetchUserResults(),
|
fetchUserResults(),
|
||||||
fetchLeaderboard(),
|
fetchLeaderboard(),
|
||||||
]);
|
]);
|
||||||
@ -343,32 +380,61 @@ onMounted(() => {
|
|||||||
Your Objectives
|
Your Objectives
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div v-if="isLoadingObjectives" class="flex justify-center py-8">
|
<div v-if="objectives.length === 0" class="text-center py-8">
|
||||||
<span class="loading loading-spinner loading-lg"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else-if="objectives.length === 0" class="text-center py-8">
|
|
||||||
<p class="text-base-content/70 mb-2">No objectives completed yet</p>
|
<p class="text-base-content/70 mb-2">No objectives completed yet</p>
|
||||||
<p class="text-sm text-base-content/50">Submit your runs to unlock objectives!</p>
|
<p class="text-sm text-base-content/50">Submit your runs to unlock objectives!</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else class="overflow-x-auto">
|
<div v-if="objectives.length > 0" class="space-y-4">
|
||||||
<table class="table table-zebra w-full">
|
<!-- Search Input -->
|
||||||
<thead>
|
<input v-model="objectiveSearchQuery" type="text" placeholder="Search objectives..."
|
||||||
<tr>
|
class="input input-bordered w-full" />
|
||||||
<th>Objective ID</th>
|
|
||||||
<th class="text-right">Count</th>
|
<!-- Results Summary -->
|
||||||
</tr>
|
<div class="text-sm text-base-content/70">
|
||||||
</thead>
|
Showing {{ filteredObjectives.length }} of {{ objectives.length }} objectives
|
||||||
<tbody>
|
</div>
|
||||||
<tr v-for="obj in objectives" :key="obj.objectiv_id">
|
|
||||||
<td class="font-medium">{{ obj.objectiv_id }}</td>
|
<!-- Objectives Table -->
|
||||||
<td class="text-right">
|
<div v-if="filteredObjectives.length > 0" class="overflow-x-auto">
|
||||||
<span class="badge badge-primary badge-lg">{{ obj.count }}</span>
|
<table class="table table-zebra w-full">
|
||||||
</td>
|
<thead>
|
||||||
</tr>
|
<tr>
|
||||||
</tbody>
|
<th class="cursor-pointer hover:bg-base-300" @click="toggleObjectiveSort('id')">
|
||||||
</table>
|
Objective ID
|
||||||
|
<i v-if="objectiveSortBy === 'id'"
|
||||||
|
:class="['mdi ml-2', objectiveSortDesc ? 'mdi-arrow-down' : 'mdi-arrow-up']"></i>
|
||||||
|
</th>
|
||||||
|
<th class="text-right cursor-pointer hover:bg-base-300"
|
||||||
|
@click="toggleObjectiveSort('total_points')">
|
||||||
|
Total Points
|
||||||
|
<i v-if="objectiveSortBy === 'total_points'"
|
||||||
|
:class="['mdi ml-2', objectiveSortDesc ? 'mdi-arrow-down' : 'mdi-arrow-up']"></i>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="obj in filteredObjectives" :key="obj.objectiv_id">
|
||||||
|
<td class="font-medium">
|
||||||
|
<a :href="`https://noita.wiki.gg/wiki/${obj.objectiv_id}`" target="_blank">
|
||||||
|
{{ obj.objectiv_id }}
|
||||||
|
<i class="mdi mdi-open-in-new"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="text-right font-bold text-success">
|
||||||
|
{{ obj.total_points || 0 }}
|
||||||
|
</td>
|
||||||
|
<td class="text-right">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- No Results -->
|
||||||
|
<div v-if="filteredObjectives.length === 0" class="text-center py-8">
|
||||||
|
<p class="text-base-content/70">No objectives match your search</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
import{k as b,c as v,r as g,l as a,p as n,s as t,F as h,x,v as i,A as f,O as _}from"./style-D1Ozo1PL.js";const y={class:"min-h-screen bg-base-300 flex items-center justify-center px-4"},w={class:"w-full max-w-6xl"},k={class:"grid grid-cols-1 md:grid-cols-2 gap-8"},S=["onClick"],I={class:"relative h-60 bg-base-300 overflow-hidden"},j=["src","alt","onError"],E={key:1,class:"w-full h-full bg-gradient-to-br from-blue-600 to-blue-400 flex items-center justify-center text-white"},N={class:"card-body"},C={class:"card-title text-2xl"},A={class:"text-base-content/70"},B=b({__name:"Home",setup(z){const c=v(()=>[{id:"opus-magnum",title:"Opus Magnum",description:"Submit your best Opus Magnum puzzle solutions",appId:558990,path:"/opus-magnum"},{id:"noita",title:"Noita",description:"Submit your greatest Noita achievements",appId:881100,path:"/noita"}]),r=g(new Set),d=o=>`https://cdn.akamai.steamstatic.com/steam/apps/${o}/header.jpg`,u=o=>{r.value.add(o)},p=o=>{window.location.href=o};return(o,e)=>(n(),a("div",y,[t("div",w,[e[3]||(e[3]=t("div",{class:"text-center mb-12"},[t("h1",{class:"text-5xl font-bold mb-4"},"PolyLAN Submitter"),t("p",{class:"text-xl text-base-content/70"}," Choose a game and submit your best solutions ")],-1)),t("div",k,[(n(!0),a(h,null,x(c.value,s=>(n(),a("div",{key:s.id,onClick:m=>p(s.path),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[t("figure",I,[r.value.has(s.appId)?(n(),a("div",E,[...e[0]||(e[0]=[t("i",{class:"mdi mdi-gamepad-variant text-5xl"},null,-1)])])):(n(),a("img",{key:0,src:d(s.appId),alt:s.title,onError:m=>u(s.appId),class:"w-full h-full object-cover"},null,40,j)),e[1]||(e[1]=t("div",{class:"absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"},null,-1))]),t("div",N,[t("h2",C,i(s.title),1),t("p",A,i(s.description),1),e[2]||(e[2]=t("div",{class:"card-actions justify-end mt-4"},[t("button",{class:"btn btn-primary"},[t("i",{class:"mdi mdi-arrow-right mr-2"}),f(" Submit results ")])],-1))])],8,S))),128))]),e[4]||(e[4]=t("div",{class:"text-center mt-12 text-base-content/50"},[t("p",null,"Select a game above to begin submitting")],-1))])]))}}),l="#app",O=document.querySelector(l),$=_(B,{...O?.dataset});$.mount(l);
|
import{k as b,c as v,r as g,l as a,p as n,s as t,F as h,x,v as i,A as f,O as _}from"./style-iP6anD9B.js";const y={class:"min-h-screen bg-base-300 flex items-center justify-center px-4"},w={class:"w-full max-w-6xl"},k={class:"grid grid-cols-1 md:grid-cols-2 gap-8"},S=["onClick"],I={class:"relative h-60 bg-base-300 overflow-hidden"},j=["src","alt","onError"],E={key:1,class:"w-full h-full bg-gradient-to-br from-blue-600 to-blue-400 flex items-center justify-center text-white"},N={class:"card-body"},C={class:"card-title text-2xl"},A={class:"text-base-content/70"},B=b({__name:"Home",setup(z){const c=v(()=>[{id:"opus-magnum",title:"Opus Magnum",description:"Submit your best Opus Magnum puzzle solutions",appId:558990,path:"/opus-magnum"},{id:"noita",title:"Noita",description:"Submit your greatest Noita achievements",appId:881100,path:"/noita"}]),r=g(new Set),d=o=>`https://cdn.akamai.steamstatic.com/steam/apps/${o}/header.jpg`,u=o=>{r.value.add(o)},p=o=>{window.location.href=o};return(o,e)=>(n(),a("div",y,[t("div",w,[e[3]||(e[3]=t("div",{class:"text-center mb-12"},[t("h1",{class:"text-5xl font-bold mb-4"},"PolyLAN Submitter"),t("p",{class:"text-xl text-base-content/70"}," Choose a game and submit your best solutions ")],-1)),t("div",k,[(n(!0),a(h,null,x(c.value,s=>(n(),a("div",{key:s.id,onClick:m=>p(s.path),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[t("figure",I,[r.value.has(s.appId)?(n(),a("div",E,[...e[0]||(e[0]=[t("i",{class:"mdi mdi-gamepad-variant text-5xl"},null,-1)])])):(n(),a("img",{key:0,src:d(s.appId),alt:s.title,onError:m=>u(s.appId),class:"w-full h-full object-cover"},null,40,j)),e[1]||(e[1]=t("div",{class:"absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"},null,-1))]),t("div",N,[t("h2",C,i(s.title),1),t("p",A,i(s.description),1),e[2]||(e[2]=t("div",{class:"card-actions justify-end mt-4"},[t("button",{class:"btn btn-primary"},[t("i",{class:"mdi mdi-arrow-right mr-2"}),f(" Submit results ")])],-1))])],8,S))),128))]),e[4]||(e[4]=t("div",{class:"text-center mt-12 text-base-content/50"},[t("p",null,"Select a game above to begin submitting")],-1))])]))}}),l="#app",O=document.querySelector(l),$=_(B,{...O?.dataset});$.mount(l);
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
|||||||
import{e as Ft,r as j,m as Ut,t as Bt,c as ne,i as ve,a as nt,b as us,d as ds,h as fs,f as hs,g as Vt,o as Gt,w as $e,n as Se,j as vs,k as me,l as h,p as f,q as re,s as e,u as A,v as x,F as Q,x as ee,y as I,z as Xe,A as q,B as ms,C as ce,D as Wt,E as ze,G as xe,H as gs,I as ot,J as dt,K as Ht,L as ps,M as ke,N as bs,O as ys}from"./style-D1Ozo1PL.js";/*!
|
import{e as Ft,r as j,m as Ut,t as Bt,c as ne,i as ve,a as nt,b as us,d as ds,h as fs,f as hs,g as Vt,o as Gt,w as $e,n as Se,j as vs,k as me,l as h,p as f,q as re,s as e,u as A,v as x,F as Q,x as ee,y as I,z as Xe,A as q,B as ms,C as ce,D as Wt,E as ze,G as xe,H as gs,I as ot,J as dt,K as Ht,L as ps,M as ke,N as bs,O as ys}from"./style-iP6anD9B.js";/*!
|
||||||
* pinia v3.0.3
|
* pinia v3.0.3
|
||||||
* (c) 2025 Eduardo San Martin Morote
|
* (c) 2025 Eduardo San Martin Morote
|
||||||
* @license MIT
|
* @license MIT
|
||||||
File diff suppressed because one or more lines are too long
@ -1,9 +1,13 @@
|
|||||||
{
|
{
|
||||||
"_style-D1Ozo1PL.js": {
|
"_style-DK-qmJDU.css": {
|
||||||
"file": "assets/style-D1Ozo1PL.js",
|
"file": "assets/style-DK-qmJDU.css",
|
||||||
|
"src": "_style-DK-qmJDU.css"
|
||||||
|
},
|
||||||
|
"_style-iP6anD9B.js": {
|
||||||
|
"file": "assets/style-iP6anD9B.js",
|
||||||
"name": "style",
|
"name": "style",
|
||||||
"css": [
|
"css": [
|
||||||
"assets/style-IIn-gCA5.css"
|
"assets/style-DK-qmJDU.css"
|
||||||
],
|
],
|
||||||
"assets": [
|
"assets": [
|
||||||
"assets/materialdesignicons-webfont-CSr8KVlo.eot",
|
"assets/materialdesignicons-webfont-CSr8KVlo.eot",
|
||||||
@ -12,10 +16,6 @@
|
|||||||
"assets/materialdesignicons-webfont-B7mPwVP_.ttf"
|
"assets/materialdesignicons-webfont-B7mPwVP_.ttf"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"_style-IIn-gCA5.css": {
|
|
||||||
"file": "assets/style-IIn-gCA5.css",
|
|
||||||
"src": "_style-IIn-gCA5.css"
|
|
||||||
},
|
|
||||||
"node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.eot": {
|
"node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.eot": {
|
||||||
"file": "assets/materialdesignicons-webfont-CSr8KVlo.eot",
|
"file": "assets/materialdesignicons-webfont-CSr8KVlo.eot",
|
||||||
"src": "node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.eot"
|
"src": "node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.eot"
|
||||||
@ -33,30 +33,30 @@
|
|||||||
"src": "node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.woff2"
|
"src": "node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.woff2"
|
||||||
},
|
},
|
||||||
"src/home.ts": {
|
"src/home.ts": {
|
||||||
"file": "assets/home-BOcY-OpH.js",
|
"file": "assets/home-C3AkoPCZ.js",
|
||||||
"name": "home",
|
"name": "home",
|
||||||
"src": "src/home.ts",
|
"src": "src/home.ts",
|
||||||
"isEntry": true,
|
"isEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_style-D1Ozo1PL.js"
|
"_style-iP6anD9B.js"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/noita.ts": {
|
"src/noita.ts": {
|
||||||
"file": "assets/noita-Dc59M1_A.js",
|
"file": "assets/noita-Cj8fTuxL.js",
|
||||||
"name": "noita",
|
"name": "noita",
|
||||||
"src": "src/noita.ts",
|
"src": "src/noita.ts",
|
||||||
"isEntry": true,
|
"isEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_style-D1Ozo1PL.js"
|
"_style-iP6anD9B.js"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/opus-magnum.ts": {
|
"src/opus-magnum.ts": {
|
||||||
"file": "assets/opus_magnum-DPEOQ6aI.js",
|
"file": "assets/opus_magnum-a6P58qyI.js",
|
||||||
"name": "opus_magnum",
|
"name": "opus_magnum",
|
||||||
"src": "src/opus-magnum.ts",
|
"src": "src/opus-magnum.ts",
|
||||||
"isEntry": true,
|
"isEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_style-D1Ozo1PL.js"
|
"_style-iP6anD9B.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user