def createNewRound(caster,gid): #rnum = 0 try: rnum = Round.object.filter(gameID = gid).count() +1 except: rnum = 0 if rnum ==0: casterID = caster gr = Round() gr.gameID_id = gid gr.roundNum = rnum gr.caster = casterID gr.victim = -1 gr.attackTimeBegin = datetime.datetime.now() gr.casterDice = -1 gr.victimDice = -1 gr.roundStatue = 0 gr.save() rnd = getLastRound(gid) if rnd: return rnum return -1
def findNextCaster(gid): # 获取当前轮开始时间 rnd = getLastRound(gid) game = GameInfo.objects.get(pk = gid) pl = game.pclist.split(",") bi = findPCInList(rnd.caster,pl) if bi == -1: return -1 if bi+1>=len(pl): index = 0 else: index = bi+1 return int(pl[index])
def isNextCaster(uid,gid): r = {"errmsg": "", "found": False, "rcntPC":-1,"low":-1, "high":-1, "victim":False} # 获取当前轮开始时间 rnd = getLastRound(gid) if rnd.fbTimeBegin: btime = rnd.fbTimeBegin #判断是否当前轮受害者 if uid == rnd.victim: r["victim"] = True r["found"] = True return r else: btime = rnd.attackTimeBegin rt = datetime.datetime.now() - btime border = rt.seconds/intervalSeconds pc_num = PC.objects.filter(gameStatue=gid).count() if border >=pc_num: #6: #超时一轮,游戏结束 r["errmsg"] = "overtime" return r # else: game = GameInfo.objects.get(pk = gid) pl = game.pclist.split(",") bi = findPCInList(uid,pl) if bi == -1: r["errmsg"] = "no such pc" return r r["low"] = bi r["rcntPC"] = int(pl[bi]) l = bi + border LA = len(pl) for i in range(bi,l): if i<LA: index = i else: index = (LA - i)*(-1) if int(pl[index]) == uid: r["found"] = True r["high"] = index return r return r
def roll(request, target, gid, cRound, turnFlg): debugLog("roll() begin aaa") uid = request.user.id attFlag = turnFlg["RollTurnInfo"]["grStatue"] r = {"errmsg":""} targetStatue = ifMad(target) if targetStatue["errmsg"]=="": mad = targetStatue["mad"] else: r["errmsg"] = targetStatue["errmsg"] return r if mad and attFlag==0: r["errmsg"] = "target mad" #u"目标已疯,不能进行此操作。" return r else: # 生成骰数 num = random.randint(0,11) #num = 9 # 根据骰数决定对应操作 diceIndex =["Cthulhu","Yellow","Tentacle","Tentacle","Yellow","Yellow","Yellow","Yellow","Elder","Eye","Tentacle","Tentacle"] debugLog("roll() randint: diceNum="+str(num)+" dice="+str(diceIndex[num]) ) debugLog("roll() *** attFlag="+str(attFlag)) #设置攻击及受害者 if attFlag==0: caster = uid victim = target elif attFlag == 1: lastRnd = getLastRound(gid) caster = lastRnd.victim victim = lastRnd.caster else: r["errmsg"] = "unknow" return r r["target"] = victim if not turnFlg["PCTURN"]: ot = True else: ot = False # 进行相应操作:扣除被伤害者相应神智/...等 va = {"dice":diceIndex[num], "gid":gid, "caster":caster, "victim":victim, "flag":attFlag, "overtime":ot } rvalue = switch(va) if len(rvalue)==0: return r rvalue["rid"] = cRound rnd_list = Round.objects.filter(gameID=gid).order_by('-id')[:1] t_rnd = rnd_list[0] rvalue["rollFlag"] = attFlag #更新 if attFlag==0: if diceIndex[num]!="Eye": rvalue["pTurn"] = target else: rvalue["pTurn"] = caster t_rnd.casterDice = num t_rnd.fbTimeBegin = datetime.datetime.now() t_rnd.victim = target t_rnd.save(update_fields=['casterDice','victim','fbTimeBegin']) elif attFlag == 1: t_rnd.victimDice = num t_rnd.save(update_fields=['victimDice']) # 若本轮结束则更新本轮; if diceIndex[num]!="Eye": # 游戏结束:sanity<1的人有5个;查找是否有获胜者;返回数据格式: gameover = ifGameOver(gid) if gameover>=0: rvalue["gameover"]=1 rvalue["winner"]=gameover game = GameInfo.objects.get(pk=gid) game.statue = 0 game.winner = gameover game.save(update_fields=['statue','winner']) else: rvalue["gameover"]=0 #查找下一个玩家,开启下一回合(轮) nextCaster = findNextCaster(gid) newrid = createNewRound(nextCaster,gid) rvalue["crntRid"] = newrid rvalue["pTurn"] = nextCaster rvalue["rtime"] = datetime.datetime.now() rvalue["rFlag"] = 1 else: rvalue["pTurn"] = uid rvalue["rollFlag"] = attFlag+3 else: pass r["info"] = rvalue return r
es = str(Exception) + ":" + str(data) debugLog("check PCTurn () line 38:" + es) return r # 无论是否超时,只要当前是该玩家投骰则返回True if r["RollTurnInfo"]["crntPC"] == uid: r["PCTURN"] = True r["RollToken"] = True return r elif r["RollTurnInfo"]["overtime"] == True: # 非uid投骰,且当前超时: # 检查下一个投骰者是否uid nextpc = isNextCaster(uid, gid) # 若是则设置当前轮状态,生成新轮,并返回新生成的轮信息 ##if uid == nextpc: if nextpc["found"]: r["RollToken"] = True # set crnt turn statue; rnd = getLastRound(gid) rnd.roundStatue = 1 rnd.save(update_fields=["roundStatue"]) # generate new turn; createNewRound(nextpc["rcntPC"], gid) r["rndID"] = rnd.id return r else: return r return r