github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/task.go (about)

     1  package internal
     2  
     3  import (
     4  	"common"
     5  	"msg"
     6  	"sort"
     7  	"time"
     8  
     9  	"github.com/name5566/leaf/log"
    10  	mgo "gopkg.in/mgo.v2"
    11  	"gopkg.in/mgo.v2/bson"
    12  )
    13  
    14  func getRandomTaskIDs(n, taskType int, fromTaskIDs []int) []int {
    15  	var taskIDs []int
    16  	switch taskType {
    17  	case taskRedPacket:
    18  		taskIDs = common.Shuffle(fromTaskIDs)
    19  		taskIDs = common.RemoveAll(taskIDs, 28)
    20  		/*if checkRedPacketMatchingTime() {
    21  		            taskIDs = common.RemoveAll(taskIDs, 28)
    22  				}
    23  		*/
    24  	case taskChip:
    25  		taskIDs = common.Shuffle(ChipTaskIDs[2:])
    26  	default:
    27  		return []int{}
    28  	}
    29  	temp := append([]int{}, taskIDs[:n]...)
    30  	sort.Ints(temp)
    31  	return temp
    32  }
    33  
    34  func loadTaskList(taskList []TaskData, m map[int]*TaskData) map[int]*TaskData {
    35  	for _, taskData := range taskList {
    36  		task := &TaskData{
    37  			TaskID:   taskData.TaskID,
    38  			Progress: taskData.Progress,
    39  			Taken:    taskData.Taken,
    40  			TakenAt:  taskData.TakenAt,
    41  			Handling: taskData.Handling,
    42  		}
    43  		m[taskData.TaskID] = task
    44  	}
    45  	return m
    46  }
    47  
    48  func buildTaskList(taskIDs []int) []TaskData {
    49  	var taskList []TaskData
    50  	for _, taskID := range taskIDs {
    51  		taskList = append(taskList, TaskData{
    52  			TaskID: taskID,
    53  		})
    54  	}
    55  	return taskList
    56  }
    57  
    58  func addTaskItem(items []msg.TaskItem, taskID, progress int, taken bool) []msg.TaskItem {
    59  	items = append(items, msg.TaskItem{
    60  		TaskID:   taskID,
    61  		Progress: progress,
    62  		Taken:    taken,
    63  		Total:    TaskList[taskID].Total,
    64  		Desc:     TaskList[taskID].Desc,
    65  		Chips:    TaskList[taskID].Chips,
    66  		Jump:     TaskList[taskID].Jump,
    67  	})
    68  	return items
    69  }
    70  
    71  func buildTaskItems(taskList []TaskData) []msg.TaskItem {
    72  	var taskItems []msg.TaskItem
    73  	m := make(map[int]bool)
    74  	for _, taskData := range taskList {
    75  		// 可以领取奖励的任务
    76  		if !m[taskData.TaskID] && taskData.Progress >= TaskList[taskData.TaskID].Total && !taskData.Taken {
    77  			taskItems = addTaskItem(taskItems, taskData.TaskID, TaskList[taskData.TaskID].Total, taskData.Taken)
    78  			m[taskData.TaskID] = true
    79  		}
    80  	}
    81  	for _, taskData := range taskList {
    82  		// 进行中的任务
    83  		if !m[taskData.TaskID] && taskData.Progress < TaskList[taskData.TaskID].Total {
    84  			taskItems = addTaskItem(taskItems, taskData.TaskID, taskData.Progress, taskData.Taken)
    85  			m[taskData.TaskID] = true
    86  		}
    87  	}
    88  	for _, taskData := range taskList {
    89  		// 已领取奖励的任务
    90  		if !m[taskData.TaskID] && taskData.Progress >= TaskList[taskData.TaskID].Total && taskData.Taken {
    91  			taskItems = addTaskItem(taskItems, taskData.TaskID, TaskList[taskData.TaskID].Total, taskData.Taken)
    92  			m[taskData.TaskID] = true
    93  		}
    94  	}
    95  	return taskItems
    96  }
    97  
    98  func getOrderKeys(m map[int]*TaskData) []int {
    99  	var keys []int
   100  	for k := range m {
   101  		keys = append(keys, k)
   102  	}
   103  	sort.Ints(keys)
   104  	return keys
   105  }
   106  
   107  func toTaskList(m map[int]*TaskData, taskType int) []TaskData {
   108  	var taskList []TaskData
   109  	keys := getOrderKeys(m)
   110  	for _, k := range keys {
   111  		taskData := m[k]
   112  		if TaskList[taskData.TaskID].Type == taskType {
   113  			taskList = append(taskList, TaskData{
   114  				TaskID:   taskData.TaskID,
   115  				Progress: taskData.Progress,
   116  				Taken:    taskData.Taken,
   117  				TakenAt:  taskData.TakenAt,
   118  				Handling: taskData.Handling,
   119  			})
   120  		}
   121  	}
   122  	return taskList
   123  }
   124  
   125  // 更新奖励被领取的红包任务
   126  func updateRedPacketTaskList(taskList []TaskData) []TaskData {
   127  	var newTaskList []TaskData
   128  	var existTaskIDs []int
   129  	n := 0
   130  	for _, taskData := range taskList {
   131  		// 更新不可用任务
   132  		if _, ok := TaskList[taskData.TaskID]; !ok || taskData.Taken {
   133  			n++
   134  		} else {
   135  			newTaskList = append(newTaskList, taskData)
   136  			existTaskIDs = append(existTaskIDs, taskData.TaskID)
   137  		}
   138  	}
   139  	if n > 0 {
   140  		taskIDs := common.Remove(RedPacketIDs, existTaskIDs)
   141  		taskIDs = common.Shuffle(taskIDs)
   142  		newTaskList = append(newTaskList, buildTaskList(taskIDs[:n])...)
   143  	}
   144  	return newTaskList
   145  }
   146  
   147  // 更新奖励被领取的金币任务
   148  func updateChipTaskList(taskList []TaskData) []TaskData {
   149  	var newTaskList []TaskData
   150  	var existTaskIDs []int
   151  	n := 0
   152  	for _, taskData := range taskList {
   153  		// 活动任务直接追加进去
   154  		if _, ok := ActivityTimeList[taskData.TaskID]; ok {
   155  			newTaskList = append(newTaskList, taskData)
   156  			existTaskIDs = append(existTaskIDs, taskData.TaskID)
   157  			continue
   158  		}
   159  		// 任务转换,如果删表可以删除
   160  		switch taskData.TaskID {
   161  		case 12:
   162  			taskData.TaskID = 1000
   163  		}
   164  		// 更新不可用任务
   165  		if _, ok := TaskList[taskData.TaskID]; !ok {
   166  			//n++
   167  			continue
   168  		}
   169  		if taskData.Taken {
   170  			takenTime := time.Unix(taskData.TakenAt, 0)
   171  			takenMidday := time.Date(takenTime.Year(), takenTime.Month(), takenTime.Day(), 12, 0, 0, 0, time.Local)
   172  			if takenMidday.Unix() > taskData.TakenAt {
   173  				takenMidday = takenMidday.Add(-24 * time.Hour)
   174  			}
   175  			if time.Now().Sub(takenMidday).Hours() >= 24 {
   176  				switch taskData.TaskID {
   177  				case 1000, 1001:
   178  					taskData.Progress = 0
   179  					taskData.Taken = false
   180  					newTaskList = append(newTaskList, taskData)
   181  					existTaskIDs = append(existTaskIDs, taskData.TaskID)
   182  				default:
   183  					n++
   184  				}
   185  			} else {
   186  				newTaskList = append(newTaskList, taskData)
   187  				existTaskIDs = append(existTaskIDs, taskData.TaskID)
   188  			}
   189  		} else {
   190  			newTaskList = append(newTaskList, taskData)
   191  			existTaskIDs = append(existTaskIDs, taskData.TaskID)
   192  		}
   193  	}
   194  	if n > 0 {
   195  		taskIDs := common.Remove(ChipTaskIDs[2:], existTaskIDs)
   196  		taskIDs = common.Shuffle(taskIDs)
   197  		newTaskList = append(newTaskList, buildTaskList(taskIDs[:n])...)
   198  	}
   199  	return newTaskList
   200  }
   201  
   202  func updateActivityTaskList(taskList []TaskData) []TaskData {
   203  	now := time.Now().Unix()
   204  	var newTaskList []TaskData
   205  	// 非活动任务添加
   206  	for _, taskData := range taskList {
   207  		if _, ok := ActivityTimeList[taskData.TaskID]; !ok {
   208  			newTaskList = append(newTaskList, taskData)
   209  		}
   210  	}
   211  	for id, activityTime := range ActivityTimeList {
   212  		// 检查活动任务时效性
   213  		if now < activityTime.Start || now > activityTime.Deadline {
   214  			continue // 移除任务
   215  		}
   216  		have := false // 是否有这个任务
   217  		for _, taskData := range taskList {
   218  			if id == taskData.TaskID {
   219  				have = true
   220  				newTaskList = append(newTaskList, taskData)
   221  				break
   222  			}
   223  		}
   224  		if !have { // 没有就添加任务
   225  			if now < activityTime.End {
   226  				newTaskList = append(newTaskList, TaskData{
   227  					TaskID: id,
   228  				})
   229  			}
   230  		}
   231  	}
   232  	return newTaskList
   233  }
   234  
   235  func addTaskProgress(userID, taskID int) {
   236  	task := TaskList[taskID]
   237  	if task == nil {
   238  		log.Debug("taskID: %v 不存在", taskID)
   239  		return
   240  	}
   241  	skeleton.Go(func() {
   242  		db := mongoDB.Ref()
   243  		defer mongoDB.UnRef(db)
   244  
   245  		var err error
   246  		switch task.Type {
   247  		case taskRedPacket:
   248  			err = db.DB(DB).C("usertasklist").
   249  				Update(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$lt": task.Total}},
   250  					bson.M{"$inc": bson.M{"redpackettasklist.$.progress": 1}})
   251  			if err == nil {
   252  				count, _ := db.DB(DB).C("usertasklist").
   253  					Find(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$eq": task.Total}}).
   254  					Count()
   255  				if count == 1 {
   256  					upsertTaskTicket(bson.M{"userid": userID, "finish": false, "taskid": taskID},
   257  						bson.M{"$set": bson.M{"finish": true, "updatedat": time.Now().Unix()}})
   258  				}
   259  			}
   260  		case taskChip:
   261  			err = db.DB(DB).C("usertasklist").
   262  				Update(bson.M{"userid": userID, "chiptasklist.taskid": taskID, "chiptasklist.progress": bson.M{"$lt": task.Total}},
   263  					bson.M{"$inc": bson.M{"chiptasklist.$.progress": 1}})
   264  		}
   265  		if err != nil && err != mgo.ErrNotFound {
   266  			log.Debug("update userID: %v usertasklist error: %v", userID, err)
   267  		}
   268  	}, nil)
   269  }
   270  
   271  func resetTaskProgress(userID, taskID int) {
   272  	task := TaskList[taskID]
   273  	if task == nil {
   274  		log.Error("taskID: %v 不存在", taskID)
   275  		return
   276  	}
   277  	skeleton.Go(func() {
   278  		db := mongoDB.Ref()
   279  		defer mongoDB.UnRef(db)
   280  
   281  		var err error
   282  		switch task.Type {
   283  		case taskRedPacket:
   284  			err = db.DB(DB).C("usertasklist").
   285  				Update(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$lt": task.Total}},
   286  					bson.M{"$set": bson.M{"redpackettasklist.$.progress": 0}})
   287  		case taskChip:
   288  			err = db.DB(DB).C("usertasklist").
   289  				Update(bson.M{"userid": userID, "chiptasklist.taskid": taskID, "chiptasklist.progress": bson.M{"$lt": task.Total}},
   290  					bson.M{"$set": bson.M{"chiptasklist.$.progress": 0}})
   291  		}
   292  		if err != nil && err != mgo.ErrNotFound {
   293  			log.Debug("update userID: %v usertasklist error: %v", userID, err)
   294  		}
   295  	}, nil)
   296  }
   297  
   298  func updateUserTask(userID int, task *TaskData) {
   299  	skeleton.Go(func() {
   300  		db := mongoDB.Ref()
   301  		defer mongoDB.UnRef(db)
   302  
   303  		var err error
   304  		switch TaskList[task.TaskID].Type {
   305  		case taskRedPacket:
   306  			err = db.DB(DB).C("usertasklist").
   307  				Update(bson.M{"userid": userID, "redpackettasklist.taskid": task.TaskID},
   308  					bson.M{"$set": bson.M{"redpackettasklist.$": task}})
   309  		case taskChip:
   310  			err = db.DB(DB).C("usertasklist").
   311  				Update(bson.M{"userid": userID, "chiptasklist.taskid": task.TaskID},
   312  					bson.M{"$set": bson.M{"chiptasklist.$": task}})
   313  		}
   314  		if err != nil {
   315  			log.Debug("update userID: %v usertasklist error: %v", userID, err)
   316  		}
   317  	}, nil)
   318  }
   319  
   320  // 做活动任务
   321  func doActivityTask(userID int, taskID int) {
   322  	activityTime, ok := ActivityTimeList[taskID]
   323  	if !ok {
   324  		return
   325  	}
   326  	now := time.Now().Unix()
   327  	if now >= activityTime.Start && now < activityTime.End {
   328  		if user, ok := userIDUsers[userID]; ok {
   329  			user.doTask(taskID)
   330  		} else {
   331  			addTaskProgress(userID, taskID)
   332  		}
   333  	}
   334  }