示例#1
0
class ScheduleMaster(BaseMaster):
    """スケジュール.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    stime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'公開開始時間')
    etime = AppDateTimeField(db_index=True,
                             default=OSAUtil.get_now,
                             verbose_name=u'公開終了時間')
    wday = models.PositiveSmallIntegerField(default=Defines.WeekDay.ALL,
                                            verbose_name=u'曜日指定',
                                            choices=dict_to_choices(
                                                Defines.WeekDay.NAMES))
    shour = models.PositiveSmallIntegerField(default=0,
                                             verbose_name=u'日毎の開始時間(時)',
                                             choices=numberitems(0, 24))
    sminute = models.PositiveSmallIntegerField(default=0,
                                               verbose_name=u'日毎の開始時間(分)',
                                               choices=numberitems(0, 60))
    timelimit = models.PositiveSmallIntegerField(default=0,
                                                 verbose_name=u'日毎の制限時間(分)')
    target = JsonCharField(default=list, verbose_name=u'対象のユーザID下一桁')
示例#2
0
class RaidEventRecipeMaster(BaseMaster):
    """キャスト交換のレシピ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    name = models.CharField(max_length=48, verbose_name=u'名前')
    thumb = models.CharField(max_length=128, verbose_name=u'サムネイル', blank=True)
    eventid = models.PositiveIntegerField(db_index=True,
                                          default=0,
                                          verbose_name=u'イベントID')
    itype = models.PositiveSmallIntegerField(verbose_name=u'種別(アイテム or チケット)',
                                             choices=dict_to_choices(
                                                 Defines.ItemType.TRADE_TYPES))
    itemid = models.PositiveIntegerField(default=0, verbose_name=u'アイテムID')
    itemnum = models.PositiveIntegerField(default=0, verbose_name=u'アイテム個数')
    stock = models.PositiveSmallIntegerField(default=0,
                                             verbose_name=u'在庫数',
                                             help_text=u'0で無制限')
    materialnum0 = models.PositiveIntegerField(default=0,
                                               verbose_name=u'材料0の個数')
    materialnum1 = models.PositiveIntegerField(default=0,
                                               verbose_name=u'材料1の個数')
    materialnum2 = models.PositiveIntegerField(default=0,
                                               verbose_name=u'材料2の個数')
    pri = models.PositiveSmallIntegerField(default=0,
                                           verbose_name=u'並べるときの優先順位',
                                           help_text=u'0〜65535')

    def getMaterialNum(self, idx):
        return getattr(self, 'materialnum%d' % idx)
示例#3
0
class Friend(BaseModel):
    """仲間.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    
    FIXED_COLUMNS = (
        'uid','fid'
    )
    
    id = PositiveBigIntegerField(primary_key=True, verbose_name=u'ID((ユーザID<<32)+フレンドID)')
    uid = models.PositiveIntegerField(verbose_name=u'ユーザID')
    fid = models.PositiveIntegerField(db_index=True, verbose_name=u'フレンドID')
    state = models.PositiveSmallIntegerField(verbose_name=u'状態', choices=dict_to_choices(Defines.FriendState.NAMES))
    ctime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'更新時間')
    
    @staticmethod
    def makeID(uid, fid):
        return (uid << 32) + fid
    
    @staticmethod
    def create(uid, fid, state):
        ins = Friend()
        ins.id = Friend.makeID(uid, fid)
        ins.uid = uid
        ins.fid = fid
        ins.state = state
        return ins
    
    @classmethod
    def makeInstance(cls, key):
        uid = (key >> 32)
        fid = (key & 0xffffffff)
        return Friend.create(uid, fid, 0)
示例#4
0
class TradeMaster(BaseMaster):
    """秘宝交換マスターデータ.
    """
    class Meta:
        abstract = False
        app_label = settings_sub.APP_NAME

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    itype = models.PositiveSmallIntegerField(verbose_name=u'種別(アイテム or チケット)',
                                             choices=dict_to_choices(
                                                 Defines.ItemType.TRADE_TYPES))
    itemid = models.PositiveIntegerField(default=0, verbose_name=u'アイテムID')
    itemnum = models.PositiveIntegerField(default=0, verbose_name=u'アイテム個数')
    rate_cabaretking = models.PositiveIntegerField(
        default=0,
        verbose_name=u'レート(キャバ王の秘宝 or プラチナの欠片 or バトルチケット or クリスタルの欠片)')
    rate_demiworld = models.PositiveIntegerField(
        default=0, verbose_name=u'レート(裏社会の秘宝)[未使用]')
    schedule = models.PositiveIntegerField(default=0, verbose_name=u'スケジュール')
    stock = models.PositiveIntegerField(default=0, verbose_name=u'在庫数')
    reset_stock_monthly = models.BooleanField(default=False,
                                              verbose_name=u'月初に在庫数をリセットするフラグ')
    slidecapture = models.TextField(
        default='', verbose_name=u'画面上部でスライド表示させるキャプチャ画像(カード限定)', blank=True)
    header = models.TextField(default='',
                              verbose_name=u'画面上部のヘッダ画像',
                              blank=True)
    is_used_platinum_piece = models.BooleanField(
        default=False, verbose_name=u'交換にプラチナの欠片を使うか否か')
    is_used_battle_ticket = models.BooleanField(
        default=False, verbose_name=u'交換にバトルチケットを使うか否か')
    is_used_crystal_piece = models.BooleanField(
        default=False, verbose_name=u'交換にクリスタルの欠片を使うか否か')
示例#5
0
class BaseMaster(BaseModel):
    class Meta:
        abstract = True

    pubstatus = models.PositiveSmallIntegerField(
        default=Defines.PublishStatus.PUBLIC,
        choices=dict_to_choices(Defines.PublishStatus.NAMES),
        verbose_name="公開ステータス")
    edittime = AppDateTimeField(default=OSAUtil.get_datetime_min(),
                                db_index=True,
                                verbose_name=u'更新時間')

    @property
    def is_public(self):
        return self.pubstatus == Defines.PublishStatus.PUBLIC

    @classmethod
    def get_formfields(cls):
        pkeyname = cls.get_primarykey_column()
        fields = [pkeyname, 'pubstatus']
        for field in cls.get_fields():
            if not field.name in fields:
                fields.append(field.name)
        return fields

    @classmethod
    def makeID(cls, uid, mid):
        return (uid << 32) + mid
示例#6
0
class CardSortMaster(BaseMaster):
    """カードソート用マスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ユーザID')
    ctype = models.PositiveSmallIntegerField(db_index=True, verbose_name=u'タイプ', default=Defines.CharacterType.TYPE_001, choices=dict_to_choices(Defines.CharacterType.NAMES))
    rare = models.PositiveSmallIntegerField(verbose_name=u'レア度', choices=dict_to_choices(Defines.Rarity.NAMES))
    album = models.PositiveIntegerField(db_index=True, verbose_name=u'アルバム番号')
    hklevel = models.PositiveSmallIntegerField(db_index=True, verbose_name=u'ハメ管理レベル', default=1, choices=rangedict(1, Defines.HKLEVEL_MAX+1).items())
示例#7
0
class GachaGroupMaster(BaseMaster):
    """ボックスのグループ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    name = models.CharField(default='', max_length=48, verbose_name=u'名前')
    rare = models.PositiveSmallIntegerField(
        verbose_name=u'レア度',
        choices=dict_to_choices(Defines.Rarity.NAMES_INCLUDE_ALL),
        default=Defines.Rarity.ALL)
    table = JsonCharField(default=list, verbose_name=u'テーブル')
    expectation = models.PositiveSmallIntegerField(
        verbose_name=u'期待度',
        choices=dict_to_choices(Defines.RankingGachaExpect.NAMES),
        default=Defines.RankingGachaExpect.LOW)

    def getCardNum(self):
        return len(self.table)
示例#8
0
class RaidMaster(BaseMaster):
    """レイドのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    name = models.CharField(default='', max_length=48, verbose_name=u'名前')
    commentappear = models.TextField(default='', verbose_name=u'出現時(挑発)コメント')
    commentwin = models.TextField(default='', verbose_name=u'勝利(ユーザが勝利)時コメント')
    commentwin_full = models.TextField(default='', verbose_name=u'大成功時コメント')
    commentlose = models.TextField(default='', verbose_name=u'敗北(ユーザが敗北)時コメント')
    thumb = models.CharField(default='', max_length=96, verbose_name=u'サムネイル')
    hprate_min = models.PositiveIntegerField(default=100,
                                             verbose_name=u'HPの変動幅の下限[%]')
    hprate_max = models.PositiveIntegerField(default=100,
                                             verbose_name=u'HPの変動幅の上限値[%]')
    hpbase = models.PositiveIntegerField(default=0, verbose_name=u'HP基本値')
    hpgrowth = models.PositiveIntegerField(default=0, verbose_name=u'HP成長度')
    defensebase = models.PositiveIntegerField(default=0,
                                              verbose_name=u'防御力基本値')
    defensegrowth = models.PositiveIntegerField(default=0,
                                                verbose_name=u'防御力成長度')
    bpcost = models.PositiveSmallIntegerField(default=20,
                                              verbose_name=u'気力消費量')
    bpcost_strong = models.PositiveSmallIntegerField(
        default=50, verbose_name=u'気力消費量(強攻撃)')
    bpcost_first = models.SmallIntegerField(default=-1,
                                            verbose_name=u'気力消費量(初回)',
                                            help_text=u'0より小さい場合は無効')
    bpcost_first_other = models.SmallIntegerField(
        default=-1, verbose_name=u'気力消費量(発見者以外の初回)', help_text=u'0より小さい場合は無効')
    prizes = JsonCharField(default=list, verbose_name=u'発見者の報酬')
    helpprizes = JsonCharField(default=list, verbose_name=u'救援の報酬')
    cabaretkingbase = models.PositiveIntegerField(default=0,
                                                  verbose_name=u'キャバ王の秘宝基本値')
    cabaretkinggrowth = models.PositiveIntegerField(default=0,
                                                    verbose_name=u'キャバ王の秘宝成長度')
    demiworldbase = models.PositiveIntegerField(default=0,
                                                verbose_name=u'キャバ王の秘宝(救援)基本値')
    demiworldgrowth = models.PositiveIntegerField(
        default=0, verbose_name=u'キャバ王の秘宝(救援)成長度')
    max_level = models.PositiveIntegerField(default=100,
                                            verbose_name=u'ボスの最大レベル')
    ctype = models.PositiveSmallIntegerField(
        verbose_name=u'ボスの属性',
        default=Defines.CharacterType.NONE,
        choices=dict_to_choices(Defines.CharacterType.BOSS_NAMES))
    weakbonus = JsonCharField(verbose_name=u'属性ボーナス',
                              default=list,
                              help_text=u'[[属性,倍率%],..]')
    items = JsonCharField(default=list, verbose_name=u'アイテム出現テーブル')
示例#9
0
class PlayerRegist(BaseModel):
    """登録時に設定する内容.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ユーザID')
    ctime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'登録時間')
    ptype = models.PositiveSmallIntegerField(db_index=True,
                                             choices=dict_to_choices(
                                                 Defines.CharacterType.NAMES),
                                             verbose_name=u'タイプ')
示例#10
0
class PromotionRequirementMasterBase(BaseMasterWithName):
    """クロスプロモーション条件マスターデータ.
    """
    class Meta:
        abstract = True
        app_label = settings_sub.APP_NAME

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    condition_type = models.PositiveIntegerField(
        default=Defines.PromotionRequirementType.LEVEL,
        choices=dict_to_choices(Defines.PromotionRequirementType.NAMES),
        verbose_name=u'達成条件タイプ')
    condition_value = models.PositiveIntegerField(default=0,
                                                  verbose_name=u'達成条件の値')
示例#11
0
class PromotionDataBase(BasePerPlayerBaseWithMasterID):
    """クロスプロモーション達成データ.
    """
    class Meta:
        abstract = True
        app_label = settings_sub.APP_NAME

    status = models.PositiveSmallIntegerField(
        default=Defines.PromotionStatus.NONE,
        choices=dict_to_choices(Defines.PromotionStatus.NAMES),
        verbose_name=u'達成状態')
    atime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'達成した時間')
    rtime = AppDateTimeField(default=OSAUtil.get_datetime_min,
                             verbose_name=u'受け取った時間')
示例#12
0
class GachaBoxGachaDetailMaster(BaseMaster):
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ガチャID')
    allowreset_rarity = models.PositiveIntegerField(
        default=0,
        verbose_name=u'リセット許可レアリティ',
        choices=dict_to_choices(Defines.Rarity.NAMES))
    allowreset_cardidlist = JsonCharField(default=list,
                                          verbose_name=u'リセット許可カードIDリスト')
    limit_resettime = models.PositiveIntegerField(default=0,
                                                  verbose_name=u'リセット可能回数')
    prizelist = JsonCharField(default=list, verbose_name=u'BOX引き切り報酬')
    textid = models.PositiveIntegerField(default=0, verbose_name=u'報酬文言')
示例#13
0
class InviteData(BaseModel):
    """招待詳細.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.CharField(primary_key=True,
                          max_length=16,
                          verbose_name=u'ユーザID(DMM)')
    fid = models.PositiveIntegerField(db_index=True,
                                      verbose_name=u'誰から招待されたかユーザID')
    state = models.PositiveSmallIntegerField(verbose_name=u'状態',
                                             choices=dict_to_choices(
                                                 Defines.InviteState.NAMES))
    ctime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'招待通知受信日時')
示例#14
0
class PrizeMaster(BaseMaster):
    """報酬マスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    gold = models.PositiveIntegerField(default=0, verbose_name=u'キャバゴールド')
    gachapt = models.PositiveIntegerField(default=0, verbose_name=u'引抜Pt')
    rareoverticket = models.PositiveIntegerField(default=0,
                                                 verbose_name=u'レア以上チケット')
    ticket = models.PositiveIntegerField(default=0, verbose_name=u'運試しチケット')
    memoriesticket = models.PositiveIntegerField(default=0,
                                                 verbose_name=u'思い出チケット')
    gachaticket = models.PositiveIntegerField(default=0,
                                              verbose_name=u'引き抜きチケット')
    goldkey = models.PositiveIntegerField(default=0, verbose_name=u'金の鍵')
    silverkey = models.PositiveIntegerField(default=0, verbose_name=u'銀の鍵')
    itemid = models.PositiveIntegerField(default=0, verbose_name=u'アイテムID')
    itemnum = models.PositiveIntegerField(default=0, verbose_name=u'アイテム個数')
    cardid = models.PositiveIntegerField(default=0, verbose_name=u'カードID')
    cardnum = models.PositiveIntegerField(default=0, verbose_name=u'カード枚数')
    eventticket_id = models.PositiveIntegerField(default=0,
                                                 verbose_name=u'レイドイベントID')
    eventticket_num = models.PositiveIntegerField(
        default=0, verbose_name=u'レイドイベントチケット枚数')
    additional_ticket_id = models.PositiveIntegerField(
        default=0,
        verbose_name=u'追加ガチャチケット種別',
        choices=dict_to_choices(
            Defines.GachaConsumeType.GachaTicketType.CHOICES))
    additional_ticket_num = models.PositiveIntegerField(
        default=0, verbose_name=u'追加ガチャチケット枚数')
    tanzaku_number = models.PositiveSmallIntegerField(
        default=0, verbose_name=u'スカウトイベント短冊')
    tanzaku_num = models.PositiveIntegerField(default=0,
                                              verbose_name=u'スカウトイベント短冊数')
    cabaclub_money = models.PositiveIntegerField(
        default=0, verbose_name=u'キャバクラシステムの特別なマネー')
    cabaclub_honor = models.PositiveIntegerField(default=0,
                                                 verbose_name=u'名誉ポイント')
    platinum_piece_num = models.PositiveIntegerField(default=0,
                                                     verbose_name=u'プラチナの欠片')
    crystal_piece_num = models.PositiveIntegerField(default=0,
                                                    verbose_name=u'クリスタルの欠片')
示例#15
0
class MemoriesMaster(BaseMasterWithThumbnail):
    """思い出アルバムのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    contenttype = models.PositiveSmallIntegerField(
        verbose_name=u'コンテンツの種類',
        default=Defines.MemoryContentType.IMAGE,
        choices=dict_to_choices(Defines.MemoryContentType.NAMES))
    contentdata = models.CharField(max_length=96, verbose_name=u'コンテンツの内容')
    cardid = models.PositiveIntegerField(default=0,
                                         db_index=True,
                                         verbose_name=u'カードID')
    cardlevel = models.PositiveIntegerField(default=0,
                                            verbose_name=u'開放に必要なカードのレベル')
示例#16
0
class PresentBase(BaseModel):
    """プレゼント.
    """
    class Meta:
        abstract = True

    fromid = models.PositiveIntegerField(verbose_name=u'送信したユーザID')
    toid = models.PositiveIntegerField(verbose_name=u'受け取るユーザID')
    itype = models.PositiveSmallIntegerField(
        verbose_name=u'種別(PM or 引き抜きPt or アイテム or カード)',
        choices=dict_to_choices(Defines.ItemType.PRESENT_TYPES))
    ivalue = models.PositiveIntegerField(
        verbose_name=u'値(金額 or Pt or アイテムID or カードID)')
    inum = models.PositiveIntegerField(verbose_name=u'個数(アイテム or カードのみ)',
                                       default=0)
    textid = models.PositiveIntegerField(verbose_name=u'テキストID')
    limittime = AppDateTimeField(db_index=True,
                                 default=OSAUtil.get_now,
                                 verbose_name=u'有効期限')
示例#17
0
class AppConfig(Singleton):
    """メンテナンス設定.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    maintenancetype = TinyIntField(verbose_name=u'メンテフラグ',
                                   choices=dict_to_choices(
                                       Defines.MaintenanceType.NAMES),
                                   default=Defines.MaintenanceType.EMERGENCY)
    stime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'メンテ開始時間')
    etime = AppDateTimeField(default=OSAUtil.get_now, verbose_name=u'メンテ終了時間')
    master = models.PositiveIntegerField(default=0, verbose_name=u'マスターデータ番号')

    def is_maintenance(self):
        if self.is_emergency():
            return True
        elif self.stime <= OSAUtil.get_now() < self.etime:
            return True
        return False

    def is_platform_maintenance(self):
        """プラットフォームのメンテか.
        """
        return self.maintenancetype in (
            Defines.MaintenanceType.REGULAR_PLATFORM,
            Defines.MaintenanceType.EMERGENCY_PLATFORM)

    def is_emergency(self):
        """緊急メンテか.
        """
        return self.maintenancetype in (
            Defines.MaintenanceType.EMERGENCY,
            Defines.MaintenanceType.EMERGENCY_PLATFORM)

    @classmethod
    def getModel(cls):
        model = cls.getSingletonModel()
        if model is None:
            model = cls()
            model.save()
        return model
示例#18
0
class LoginBonusTimeLimitedMaster(BaseMaster):
    """期限付きログインボーナスの設定.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    name = models.CharField(max_length=48, verbose_name=u'名前')
    htmlname = models.CharField(max_length=64, verbose_name=u'HTML名(ロングログイン)')
    effectname = models.CharField(max_length=64, verbose_name=u'演出名(ロングログイン)')
    textid = models.PositiveIntegerField(default=0,
                                         verbose_name=u'報酬テキストID(ロングログイン)')
    lbtype = models.PositiveSmallIntegerField(
        default=Defines.LoginBonusTimeLimitedType.TOTAL,
        verbose_name=u'日付固定フラグ',
        choices=dict_to_choices(Defines.LoginBonusTimeLimitedType.NAMES))
    # 演出用パラメータ.
    logo = models.BooleanField(default=False, verbose_name=u'ロゴの有無')
    img_effect = models.CharField(max_length=96,
                                  verbose_name=u'演出画像',
                                  blank=True)
    text_logo = models.CharField(max_length=128,
                                 verbose_name=u'演出文言(ロゴ表示時)',
                                 blank=True)
    text_start = models.CharField(max_length=128,
                                  verbose_name=u'演出文言(開始)',
                                  blank=True)
    text_itemlist = models.CharField(max_length=128,
                                     verbose_name=u'演出文言(報酬一覧)',
                                     blank=True)
    text_itemget = models.CharField(max_length=128,
                                    verbose_name=u'演出文言(アイテム獲得)',
                                    blank=True)
    text_itemnext = models.CharField(max_length=128,
                                     verbose_name=u'演出文言(明日のアイテム)',
                                     blank=True)
    text_end = models.CharField(max_length=128,
                                verbose_name=u'演出文言(終了,タッチ待ち)',
                                blank=True)
示例#19
0
class SkillMaster(BaseMasterWithName):
    """スキルのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    class Skill():
        def __init__(self,
                     etarget=0,
                     etypelist=None,
                     epower=0,
                     etext=None,
                     eskill=0):
            self.etarget = etarget
            self.etypelist = etypelist or []
            self.epower = epower
            self.etext = etext or u''
            self.eskill = eskill

    MULTI_SKILL_NUM_MAX = 4

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    etarget = models.PositiveSmallIntegerField(verbose_name=u'効果対象',
                                               choices=dict_to_choices(
                                                   Defines.SkillTarget.NAMES))
    etype = models.PositiveSmallIntegerField(
        verbose_name=u'対象タイプ',
        choices=dict_to_choices(Defines.CharacterType.SKILL_TARGET_NAMES))
    eskill = models.PositiveSmallIntegerField(verbose_name=u'スキル効果',
                                              choices=dict_to_choices(
                                                  Defines.SkillEffect.NAMES),
                                              default=0)
    epower = models.PositiveIntegerField(verbose_name=u'上昇する接客力')
    etext = models.TextField(verbose_name=u'効果テキスト', blank=True)
    etarget1 = models.PositiveSmallIntegerField(verbose_name=u'効果対象',
                                                choices=dict_to_choices(
                                                    Defines.SkillTarget.NAMES),
                                                default=0)
    etype1 = models.PositiveSmallIntegerField(
        verbose_name=u'対象タイプ',
        default=0,
        choices=dict_to_choices(Defines.CharacterType.SKILL_TARGET_NAMES_SUB))
    eskill1 = models.PositiveSmallIntegerField(verbose_name=u'スキル効果',
                                               choices=dict_to_choices(
                                                   Defines.SkillEffect.NAMES),
                                               default=0)
    epower1 = models.PositiveIntegerField(verbose_name=u'上昇する接客力', default=0)
    etext1 = models.TextField(verbose_name=u'効果テキスト', blank=True)
    etarget2 = models.PositiveSmallIntegerField(verbose_name=u'効果対象',
                                                choices=dict_to_choices(
                                                    Defines.SkillTarget.NAMES),
                                                default=0)
    etype2 = models.PositiveSmallIntegerField(
        verbose_name=u'対象タイプ',
        default=0,
        choices=dict_to_choices(Defines.CharacterType.SKILL_TARGET_NAMES_SUB))
    eskill2 = models.PositiveSmallIntegerField(verbose_name=u'スキル効果',
                                               choices=dict_to_choices(
                                                   Defines.SkillEffect.NAMES),
                                               default=0)
    epower2 = models.PositiveIntegerField(verbose_name=u'上昇する接客力', default=0)
    etext2 = models.TextField(verbose_name=u'効果テキスト', blank=True)
    etarget3 = models.PositiveSmallIntegerField(verbose_name=u'効果対象',
                                                choices=dict_to_choices(
                                                    Defines.SkillTarget.NAMES),
                                                default=0)
    etype3 = models.PositiveSmallIntegerField(
        verbose_name=u'対象タイプ',
        default=0,
        choices=dict_to_choices(Defines.CharacterType.SKILL_TARGET_NAMES_SUB))
    eskill3 = models.PositiveSmallIntegerField(verbose_name=u'スキル効果',
                                               choices=dict_to_choices(
                                                   Defines.SkillEffect.NAMES),
                                               default=0)
    epower3 = models.PositiveIntegerField(verbose_name=u'上昇する接客力', default=0)
    etext3 = models.TextField(verbose_name=u'効果テキスト', blank=True)
    erate1 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.1')
    erate2 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.2')
    erate3 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.3')
    erate4 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.4')
    erate5 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.5')
    erate6 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.6')
    erate7 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.7')
    erate8 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.8')
    erate9 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.9')
    erate10 = models.PositiveSmallIntegerField(verbose_name=u'発動率Lv.10')
    group = models.PositiveIntegerField(
        verbose_name=u'グループ',
        help_text=u'同じ値が入っていれば教育時にスキルアップの対象になる',
        default=0)

    def get_rate(self, level):
        return getattr(self, 'erate%d' % level, self.erate1)

    def get_skill(self, number):
        str_number = str(number) if 0 < number else ''
        epower = getattr(self, 'epower%s' % str_number)
        if epower < 1:
            # 未設定.
            return None

        etarget = getattr(self, 'etarget%s' % str_number)
        tmp_etype = getattr(self, 'etype%s' % str_number)
        etext = getattr(self, 'etext%s' % str_number) or self.text
        eskill = getattr(self, 'eskill%s' % str_number)

        if tmp_etype == Defines.CharacterType.ALL:
            etypelist = Defines.CharacterType.LIST
        else:
            etypelist = []
            for _ in xrange(Defines.CharacterType.NUM_MAX - 1):
                etype = tmp_etype % 10
                if etype in Defines.CharacterType.LIST:
                    etypelist.append(etype)
                tmp_etype = int(tmp_etype / 10)

        return SkillMaster.Skill(etarget, list(set(etypelist)), epower, etext,
                                 eskill)
示例#20
0
class DefaultCardMaster(BaseMaster):
    """デフォルト所持カードのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    ctype = models.PositiveSmallIntegerField(primary_key=True, verbose_name=u'タイプ', choices=dict_to_choices(Defines.CharacterType.NAMES))
    leader = models.PositiveIntegerField(db_index=True, verbose_name=u'リーダー')
    members = JsonCharField(default=list, verbose_name=u'メンバー', help_text=u'ユーザー登録時にデッキに設定します')
    box = JsonCharField(default=list, verbose_name=u'BOX', help_text=u'ユーザー登録時にBOXに設定します')
示例#21
0
class ItemMaster(BaseMasterWithThumbnail):
    """アイテムのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    id = models.PositiveSmallIntegerField(primary_key=True, verbose_name=u'ID', choices=dict_to_choices(Defines.ItemEffect.NAMES))
    evalue = models.PositiveSmallIntegerField(default=0, verbose_name=u'効果の値')
    unit = models.CharField(max_length=16, verbose_name=u'単位', default=u'')
    pri = models.PositiveSmallIntegerField(default=0, verbose_name=u'優先順位')
示例#22
0
class CardMaster(BaseMasterWithThumbnail):
    """カードマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    ckind = models.PositiveSmallIntegerField(default=Defines.CardKind.NORMAL, choices=dict_to_choices(Defines.CardKind.NAMES), verbose_name=u'カードの種類(通常or教育or進化)')
    gtype = models.PositiveSmallIntegerField(default=Defines.CardGrowthType.BALANCE, choices=dict_to_choices(Defines.CardGrowthType.NAMES), verbose_name=u'成長タイプ(早熟orバランスor晩成)')
    cost = models.PositiveSmallIntegerField(default=0, verbose_name=u'コスト')
    basepower = models.PositiveIntegerField(default=1, verbose_name=u'接客力(基礎値)')
    maxpower = models.PositiveIntegerField(default=1, verbose_name=u'接客力(最大値)')
    maxlevel = models.PositiveIntegerField(default=1, verbose_name=u'最大レベル')
    skill = models.PositiveIntegerField(verbose_name=u'サービス(スキル)')
    albumhklevel = PositiveBigIntegerField(unique=True, verbose_name=u'(アルバム番号<<32)+ハメ管理レベル')
    basematerialexp = models.PositiveIntegerField(verbose_name=u'強化素材経験値(基礎)')
    maxmaterialexp = models.PositiveIntegerField(verbose_name=u'強化素材経験値(最大)')
    baseprice = models.PositiveIntegerField(verbose_name=u'売値(基礎)')
    maxprice = models.PositiveIntegerField(verbose_name=u'売値(最大)')
    evolcost = models.PositiveIntegerField(verbose_name=u'進化費用')
    dmmurl = JsonCharField(verbose_name=u'DMMの動画ページのURL', default=list, blank=True)
    
    @classmethod
    def makeAlbumHklevel(cls, album, hklevel):
        return (album << 32) + hklevel
    
    @property
    def album(self):
        return int(self.albumhklevel >> 32)
    @property
    def hklevel(self):
        return int(self.albumhklevel & 0xffffffff)
示例#23
0
class BaseTreasureMaster(BaseMaster):
    """宝箱マスターデータ.
    """
    class Meta:
        abstract = True
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    itype = models.PositiveSmallIntegerField(db_index=True, verbose_name=u'中身の種別', choices=dict_to_choices(Defines.ItemType.TREASURE_ITEM_TYPES))
    ivalue1 = models.PositiveIntegerField(default=0, verbose_name=u'アイテムID')
    ivalue2 = models.PositiveIntegerField(default=1, verbose_name=u'個数,金額')
    probability = models.PositiveIntegerField(default=0, verbose_name=u'確率')
    priority = models.PositiveSmallIntegerField(default=0, verbose_name=u'優先度')
示例#24
0
class TutorialConfig(BaseMaster):
    """チュートリアル設定.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    
    ctype = models.PositiveSmallIntegerField(primary_key=True, verbose_name=u'タイプ', choices=dict_to_choices(Defines.CharacterType.NAMES))
#    compositioncard = models.PositiveIntegerField(verbose_name=u'教育の素材で使用するカード')
    scoutdropcard = models.PositiveIntegerField(verbose_name=u'スカウトでドロップするカード')
    scoutarea = models.PositiveIntegerField(verbose_name=u'チュートリアルのスカウトエリア')
    prizes = JsonCharField(default=list, verbose_name=u'チュートリアル完了報酬')
    treasure = models.PositiveIntegerField(verbose_name=u'チュートリアルで発見する宝箱')
    memories = models.PositiveIntegerField(verbose_name=u'チュートリアルで閲覧する思い出アルバム', default=0)
    pcmemories = models.PositiveIntegerField(verbose_name=u'チュートリアルで閲覧する思い出アルバム(PC)', default=0)
示例#25
0
class ReprintTicketTradeShopMaster(BaseMaster):
    """復刻チケット交換所マスター.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    card_id = models.PositiveIntegerField(default=0, verbose_name=u'カードID')
    use_ticketnum = models.PositiveSmallIntegerField(default=0, verbose_name=u'交換する際に使うチケットの枚数')
    stock = models.PositiveIntegerField(default=0, verbose_name=u'交換可能個数')
    ticket_id = models.PositiveIntegerField(default=0, verbose_name=u'ガチャチケット種別', choices=dict_to_choices(Defines.GachaConsumeType.GachaTicketType.CHOICES))
    reprintticket_trade_text = models.PositiveIntegerField(verbose_name=u'復刻チケット交換文言')
    priority = models.PositiveSmallIntegerField(default=0, verbose_name=u'表示優先順位')
    schedule_id = models.PositiveIntegerField(default=0, verbose_name=u'期間')
示例#26
0
class PanelMissionMissionMaster(BaseMaster):
    """パネルミッションのミッション.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    name = models.CharField(max_length=64, verbose_name=u'名前')
    panel = models.PositiveSmallIntegerField(db_index=True, verbose_name=u'パネルID')
    number = models.PositiveSmallIntegerField(verbose_name=u'ミッション番号')
    image_pre = models.CharField(default='', max_length=96, verbose_name=u'達成前のパネル画像')
    image_post = models.CharField(default='', max_length=96, verbose_name=u'達成後のパネル画像')
    prizes = JsonCharField(default=list, verbose_name=u'達成報酬')
    prize_text = models.PositiveIntegerField(default=0, verbose_name=u'達成報酬テキスト')
    condition_type = models.PositiveSmallIntegerField(default=0, verbose_name=u'達成条件種別', choices=dict_to_choices(Defines.PanelMissionCondition.NAMES))
    condition_value1 = models.PositiveSmallIntegerField(default=0, verbose_name=u'達成条件の値1')
    condition_value2 = models.PositiveSmallIntegerField(default=0, verbose_name=u'達成条件の値2')
    condition_text = models.TextField(default='', verbose_name=u'達成条件の説明', blank=True)
    
    @classmethod
    def makeID(cls, panel, number):
        return (panel << 16) + number
    
    @classmethod
    def makeInstance(cls, key):
        model = cls()
        primary_key_column = cls.get_primarykey_column()
        setattr(model, primary_key_column, key)
        model.panel = (key >> 16)
        model.number = key & 0xffff
        return model
示例#27
0
class GachaMaster(BaseMasterWithThumbnail):
    """引きぬきガチャのマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False

    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    pay_thumb = models.CharField(max_length=128, verbose_name=u'課金用サムネイル')
    pay_thumb_pc = models.CharField(max_length=128,
                                    verbose_name=u'PC版課金用サムネイル')
    unique_name = models.CharField(max_length=32,
                                   unique=True,
                                   verbose_name=u'ユニークキー')
    tabname = models.CharField(max_length=16,
                               default=u'',
                               verbose_name=u'タブ名',
                               blank=True)
    tabengname = models.CharField(max_length=16,
                                  default=u'',
                                  verbose_name=u'タブ名(リンク用)',
                                  blank=True)
    schedule = models.PositiveIntegerField(default=0, verbose_name=u'期間')
    stime_text = models.CharField(max_length=64,
                                  default='',
                                  verbose_name=u'開始時間表示用テキスト',
                                  help_text=u'未設定の場合はscheduleを見て表示します',
                                  blank=True)
    etime_text = models.CharField(max_length=64,
                                  default='',
                                  verbose_name=u'終了時間表示用テキスト',
                                  help_text=u'未設定の場合はscheduleを見て表示します',
                                  blank=True)
    continuity = models.PositiveSmallIntegerField(default=1,
                                                  verbose_name=u'回数')
    consumetype = models.PositiveSmallIntegerField(
        verbose_name=u'消費するもの',
        choices=dict_to_choices(Defines.GachaConsumeType.NAMES),
        db_index=True)
    consumevalue = models.PositiveIntegerField(verbose_name=u'消費量')
    stock = models.PositiveSmallIntegerField(default=0,
                                             verbose_name=u'ガチャの在庫数',
                                             help_text=u'0で無制限')
    firsttimetype = models.PositiveSmallIntegerField(
        verbose_name=u'毎日初回 or 1度きり',
        choices=dict_to_choices(Defines.GachaFirsttimeType.NAMES))
    firststock = models.PositiveSmallIntegerField(verbose_name=u'初回ガチャの在庫数')
    firstcontinuity = models.PositiveSmallIntegerField(
        verbose_name=u'初回ガチャを1度に回す回数')
    consumefirstvalue = models.PositiveIntegerField(verbose_name=u'初回消費量')
    boxid = models.PositiveIntegerField(default=0, verbose_name=u'BoxID')
    special_boxid = JsonCharField(default=list,
                                  verbose_name=u'回数別BoxID',
                                  blank=True)
    rarity_fixed_boxid = models.PositiveIntegerField(
        default=0, verbose_name=u'レアリティ確定の際に使用するBoxID')
    rarity_fixed_num = models.PositiveSmallIntegerField(
        default=0, verbose_name=u'レアリティ確定枚数')
    bonus = JsonCharField(default=list, verbose_name=u'おまけ')
    variableconsumevalue = JsonCharField(default=dict, verbose_name=u'変動消費量')
    premium = models.BooleanField(default=False,
                                  verbose_name=u'プレミアムフラグ(課金ガチャ用)')
    stepid = models.PositiveIntegerField(default=0, verbose_name=u'StepID')
    step = models.PositiveIntegerField(default=0, verbose_name=u'ステップ番号')
    stepsid = models.PositiveIntegerField(default=0,
                                          verbose_name=u'ステップ開始ガチャID')
    seattableid = models.PositiveIntegerField(default=0,
                                              verbose_name=u'シートテーブルID')
    addsocardflg = models.BooleanField(default=0, verbose_name=u'特効追加注意表示フラグ')
    img_rule = models.CharField(max_length=128,
                                verbose_name=u'ルール画像',
                                blank=True,
                                default='')
    point_rate = JsonCharField(
        default=list,
        verbose_name=u'ポイントレート',
        help_text=u'[9月中期新規追加ガチャ]のイベント時にガチャを回した際に付与されるポイント')
    trade_shop_master_id = models.PositiveSmallIntegerField(
        verbose_name=u'TradeShopMasetrID', default=0)
    gacha_explain_text_id = models.PositiveSmallIntegerField(
        verbose_name=u'GachaExplainTextID', default=0)

    def get_bonus_all(self, with_name=False):
        """おまけを全て取得.
        """
        if not self.bonus or not isinstance(self.bonus, list):
            return []
        elif not isinstance(self.bonus[0], dict):
            return [self.bonus]
        else:
            return [data['prize'] for data in self.bonus]

    def get_bonus_name(self):
        """おまけの名前を取得.
        """
        if not self.bonus or not isinstance(self.bonus, list):
            return []
        elif not isinstance(self.bonus[0], dict):
            return ['おまけ%d' % (i + 1) for i in xrange(len(self.bonus))]
        else:
            return [
                data.get('name', 'おまけ%d' % (i + 1))
                for i, data in enumerate(self.bonus)
            ]

    def choice_bonus(self, rand=None):
        """おまけを選定.
        """
        if not self.bonus or not isinstance(self.bonus, list):
            return []
        elif not isinstance(self.bonus[0], dict):
            return self.bonus

        rand = rand or AppRandom()
        rate_total = sum([data.get('rate', 0) for data in self.bonus])
        if rate_total < 1 or AppRandom.RAND_MAX <= rate_total:
            raise CabaretError(u'おまけの確率が壊れています',
                               CabaretError.Code.INVALID_MASTERDATA)

        v = rand.getIntN(rate_total)
        for data in self.bonus:
            rate = data.get('rate', 0)
            v -= rate
            if 0 < rate and v <= 0:
                return data['prize']
        raise CabaretError(u'想定外のバグです')
示例#28
0
class ShopItemMaster(BaseMasterWithThumbnail):
    """ショップに並べる商品のマスターデータ.
    """
    class Meta:
        app_label = settings_sub.APP_NAME
        abstract = False
    
    ITEM_LENGTH = 3
    
    id = models.PositiveIntegerField(primary_key=True, verbose_name=u'ID')
    schedule = models.PositiveIntegerField(default=0, verbose_name=u'期間')
    consumetype = models.PositiveSmallIntegerField(default=Defines.ShopConsumeType.PAYMENT, verbose_name=u'消費するもの', choices=Defines.ShopConsumeType.NAMES.items())
    price = models.PositiveIntegerField(default=0, verbose_name=u'値段')
    stock = models.PositiveSmallIntegerField(default=0, verbose_name=u'在庫')
    itype0 = models.PositiveSmallIntegerField(default=0, verbose_name=u'商品種別0', choices=dict_to_choices(Defines.ItemType.BUY_ABLE_TYPES))
    iid0 = models.PositiveIntegerField(default=0, verbose_name=u'商品ID0')
    inum0 = models.PositiveIntegerField(default=0, verbose_name=u'商品個数0')
    itype1 = models.PositiveSmallIntegerField(default=0, verbose_name=u'商品種別1', choices=dict_to_choices(Defines.ItemType.BUY_ABLE_TYPES))
    iid1 = models.PositiveIntegerField(default=0, verbose_name=u'商品ID1')
    inum1 = models.PositiveIntegerField(default=0, verbose_name=u'商品個数1')
    itype2 = models.PositiveSmallIntegerField(default=0, verbose_name=u'商品種別2', choices=dict_to_choices(Defines.ItemType.BUY_ABLE_TYPES))
    iid2 = models.PositiveIntegerField(default=0, verbose_name=u'商品ID2')
    inum2 = models.PositiveIntegerField(default=0, verbose_name=u'商品個数2')
    pri = models.PositiveSmallIntegerField(default=0, verbose_name=u'優先順位')
    beginer = models.BooleanField(default=False, verbose_name=u'初心者用', choices={True:u'初心者限定',False:u'通常'}.items())
    
    def getItemList(self, num=1):
        """設定されているアイテム.
        """
        items = {}
        for i in xrange(ShopItemMaster.ITEM_LENGTH):
            itype = getattr(self, 'itype%d' % i)
            iid = getattr(self, 'iid%d' % i)
            inum = getattr(self, 'inum%d' % i) * num
            key = (itype << 32) + iid
            if inum == 0:
                continue
            elif itype == Defines.ItemType.CARD and 0 < iid:
                prize = items.get(key) or PrizeData.create(cardid=iid, cardnum=0)
                prize.cardnum += inum
                items[key] = prize
            elif itype == Defines.ItemType.ITEM and 0 < iid:
                prize = items.get(key) or PrizeData.create(itemid=iid, cardnum=0)
                prize.itemnum += inum
                items[key] = prize
            elif itype == Defines.ItemType.RAREOVERTICKET:
                prize = items.get(key) or PrizeData.create()
                prize.rareoverticket += inum
                items[key] = prize
            elif itype == Defines.ItemType.TRYLUCKTICKET:
                prize = items.get(key) or PrizeData.create()
                prize.ticket += inum
                items[key] = prize
            elif itype == Defines.ItemType.MEMORIESTICKET:
                prize = items.get(key) or PrizeData.create()
                prize.memoriesticket += inum
                items[key] = prize
            elif itype == Defines.ItemType.GACHATICKET:
                prize = items.get(key) or PrizeData.create()
                prize.gachaticket += inum
                items[key] = prize
            elif itype == Defines.ItemType.GOLDKEY:
                prize = items.get(key) or PrizeData.create()
                prize.goldkey += inum
                items[key] = prize
            elif itype == Defines.ItemType.GOLDKEY:
                prize = items.get(key) or PrizeData.create()
                prize.goldkey += inum
                items[key] = prize
            elif itype == Defines.ItemType.SILVERKEY:
                prize = items.get(key) or PrizeData.create()
                prize.silverkey += inum
                items[key] = prize
            elif itype == Defines.ItemType.EVENT_GACHATICKET:
                prize = items.get(key) or PrizeData.create(eventticket_id=iid)
                prize.eventticket_num += inum
                items[key] = prize
            elif itype == Defines.ItemType.CABARETCLUB_SPECIAL_MONEY:
                prize = items.get(key) or PrizeData.create()
                prize.cabaclub_money += inum
                items[key] = prize
            elif itype == Defines.ItemType.CABARETCLUB_HONOR_POINT:
                prize = items.get(key) or PrizeData.create()
                prize.cabaclub_honor += inum
                items[key] = prize
            else:
                raise CabaretError(u'商品設定に誤りがあります.id=%d' % self.id, CabaretError.Code.INVALID_MASTERDATA)
        return items.values()