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 type {
AbandonMissionResponse,
ActiveMission,
AuthResponse,
AvailableMission,
City,
ClaimMissionResponse,
InventoryResponse,
LeaderboardResponse,
MarketResponse,
Mission,
PlayerMeResponse,
StartMissionResponse,
TradeResponse,
@@ -44,12 +45,14 @@ export const api = {
inventory: () => request<InventoryResponse>('/inventory'),
// Missions
missionsAvailable: () => request<{ missions: Mission[] }>('/missions/available'),
missionsAvailable: () => request<{ missions: AvailableMission[] }>('/missions/available'),
missionsActive: () => request<{ missions: ActiveMission[] }>('/missions/active'),
startMission: (missionId: string) =>
request<StartMissionResponse>(`/missions/${missionId}/start`, { method: 'POST' }),
claimMission: (playerMissionId: string) =>
request<ClaimMissionResponse>(`/missions/${playerMissionId}/claim`, { method: 'POST' }),
abandonMission: (playerMissionId: string) =>
request<AbandonMissionResponse>(`/missions/${playerMissionId}/abandon`, { method: 'POST' }),
// Events
events: () => request<{ events: WorldEvent[] }>('/events/current'),
+23
View File
@@ -27,6 +27,8 @@ export type City = {
riskLevel: number;
policePressure: number;
economyModifier: number;
mapX: number;
mapY: number;
travelCost: number;
};
@@ -54,6 +56,7 @@ export type MarketEntry = {
name: string;
buyPrice: number;
sellPrice: number;
basePrice: number;
demand: number;
supply: number;
rarity: number;
@@ -96,8 +99,10 @@ export type Mission = {
id: string;
cityId: string;
title: string;
description: string;
type: 'DELIVERY' | 'THEFT' | 'SMUGGLING' | 'INTEL';
difficulty: number;
minLevel: number;
durationSeconds: number;
rewardMoney: number;
rewardXp: number;
@@ -105,9 +110,17 @@ export type Mission = {
requiredItemId: string | null;
requiredItemName: string | null;
requiredItemQuantity: number | null;
rewardItemName: string | null;
rewardItemQuantity: number | null;
expiresAt: string;
};
/** Missione disponibile, arricchita con la stima calcolata per il giocatore. */
export type AvailableMission = Mission & {
estimatedSuccessChance: number;
canStart: boolean;
};
export type ActiveMission = {
playerMissionId: string;
status: 'STARTED' | 'COMPLETED' | 'FAILED';
@@ -130,11 +143,21 @@ export type ClaimMissionResponse = {
successChance: number;
rewardMoney: number;
rewardXp: number;
moneyChange: number;
fine: number;
lootItemName: string | null;
lootItemQuantity: number | null;
reputationChange: number;
levelsGained: number;
player: Player;
};
export type AbandonMissionResponse = {
playerMissionId: string;
reputationChange: number;
player: Player;
};
export type LeaderboardEntry = {
rank: number;
playerId: string;