Skip to content

Commit fd38749

Browse files
authored
feat: update forest lobby ux (#554)
* feat: update forest lobby ux * undo
1 parent 9663a1c commit fd38749

8 files changed

Lines changed: 76 additions & 37 deletions

File tree

client/modules/character/components/CharacterMagicLearnModal.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ export const CharacterMagicsLearnModal: FC<{ avaiableMagicLevels: Record<number,
2424
return (
2525
<Modal trigger={<Button className="is-primary flex-1">Изучение магий</Button>} modal={false}>
2626
<Card header="Изучение магии">
27-
<h5 className="text-sm">Выбери уровень магии, который хочешь изучить</h5>
27+
<h5 className="text-sm">
28+
Выбери уровень магии, который хочешь изучить. Будет изучена случайная магия выбранного
29+
уровня
30+
</h5>
2831

2932
<div className="flex flex-col gap-2">
3033
<span className="self-end mr-4">У тебя {character.bonus}💡</span>

client/modules/clan/pages/ClanListPage.tsx

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,29 @@ export const ClanListPage = () => {
3131
};
3232

3333
return (
34-
<Card header="Кланы" className="m-4">
35-
<Suspense fallback={'Ищем кланы...'}>
36-
{clans.length ? (
37-
<ClanList
38-
clans={clans}
39-
isLoading={isLoading}
40-
isRequested={isRequested}
41-
onCreateRequest={createRequest}
42-
onCancelRequest={cancelRequest}
43-
/>
44-
) : (
45-
'Кланов не найдено'
46-
)}
47-
48-
<div className="flex flex-col">
49-
<Button className="mt-4" onClick={() => navigate('/character/clan/create')}>
50-
Создать клан
51-
</Button>
52-
</div>
53-
</Suspense>
54-
</Card>
34+
<div className="h-screen flex flex-col justify-between">
35+
<Card header="Кланы" className="m-4">
36+
<Suspense fallback={'Ищем кланы...'}>
37+
{clans.length ? (
38+
<ClanList
39+
clans={clans}
40+
isLoading={isLoading}
41+
isRequested={isRequested}
42+
onCreateRequest={createRequest}
43+
onCancelRequest={cancelRequest}
44+
/>
45+
) : (
46+
'Кланов не найдено'
47+
)}
48+
</Suspense>
49+
</Card>
50+
51+
<div className="flex flex-col p-4">
52+
<Button className="mt-4 is-primary" onClick={() => navigate('/character/clan/create')}>
53+
Создать клан
54+
</Button>
55+
</div>
56+
</div>
5557
);
5658
};
5759

client/modules/forest/pages/ForestPage.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { ForestEventAction, ForestEventType, ForestPhase } from '@fwo/shared';
22
import { Button } from '@/components/Button';
33
import { Card } from '@/components/Card';
4+
import { Player } from '@/components/Player';
5+
import { useCharacter } from '@/modules/character/store/character';
46
import { useForest } from '@/modules/forest/hooks/useForest';
57

68
const EVENT_TITLES: Record<ForestEventType, string> = {
@@ -59,6 +61,9 @@ export const ForestPage = () => {
5961
isEvent,
6062
} = useForest();
6163

64+
const name = useCharacter((character) => character.name);
65+
const characterClass = useCharacter((character) => character.class);
66+
6267
if (!status) {
6368
return (
6469
<Card header="Лес" className="m-4">
@@ -71,6 +76,7 @@ export const ForestPage = () => {
7176
<Card header="Лес" className="m-4">
7277
{/* Статус игрока */}
7378
<div className="mb-4 p-2 border-2 border-dashed">
79+
<Player name={name} class={characterClass} />
7480
<div className="flex justify-between items-center">
7581
<span>❤️ HP:</span>
7682
<span>

client/modules/forge/components/ForgeList.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { getItemPrice, type Item } from '@fwo/shared';
2+
import { every } from 'es-toolkit/compat';
23
import type { FC } from 'react';
4+
import { forgeClanItem } from '@/api/clan';
35
import { forgeItem } from '@/api/inventory';
4-
import { ItemModal } from '@/modules/items/components/ItemModal';
5-
import { useRequest } from '@/hooks/useRequest';
66
import { Button } from '@/components/Button';
77
import { Placeholder } from '@/components/Placeholder';
8-
import { every } from 'es-toolkit/compat';
9-
import { forgeClanItem } from '@/api/clan';
10-
import { useCharacter } from '@/modules/character/store/character';
11-
import { useSyncCharacter } from '@/modules/character/hooks/useSyncCharacter';
128
import { usePopup } from '@/hooks/usePopup';
9+
import { useRequest } from '@/hooks/useRequest';
10+
import { useSyncCharacter } from '@/modules/character/hooks/useSyncCharacter';
11+
import { useCharacter } from '@/modules/character/store/character';
12+
import { ItemModal } from '@/modules/items/components/ItemModal';
1313

1414
export const ForgeList: FC<{ items: Item[]; clanForge?: boolean }> = ({ items, clanForge }) => {
1515
const gold = useCharacter((character) => character.gold);

client/modules/lobby/pages/LobbyForestPage.tsx

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ import { useState } from 'react';
22
import { useNavigate } from 'react-router';
33
import { Button } from '@/components/Button';
44
import { Card } from '@/components/Card';
5+
import { useMountEffect } from '@/hooks/useMountEffect';
6+
import { usePopup } from '@/hooks/usePopup';
57
import { useSocket } from '@/stores/socket';
68

79
export const LobbyForestPage = () => {
810
const navigate = useNavigate();
911
const socket = useSocket();
1012
const [loading, setLoading] = useState(false);
1113
const [error, setError] = useState<string | null>(null);
14+
const [debuffLevel, setDebuffLevel] = useState(0);
15+
const popup = usePopup();
1216

1317
const handleEnterForest = async () => {
1418
setLoading(true);
@@ -27,27 +31,40 @@ export const LobbyForestPage = () => {
2731
}
2832
};
2933

34+
useMountEffect(() => {
35+
socket.emitWithAck('forest:lobby').then((res) => {
36+
if (res.error) {
37+
popup.info({ message: res.error });
38+
} else {
39+
setDebuffLevel(res.debuffLevel ?? 0);
40+
}
41+
});
42+
});
43+
3044
return (
3145
<div className="h-full overflow-hidden flex flex-col">
3246
<Card header="Лес" className="m-4">
33-
<div className="flex flex-col gap-4">
34-
<p className="text-sm">
35-
Лес - это PvE режим, где ты можешь собирать ресурсы и сражаться с монстрами.
36-
</p>
47+
<div className="flex flex-col gap-2">
48+
<div className="flex flex-col">
49+
<p className="text-sm">
50+
Лес - это PvE режим, где ты можешь собирать ресурсы и сражаться с монстрами.
51+
</p>
52+
53+
{debuffLevel ? <p className="text-sm text-red-500">Ты ослаблен после смерти</p> : null}
54+
</div>
3755

3856
<div className="border-2 border-dashed p-2">
39-
<h5 className="mb-2">Правила:</h5>
57+
<h5 className="mb-1 text-sm">Правила:</h5>
4058
<ul className="text-xs list-disc list-inside">
4159
<li>Здоровье сохраняется между боями</li>
42-
<li>Максимальное время: 15 минут</li>
4360
<li>Чем глубже ты пробираешься в лес - тем опаснее</li>
4461
<li>При смерти - дебафф на 1 час</li>
4562
<li>Любой выбор может обернуться неожиданным последствием</li>
4663
</ul>
4764
</div>
4865

4966
<div className="border-2 border-dashed p-2">
50-
<h5 className="mb-2">Награды:</h5>
67+
<h5 className="mb-1 text-sm">Награды:</h5>
5168
<ul className="text-xs list-disc list-inside">
5269
<li>🐺 Волк - кожа</li>
5370
<li>🌳 Дерево - доски</li>

server/arena/ForestService/ForestService.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,13 @@ export class ForestService extends EventEmitter<{
112112
return this;
113113
}
114114

115+
static getDebuffLevel(character: CharacterService) {
116+
const penalties = character.getPenalties('forest_death');
117+
return Math.min(penalties?.length, deathEcho.effect.length);
118+
}
119+
115120
private applyForestDebuff() {
116-
const penalties = this.character.getPenalties('forest_death');
117-
this.debuffLevel = Math.min(penalties.length, deathEcho.effect.length);
121+
this.debuffLevel = ForestService.getDebuffLevel(this.character);
118122

119123
if (this.debuffLevel) {
120124
this.player.passiveSkills[deathEcho.name] = this.debuffLevel;

server/server/ws/forest.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ export const onCreate = (io: Server) => {
6262
export const onConnection = (_io: Server, socket: Socket) => {
6363
const { character } = socket.data;
6464

65+
socket.on('forest:lobby', async (callback) => {
66+
callback({
67+
debuffLevel: ForestService.getDebuffLevel(character),
68+
});
69+
});
70+
6571
// Вход в лес
6672
socket.on('forest:enter', async (callback) => {
6773
withValidationRPC(async () => {

shared/shared/message.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export type ClientToServerMessage = Message<{
5353
) => void,
5454
];
5555
'tower:accept': [accept: boolean, callback: (payload: RPC<{ accepted: string[] }>) => void];
56+
'forest:lobby': [callback: (payload: RPC<{ debuffLevel: number }>) => void];
5657
'forest:enter': [callback: (payload: RPC<{ forestId: string }>) => void];
5758
'forest:connect': [callback: (payload: RPC<ForestStatus>) => void];
5859
'forest:handleEvent': [

0 commit comments

Comments
 (0)