「ソーシャルゲーム」
大事な連絡
スキーマとは、DBにどうデータが入るかの定義
CREATE TABLE user (
name VARCHAR(255) NOT NULL COMMENT '名前',
age INTEGER NOT NULL COMMENT '年齢',
PRIMARY KEY (name)
) COMMENT 'ユーザ';
ユーザを、ユーザたらしめるのは、名前
ユーザは、年齢を持ってる
package MyApp::Schema;
use strict;
use warning;
use Teng::Schema::Declare;
table {
name "user";
pk "name";
columns qw( name age );
inflate 'age' => sub { };
deflate 'age' => sub { };
row_class 'MyApp::Row'; # optional
};
CREATE TABLE user (
name VARCHAR(255) NOT NULL COMMENT '名前',
birthday DATETIME NOT NULL COMMENT '誕生日',
PRIMARY KEY (name)
) COMMENT 'ユーザ';
SELECT * FROM name WHERE name = '佐藤健太';
CREATE TABLE user (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
os_id varchar(50) NOT NULL,
level int(10) unsigned NOT NULL,
exp int(10) unsigned NOT NULL,
money int(10) unsigned NOT NULL,
rare_medal int(10) unsigned NOT NULL,
guild_stone int(10) unsigned NOT NULL,
mission_point int(10) unsigned NOT NULL COMMENT 'ミッション用行動ポイント(現在値)',
max_mission_point int(10) unsigned NOT NULL COMMENT 'ミッション用行動ポイント(最大値)',
colosseum_point int(10) unsigned NOT NULL COMMENT '闘技場用行動ポイント(現在値)',
max_colosseum_point int(10) unsigned NOT NULL COMMENT '闘技場用行動ポイント(最大値)',
unit_max_count int(10) unsigned NOT NULL COMMENT 'unitの最大所持数',
unit_use_point int(10) unsigned NOT NULL COMMENT 'unitを使うためのポイント / unit.use_pointと対応',
leader_user_unit_id int(10) unsigned NOT NULL COMMENT 'リーダーカードのID',
equipment_max_count int(10) unsigned NOT NULL COMMENT '武具の最大所持数',
gacha_point int(10) unsigned NOT NULL COMMENT 'ガチャを回すためのポイント(エールP) greetなどで溜まる',
last_unconnect_at datetime NOT NULL COMMENT '最後にいずれかの仲間を解除した時間',
mission_point_recover_seconds int(10) unsigned NOT NULL COMMENT '行動力回復に必要な時間 / 回復量は設定に',
mission_point_last_recovered_at datetime NOT NULL COMMENT '最後に行動力を回復した時間',
colosseum_point_recover_seconds int(10) unsigned NOT NULL COMMENT '闘志回復に必要な時間 / 回復量は設定に',
colosseum_point_last_recovered_at datetime NOT NULL COMMENT '最後に闘志を回復した時間',
guild_battle_point_recover_seconds int(10) unsigned NOT NULL COMMENT '士気回復に必要な時間 / 回復量は設定に',
guild_battle_point_last_recovered_at datetime NOT NULL COMMENT '最後に士気を回復した時間',
partner_id int(10) unsigned COMMENT '選択中のパートナーのID',
last_present_at datetime NOT NULL COMMENT '最後にプレゼントした時間',
present_count int(10) unsigned COMMENT 'プレゼントした回数',
text_api_id varchar(50) COMMENT '自己紹介用TextDataAPIのID',
text_api_id_last_updated_at datetime COMMENT '最後に自己紹介を更新した時間',
tutorial_progress int(10) unsigned COMMENT 'チュートリアルをどこまで読んだか。チュートリアルの画面ID',
tutorial_end_fg tinyint NOT NULL DEFAULT '0' COMMENT 'チュートリアル終了フラグ',
tutorial_end_at datetime NOT NULL COMMENT 'チュートリアル終了時刻',
colosseum_tutorial_end_fg tinyint NOT NULL DEFAULT '0' COMMENT '闘技場チュートリアル終了フラグ',
invite_count int(10) unsigned NOT NULL DEFAULT 0 COMMENT '友だちを招待した数',
invite_user_id int(10) unsigned NULL COMMENT '招待したユーザ',
max_friend_count int(10) unsigned NOT NULL COMMENT '最大仲間人数',
created_at datetime NOT NULL,
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY `os_id` (`os_id`),
KEY `level` (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザー';
所有者
CREATE TABLE user_unit (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INTEGER UNSIGNED NOT NULL,
unit_id INTEGER UNSIGNED NOT NULL,
unit_base_id INTEGER UNSIGNED NOT NULL,
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY user_id (user_id, unit_id),
KEY unit_id (unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='カードの所有者情報';
育てたカード
CREATE TABLE unit (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
unit_base_id INTEGER UNSIGNED NOT NULL,
attack_point INTEGER UNSIGNED NOT NULL COMMENT '攻撃力',
guard_point INTEGER UNSIGNED NOT NULL COMMENT '防御力',
stamina_point INTEGER UNSIGNED NOT NULL COMMENT '耐久力',
use_point INTEGER UNSIGNED NOT NULL COMMENT 'コスト',
level INTEGER UNSIGNED NOT NULL COMMENT 'レベル',
growth INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT '成長',
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='カード個別データ';
元データ
CREATE TABLE unit_base (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(32) CHARSET ascii COLLATE ascii_bin NOT NULL,
name_ja VARCHAR(32) NOT NULL,
description TEXT NULL,
element ENUM('god', 'devil', 'human') NOT NULL COMMENT '属性',
rarity ENUM('N', 'NP', 'R', 'RP', 'HR', 'HRP', 'SR', 'SRP', 'UR', 'URP', 'LG', 'LGP') NOT NULL COMMENT 'レア度',
attack_point INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT '攻撃力',
guard_point INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT '防御力',
use_point INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT 'コスト',
money INTEGER UNSIGNED NOT NULL COMMENT '売却価格',
max_level INTEGER UNSIGNED NOT NULL COMMENT '最大レベル',
attack_point_when_rising_levelup INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT 'レベルアップ時の攻撃力の上がり幅',
guard_point_when_rising_levelup INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT 'レベルアップ時の防御の上がり幅',
ability_id INTEGER UNSIGNED DEFAULT NULL,
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユニット基盤データ';
CREATE TABLE user_unit (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INTEGER UNSIGNED NOT NULL,
unit_id INTEGER UNSIGNED NOT NULL,
exp INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT '経験値',
unit_acquired_count INTEGER UNSIGNED NOT NULL DEFAULT 1 COMMENT 'ユニット獲得回数',
additional_level_limit INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT '追加レベル上限',
use_count INTEGER UNSIGNED NOT NULL DEFAULT 0 COMMENT 'ユニット使用回数(バトル/ストーリー)',
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY user_unit_uniq (user_id, unit_id),
INDEX unit_id_idx (unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='所有ユニット';
CREATE TABLE unit (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_ja VARCHAR(32) NOT NULL,
default_level_limit INTEGER UNSIGNED NOT NULL COMMENT '初期値(レベル上限)',
default_physical_energy INTEGER UNSIGNED NOT NULL COMMENT '初期値(体力)',
... 中略 m(_ _)m ...
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユニット';
例)「ユーザがレベル10になったら、なにがしかの"称号"が与えられる」
CREATE TABLE achievement (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
group_name ENUM(
'camel'
'onion'
'pumpking'
'etc'
) NOT NULL DEFAULT 'etc',
score INT UNSIGNED NOT NULL,
cond_data TEXT NOT NULL, -- XXX なんぞこれwww
description TEXT NOT NULL,
value INT UNSIGNED DEFAULT NULL COMMENT '称号付与の閾値となる値',
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE emblem_tmpl (
id INTEGER UNSIGNED NOT NULL PRIMARY KEY, -- 種別ごとにidがまとまっている方が管理しやい
emblem_group_id INTEGER UNSIGNED NOT NULL,
threshold INTEGER UNSIGNED NOT NULL COMMENT '貰えるまでの閾値',
name_ja VARCHAR(255) NOT NULL COMMENT '称号名のテンプレ',
description TEXT NOT NULL COMMENT '称号説明のテンプレ',
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX emblem_group_threshold_idx (emblem_group_id, threshold)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='称号テンプレ';
CREATE TABLE emblem (
id INTEGER UNSIGNED NOT NULL PRIMARY KEY, -- 種別ごとにidがまとまっている方が管理しやすい
emblem_group_id INTEGER UNSIGNED NOT NULL,
emblem_tmpl_id INTEGER UNSIGNED NOT NULL,
target_uniqkey VARCHAR(64) CHARSET ascii COLLATE ascii_bin NULL COMMENT '称号の対象条件のuniqkey',
name_ja VARCHAR(255) NOT NULL COMMENT '称号名', -- emblem_tmplから生成
description TEXT NOT NULL COMMENT '称号説明', -- emblem_tmplから生成
threshold INTEGER UNSIGNED NOT NULL COMMENT '貰えるまでの閾値', -- emblem_tmplから生成
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY emblem_group_emblem_tmpl_target_uniqkey_uniq (emblem_group_id, emblem_tmpl_id, target_uniqkey), -- ある称号種別の閾値100の称<
INDEX emblem_group_target_uniqkey_idx (emblem_group_id, target_uniqkey) -- ある称号種別のアッシュの称号一覧を見たい
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='称号';
時間の関係で割愛...
「skillを持ったFighterが、隊をなして、相手か自分が殲滅するまで、HPステータスの削り合いをする」
package MyGame::Model::Battle;
my $fighters = model('Fighter')->fetch_party(+{ user_id => $user->id });
my $opposite_fighters = model('Fighter')->fetch_party(+{ user_id => $opposite_user->id });
my $turn = 0;
while (my $turn <= MAX_TURN ) {
$fighter->attack($opposite_fighters, $fighters);
$turn++;
}
my $battle_manager = model('Battle')->manager(user => $user, opposite_user => $opposite_user);
my $fighters = $battle_manager->fighters;
my $opposite_fighters = $battle_manager->opposite_fighters;
.. 略 ..
:) -> Controller -> Model -> DB -> mysql, redis, memcached etc
対戦の組み合わせ毎のスキーマを用意
CREATE TABLE arena_tournament_group_match (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
arena_tournament_group_id INTEGER UNSIGNED NOT NULL,
battle_count INTEGER UNSIGNED NOT NULL COMMENT '何回戦か', -- 1回戦から
match_num INTEGER UNSIGNED NOT NULL COMMENT '対戦番号', -- 1番から
user_id INTEGER UNSIGNED NULL,
status ENUM(
'before_battle', -- 戦闘開始前
'end' -- 戦闘終了( is_odd(MN) ? MN + 1 に勝利/敗北 : MN - 1 に勝利/敗北 )
) NOT NULL DEFAULT 'before_battle' COMMENT '状態',
opposite_user_id INTEGER UNSIGNED NULL COMMENT '対戦相手のuserのid',
npc_fg BOOL NULL DEFAULT 0,
won_fg BOOL NULL,
user_bout_log_id INTEGER UNSIGNED NULL COMMENT '戦闘ログid',
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL,
UNIQUE KEY arena_tournament_group_round_match_num_uniq (arena_tournament_group_id, battle_count, match_num),
INDEX arena_tournament_battle_user_idx (arena_tournament_group_id, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin COMMENT='アリーナトーナメント対戦表';
株式会社モバイルファクトリー は、
開発好きなエンジニアを求めています。