Merge branch 'development' into landing-2026

This commit is contained in:
Renkar
2026-04-30 17:36:23 +03:00
committed by GitHub
18 changed files with 497 additions and 461 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View File

@@ -7,6 +7,12 @@ import { useEffect, useRef, useState, useMemo } from "react";
import { EyeClosed, Eye } from "lucide-react";
import SectionDivider from "@/components/SectionDivider";
import { useTranslations } from "next-intl";
import {
roomNameKeys,
staticRoomNames,
roomMeta,
RoomNameKey,
} from "@/data/roomNames";
import gamedevData from "@/data/gamedev.json";
// Define interface for the ref with toggle function
@@ -26,27 +32,19 @@ export default function Expo() {
const currentViewRef = useRef<"tudengimaja" | "fuajee">("fuajee");
const t = useTranslations();
// Define room names with translations
const roomNames = useMemo(
() => ({
boardGames: t("expo.areas.boardGames"),
bar: t("expo.areas.bar"),
eval: "EVAL",
simRacing: t("expo.areas.simRacing"),
fighting: t("expo.areas.fighting"),
lvlup: "LVLup!",
redbull: "Red Bull",
// fuajee rooms
estoniagamedev: t("expo.areas.estoniagamedev"),
info: t("expo.areas.info"),
tartuyk: t("expo.areas.tartuyk"),
tly: t("expo.areas.tly"),
gameup: "GameUP!",
ittk: t("expo.areas.ittk"),
photobooth: t("expo.areas.photobooth"),
}),
[t],
);
// Room names using translations and staticRoomNames
const roomNames = useMemo(() => {
const names: Record<RoomNameKey, string> = {} as never;
roomNameKeys.forEach((key) => {
if (staticRoomNames[key]) {
names[key] = staticRoomNames[key]!;
} else {
// fallback to translation key or just key
names[key] = t(`expo.areas.${key}`, { default: key });
}
});
return names;
}, [t]);
useEffect(() => {
if (!mountRef.current) return;
@@ -129,20 +127,7 @@ export default function Expo() {
directionalLight.shadow.mapSize.height = 2048;
scene.add(directionalLight);
// Room colors and names
const roomColors = [
0x343434, // Gray - Lauamängude ala
0x4ecdc4, // Turquoise - Baariala
0xffe66d, // Yellow - EVAL
0xff6600, // Orange - Redbull Sim Racing
0xff1493, // Deep Pink - Võitlusmängu ala
0x3498db, // Blue - Sony
0x2ecc71, // Green - Lava
0x080682, // Dark Blue - LVLup!
0xc02841, // Red - RedBull
];
// Create individual rooms as rectangles with custom positions
// Create individual rooms as rectangles with custom positions using roomMeta
const rooms: THREE.Mesh[] = [];
const roomData: Array<{
mesh: THREE.Mesh;
@@ -153,115 +138,36 @@ export default function Expo() {
}> = [];
const dividers: THREE.Mesh[] = [];
// Define rooms with custom positions, sizes and colors
const roomDefinitions = [
{
width: 7,
height: 0.7,
depth: 3,
x: 2.5,
z: 4,
color: roomColors[0],
name: roomNames.boardGames,
},
{
width: 3.5,
height: 0.7,
depth: 1.2,
x: 0.7,
z: -0.3,
color: roomColors[1],
name: roomNames.bar,
},
{
width: 1.8,
height: 0.7,
depth: 1.5,
x: 1,
z: -3.5,
color: roomColors[2],
name: roomNames.eval,
},
{
width: 2,
height: 0.7,
depth: 4.5,
x: 5.2,
z: -2,
color: roomColors[3],
name: roomNames.simRacing,
},
{
width: 3,
height: 0.7,
depth: 1.5,
x: -1.7,
z: -3.5,
color: roomColors[4],
name: roomNames.fighting,
},
// {
// width: 1.8,
// height: 0.7,
// depth: 1.5,
// x: -4.3,
// z: -3.5,
// color: roomColors[5],
// name: "Sony",
// },
{
width: 3,
height: 0.7,
depth: 1.7,
x: -3.5,
z: -0.5,
color: roomColors[7],
name: roomNames.lvlup,
},
//{
// width: 2,
// height: 0.7,
// depth: 4,
// x: -6.4,
// z: -2.3,
// color: roomColors[6],
// name: "Lava",
//},
{
width: 1.8,
height: 0.7,
depth: 1.5,
x: 3,
z: -3.5,
color: roomColors[8],
name: roomNames.redbull,
},
];
// Generate rooms for tudengimaja and fuajee using roomMeta
roomNameKeys.forEach((key) => {
const metas = roomMeta[key];
if (!metas) return;
metas.forEach((meta) => {
if (meta.view !== "tudengimaja") return;
const geometry = new THREE.BoxGeometry(
meta.size.width,
meta.size.height,
meta.size.depth,
);
const material = new THREE.MeshLambertMaterial({
color: meta.color,
});
const room = new THREE.Mesh(geometry, material);
room.position.set(meta.position.x, meta.position.y, meta.position.z);
room.castShadow = true;
room.receiveShadow = true;
room.userData = { name: roomNames[key], originalColor: meta.color };
roomDefinitions.forEach((roomDef) => {
const geometry = new THREE.BoxGeometry(
roomDef.width,
roomDef.height,
roomDef.depth,
);
const material = new THREE.MeshLambertMaterial({
color: roomDef.color,
});
scene.add(room);
rooms.push(room);
const room = new THREE.Mesh(geometry, material);
room.position.set(roomDef.x, roomDef.height / 2, roomDef.z);
room.castShadow = true;
room.receiveShadow = true;
room.userData = { name: roomDef.name, originalColor: roomDef.color };
scene.add(room);
rooms.push(room);
roomData.push({
mesh: room,
name: roomDef.name,
originalColor: roomDef.color,
originalScale: room.scale.clone(),
view: "tudengimaja",
roomData.push({
mesh: room,
name: roomNames[key],
originalColor: meta.color,
originalScale: room.scale.clone(),
view: "tudengimaja",
});
});
});
@@ -275,9 +181,9 @@ export default function Expo() {
) => {
const wallGeometry = new THREE.BoxGeometry(width, height, depth);
const wallMaterial = new THREE.MeshLambertMaterial({
color: 0x555555,
transparent: true,
opacity: 0,
color: 0x2e5570,
// transparent: true,
// opacity: 0,
});
const wall = new THREE.Mesh(wallGeometry, wallMaterial);
@@ -288,8 +194,10 @@ export default function Expo() {
};
// Add strategic dividers between major areas
createTogglableDivider(10, 2, 2, -2.5, 1.5); // Wall between main entrance
createTogglableDivider(2, 2, 2, 5.5, 1.5); // Wall right next to Lauamängud & Redbull Sim Racing
createTogglableDivider(2, 2, 1, -6.5, 1); // Wall behind photowall
createTogglableDivider(4, 2, 2, -3.5, 1.5); // Wall between main entrance
createTogglableDivider(2, 2, 1, -0.5, 1.5); // Wall behind bar
createTogglableDivider(2, 2, 2, 1.5, 1.5); // Wall between main entrance
// Store dividers reference for later access
dividersRef = [...dividers];
@@ -306,10 +214,7 @@ export default function Expo() {
// Second ground plane
const groundGeometry2 = new THREE.PlaneGeometry(2, 7);
const groundMaterial2 = new THREE.MeshLambertMaterial({
color: 0xcccccc,
});
const ground2 = new THREE.Mesh(groundGeometry2, groundMaterial2);
const ground2 = new THREE.Mesh(groundGeometry2, groundMaterial);
ground2.rotation.x = -Math.PI / 2;
ground2.position.x = -12.2;
ground2.position.y = -5;
@@ -362,119 +267,39 @@ export default function Expo() {
},
);
// Function to create example rooms for fuajee
// Function to create rooms for fuajee using roomMeta
const createfuajeeRooms = () => {
const fuajeeRoomColors = [
0x7b1642, // ITÜK - Cherry Red
0x365591, // Light Blue - Tartu Ülikool
0xa82838, // Red - Tallinna Ülikool
0x183bbf, // Dark Blue - Eesti Gamedev
0xd12e7d, // Purple - Taltech
0x228b22, // Green - GameUP
0xff6347, // Orange - Info
0x20b2aa, // Light Sea Green - Photobooth
];
roomNameKeys.forEach((key) => {
const metas = roomMeta[key];
if (!metas) return;
metas.forEach((meta) => {
if (meta.view !== "fuajee") return;
const geometry = new THREE.BoxGeometry(
meta.size.width,
meta.size.height,
meta.size.depth,
);
const material = new THREE.MeshLambertMaterial({
color: meta.color,
});
const fuajeeRoomDefinitions = [
{
width: 5,
height: 0.5,
depth: 3.5,
x: -6,
z: 2.8,
color: fuajeeRoomColors[4],
name: roomNames.ittk,
},
{
width: 5,
height: 0.5,
depth: 2,
x: 2.2,
z: -1.5,
color: fuajeeRoomColors[1],
name: roomNames.tartuyk,
},
{
width: 6,
height: 0.5,
depth: 2,
x: -5.8,
z: -1.2,
color: fuajeeRoomColors[3],
name: roomNames.estoniagamedev,
},
{
width: 2,
height: 0.5,
depth: 2,
x: -1.5,
z: -1.5,
color: fuajeeRoomColors[6],
name: roomNames.info,
},
{
width: 2,
height: 0.5,
depth: 1.5,
x: 6,
z: -1.7,
color: fuajeeRoomColors[2],
name: roomNames.tly,
},
{
width: 2,
height: 0.5,
depth: 1.5,
x: 11,
z: -1.7,
color: fuajeeRoomColors[4],
name: roomNames.ittk,
},
{
width: 2,
height: 0.5,
depth: 1.5,
x: 13.5,
z: -1.7,
color: fuajeeRoomColors[7],
name: roomNames.photobooth,
},
{
width: 2,
height: 0.5,
depth: 1.5,
x: 8.5,
z: -1.7,
color: fuajeeRoomColors[5],
name: roomNames.gameup,
},
];
const room = new THREE.Mesh(geometry, material);
room.position.set(meta.position.x, meta.position.y, meta.position.z);
room.castShadow = true;
room.receiveShadow = true;
room.userData = { name: roomNames[key], originalColor: meta.color };
room.visible = true; // Initially visible for fuajee default
fuajeeRoomDefinitions.forEach((roomDef) => {
const geometry = new THREE.BoxGeometry(
roomDef.width,
roomDef.height,
roomDef.depth,
);
const material = new THREE.MeshLambertMaterial({
color: roomDef.color,
});
scene.add(room);
fuajeeRooms.push(room);
const room = new THREE.Mesh(geometry, material);
room.position.set(roomDef.x, roomDef.height / 2 + 2, roomDef.z);
room.castShadow = true;
room.receiveShadow = true;
room.userData = { name: roomDef.name, originalColor: roomDef.color };
room.visible = true; // Initially visible for fuajee default
scene.add(room);
fuajeeRooms.push(room);
roomData.push({
mesh: room,
name: roomDef.name,
originalColor: roomDef.color,
originalScale: room.scale.clone(),
view: "fuajee",
roomData.push({
mesh: room,
name: roomNames[key],
originalColor: meta.color,
originalScale: room.scale.clone(),
view: "fuajee",
});
});
});
};
@@ -738,6 +563,7 @@ export default function Expo() {
{currentView === "tudengimaja" && (
<div className="flex flex-wrap gap-4 pb-4">
{/* Bar */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
@@ -747,69 +573,116 @@ export default function Expo() {
{t("expo.areas.bar")}
</span>
</div>
{/* EVAL */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#ffe66d" }}
style={{ backgroundColor: "#4d86f7" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
EVAL
</span>
</div>
{/* LVLup */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#343434" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.boardGames")}
</span>
</div>
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#080682" }}
style={{ backgroundColor: "#d34e35" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
LVLup!
</span>
</div>
{/* Red Bull */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#C02841" }}
style={{ backgroundColor: "#c02841" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
Red Bull
</span>
</div>
{/* Sim Racing */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#ff6600" }}
style={{ backgroundColor: "#d8b43c" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.simRacing")}
</span>
</div>
<div className="items-center gap-2 hidden">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#3498db" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
Sony
</span>
</div>
{/* Fighting */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#ff1493" }}
style={{ backgroundColor: "#a8f494" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.fighting")}
</span>
</div>
{/* K-space */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#2c5da3" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
K-space.ee
</span>
</div>
{/* Photowall */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#d12e7d" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.photowall")}
</span>
</div>
{/* Buckshot Roulette */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#edb4b1" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
Buckshot Roulette
</span>
</div>
{/* Chill Area */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#05512e" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.chillArea")}
</span>
</div>
{/* Alzgamer */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#d08331" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
Alzgamer
</span>
</div>
{/* WC */}
<div className="flex items-center gap-2">
<div
className="w-4 h-4 border border-gray-300"
style={{ backgroundColor: "#332b5d" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
WC
</span>
</div>
</div>
)}
@@ -857,7 +730,7 @@ export default function Expo() {
style={{ backgroundColor: "#20b2aa" }}
></div>
<span className="text-sm text-[#2A2C3F] dark:text-[#EEE5E5]">
{t("expo.areas.photobooth")}
{t("expo.areas.studentformula")}
</span>
</div>
<div className="flex items-center gap-2">
@@ -944,6 +817,12 @@ export default function Expo() {
roomNames.fighting,
roomNames.lvlup,
roomNames.redbull,
roomNames.kspace,
roomNames.photowall,
roomNames.buckshotroulette,
roomNames.wc,
roomNames.chillArea,
roomNames.alzgamer,
].includes(hoveredRoom)) ||
(currentView === "fuajee" &&
[
@@ -952,8 +831,8 @@ export default function Expo() {
roomNames.info,
roomNames.tly,
roomNames.ittk,
roomNames.photobooth,
roomNames.gameup,
roomNames.studentformula,
].includes(hoveredRoom))) && (
<div
className="fixed bg-black bg-opacity-80 text-white px-3 py-2 rounded-lg text-sm pointer-events-none z-50"
@@ -979,7 +858,9 @@ export default function Expo() {
MINITURNIIRID
</h2>
<p className="text-[#2A2C3F] dark:text-[#EEE5E5] text-lg mb-4">
TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu tekitavaid miniturniire. Osaleda saavad ka niisama külastajad! Auhinnafond on kõigi turniiride peale 1250.
TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu
tekitavaid miniturniire. Osaleda saavad ka niisama külastajad!
Auhinnafond on kõigi turniiride peale 1250.
</p>
</div>
<div className="flex-shrink-0 relative overflow-hidden">
@@ -987,11 +868,11 @@ export default function Expo() {
src="/images/minitournament_logo.png"
alt="Miniturniirid logo"
style={{
width: '649.7214965820312px',
height: '400.99997840027544px',
transform: 'rotate(0deg)',
width: "649.7214965820312px",
height: "400.99997840027544px",
transform: "rotate(0deg)",
opacity: 1,
position: 'relative'
position: "relative",
}}
/>
</div>
@@ -1006,7 +887,7 @@ export default function Expo() {
>
PUHKA JA MÄNGI
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Card 1 - Chill-ala */}
<div className="flex flex-col">
@@ -1019,15 +900,15 @@ export default function Expo() {
/>
</div>
</div>
<h3
<h3
className="text-[#2A2C3F] dark:text-[#EEE5E5]"
style={{
fontFamily: 'Work Sans',
fontFamily: "Work Sans",
fontWeight: 700,
fontSize: '36px',
lineHeight: '100%',
letterSpacing: '-3%',
verticalAlign: 'middle'
fontSize: "36px",
lineHeight: "100%",
letterSpacing: "-3%",
verticalAlign: "middle",
}}
>
Chill-ala koos turniiride otseülekandega
@@ -1045,15 +926,15 @@ export default function Expo() {
/>
</div>
</div>
<h3
<h3
className="text-[#2A2C3F] dark:text-[#EEE5E5]"
style={{
fontFamily: 'Work Sans',
fontFamily: "Work Sans",
fontWeight: 700,
fontSize: '36px',
lineHeight: '100%',
letterSpacing: '-3%',
verticalAlign: 'middle'
fontSize: "36px",
lineHeight: "100%",
letterSpacing: "-3%",
verticalAlign: "middle",
}}
>
Mänguklubi lauamängud ja konsoolid
@@ -1071,15 +952,15 @@ export default function Expo() {
/>
</div>
</div>
<h3
<h3
className="text-[#2A2C3F] dark:text-[#EEE5E5]"
style={{
fontFamily: 'Work Sans',
fontFamily: "Work Sans",
fontWeight: 700,
fontSize: '36px',
lineHeight: '100%',
letterSpacing: '-3%',
verticalAlign: 'middle'
fontSize: "36px",
lineHeight: "100%",
letterSpacing: "-3%",
verticalAlign: "middle",
}}
>
Baariala jookide ja snäkkidega
@@ -1097,7 +978,7 @@ export default function Expo() {
>
Eesti mänguarendajad
</h2>
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-6">
{gamedevData.games.map((game) => (
<div key={game.id} className="flex flex-col">
@@ -1128,7 +1009,7 @@ export default function Expo() {
>
Ülikoolid
</h2>
{/* First 12 games in 3x4 grid */}
<div className="grid grid-cols-3 md:grid-cols-4 gap-6 mb-6">
{gamedevData.universities?.slice(0, 12).map((university) => (

View File

@@ -77,6 +77,7 @@ export default async function Home({
{/* Sponsors */}
<Sponsors />
</div>
);
}

View File

@@ -9,17 +9,17 @@ export default async function RulesMenu({
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
const t = await getTranslations({ locale });
const headingStyle = `text-4xl md:text-5xl lg:text-6xl ${vipnagorgialla.className} font-bold italic text-[#2A2C3F] dark:text-[#EEE5E5] uppercase`;
const boxStyle = `-skew-x-2 md:-skew-x-5 text-white md:px-12 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]`;
const boxTextStyle = `text-2xl md:text-3xl ${vipnagorgialla.className} font-bold uppercase text-[#EEE5E5] pb-2 break-normal whitespace-pre-line`;
return (
<div>
<div className="flex flex-col md:m-16">
@@ -49,11 +49,11 @@ export default async function RulesMenu({
{/* Minitourn. link coming soon*/}
{/*<Link href="">*/}
{/* ajutine div. kui asendate lingiga, siis saab selle ära võtta */}
<div>
<div className={`${boxStyle} bg-[#1F5673] py-16 px-8`}>
<h2 className={`${boxTextStyle}`}>
{t("rules.miniRules")}
</h2>
<div className="cursor-not-allowed">
<div
className={`${boxStyle} bg-[#1F5673] py-16 px-8 opacity-50 pointer-events-none`}
>
<h2 className={`${boxTextStyle}`}>{t("rules.miniRules")}</h2>
</div>
</div>
{/*</Link>*/}

View File

@@ -1,7 +1,8 @@
import { vipnagorgialla } from "@/components/Vipnagorgialla";
import Link from "next/link";
import Image from "next/image";
import Sponsors from "@/components/Sponsors";
import { Link } from "@/i18n/routing";
import { getTranslations, setRequestLocale } from "next-intl/server";
import Image from "next/image";
export default async function Home({
params,
@@ -73,7 +74,7 @@ export default async function Home({
>
<div className="cursor-pointer flex flex-row justify-between gap-4 items-center">
<h2
className={`text-[clamp(2rem,1.8rem+1vw,3rem)] ${vipnagorgialla.className} font-bold italic uppercase dark:text-[#EEE5E5] text-[#2A2C3F] dark:group-hover:text-[#2A2C3F] group-hover:text-black`}
className={`text-[clamp(2rem,1.8rem+1vw,3rem)] ${vipnagorgialla.className} font-bold italic break-normal uppercase dark:text-[#EEE5E5] text-[#2A2C3F] dark:group-hover:text-[#2A2C3F] group-hover:text-black`}
>
{t("navigation.tournaments")}
</h2>
@@ -129,114 +130,11 @@ export default async function Home({
</span>
</div>
<h2 className="text-[clamp(2.5rem,2.25rem+1.25vw,3.75rem)] text-[#007CAB] dark:text-[#00A3E0] dark:group-hover:text-[#EEE5E5] group-hover:text-[#EEE5E5]">
24.-26. okt.
{t("home.sections.dateAndLocation")}
</h2>
</Link>
{/* Sponsors */}
<div
className={`p-12 flex flex-col ${vipnagorgialla.className} font-bold italic border-b-3 border-[#1F5673]`}
>
<div className="text-left flex flex-col justify-between xl:justify-start">
<h3 className="text-4xl md:text-5xl dark:text-[#EEE5E5] text-[#2A2C3F] group-hover:text-black pb-8">
{t("home.sections.poweredBy")}
</h3>
<div className="flex flex-row flex-wrap gap-8 md:gap-18 items-center">
<Link href="https://taltech.ee" target="_blank">
<Image
src="/sponsors/taltech-color.png"
alt="Taltech (Tallinna Tehnikaülikool)"
width={192}
height={192}
className="object-contain"
/>
</Link>
<Link href="https://www.redbull.com/ee-et/" target="_blank">
<Image
src="/sponsors/redbull.png"
alt="Redbull"
width={80}
height={80}
className="object-contain"
/>
</Link>
<Link href="https://www.alecoq.ee" target="_blank">
<Image
src="/sponsors/alecoq.svg"
alt="Alecoq"
width={200}
height={200}
className="object-contain"
/>
</Link>
<Link href="https://www.simracing.ee/" target="_blank">
<Image
src="/sponsors/EVAL.png"
alt="EVAL"
width={200}
height={200}
className="object-contain"
/>
</Link>
<Link href="https://balsnack.ee" target="_blank">
<Image
src="/sponsors/balsnack.svg"
alt="Balsnack"
width={200}
height={200}
className="object-contain"
/>
</Link>
<Link
href="https://www.rara.ee/sundmused/interaktiivne-videomangude-muuseum-lvlup/"
target="_blank"
>
<Image
src="/sponsors/lvlup_logo_export.svg"
alt="LVLup!"
width={192}
height={192}
className="object-contain"
/>
</Link>
<Link href="https://www.facebook.com/bfglOfficial" target="_blank">
<Image
src="/sponsors/BFGL.png"
alt="BFGL"
width={192}
height={192}
className="object-contain"
/>
</Link>
<Link href="https://www.tallinn.ee/et/haridus" target="_blank">
<Image
src="/sponsors/Tallinna_Haridusamet_logo_RGB.svg"
alt="Tallinna Haridusamet"
width={192}
height={192}
className="object-contain"
/>
</Link>
<Link href="https://www.militaarseiklus.ee/" target="_blank">
<Image
src="/sponsors/militaarseiklus.png"
alt="Militaarseiklus"
width={200}
height={200}
className="object-contain"
/>
</Link>
<Link href="https://www.arvutimuuseum.ee" target="_blank">
<Image
src="/sponsors/arvutimuuseum.svg"
alt="Arvutimuuseum"
width={200}
height={200}
className="object-contain not-dark:invert"
/>
</Link>
</div>
</div>
</div>
<Sponsors />
</div>
);
}

View File

@@ -30,7 +30,7 @@ const Footer = () => {
{/* Social media */}
<div className="flex flex-row">
<a
href="https://discord.gg/tipilan"
href="https://discord.gg/pPhhatZAfA"
target="_blank"
className="mx-4 ml-0 md:ml-4"
rel="noopener noreferrer"

View File

@@ -8,7 +8,10 @@ interface SponsorsProps {
className?: string;
}
export default function Sponsors({ showTitle = true, className = "" }: SponsorsProps) {
export default function Sponsors({
showTitle = true,
className = "",
}: SponsorsProps) {
const t = useTranslations();
return (
@@ -109,7 +112,10 @@ export default function Sponsors({ showTitle = true, className = "" }: SponsorsP
className="object-contain"
/>
</NextLink>
<NextLink href="https://www.linkedin.com/company/gamedev-guild/" target="_blank">
<NextLink
href="https://www.linkedin.com/company/gamedev-guild/"
target="_blank"
>
<Image
src="/sponsors/estonian_gamedev_guild.png"
alt="Estonian Gamedev Guild"
@@ -163,7 +169,33 @@ export default function Sponsors({ showTitle = true, className = "" }: SponsorsP
className="object-contain"
/>
</NextLink>
<NextLink href="https://alzgamer.ee/" target="_blank">
<Image
src="/sponsors/alzgamer.png"
alt="AlzGamer"
width={200}
height={200}
className="object-contain"
/>
</NextLink>
<NextLink href="https://k-space.ee/" target="_blank">
<Image
src="/sponsors/k-space_ee-white.png"
alt="K-Space"
width={200}
height={200}
className="object-contain not-dark:invert"
/>
</NextLink>
<NextLink href="https://globalproductions.ee/" target="_blank">
<Image
src="/sponsors/Global-productions.png"
alt="Global Productions"
width={200}
height={200}
className="object-contain"
/>
</NextLink>
</div>
</div>
</div>

View File

@@ -16,7 +16,7 @@
},
{
"id": "eleball",
"name": "Eleball",
"name": "EleBall",
"logo": "/images/EXPO/GameDev logos/Eleball.png",
"developer": "Pulsar Twin",
"description": ""
@@ -29,8 +29,8 @@
"description": ""
},
{
"id": "cyber-dog-rescue",
"name": "Cyber Dog Rescue",
"id": "cyber-doc-rogue",
"name": "CYBER DOC ROGUE",
"logo": "/images/EXPO/GameDev logos/Cyber_Doc_Rogue.png",
"developer": "HRA Interactive",
"description": ""
@@ -121,11 +121,18 @@
"description": ""
},
{
"id": "war-thorn",
"name": "War-thorn",
"id": "war-torn",
"name": "War-torn",
"logo": "/images/EXPO/GameDev logos/War_torn.png",
"developer": "KingOfTheEnd, ForgottenCup",
"description": ""
},
{
"id": "type-n-magic",
"name": "Type 'n Magic",
"logo": "/images/EXPO/ylikoolid/type_n_magic.png",
"developer": "Mikhail Fiadotau",
"description": ""
}
],
"universities": [
@@ -182,7 +189,7 @@
"id": "nullis",
"name": "Nullis",
"logo": "/images/EXPO/GameDev logos/Nullis.png",
"university": "Tallinna Tehnikaülikool",
"university": "Tartu Ülikool",
"description": ""
},
{
@@ -219,13 +226,6 @@
"logo": "/images/EXPO/ylikoolid/magic_mineral.png",
"university": "Tallinna Ülikool",
"description": ""
},
{
"id": "type-n-magic",
"name": "Type 'n Magic",
"logo": "/images/EXPO/ylikoolid/type_n_magic.png",
"university": "Tallinna Ülikool",
"description": ""
}
]
}

218
src/data/roomNames.ts Normal file
View File

@@ -0,0 +1,218 @@
export const roomNameKeys = [
"boardGames",
"bar",
"eval",
"simRacing",
"fighting",
"lvlup",
"redbull",
"kspace",
"photowall",
"buckshotroulette",
"chillArea",
"estoniagamedev",
"info",
"tartuyk",
"tly",
"gameup",
"ittk",
"wc",
"alzgamer",
"studentformula",
] as const;
export type RoomNameKey = (typeof roomNameKeys)[number];
/**
* Static room names that do not require translation.
* Centralizing here allows easy management and expansion.
*/
export const staticRoomNames: Partial<Record<RoomNameKey, string>> = {
eval: "EVAL",
redbull: "Red Bull",
kspace: "K-space.ee",
buckshotroulette: "Buckshot Roulette",
gameup: "GameUP! Academy",
wc: "WC",
alzgamer: "Alzgamer",
};
/**
* Room metadata for tudengimaja and fuajee rooms.
* Centralizes size, position, and color for easier management.
*/
export interface RoomMeta {
color: number;
size: { width: number; height: number; depth: number };
position: { x: number; y: number; z: number };
view: "tudengimaja" | "fuajee";
}
export const roomMeta: Partial<Record<RoomNameKey, RoomMeta[]>> = {
// tudengimaja rooms
lvlup: [
{
color: 0xd34e35,
size: { width: 7, height: 0.7, depth: 2 },
position: { x: 2.8, y: 0, z: 4.75 },
view: "tudengimaja",
},
],
kspace: [
{
color: 0x2c5da3,
size: { width: 5, height: 0.7, depth: 2 },
position: { x: -3.2, y: 0, z: 4.75 },
view: "tudengimaja",
},
],
bar: [
{
color: 0x4ecdc4,
size: { width: 2, height: 0.7, depth: 0.7 },
position: { x: -0.5, y: 0, z: 1 },
view: "tudengimaja",
},
],
eval: [
{
color: 0x4d86f7,
size: { width: 2, height: 0.7, depth: 1.5 },
position: { x: 1.7, y: 0, z: -3.8 },
view: "tudengimaja",
},
],
simRacing: [
{
color: 0xd8b43c,
size: { width: 1.5, height: 0.7, depth: 5 },
position: { x: -6.8, y: 0, z: -2.2 },
view: "tudengimaja",
},
],
redbull: [
{
color: 0xc02841,
size: { width: 2, height: 0.7, depth: 1.5 },
position: { x: -3.9, y: 0, z: -3.8 },
view: "tudengimaja",
},
],
fighting: [
{
color: 0xa8f494,
size: { width: 3.5, height: 0.7, depth: 1.5 },
position: { x: -1.1, y: 0, z: -3.8 },
view: "tudengimaja",
},
],
photowall: [
{
color: 0xd12e7d,
size: { width: 2, height: 0.7, depth: 1 },
position: { x: -6.6, y: 0, z: 1.9 },
view: "tudengimaja",
},
],
buckshotroulette: [
{
color: 0xedb4b1,
size: { width: 2, height: 0.7, depth: 1.5 },
position: { x: 3.7, y: 0, z: -3.8 },
view: "tudengimaja",
},
],
chillArea: [
{
color: 0x05512e,
size: { width: 1.5, height: 0.7, depth: 5 },
position: { x: 5.5, y: 0, z: -2.1 },
view: "tudengimaja",
},
{
color: 0x05512e,
size: { width: 3.8, height: 0.7, depth: 1.5 },
position: { x: 0.4, y: 0, z: -0.2 },
view: "tudengimaja",
},
],
alzgamer: [
{
color: 0xd08331,
size: { width: 3.5, height: 0.7, depth: 1.5 },
position: { x: -3.3, y: 0, z: -0.2 },
view: "tudengimaja",
},
],
wc: [
{
color: 0x332b5d,
size: { width: 2, height: 0.7, depth: 2 },
position: { x: 5.3, y: 0, z: 1.5 },
view: "tudengimaja",
},
],
// fuajee rooms
ittk: [
{
color: 0xd12e7d,
size: { width: 4.5, height: 0.5, depth: 3 },
position: { x: -3.8, y: 0, z: 3.3 },
view: "fuajee",
},
],
tartuyk: [
{
color: 0x365591,
size: { width: 5, height: 0.5, depth: 2.5 },
position: { x: 2.7, y: 0, z: -1.7 },
view: "fuajee",
},
],
estoniagamedev: [
{
color: 0x183bbf,
size: { width: 6, height: 0.5, depth: 2.5 },
position: { x: -5.8, y: 0, z: -1.7 },
view: "fuajee",
},
{
color: 0x183bbf,
size: { width: 2, height: 0.5, depth: 5.5 },
position: { x: -7.7, y: 0, z: 2.1 },
view: "fuajee",
},
],
info: [
{
color: 0xff6347,
size: { width: 2, height: 0.5, depth: 2 },
position: { x: -1, y: 0, z: -2 },
view: "fuajee",
},
],
tly: [
{
color: 0xa82838,
size: { width: 4, height: 0.5, depth: 2 },
position: { x: 7.5, y: 0, z: -1.8 },
view: "fuajee",
},
],
gameup: [
{
color: 0x228b22,
size: { width: 2, height: 0.5, depth: 1.5 },
position: { x: 10.7, y: 0, z: -2 },
view: "fuajee",
},
],
studentformula: [
{
color: 0x20b2aa,
size: { width: 2.5, height: 0.5, depth: 1.5 },
position: { x: 13, y: 0, z: -2 },
view: "fuajee",
},
],
};

View File

@@ -89,7 +89,7 @@
"computerParticipant": {
"title": "Computer Participant",
"earlyPrice": "8€",
"latePrice":"10€",
"latePrice": "10€",
"features": [
"Personal desk, power and internet connection",
"Access to expo area",
@@ -199,7 +199,7 @@
"auditorium": "Auditorium",
"studentHouse": "Student House (Tudengimaja)",
"auditoriumAndStudentHouse": "Auditorium and Student House",
"entranceHall": "Entrance Hall"
"entranceHall": "Lobby"
}
},
"stream": {
@@ -227,18 +227,21 @@
"title": "Expo Area",
"description": "The TipiLAN expo area hosts companies, additional activities and lectures.",
"areas": {
"bar": "Bar Area",
"bar": "Bar",
"boardGames": "Board Games Area",
"simRacing": "Red Bull Sim Racing",
"fighting": "Fighting Games Area",
"photobooth": "Photo booth",
"simRacing": "Red Bull Rally Simulators",
"fighting": "Baltic Fighting Games League",
"ityk": "TalTech IT Faculty Student Council",
"tartuyk": "Tartu University",
"estoniagamedev": "Estonia Gamedev",
"estoniagamedev": "Estonian game developers",
"info": "Information booth",
"tly": "Tallinn University",
"ittk": "TalTech School of Information Technologies",
"gameup": "GameUP!"
"ittk": "TalTech School of IT",
"gameup": "GameUP!",
"photowall": "Photo wall",
"lvlup": "LVLup! video game museum",
"studentformula": "Student Formula",
"chillArea": "Chill area"
},
"hide": "Hide walls",
"show": "Show walls"

View File

@@ -89,7 +89,7 @@
"computerParticipant": {
"title": "Arvutiga osaleja",
"earlyPrice": "8€",
"latePrice":"10€",
"latePrice": "10€",
"features": [
"Isiklik laud, voolu- ja internetiühendus",
"Ligipääs messialale",
@@ -228,18 +228,21 @@
"title": "Messiala",
"description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud.",
"areas": {
"bar": "Baariala",
"bar": "Baar",
"boardGames": "Lauamängude ala",
"simRacing": "Red Bull Sim Racing",
"fighting": "Võitlusmängu ala",
"photobooth": "Fotoboks",
"simRacing": "Red Bull rallisimulaatorid",
"fighting": "Balti Võitlusmängude Liiga",
"ityk": "IT-teaduskonna üliõpilaskogu",
"tartuyk": "Tartu Ülikool",
"estoniagamedev": "Eesti Gamedev",
"estoniagamedev": "Eesti mänguarendajad",
"info": "Infoboks",
"tly": "Tallinna Ülikool",
"ittk": "TalTech IT-Teaduskond",
"gameup": "GameUP!"
"gameup": "GameUP!",
"photowall": "Fotosein",
"lvlup": "LVLup! videomängude muuseum",
"studentformula": "Tudengivormel",
"chillArea": "Chill-ala"
},
"hide": "Peida seinad",
"show": "Näita seinu"