# API設計
###### tags: `遊戲後端`
<!-- 頁首通用模組 -->
{%hackmd xcsnQTMQQ0SZQ9QF7YUp_g %}
---
:::info
:::spoiler 大綱
[TOC]
:::
---
## 構想
- 2020/10/15
:::spoiler 構想
```
// ======================================================
// DB Struct
// ======================================================
Collection players: {
Unsigned playerID, // uniqe, primary key val
String playerName,
String bio,
String leaderStone = stoneID
Stone[] stones: {
// 擁有的石頭
{
Unsigned stoneID, // uniqe for each stone
Unsigned stoneType, // map<stoneName, stoneType>
String stoneName, // e.g. "長石"
Action activityDoing,
Time activityStartTime,
Integer level,
Integer STR,
Integer AGI,
...
},
{
Unsigned stoneID,
...
},
...
}
}
Collection basicStones: {
// 各種石頭的基本數值
{
Unsigned stoneType, // primary key val
String stoneName,
EvolveRule[] evolveRules {
{
Unsined target = stoneType
Rule rule: {
// this rule refer to "(str > 78 or atk > 7) and agi < 63 and stoneType == 78763"
$and: {
$or: {
$gt: {
STR: 78
},
$gt: {
level: 7
}
},
$les: {
AGI: 63
},
$eq: {
stoneType: 78763
}
}
}
}
}
Integer level
Integer STR, // init value of this type of stone
Integer AGI,
Integer LUK,
Integer MAG,
...
},
...
}
// ======================================================
// API router
// ======================================================
::
req: POST /api/login
res: Session cookie
::
::
req: GET /api/myData
res: player[session.playerID]
::
::
req: GET /api/myData/qury="stone1.STR"
res: player[session.playerID][stone1][STR]
::
::
req: POST /api/action/$stone="stone1" & $action="reading"
res: player[session.playerID][$stone].do($action)
::
::
req: GET /api/playerData/$playerID="78763"
res: player[$playerID]
::
::
req: POST /api/attack/$opponent="78763" & $type="kill"
res: challangePlayer(session.playerID, $opponent, $type).result
::
::
req: GET /api/challange/$stage="78"
res: challangeStage($stage).result
::
```
:::