378 lines
10 KiB
Go
378 lines
10 KiB
Go
package quests
|
|
|
|
// Prerequisite management methods for Quest
|
|
|
|
// SetPrereqLevel sets the minimum level requirement
|
|
func (q *Quest) SetPrereqLevel(level int8) {
|
|
q.PrereqLevel = level
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// SetPrereqTSLevel sets the minimum tradeskill level requirement
|
|
func (q *Quest) SetPrereqTSLevel(level int8) {
|
|
q.PrereqTSLevel = level
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// SetPrereqMaxLevel sets the maximum level requirement
|
|
func (q *Quest) SetPrereqMaxLevel(level int8) {
|
|
q.PrereqMaxLevel = level
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// SetPrereqMaxTSLevel sets the maximum tradeskill level requirement
|
|
func (q *Quest) SetPrereqMaxTSLevel(level int8) {
|
|
q.PrereqMaxTSLevel = level
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqClass adds a class prerequisite
|
|
func (q *Quest) AddPrereqClass(classID int8) {
|
|
q.PrereqClasses = append(q.PrereqClasses, classID)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqTradeskillClass adds a tradeskill class prerequisite
|
|
func (q *Quest) AddPrereqTradeskillClass(classID int8) {
|
|
q.PrereqTSClasses = append(q.PrereqTSClasses, classID)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqModelType adds a model type prerequisite
|
|
func (q *Quest) AddPrereqModelType(modelType int16) {
|
|
q.PrereqModelTypes = append(q.PrereqModelTypes, modelType)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqRace adds a race prerequisite
|
|
func (q *Quest) AddPrereqRace(race int8) {
|
|
q.PrereqRaces = append(q.PrereqRaces, race)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqQuest adds a quest prerequisite
|
|
func (q *Quest) AddPrereqQuest(questID int32) {
|
|
q.PrereqQuests = append(q.PrereqQuests, questID)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// AddPrereqFaction adds a faction prerequisite
|
|
func (q *Quest) AddPrereqFaction(factionID int32, min, max int32) {
|
|
faction := NewQuestFactionPrereq(factionID, min, max)
|
|
q.PrereqFactions = append(q.PrereqFactions, faction)
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// RemovePrereqClass removes a class prerequisite
|
|
func (q *Quest) RemovePrereqClass(classID int8) bool {
|
|
for i, class := range q.PrereqClasses {
|
|
if class == classID {
|
|
q.PrereqClasses = append(q.PrereqClasses[:i], q.PrereqClasses[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RemovePrereqTradeskillClass removes a tradeskill class prerequisite
|
|
func (q *Quest) RemovePrereqTradeskillClass(classID int8) bool {
|
|
for i, class := range q.PrereqTSClasses {
|
|
if class == classID {
|
|
q.PrereqTSClasses = append(q.PrereqTSClasses[:i], q.PrereqTSClasses[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RemovePrereqModelType removes a model type prerequisite
|
|
func (q *Quest) RemovePrereqModelType(modelType int16) bool {
|
|
for i, model := range q.PrereqModelTypes {
|
|
if model == modelType {
|
|
q.PrereqModelTypes = append(q.PrereqModelTypes[:i], q.PrereqModelTypes[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RemovePrereqRace removes a race prerequisite
|
|
func (q *Quest) RemovePrereqRace(race int8) bool {
|
|
for i, r := range q.PrereqRaces {
|
|
if r == race {
|
|
q.PrereqRaces = append(q.PrereqRaces[:i], q.PrereqRaces[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RemovePrereqQuest removes a quest prerequisite
|
|
func (q *Quest) RemovePrereqQuest(questID int32) bool {
|
|
for i, quest := range q.PrereqQuests {
|
|
if quest == questID {
|
|
q.PrereqQuests = append(q.PrereqQuests[:i], q.PrereqQuests[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RemovePrereqFaction removes a faction prerequisite
|
|
func (q *Quest) RemovePrereqFaction(factionID int32) bool {
|
|
for i, faction := range q.PrereqFactions {
|
|
if faction.FactionID == factionID {
|
|
q.PrereqFactions = append(q.PrereqFactions[:i], q.PrereqFactions[i+1:]...)
|
|
q.SetSaveNeeded(true)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqClass checks if a class is a prerequisite
|
|
func (q *Quest) HasPrereqClass(classID int8) bool {
|
|
for _, class := range q.PrereqClasses {
|
|
if class == classID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqTradeskillClass checks if a tradeskill class is a prerequisite
|
|
func (q *Quest) HasPrereqTradeskillClass(classID int8) bool {
|
|
for _, class := range q.PrereqTSClasses {
|
|
if class == classID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqModelType checks if a model type is a prerequisite
|
|
func (q *Quest) HasPrereqModelType(modelType int16) bool {
|
|
for _, model := range q.PrereqModelTypes {
|
|
if model == modelType {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqRace checks if a race is a prerequisite
|
|
func (q *Quest) HasPrereqRace(race int8) bool {
|
|
for _, r := range q.PrereqRaces {
|
|
if r == race {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqQuest checks if a quest is a prerequisite
|
|
func (q *Quest) HasPrereqQuest(questID int32) bool {
|
|
for _, quest := range q.PrereqQuests {
|
|
if quest == questID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HasPrereqFaction checks if a faction is a prerequisite
|
|
func (q *Quest) HasPrereqFaction(factionID int32) bool {
|
|
for _, faction := range q.PrereqFactions {
|
|
if faction.FactionID == factionID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// GetPrereqFaction returns the faction prerequisite for a given faction ID
|
|
func (q *Quest) GetPrereqFaction(factionID int32) *QuestFactionPrereq {
|
|
for _, faction := range q.PrereqFactions {
|
|
if faction.FactionID == factionID {
|
|
return faction
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ClearAllPrerequisites removes all prerequisites
|
|
func (q *Quest) ClearAllPrerequisites() {
|
|
q.PrereqLevel = DefaultPrereqLevel
|
|
q.PrereqTSLevel = 0
|
|
q.PrereqMaxLevel = 0
|
|
q.PrereqMaxTSLevel = 0
|
|
q.PrereqFactions = q.PrereqFactions[:0]
|
|
q.PrereqRaces = q.PrereqRaces[:0]
|
|
q.PrereqModelTypes = q.PrereqModelTypes[:0]
|
|
q.PrereqClasses = q.PrereqClasses[:0]
|
|
q.PrereqTSClasses = q.PrereqTSClasses[:0]
|
|
q.PrereqQuests = q.PrereqQuests[:0]
|
|
q.SetSaveNeeded(true)
|
|
}
|
|
|
|
// Prerequisite validation methods
|
|
|
|
// ValidatePrerequisites validates all quest prerequisites
|
|
func (q *Quest) ValidatePrerequisites() error {
|
|
// Validate level requirements
|
|
if q.PrereqLevel < 1 || q.PrereqLevel > 100 {
|
|
return fmt.Errorf("prerequisite level must be between 1 and 100")
|
|
}
|
|
|
|
if q.PrereqTSLevel < 0 || q.PrereqTSLevel > 100 {
|
|
return fmt.Errorf("prerequisite tradeskill level must be between 0 and 100")
|
|
}
|
|
|
|
if q.PrereqMaxLevel > 0 && q.PrereqMaxLevel < q.PrereqLevel {
|
|
return fmt.Errorf("prerequisite max level cannot be less than min level")
|
|
}
|
|
|
|
if q.PrereqMaxTSLevel > 0 && q.PrereqMaxTSLevel < q.PrereqTSLevel {
|
|
return fmt.Errorf("prerequisite max tradeskill level cannot be less than min tradeskill level")
|
|
}
|
|
|
|
// Validate class prerequisites
|
|
if err := q.validateClassPrerequisites(); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Validate race prerequisites
|
|
if err := q.validateRacePrerequisites(); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Validate faction prerequisites
|
|
if err := q.validateFactionPrerequisites(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// validateClassPrerequisites validates class prerequisites
|
|
func (q *Quest) validateClassPrerequisites() error {
|
|
// Check for duplicate classes
|
|
classMap := make(map[int8]bool)
|
|
for _, classID := range q.PrereqClasses {
|
|
if classMap[classID] {
|
|
return fmt.Errorf("duplicate class prerequisite: %d", classID)
|
|
}
|
|
classMap[classID] = true
|
|
|
|
// Validate class ID range (basic validation)
|
|
if classID < 1 || classID > 100 {
|
|
return fmt.Errorf("invalid class ID in prerequisites: %d", classID)
|
|
}
|
|
}
|
|
|
|
// Check for duplicate tradeskill classes
|
|
tsClassMap := make(map[int8]bool)
|
|
for _, classID := range q.PrereqTSClasses {
|
|
if tsClassMap[classID] {
|
|
return fmt.Errorf("duplicate tradeskill class prerequisite: %d", classID)
|
|
}
|
|
tsClassMap[classID] = true
|
|
|
|
// Validate tradeskill class ID range
|
|
if classID < 1 || classID > 100 {
|
|
return fmt.Errorf("invalid tradeskill class ID in prerequisites: %d", classID)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// validateRacePrerequisites validates race prerequisites
|
|
func (q *Quest) validateRacePrerequisites() error {
|
|
// Check for duplicate races
|
|
raceMap := make(map[int8]bool)
|
|
for _, race := range q.PrereqRaces {
|
|
if raceMap[race] {
|
|
return fmt.Errorf("duplicate race prerequisite: %d", race)
|
|
}
|
|
raceMap[race] = true
|
|
|
|
// Validate race ID range
|
|
if race < 1 || race > 50 {
|
|
return fmt.Errorf("invalid race ID in prerequisites: %d", race)
|
|
}
|
|
}
|
|
|
|
// Check for duplicate model types
|
|
modelMap := make(map[int16]bool)
|
|
for _, modelType := range q.PrereqModelTypes {
|
|
if modelMap[modelType] {
|
|
return fmt.Errorf("duplicate model type prerequisite: %d", modelType)
|
|
}
|
|
modelMap[modelType] = true
|
|
|
|
// Validate model type range
|
|
if modelType < 1 {
|
|
return fmt.Errorf("invalid model type in prerequisites: %d", modelType)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// validateFactionPrerequisites validates faction prerequisites
|
|
func (q *Quest) validateFactionPrerequisites() error {
|
|
// Check for duplicate factions and validate ranges
|
|
factionMap := make(map[int32]bool)
|
|
for _, faction := range q.PrereqFactions {
|
|
if factionMap[faction.FactionID] {
|
|
return fmt.Errorf("duplicate faction prerequisite: %d", faction.FactionID)
|
|
}
|
|
factionMap[faction.FactionID] = true
|
|
|
|
// Validate faction ID
|
|
if faction.FactionID <= 0 {
|
|
return fmt.Errorf("invalid faction ID in prerequisites: %d", faction.FactionID)
|
|
}
|
|
|
|
// Validate faction value ranges
|
|
if faction.Min < -50000 || faction.Min > 50000 {
|
|
return fmt.Errorf("faction %d min value out of range: %d", faction.FactionID, faction.Min)
|
|
}
|
|
|
|
if faction.Max < -50000 || faction.Max > 50000 {
|
|
return fmt.Errorf("faction %d max value out of range: %d", faction.FactionID, faction.Max)
|
|
}
|
|
|
|
// Check min/max relationship
|
|
if faction.Max != 0 && faction.Max < faction.Min {
|
|
return fmt.Errorf("faction %d max value cannot be less than min value", faction.FactionID)
|
|
}
|
|
}
|
|
|
|
// Check for duplicate quest prerequisites
|
|
questMap := make(map[int32]bool)
|
|
for _, questID := range q.PrereqQuests {
|
|
if questMap[questID] {
|
|
return fmt.Errorf("duplicate quest prerequisite: %d", questID)
|
|
}
|
|
questMap[questID] = true
|
|
|
|
// Don't allow self-reference
|
|
if questID == q.ID {
|
|
return fmt.Errorf("quest cannot be a prerequisite of itself")
|
|
}
|
|
|
|
// Validate quest ID
|
|
if questID <= 0 {
|
|
return fmt.Errorf("invalid quest ID in prerequisites: %d", questID)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
} |