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下一桁')
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)
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)
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'交換にクリスタルの欠片を使うか否か')
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
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())
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)
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'アイテム出現テーブル')
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'タイプ')
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'達成条件の値')
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'受け取った時間')
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'報酬文言')
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'招待通知受信日時')
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'クリスタルの欠片')
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'開放に必要なカードのレベル')
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'有効期限')
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
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)
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)
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に設定します')
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'優先順位')
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)
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'優先度')
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)
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'期間')
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
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'想定外のバグです')
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()