GS2-Enhance トランザクションアクション
アクションの組み合わせと同時実行
すべてのサービスに共通する前提は トランザクションアクションの組み合わせ にまとめています。先にそちらを読んでください。この節の残りは GS2-Enhance 固有の内容です。
GS2-Enhance のトランザクションアクションは、進行を介するものと介さないものの 2 つに分かれます。進行はネームスペースとユーザーの組で決まり、1 ユーザーにつき 1 つだけ存在します。
| 操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 | 直列実行モード有効時 |
|---|---|---|---|---|
進行の作成CreateProgressByUserId | 1 件に統合される | 失敗する | ネームスペース・ユーザー | 作成どうしの衝突は変わらず失敗する。2 件目は、実在する重複を防ぐのと同じ読み取りで 1 件目の進行を見られるようになり、「すでに存在する」として拒否されるため。2 件目に force を指定しても解決しない。この場合はチェックが飛ばされるが、同じ行への 2 つの書き込みをまとめられずトランザクションが失敗する (400)。破棄との衝突も引き続き失敗する(後述) |
進行の破棄DeleteProgressByUserId | 1 件に統合される | 失敗する | ネームスペース・ユーザー | 引き続き失敗する。1 件にまとめられなくなるため、2 件目の破棄はすでに無くなった進行に対して実行され、見つからない (404) として弾かれる |
直接強化・解放DirectEnhanceByUserId UnleashByUserId | 強化レート・対象・素材がすべて同じなら 1 件に統合される。1 つでも違えばそれぞれ実行される | 進行を触らない | ネームスペース・ユーザー・強化レート・対象アイテム・素材 | 変わらない。進行を触らないことに変わりはない |
作成と破棄は行が違い、境界が同じです。1 つのトランザクションに入れることはできません。
進行の作成は、すでに別の進行があると失敗します。これによって同時に進められる強化が 1 つに保たれています。この判定はトランザクション開始時点の状態に対して行われるため、衝突の問題を別にしても、進行を破棄してから新しい進行を作ることはできません。直列実行モード(enableSequentialExecution または TransactionSettingV2)を有効にしても、この流れはできません。破棄は消費アクションで、作成(入手アクション)より必ず先に実行されるため、作成の存在チェック自体は通ります。しかし破棄と作成は同じ行への 2 つの書き込みになり、それらをまとめる時点でトランザクションが失敗します (400)。進行を破棄してから新しい進行を作るには、引き続きトランザクションを 2 つに分ける必要があります。作成どうしを同居させた場合の挙動も変わりません(上の表を参照)。
DirectEnhanceByUserId と UnleashByUserId は進行をまったく触りません。何を消費して何を入手するかを算出し、それらを自身のトランザクションとして発行します。素材が違う 2 つは別の対象なのでどちらも実行されますが、消費するものと入手するものは同じトランザクションに集まります。
強化の素材は GS2-Inventory から消費され、結果も GS2-Inventory で入手されるのが一般的です。外側のトランザクションが同じアイテムを触る場合は、GS2-Inventory のページもあわせて確認してください。
入れ子になったトランザクションに注意
内側から作成された進行と、外側から破棄された進行が衝突して、トランザクションが失敗します。 直列実行モードを有効にすると、この失敗は起こらなくなります。破棄は消費アクションなので、内側の作成を起動する入手アクションより必ず先に実行され、内側の作成の存在チェックが走る時点ではすでに破棄が終わっているため、じゃまな進行が無い状態になります。
制限を回避したい場合
進行の作成、直接強化、解放は入手アクション、進行の破棄は消費アクションです。作成どうしの衝突は acquireActionUseJobQueue を有効にすれば解消できます。作成と破棄の同居は enableAtomicCommit を無効にすれば解消し、このとき消費アクションが入手アクションより先に実行されるため、破棄してから新しい進行を作るという流れも成立するようになります。
同時実行とリトライ
同じユーザーの進行を複数のリクエストが同時に作成・破棄した場合、後から確定した側がコンフリクト (409) になります。リトライすると最新の状態で判定し直されるので、進行が期待した状態であれば成功し、すでに別の強化が始まっていればエラーが返ります。
直接強化と解放は進行を触らないため、どの程度コンフリクトするかは、素材と結果が属するサービス次第です。
Consume Action
消費アクション
Gs2Enhance:DeleteProgressByUserId
ユーザーIDを指定して実行中の強化の進行情報を削除
指定されたユーザーの現在進行中の強化の進行情報レコードを削除します。
進行中の2フェーズ強化がキャンセルされ、事前計算された経験値とボーナスレートは破棄されます。
Start フェーズで既に消費された素材は自動的には返還されません。
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2Enhance:DeleteProgressByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"userId": "[string]ユーザーID",
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2Enhance:DeleteProgressByUserId
request:
namespaceName: "[string]ネームスペース名"
userId: "[string]ユーザーID"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("enhance").consume.delete_progress_by_user_id({
namespaceName="[string]ネームスペース名",
userId="[string]ユーザーID",
timeOffsetToken="[string]タイムオフセットトークン",
})Acquire Action
入手アクション
Gs2Enhance:DirectEnhanceByUserId
ユーザーIDを指定して強化を実行
強化レートモデルに基づいて、指定された素材を消費して対象アイテムセットに経験値を付与します。
獲得経験値はレートモデルで定義された経験値階層に従って素材から計算され、ボーナスレートは設定されたボーナスレート確率テーブルから抽選されます。
結果には獲得した経験値量と適用されたボーナスレートが含まれます。
素材の消費と経験値の取得を実行するためのトランザクションが発行されます。
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| rateName | string | ✓ | ~ 128文字 | 強化レートモデル名 強化レートモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| targetItemSetId | string | ✓ | ~ 1024文字 | 強化対象のアイテムセットの GRN | ||
| materials | List<Material> | ✓ | 1 ~ 10 items | 強化素材リスト | ||
| config | List<Config> | [] | 0 ~ 32 items | トランザクションの変数に適用する設定値 | ||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2Enhance:DirectEnhanceByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"rateName": "[string]強化レートモデル名",
"userId": "[string]ユーザーID",
"targetItemSetId": "[string]強化対象のアイテムセットのGRN",
"materials": [
{
"materialItemSetId": "[string]強化の素材となるアイテムセットの GRN",
"count": "[int]消費数量"
}
],
"config": [
{
"key": "[string]名前",
"value": "[string]値"
}
],
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2Enhance:DirectEnhanceByUserId
request:
namespaceName: "[string]ネームスペース名"
rateName: "[string]強化レートモデル名"
userId: "[string]ユーザーID"
targetItemSetId: "[string]強化対象のアイテムセットのGRN"
materials:
- materialItemSetId: "[string]強化の素材となるアイテムセットの GRN"
count: "[int]消費数量"
config:
- key: "[string]名前"
value: "[string]値"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("enhance").acquire.direct_enhance_by_user_id({
namespaceName="[string]ネームスペース名",
rateName="[string]強化レートモデル名",
userId="[string]ユーザーID",
targetItemSetId="[string]強化対象のアイテムセットのGRN",
materials={
{
materialItemSetId="[string]強化の素材となるアイテムセットの GRN",
count="[int]消費数量"
}
},
config={
{
key="[string]名前",
value="[string]値"
}
},
timeOffsetToken="[string]タイムオフセットトークン",
})Gs2Enhance:UnleashByUserId
ユーザーIDを指定して限界突破を実行
GS2-Grade で管理するグレードを引き上げる強化処理で利用します。
なかでも、同種アイテムを素材として消費することでレベルキャップを引き上げるタイプの限界突破に利用します。
指定された素材を消費する代わりに限界突破対象のリソースのグレードを1引き上げることができます。
素材となるリソースが経験値などのリソースを持っていたとしても、そのリソースは引き継がれません。
引き継ぎが必要な場合は、事前に別のリソースに引き継ぐためのリソースに変換しておく必要があります。
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| rateName | string | ✓ | ~ 128文字 | 強化レートモデル名 強化レートモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| targetItemSetId | string | ✓ | ~ 1024文字 | 限界突破対象のアイテムセットの GRN | ||
| materials | List<string> | ✓ | 1 ~ 1000 items | 限界突破素材リスト | ||
| config | List<Config> | [] | 0 ~ 32 items | トランザクションの変数に適用する設定値 | ||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2Enhance:UnleashByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"rateName": "[string]強化レートモデル名",
"userId": "[string]ユーザーID",
"targetItemSetId": "[string]限界突破対象のアイテムセットのGRN",
"materials": [
"[string]素材"
],
"config": [
{
"key": "[string]名前",
"value": "[string]値"
}
],
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2Enhance:UnleashByUserId
request:
namespaceName: "[string]ネームスペース名"
rateName: "[string]強化レートモデル名"
userId: "[string]ユーザーID"
targetItemSetId: "[string]限界突破対象のアイテムセットのGRN"
materials:
- "[string]素材"
config:
- key: "[string]名前"
value: "[string]値"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("enhance").acquire.unleash_by_user_id({
namespaceName="[string]ネームスペース名",
rateName="[string]強化レートモデル名",
userId="[string]ユーザーID",
targetItemSetId="[string]限界突破対象のアイテムセットのGRN",
materials={
"[string]素材"
},
config={
{
key="[string]名前",
value="[string]値"
}
},
timeOffsetToken="[string]タイムオフセットトークン",
})Gs2Enhance:CreateProgressByUserId
ユーザーIDを指定して強化を開始
2フェーズ強化フローのための進行情報レコードを作成します。
対象アイテムセットと素材をレートモデルに対して検証し、素材から獲得経験値を計算し、確率テーブルからボーナスレートを抽選します。
計算された経験値とボーナスレートは進行情報レコードに保存され、End API で強化完了時に使用されます。
force が true の場合、ユーザーの既存の進行情報は破棄され置き換えられます。
数量指定可能なアクション:いいえ
反転可能なアクション:はい
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| rateName | string | ✓ | ~ 128文字 | 強化レートモデル名 この強化操作のパラメータを定義する強化レートモデルの名前です。対象インベントリ、素材インベントリ、経験値階層、ボーナスレートを指定するモデルを参照します。 | ||
| targetItemSetId | string | ✓ | ~ 1024文字 | 強化対象のアイテムセットの GRN | ||
| materials | List<Material> | 0 ~ 10 items | 強化素材リスト | |||
| force | bool | false | すでに開始している強化がある場合にそれを破棄して開始するか | |||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2Enhance:CreateProgressByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"userId": "[string]ユーザーID",
"rateName": "[string]強化レートモデル名",
"targetItemSetId": "[string]強化対象のアイテムセットのGRN",
"materials": [
{
"materialItemSetId": "[string]強化の素材となるアイテムセットの GRN",
"count": "[int]消費数量"
}
],
"force": "[bool]すでに開始している強化がある場合にそれを破棄して開始するか",
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2Enhance:CreateProgressByUserId
request:
namespaceName: "[string]ネームスペース名"
userId: "[string]ユーザーID"
rateName: "[string]強化レートモデル名"
targetItemSetId: "[string]強化対象のアイテムセットのGRN"
materials:
- materialItemSetId: "[string]強化の素材となるアイテムセットの GRN"
count: "[int]消費数量"
force: "[bool]すでに開始している強化がある場合にそれを破棄して開始するか"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("enhance").acquire.create_progress_by_user_id({
namespaceName="[string]ネームスペース名",
userId="[string]ユーザーID",
rateName="[string]強化レートモデル名",
targetItemSetId="[string]強化対象のアイテムセットのGRN",
materials={
{
materialItemSetId="[string]強化の素材となるアイテムセットの GRN",
count="[int]消費数量"
}
},
force="[bool]すでに開始している強化がある場合にそれを破棄して開始するか",
timeOffsetToken="[string]タイムオフセットトークン",
})