ゆっくり開発

開発したい時に開発するブログ

ザンキゼロのシガバネをGoogleのToDoリストで管理する

ザンキゼロ

f:id:uttnaoki:20180725230729j:plain

ザンキゼロとは,ダンガンロンパでお馴染みスパイク・チュンソフトの新作ゲームです.
このゲームにはバトル要素があり,キャラクターを強化するための以下の2つの育成要素があります.

  • スキル
    レベルアップ時に取得できるスキルポイントを消費し,取得する.
    攻撃力強化やアイテムの効果を増強させるものなどがある.
  • シガバネ
    キャラクターが特定の条件で死ぬと,復活する際に取得する.
    例えば,毒状態で死ぬと,復活後に毒耐性を取得する(毒になりにくくなる).

シガバネはキャラクター毎(全8人)に独立しており,大半は内容が被っているが,中にはキャラクター固有のものもあります. また,一人あたりおよそ150個弱のシガバネがあり, このシガバネの取得が本作のやりこみ要素の1つになっています.

今回解決したい課題

↑で話した通り,シガバネの数は非常に多く, ゲームをプレイしていると,今何のシガバネを取得していて何を取得していないかわからなくなってきます.
そこで,今回は,各キャラクターの未取得のシガバネを何らかのツールを使って管理しようと考えました.

解決方針

GoogleToDoリストを使って未取得のシガバネを管理します.

  • このToDoリストはGoogleのサービス(詳しく言うとGmailのサービス)なので,Googleのアカウントがあれば誰でも利用できます.
  • また,スマホ用アプリもリリースしているので,パソコンとスマホの両方からこのサービスを手軽に利用できます.

ToDoリストでシガバネを管理するにあたって,以下の下準備を行います.

  1. ザンキゼロの攻略サイトから各キャラクターのシガバネを取得(クロール)
  2. 取得したデータを整形(GoogleのToDoリストにインポートできる形式に)
  3. ToDoリストにインポート

シガバネデータの取得とデータ整形

クロールしたサイトについて

今回は以下のサイトを利用させていただきました.

h1g.jp

このサイトの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列のデータになっています.

f:id:uttnaoki:20180725230504p:plain

tasklist_nameでラベルを指定し,depthでそのタスクの階層を指定します.
画像では,タスクの階層を1に指定していますが,後々考えたら全部0にしたらよかったかもと思いました.

GoogleのToDoリストにインポート

データをインポートするために,以下のサイトを利用しました.

https://import-tasks.appspot.com/main

信用できるサイトかどうかは正直よくわかっていません.

ここにcsvファイルを送ると,タスクがGoogleのToDoリストに追加されます.

ToDoリストの見栄え

パソコンのブラウザ上では以下の様にタスクが表示されます.

f:id:uttnaoki:20180725231855p:plain

csvファイルの時とタスクの順が一致していませんが,これは単純にブログ投稿前に操作(削除)してしまったからです.
インポート直後はcsvファイルと同じタスクの順になっています.

以下はiphoneのアプリで見た時のものです.

f:id:uttnaoki:20180725232226j:plain:w300

タスクをクリック(タップ)するとすぐに消せ,また,パソコンとスマホで連携できるので,操作感はいいと思います.

おわりに

今回はやりこみ要素(コンプリート系)のあるゲームとしてザンキゼロを取り上げましたが, 大概のゲームは何かしらのやりこみ要素があると思います.
例えば,ポケモンのまだ捕まえていないポケモン,モンハンの食材,メタルギアの武器,などなど.
今回の開発内容はザンキゼロに限らず,上記のようなやりこみ要素に対しても適用できます.
このため,今回の開発が今後自分がプレイするゲームに対しても攻略の助けになればと思います.