mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 13:53:41 +03:00
Add campaign bonuses; fix parts variant/sub-stat grants and menu-pick quest resume state
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
package campaign
|
||||
|
||||
func (c *Catalog) QuestStamina(t QuestTarget, f Filter) StaminaMul {
|
||||
return questPermilMin(c.quest, QuestEffectStaminaConsume, t, f)
|
||||
}
|
||||
|
||||
func (c *Catalog) QuestDropRate(t QuestTarget, f Filter) DropRateMul {
|
||||
var best int32
|
||||
for _, r := range c.quest {
|
||||
if !r.isActive(f) || r.effectType != QuestEffectDropRate {
|
||||
continue
|
||||
}
|
||||
if !matchesQuest(r.targets, t) {
|
||||
continue
|
||||
}
|
||||
if r.effectValue > best {
|
||||
best = r.effectValue
|
||||
}
|
||||
}
|
||||
return DropRateMul{bonusPermil: best}
|
||||
}
|
||||
|
||||
func (c *Catalog) QuestBonusDrops(t QuestTarget, f Filter) []BonusDrop {
|
||||
var out []BonusDrop
|
||||
for _, r := range c.quest {
|
||||
if !r.isActive(f) || r.effectType != QuestEffectDropItemAdd {
|
||||
continue
|
||||
}
|
||||
if !matchesQuest(r.targets, t) {
|
||||
continue
|
||||
}
|
||||
out = append(out, r.bonusItems...)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func questPermilMin(rows []questRow, want QuestCampaignEffectType, t QuestTarget, f Filter) StaminaMul {
|
||||
min := int32(1000)
|
||||
for _, r := range rows {
|
||||
if !r.isActive(f) || r.effectType != want {
|
||||
continue
|
||||
}
|
||||
if !matchesQuest(r.targets, t) {
|
||||
continue
|
||||
}
|
||||
if r.effectValue < min {
|
||||
min = r.effectValue
|
||||
}
|
||||
}
|
||||
return StaminaMul{permil: min}
|
||||
}
|
||||
|
||||
func matchesQuest(targets []questMatch, t QuestTarget) bool {
|
||||
for _, m := range targets {
|
||||
switch m.t {
|
||||
case QuestTargetWholeQuest:
|
||||
return true
|
||||
case QuestTargetQuestType:
|
||||
if int32(t.QuestType) == m.v {
|
||||
return true
|
||||
}
|
||||
case QuestTargetEventQuestType:
|
||||
if t.QuestType == QuestTypeEventQuest && t.EventQuestType == m.v {
|
||||
return true
|
||||
}
|
||||
case QuestTargetMainQuestChapterId:
|
||||
if t.QuestType == QuestTypeMainQuest && t.ChapterId == m.v {
|
||||
return true
|
||||
}
|
||||
case QuestTargetMainQuestQuestId:
|
||||
if t.QuestType == QuestTypeMainQuest && t.QuestId == m.v {
|
||||
return true
|
||||
}
|
||||
case QuestTargetSubQuestChapterId:
|
||||
if t.QuestType == QuestTypeEventQuest && t.ChapterId == m.v {
|
||||
return true
|
||||
}
|
||||
case QuestTargetSubQuestQuestId:
|
||||
if t.QuestType == QuestTypeEventQuest && t.QuestId == m.v {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user