You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.0 KiB
Go
148 lines
5.0 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
// Town represents a fixed settlement along the hero's travel road.
|
|
type Town struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Biome string `json:"biome"`
|
|
WorldX float64 `json:"worldX"`
|
|
WorldY float64 `json:"worldY"`
|
|
Radius float64 `json:"radius"`
|
|
LevelMin int `json:"levelMin"`
|
|
LevelMax int `json:"levelMax"`
|
|
}
|
|
|
|
// NPC represents a non-hostile character living in a town.
|
|
type NPC struct {
|
|
ID int64 `json:"id"`
|
|
TownID int64 `json:"townId"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"` // quest_giver, merchant, healer
|
|
OffsetX float64 `json:"offsetX"`
|
|
OffsetY float64 `json:"offsetY"`
|
|
}
|
|
|
|
// Quest is a template definition offered by a quest-giver NPC.
|
|
type Quest struct {
|
|
ID int64 `json:"id"`
|
|
NPCID int64 `json:"npcId"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Type string `json:"type"` // kill_count, visit_town, collect_item
|
|
TargetCount int `json:"targetCount"`
|
|
TargetEnemyType *string `json:"targetEnemyType"` // NULL = any enemy
|
|
TargetTownID *int64 `json:"targetTownId"` // for visit_town quests
|
|
DropChance float64 `json:"dropChance"` // for collect_item
|
|
MinLevel int `json:"minLevel"`
|
|
MaxLevel int `json:"maxLevel"`
|
|
RewardXP int64 `json:"rewardXp"`
|
|
RewardGold int64 `json:"rewardGold"`
|
|
RewardPotions int `json:"rewardPotions"`
|
|
}
|
|
|
|
// HeroQuest tracks a hero's progress on an accepted quest.
|
|
type HeroQuest struct {
|
|
ID int64 `json:"id"`
|
|
HeroID int64 `json:"heroId"`
|
|
QuestID int64 `json:"questId"`
|
|
Status string `json:"status"` // accepted, completed, claimed
|
|
Progress int `json:"progress"`
|
|
AcceptedAt time.Time `json:"acceptedAt"`
|
|
CompletedAt *time.Time `json:"completedAt,omitempty"`
|
|
ClaimedAt *time.Time `json:"claimedAt,omitempty"`
|
|
Quest *Quest `json:"quest,omitempty"` // populated on list
|
|
}
|
|
|
|
// QuestReward holds the rewards granted when a quest is claimed.
|
|
type QuestReward struct {
|
|
XP int64 `json:"xp"`
|
|
Gold int64 `json:"gold"`
|
|
Potions int `json:"potions"`
|
|
}
|
|
|
|
// TownWithNPCs is a Town annotated with its NPC residents and computed world positions.
|
|
type TownWithNPCs struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Biome string `json:"biome"`
|
|
WorldX float64 `json:"worldX"`
|
|
WorldY float64 `json:"worldY"`
|
|
Radius float64 `json:"radius"`
|
|
Size string `json:"size"` // S, M, L derived from radius
|
|
NPCs []NPCView `json:"npcs"`
|
|
}
|
|
|
|
// NPCView is the frontend-friendly view of an NPC with absolute world coordinates.
|
|
type NPCView struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
WorldX float64 `json:"worldX"`
|
|
WorldY float64 `json:"worldY"`
|
|
}
|
|
|
|
// TownSizeFromRadius derives a size label from the town radius.
|
|
func TownSizeFromRadius(radius float64) string {
|
|
switch {
|
|
case radius >= 17:
|
|
return "L"
|
|
case radius >= 14:
|
|
return "M"
|
|
default:
|
|
return "S"
|
|
}
|
|
}
|
|
|
|
// NPCInteractAction represents a single action the player can take with an NPC.
|
|
type NPCInteractAction struct {
|
|
ActionType string `json:"actionType"` // "quest", "shop_item", "heal"
|
|
QuestID int64 `json:"questId,omitempty"` // for quest_giver
|
|
QuestTitle string `json:"questTitle,omitempty"` // for quest_giver
|
|
ItemName string `json:"itemName,omitempty"` // for merchant
|
|
ItemCost int64 `json:"itemCost,omitempty"` // for merchant / healer
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
// NPCInteractResponse is the response for POST /api/v1/hero/npc-interact.
|
|
type NPCInteractResponse struct {
|
|
NPCName string `json:"npcName"`
|
|
NPCType string `json:"npcType"`
|
|
TownName string `json:"townName"`
|
|
Actions []NPCInteractAction `json:"actions"`
|
|
}
|
|
|
|
// NearbyNPCEntry is returned by the nearby-npcs endpoint.
|
|
type NearbyNPCEntry struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
WorldX float64 `json:"worldX"`
|
|
WorldY float64 `json:"worldY"`
|
|
InteractionAvailable bool `json:"interactionAvailable"`
|
|
}
|
|
|
|
// NPCEventResponse is returned when a random NPC event occurs instead of an enemy encounter.
|
|
type NPCEventResponse struct {
|
|
Type string `json:"type"` // "npc_event"
|
|
NPC NPCEventNPC `json:"npc"`
|
|
Cost int64 `json:"cost"`
|
|
Reward string `json:"reward"` // e.g. "random_equipment"
|
|
}
|
|
|
|
// NPCEventNPC describes the wandering NPC in a random event.
|
|
type NPCEventNPC struct {
|
|
Name string `json:"name"`
|
|
Role string `json:"role"`
|
|
}
|
|
|
|
// AlmsResponse is the response for POST /api/v1/hero/npc-alms.
|
|
type AlmsResponse struct {
|
|
Accepted bool `json:"accepted"`
|
|
GoldSpent int64 `json:"goldSpent,omitempty"`
|
|
ItemDrop *LootDrop `json:"itemDrop,omitempty"`
|
|
Hero interface{} `json:"hero,omitempty"`
|
|
Message string `json:"message"`
|
|
}
|