client: API layer — types and client updates for new server fields

Add AvailableMission (extends Mission with estimatedSuccessChance,
canStart), AbandonMissionResponse type. Extend Mission with description,
minLevel, rewardItemName/Quantity; ClaimMissionResponse with moneyChange,
fine, lootItem fields; City with mapX/mapY; MarketEntry with basePrice.
Add abandonMission() API call.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 00:11:44 +02:00
parent 123b67952e
commit 25376553e7
2 changed files with 28 additions and 2 deletions
+5 -2
View File
@@ -1,13 +1,14 @@
import { request } from './http'; import { request } from './http';
import type { import type {
AbandonMissionResponse,
ActiveMission, ActiveMission,
AuthResponse, AuthResponse,
AvailableMission,
City, City,
ClaimMissionResponse, ClaimMissionResponse,
InventoryResponse, InventoryResponse,
LeaderboardResponse, LeaderboardResponse,
MarketResponse, MarketResponse,
Mission,
PlayerMeResponse, PlayerMeResponse,
StartMissionResponse, StartMissionResponse,
TradeResponse, TradeResponse,
@@ -44,12 +45,14 @@ export const api = {
inventory: () => request<InventoryResponse>('/inventory'), inventory: () => request<InventoryResponse>('/inventory'),
// Missions // Missions
missionsAvailable: () => request<{ missions: Mission[] }>('/missions/available'), missionsAvailable: () => request<{ missions: AvailableMission[] }>('/missions/available'),
missionsActive: () => request<{ missions: ActiveMission[] }>('/missions/active'), missionsActive: () => request<{ missions: ActiveMission[] }>('/missions/active'),
startMission: (missionId: string) => startMission: (missionId: string) =>
request<StartMissionResponse>(`/missions/${missionId}/start`, { method: 'POST' }), request<StartMissionResponse>(`/missions/${missionId}/start`, { method: 'POST' }),
claimMission: (playerMissionId: string) => claimMission: (playerMissionId: string) =>
request<ClaimMissionResponse>(`/missions/${playerMissionId}/claim`, { method: 'POST' }), request<ClaimMissionResponse>(`/missions/${playerMissionId}/claim`, { method: 'POST' }),
abandonMission: (playerMissionId: string) =>
request<AbandonMissionResponse>(`/missions/${playerMissionId}/abandon`, { method: 'POST' }),
// Events // Events
events: () => request<{ events: WorldEvent[] }>('/events/current'), events: () => request<{ events: WorldEvent[] }>('/events/current'),
+23
View File
@@ -27,6 +27,8 @@ export type City = {
riskLevel: number; riskLevel: number;
policePressure: number; policePressure: number;
economyModifier: number; economyModifier: number;
mapX: number;
mapY: number;
travelCost: number; travelCost: number;
}; };
@@ -54,6 +56,7 @@ export type MarketEntry = {
name: string; name: string;
buyPrice: number; buyPrice: number;
sellPrice: number; sellPrice: number;
basePrice: number;
demand: number; demand: number;
supply: number; supply: number;
rarity: number; rarity: number;
@@ -96,8 +99,10 @@ export type Mission = {
id: string; id: string;
cityId: string; cityId: string;
title: string; title: string;
description: string;
type: 'DELIVERY' | 'THEFT' | 'SMUGGLING' | 'INTEL'; type: 'DELIVERY' | 'THEFT' | 'SMUGGLING' | 'INTEL';
difficulty: number; difficulty: number;
minLevel: number;
durationSeconds: number; durationSeconds: number;
rewardMoney: number; rewardMoney: number;
rewardXp: number; rewardXp: number;
@@ -105,9 +110,17 @@ export type Mission = {
requiredItemId: string | null; requiredItemId: string | null;
requiredItemName: string | null; requiredItemName: string | null;
requiredItemQuantity: number | null; requiredItemQuantity: number | null;
rewardItemName: string | null;
rewardItemQuantity: number | null;
expiresAt: string; expiresAt: string;
}; };
/** Missione disponibile, arricchita con la stima calcolata per il giocatore. */
export type AvailableMission = Mission & {
estimatedSuccessChance: number;
canStart: boolean;
};
export type ActiveMission = { export type ActiveMission = {
playerMissionId: string; playerMissionId: string;
status: 'STARTED' | 'COMPLETED' | 'FAILED'; status: 'STARTED' | 'COMPLETED' | 'FAILED';
@@ -130,11 +143,21 @@ export type ClaimMissionResponse = {
successChance: number; successChance: number;
rewardMoney: number; rewardMoney: number;
rewardXp: number; rewardXp: number;
moneyChange: number;
fine: number;
lootItemName: string | null;
lootItemQuantity: number | null;
reputationChange: number; reputationChange: number;
levelsGained: number; levelsGained: number;
player: Player; player: Player;
}; };
export type AbandonMissionResponse = {
playerMissionId: string;
reputationChange: number;
player: Player;
};
export type LeaderboardEntry = { export type LeaderboardEntry = {
rank: number; rank: number;
playerId: string; playerId: string;