def peek_event(): """ DBの中から最も早くスケジュールされた待機中のイベントを参照 エラーの時はExceptionをスロー :return: 存在する? EventRecord : None """ try: db = DBSingleton() result = db.select( "event_id", "status", "datetime", "object", "subject", "event_name", "data", table="event", where= "datetime = (select min(datetime) from event where status = \"ready\")" ) # 待機中のイベントなし if len(result) == 0: return None # 待機中のイベントがある else: print(result[0]) return result[0] except DBError as e: logging.error(e.message) raise Exception
def get_terrian_info(terrian_type): """ 地形情報取得 DBエラー、またはterrian_typeの地形がなければExceptionをスロー :param terrian_type: :return: {terrianの全てのキー} """ result = None try: db = DBSingleton() result = db.select( "terrian_type", "infantry", # 歩兵移動補正 "heavy_inf", # 重歩兵移動補正 "cavalry", # 騎兵移動補正 "engineer", # 工兵移動補正 table="terrian", where="terrian_type = \"" + str(terrian_type) + "\"") except DBError as e: logging.error(e.message) raise Exception("兵科の情報取得に失敗") return False if len(result) == 0: logging.error("Coudn't find terrian by terrian_type = " + str(terrian_type)) raise Exception("terrian_typeが" + str(terrian_type) + "の地形がDBにない") return False return result[0]
def get_branch_info(branch_id, where=None): """ branch_idから兵科情報を取得 :param branch_id: 兵科ID :return: {divisionの全てのキー} """ result = None try: if where is None: where = "branch_id = \"" + str(branch_id) + "\"" db = DBSingleton() result = db.select( "branch_id", "branch_name", "atk", "def", "speed", # 進軍スピード "visible_range", # 視界半径 "op_food", # 運用に必要な食糧 "op_money", # 運用に必要な資金 "draft_food", # 徴兵に必要な食糧 "draft_money", # 徴兵に必要な資金 "build", # 建築補正 "sabotage", # 破壊工作補正 "transportion", # 輸送補正 "infantry_atk", # 対歩兵攻撃補正 "infantry_def", # 対歩兵防御補正 "heavy_inf_atk", # 対重歩兵攻撃補正 "heavy_inf_def", # 対重兵防御補正 "cavalry_atk", # 対騎兵攻撃補正 "cavalry_def", # 対騎兵防御補正 "engineer_atk", # 対工兵攻撃補正 "engineer_def", # 対工兵防御補正 "liver", # 川移動補正 "plain", # 平地移動補正 "capital", # 首都移動補正 table="branch", where=where) except DBError as e: logging.error(e.message) raise Exception("兵科の情報取得に失敗") return False if len(result) == 0: logging.error("Coudn't find branch by branch_id = " + str(branch_id)) raise Exception("branch_idが" + str(branch_id) + "の兵科がDBにない") return False return result[0]
def remove_event(event_id): """ DBからイベントのレコードを削除 :param event_id: イベントID :return: 成功 ? True : False """ try: db = DBSingleton() db.delete(table="event", where="event_id=\"" + str(event_id) + "\"") except DBError as e: logging.error(e.message) return False return True
def __create_grid(self): #古いグリッドを削除 db = DBSingleton() if not db.delete(table="hex_grid", where=""): self.logger.critical("error happened when deleting old hex_grid") raise Exception("map_base.__create_grid : failed") x_offset = self.length y_offset = self.length * math.sin(1 / 3 * math.pi) delta_x = 3 / 2 * self.length delta_y = y_offset #アフィン変換行列 matGridToNorm = np.matrix([[delta_x, 0, x_offset], [-(delta_y), 2 * delta_y, y_offset], [0, 0, 1]]) matNormToGrid = np.linalg.inv(matGridToNorm) #グリッド生成 x = x_offset col = 0 serial = 0 while x + delta_x + (self.length / 2) < self.width: y = y_offset if col % 2 == 1: y += delta_y while (y + delta_y * 3) < self.height: #グリッド空間の座標に変換 n_vec = np.matrix([[x], [y], [1]]) g_vec = matNormToGrid * n_vec g_col = int(np.round(g_vec[0])[0]) g_row = int(np.round(g_vec[1])[0]) #DBに格納 db.insert("hex_grid", col=g_col, row=g_row, serial=serial) serial += 1 y += delta_y * 2 x += delta_x col += 1
def peek_event_all(): """ DBに残っている全ての待機中イベントのレコードを参照(降順) :return: 存在する ? [EventRecord] : None """ try: db = DBSingleton() query = "SELECT event_id, status, datetime, object, subject, event_name, data from event " \ "WHERE status=\"ready\"" result = db.exec(query, True) if len(result) == 0: return None else: return result except DBError as e: logging.error(e.message) raise Exception("DBエラー : 待機中のイベントのレコードの参照に失敗")
def add_event(event_record): """ イベントのレコードをDBへ追加 :param event_record: イベントのレコード :return: 成功 ? True : False """ try: db = DBSingleton() db.insert(table="event", status=event_record["status"], datetime=event_record["datetime"], object=event_record["object"], subject=event_record["subject"], event_name=event_record["event_name"], data=event_record["data"]) except DBError as e: logging.error(e.message) return False return True
def post(self): self.check_xsrf_cookie() username = self.get_argument('username') userpass = self.get_argument('userpass') country = self.get_argument("country") #簡単なチェック if len(username) > 7 or len(username) <1 or len(userpass) is not 4: message = "ユーザー名は1-7文字以内、パスは4桁" self.render("error.html",message=message) return if int(country) < 0 or int(country) > 1: message = "不正な国<br>" message += "country = " + str(country) self.render("error.html",message=message) return #キャラ登録 db = DBSingleton() #初期位置は首都 try: result = db.select("capital_col", "capital_row", table="country", where="country_id="+str(country)) except DBError as e: self.render("error.html", message = e.message) return col = result[0][0] row = result[0][1] #id生成 id = uuid.uuid4() #キャラ作成 try: result = db.select("user_name", table="user", where="user_name=\"" + str(username) + "\"") print(len(result)) if len(result) is not 0: self.render("error.html", message = u"既に同じ名前が登録されている") return db.insert(table="user", user_id=id.hex, user_pass=str(userpass), user_name=str(username), country_id=country, col=col,row=row, hp=10,mp=10, at=10, df=10, mat=10, mdf=10, ag=10, cha=10, led=10, money=10000) except DBError as e: self.render("error.html", message = e.message) return self.redirect("login")
def post(self): self.check_xsrf_cookie() username = self.get_argument('username') userpass = self.get_argument('userpass') # 認証 db = DBSingleton() user_info = None user_id = None try: user_id = get_userid_by_username(username) user_info = get_playerinfo_by_id(user_id) except Exception as e: logging.error(e) self.render("error.html", message="DBエラー") return if user_info["user_pass"] == userpass: self.set_current_user(tornado.escape.utf8(user_id)) self.redirect("/index") else: self.render("error.html", message="ユーザー名とパスワードが一致しない") return
def run(self): """ :return: 成功 ? True : False """ self._logger.debug("enter EventSchedDomestic run") self._logger.debug("event_record=", self._event_record) try: db = DBSingleton() # 可算前のの国情報取得 ex_countries = country_controller.get_all_countryinfo() # 全ての国で食糧可算 query = "UPDATE country" \ " SET food = ((SELECT" \ " SUM(hex_grid.food) from hex_grid" \ " WHERE hex_grid.country_id = country.country_id" \ " GROUP BY hex_grid.country_id) + country.food)" \ "WHERE EXISTS(SELECT 1 FROM hex_grid" \ " WHERE hex_grid.country_id = country.country_id);" db.exec(query) # 全ての国で商業可算 query = "UPDATE country" \ " SET money = ((SELECT" \ " SUM(hex_grid.money) from hex_grid" \ " WHERE hex_grid.country_id = country.country_id" \ " GROUP BY hex_grid.country_id) + country.money)" \ "WHERE EXISTS(SELECT 1 FROM hex_grid" \ " WHERE hex_grid.country_id = country.country_id);" db.exec(query) print("SchedDomestic run") # イベントをインターバルでチェーン gm = GameMain.GameMain() next_time = BJTime.add_time( BJTime.get_time_now(), gm.get_affair().get_domestic_interval()) next_event = SchedEventDomestic.create_recode(next_time) event_controller.add_event(next_event) gm.set_event_timestamp(next_time) # それぞれの国へ通知 new_countries = country_controller.get_all_countryinfo() for i in range(0, len(new_countries)): message = "食糧 " + str(new_countries[i]["food"]) + " → " + str( ex_countries[i]["food"]) + "\n" message += "資金 " + str( new_countries[i]["money"]) + " → " + str( ex_countries[i]["money"]) payload = { "event": "notify", "data": { "title": "徴税結果", "message": message } } BJSocketHandler.BJSocketHandler.send_member_by_country( new_countries["country_id"], payload) except DBError as e: logging.error("EventMove::run: caught DBError: " + e.message) except Exception as e: logging.error(e)
def ask_move(_cls, _self, data): """進軍可能な進路を問い合わせに対する応答""" payload = {"event" : "response_ask_move", "data" : {}} try: db = DBSingleton() user_id = _self.get_secure_cookie("user_id").decode('utf-8') # プレイヤーの状態 player = get_playerinfo_by_id(user_id) # プレイヤーが待機中でないと移動できない if player["status"] != "ready": payload["data"] = {"response" : "deny", "reason" : "行動中"} _self.send_you(payload) return True # 配下の師団がセットされていないと移動できない if not player["division_id"]: payload["data"] = {"response" : "deny", "reason" : "配下の部隊がセットされていない"} _self.send_you(payload) return True # 配下の師団取得 division = get_division_info(player["division_id"]) # 師団の兵科情報取得 branch_info = get_branch_info(division["branch_id"]) # 師団がヘックスに移動可能かどうか ajacent_area = get_adjacent_area(division["col"], division["row"]) isMovable = False for ajacent_hex in ajacent_area: if ajacent_hex["col"] == data["col"] and ajacent_hex["row"] == data["row"]: isMovable = True break if not isMovable: payload["data"] = {"response" : "deny", "reason" : "移動可能半径ではない"} _self.send_you(payload) return True # ゲームレベルから設定値を取得 gm = GameMain() op_food_lv = gm.get_affair().get_op_food_lv() op_money_lv = gm.get_affair().get_op_money_lv() op_speed_lv = gm.get_affair().get_op_speed_lv() # 運用に必要な食糧と金 : 師団規模 * 兵科固定値 * ゲームレベル food_needed = division["quantity"] * branch_info["op_food"] * op_food_lv money_needed = division["quantity"] * branch_info["op_money"] * op_money_lv # 資金と食糧、それぞれ足りなければ移動不可 if division["food"] < food_needed: payload["data"] = {"response" : "deny", "reason" : ("部隊の運用食糧が足りない", "部隊の保持食糧 : " + str(division["food"]) , "必要な食糧 = 師団規模(" + str(division["quantity"]), ")×兵科補正(" + str(branch_info["op_food"]) , ")×情勢補正(" + str(op_food_lv) + ") = " + str(food_needed))} _self.send_you(payload) return True elif division["money"] < money_needed: payload["data"] = {"response" : "deny", "reason" : ("部隊の運用資金が足りない", "部隊の保持資金 : " + str(division["money"]), "必要な資金 = 師団規模(" + str(division["quantity"]), ")×兵科補正(" + str(branch_info["op_money"]), ")×情勢補正(" + str(op_money_lv) + ") = " + str(money_needed))} _self.send_you(payload) return True # ヘックス情報 hex_info = get_hexinfo(data["col"], data["row"]) # 地形情報 terrian_info = get_terrian_info(hex_info["type"]) # 所要時間 = 地形補正 * 兵科速度 * ゲーム速度 required_time = terrian_info[division["branch_id"]] * branch_info["speed"] * op_speed_lv payload["data"]["response"] = "accept" payload["data"]["food"] = food_needed payload["data"]["money"] = money_needed payload["data"]["required_time"] = int(required_time) _self.send_you(payload) return True except DBError as e: logging.error("move_query失敗" + e.message) _self.send_error("サーバーエラー : 進軍可能な範囲の問い合わせに失敗。行動はキャンセルされた") return False except Exception as e: logging.error(e) payload["data"] = {"response" : "deny", "reason" : "サーバーエラー"} _self.send_error("サーバーエラー : ハンドルされていないエラー。行動はキャンセルされた") return False assert False