Esempio n. 1
0
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
Esempio n. 2
0
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]
Esempio n. 3
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]
Esempio n. 4
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
Esempio n. 5
0
    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
Esempio n. 6
0
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エラー : 待機中のイベントのレコードの参照に失敗")
Esempio n. 7
0
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
Esempio n. 8
0
    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
Esempio n. 10
0
    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)
Esempio n. 11
0
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