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:
@@ -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'),
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user