ザンキゼロのシガバネをGoogleのToDoリストで管理する
ザンキゼロ
ザンキゼロとは,ダンガンロンパでお馴染みスパイク・チュンソフトの新作ゲームです.
このゲームにはバトル要素があり,キャラクターを強化するための以下の2つの育成要素があります.
- スキル
レベルアップ時に取得できるスキルポイントを消費し,取得する.
攻撃力強化やアイテムの効果を増強させるものなどがある. - シガバネ
キャラクターが特定の条件で死ぬと,復活する際に取得する.
例えば,毒状態で死ぬと,復活後に毒耐性を取得する(毒になりにくくなる).
シガバネはキャラクター毎(全8人)に独立しており,大半は内容が被っているが,中にはキャラクター固有のものもあります. また,一人あたりおよそ150個弱のシガバネがあり, このシガバネの取得が本作のやりこみ要素の1つになっています.
今回解決したい課題
↑で話した通り,シガバネの数は非常に多く,
ゲームをプレイしていると,今何のシガバネを取得していて何を取得していないかわからなくなってきます.
そこで,今回は,各キャラクターの未取得のシガバネを何らかのツールを使って管理しようと考えました.
解決方針
GoogleのToDoリストを使って未取得のシガバネを管理します.
- このToDoリストはGoogleのサービス(詳しく言うとGmailのサービス)なので,Googleのアカウントがあれば誰でも利用できます.
- また,スマホ用アプリもリリースしているので,パソコンとスマホの両方からこのサービスを手軽に利用できます.
ToDoリストでシガバネを管理するにあたって,以下の下準備を行います.
シガバネデータの取得とデータ整形
クロールしたサイトについて
今回は以下のサイトを利用させていただきました.
このサイトのrobots.txt
は以下の通りなので,クロールしてもいいサイトだと考えています.
User-agent: * Disallow: /*/?cmd=backup Disallow: /*/?cmd=edit Disallow: /*/?cmd=search Allow: /
クロール・データ整形のコード
以下のコードでデータを取得し,整形してcsvファイルに書き込みました.
今回は面倒くさがってコメントをほとんど書いていません.
# coding: UTF-8 import urllib.request from bs4 import BeautifulSoup from time import sleep import re import csv def encode_jpurl(japanese): return urllib.parse.quote_plus(japanese, encoding='utf-8') def make_url(character_name): query = "{0}%28{1}%29".format(encode_jpurl(character_name), encode_jpurl('シガバネ一覧')) return "https://h1g.jp/zanki_zero/?{0}".format(query) def get_html(url): f = urllib.request.urlopen(url) html = f.read().decode('utf-8') return html def extract_string_from_tr(tr_tag): td_array = tr_tag.find_all("td") data_array = [td.text for td in td_array] data_array.extend(["" for i in range(3-len(data_array))]) return data_array def extract_data_from_html(html): soup = BeautifulSoup(html, "html.parser") div_shigabane = soup.find("div", class_="mainbody") tbody_shigabane = div_shigabane.find("tbody") rows_shigabane = tbody_shigabane.find_all("tr") return [extract_string_from_tr(row_shigabane) for row_shigabane in rows_shigabane] def fill_the_empty(data): pre_data = ["", "", ""] for i in range(len(data)): if data[i][1] == "": data[i][1] = pre_data[1] if data[i][2] == "": data[i][2] = pre_data[2] pre_data = data[i] return data def write_data_to_csv(data, filename): f = open('csv/{0}.csv'.format(filename), 'w') writer = csv.writer(f, lineterminator='\n') writer.writerows(data) f.close() def shape4todolist(data, listname): shaped_data = [["tasklist_name", "title", "notes", "status", "due", "completed", "deleted", "hidden", "depth"]] shaped_data.append([listname, listname, "", "needsAction", "", "", "", "", 0]) # dataのヘッダを削除 data.pop(0) shaped_data.extend([[listname, d[0], d[1], "needsAction", "", "", "", "", 1] for d in data]) return shaped_data if __name__ == "__main__": character_names = ["ハルト", "リョウ", "ゼン", "マモル", "リンコ", "ユマ", "ミナモ", "サチカ"] for character_name in character_names: print(character_name) url = make_url(character_name) html = get_html(url) data = [["名称", "解説", "効果"]] data.extend(extract_data_from_html(html)) filled_data = fill_the_empty(data) write_data_to_csv(filled_data, character_name) data4todolist = shape4todolist(filled_data, character_name) write_data_to_csv(data4todolist, "{0}_todolist".format(character_name)) sleep(1)
整形後のデータ
以下のような9列のデータになっています.
tasklist_name
でラベルを指定し,depth
でそのタスクの階層を指定します.
画像では,タスクの階層を1に指定していますが,後々考えたら全部0にしたらよかったかもと思いました.
GoogleのToDoリストにインポート
データをインポートするために,以下のサイトを利用しました.
https://import-tasks.appspot.com/main
信用できるサイトかどうかは正直よくわかっていません.
ここにcsvファイルを送ると,タスクがGoogleのToDoリストに追加されます.
ToDoリストの見栄え
パソコンのブラウザ上では以下の様にタスクが表示されます.
csvファイルの時とタスクの順が一致していませんが,これは単純にブログ投稿前に操作(削除)してしまったからです.
インポート直後はcsvファイルと同じタスクの順になっています.
以下はiphoneのアプリで見た時のものです.
タスクをクリック(タップ)するとすぐに消せ,また,パソコンとスマホで連携できるので,操作感はいいと思います.
おわりに
今回はやりこみ要素(コンプリート系)のあるゲームとしてザンキゼロを取り上げましたが,
大概のゲームは何かしらのやりこみ要素があると思います.
例えば,ポケモンのまだ捕まえていないポケモン,モンハンの食材,メタルギアの武器,などなど.
今回の開発内容はザンキゼロに限らず,上記のようなやりこみ要素に対しても適用できます.
このため,今回の開発が今後自分がプレイするゲームに対しても攻略の助けになればと思います.