ダウンロード機能

ダウンロード機能を使用した、Web上の何かとの連携例。
私はあまり詳しくないので、他サイトへのリンクもあります。

基礎知識

文字コード

ウディタの文字コードはShift-JISです。だいたいのサイトはUTF-8なので、気をつける必要があります。
ブラウザで右クリック【ソースを表示】などで見られる<head>タグの中に<meta charset="utf-8"> などと記述してあります。これが一致しないと文字化けします。

サーバ

世界のあちこちにある、データを保管できて24時間インターネットにつながっているコンピュータ。これを無料で借りられるんだからすごい時代です。
出来ることや容量に制限があることが多いので、自分に必要な性能が備わっているか確認が必要。

目的別おすすめ

ホームページがあればいいなら、WixGoogleサイト などのウェブサイト作成ツールが簡単。
ゲーム置き場だけでいいなら、uploader.jpOneDriveGoogleDriveなどのアップローダやストレージ。
ウディタから通信させたいなら、PHPなどのCGIが使える無料サーバXFREEスターサーバー 、GAS(Google Apps Script)とスプレッドシートが使えるGoogleDriveなど。

このサイトはGoogleサイトですが、CSSやhtmlをカスタムできないのだけ不満。逆に言えば、そういう知識が無くてもサイトを構築できるのは便利だと思います。

ダウンロード機能有効化

まずはウディタのダウンロード機能有効化。
オプション>>エディターオプションから、【上級者向けコマンドを使用する】にチェックを入れて設定完了。エディタが再起動しますので保存し忘れに注意。

オンライン更新

サーバ側の処理

適当なWebサーバを用意し、更新するファイルをバージョンごとに配置します。

サーバ側でCGIを使うのであれば、
http://url/game.cgi?ver=1
のような送信に対して、どのファイルをダウンロードさせるかを返す。

例えば「?ver=1」は1以降をダウンロードさせるということにして、

Game/1/Basicdata.wolf
Game/1/BGM.wolf
game/2/Basicdata.wolf

をダウンロードさせるなど。
ファイル名がかぶっていれば新しいファイルだけにしてやったほうが親切ですね。

CGIを使わない場合は、Version.txtのようなファイルを用意して中身に

@1
Basicdata.wolf
@2
BGM.wolf

のように記述し、ゲーム内部にバージョン管理の変数も用意しておきます

ウディタ側の処理

  1. 最新版の番号を取得

  2. 現在のゲームのバージョン(ウディタの変数で保存)と比較

  3. ダウンロードするファイル名を取得

  4. ダウンロード

ダウンロード保存先には【_NetDownloadData】というフォルダを指定してやります。(Netの前のアンダーバー"_"に注意)
この名前のフォルダにダウンロードされたファイルは、次回ゲーム起動時にDataフォルダに移動します。そのままゲームを続けても更新は適用されず、再起動でのみ適用されるので、更新が終わったら再起動してください!と表示してから【ゲーム終了】コマンドで終了するといいと思います。

GoogleDriveの場合

GoogleDriveを使う場合は、自前でサーバを用意するより簡単です。
やってる内容はほぼ同じですが、以下に解説リンクを貼っておきます。

参考リンク

ウディタでオンラインアップデートを導入する方法(くろくまそふと)

作者に感想を送る

入力された文字列、もしくはテキストファイルの内容をPHPを通じてWeb上に保存するコモンとUDBとPHPを作成しました。装飾などは一切していませんので、お好みで改造して使ってください。

Shift-JISでのエンコードなので、サーバ側の文字エンコードに注意してください。サーバ側の文字コードがUTF-8などから変更できない場合は、他のエンコードコモンなどを導入する必要があります。

使用方法

PHPが使えるwebサーバを準備します。無料で使えるところはたくさんありますので探してください。
PHPファイルとWebテキストを、サーバの適当な場所にアップロードします。これら2つのファイルは同じ階層に置いてください。

事前準備

■作者に感想を送る.commonをコモンイベントの適当な位置に読みます。3箇所使いますので注意してください。
UDB1及びUDB2を、ユーザーデータベースに読みます。場所はどこでも大丈夫です。
※コモンとUDBの名称は変えないこと(名前で呼び出しています)。そのかわり位置はどこでも大丈夫です。
ゲーム内で入力する場合は1行目のループを【1】に、6行目を【0】。ファイル内容を送信する場合は6行目のループを【1】に、1行目を【0】。
ファイル内容を送信するなら、同梱のローカルテキストをゲームフォルダに置きます。

使用方法

■作者に感想を送る コモンイベントを呼び出すだけです。

感想確認方法

Webテキストを開くと、【入力したテキスト - 2020-09-03 20:05:43】のような形で改行区切りのテキストファイルとして保存されます。

使い道の案

  • 名称どおり、エンディング終わったら起動して感想をもらう

  • テストプレイのバグ報告に使う(Game_ErrorLog.txtの内容を加工して送るのもいいかも)

  • アンケートとして(文字列ではなく、変数を送ってもらう)

ランキング

かんたんオンラインランキング(Manual+)

GoogleスプレッドシートとGoogle Apps Script (GAS)を使用したランキング。わかりやすくまとまった良記事。
こちらを参考にしつつ、一例を以下に紹介。

スプレッドシートを作成

左から順に、日時・時刻・ユーザー名・得点・ランク(ゲーム内変数)・登録通し番号のセルを準備。右側の不要なセルは削除しておきます。

スプレッドシートは5,000,000セルの制限があるので、横方向の不要なセルはばっさりなくしましょう。

GAS側の処理

function doGet(e) { var debug = ''; var q=e.parameter; var resMessage = ''; //戻り値定義 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetRanking = ss.getSheetByName('Ranking'); //シート定義 var ncolumns = 6; //横は6列 if(q.action == 'entry'){ //■ランキング登録 var nRows = sheetRanking.getLastRow(); //現在の最終行 var values = sheetRanking.getSheetValues(1,1,nRows,ncolumns); //最終行5列まですべてを配列【values】に格納 var nowDate=Utilities.formatDate( new Date(), 'Asia/Tokyo', '■yyyy/MM/dd'); //現在時刻(■つけないと配列出し入れで日付型になっちゃうので消さない) var nowTime=Utilities.formatDate( new Date(), 'Asia/Tokyo', '■HH:mm:ss'); //現在時刻(■つけないと配列出し入れで日付型になっちゃうので消さない) nRows++; //入力する行は次の行 values.push([nowDate,nowTime,q.name,q.point,q.rank,nRows]); //ウディタから送られてきた情報を配列最後尾に追加 values.sort((a, b) => {return b[3] - a[3];} ); //配列をソート(得点) sheetRanking.getRange(1,1,nRows,ncolumns).setValues(values); //配列の内容をスプレッドシートに転記 var pointValues = sheetRanking.getSheetValues(1,6,nRows,1); //4列目の得点のみを配列に格納 var ranking = pointValues.flat().indexOf(nRows) + 1; //入力された得点が何位か取得 }else if(q.action == 'read'){ //■ランキング読み込みのみ var ranking = 0; //読み込み時はランキング0として処理 var nRows = sheetRanking.getLastRow(); //現在の最終行 } //■ランキング加工定義 var upperRank = ranking - 5; if(upperRank <= 1){upperRank = 1;} var lowerRank = upperRank + 9; if(lowerRank > nRows){lowerRank = nRows;} var innerRanking = ranking + 1 - upperRank; resMessage = ranking + '\n'; //■文字列加工for文 var resMessage = innerRanking + '\n'; //戻り値定義 var wdtValues = sheetRanking.getSheetValues(1,1,nRows,ncolumns); //最終行4列まですべてを配列【values】に格納 for(var iRank = upperRank; iRank <= lowerRank; iRank++){ resMessage += iRank + ' ' + wdtValues[iRank - 1].join(' ') + '\n'; //配列をテキストに、それと整形 } // ■ウディタ用テキスト戻り値 return ContentService.createTextOutput(encodeURIComponent(resMessage)).setMimeType(ContentService.MimeType.TEXT);}

綺麗なコードではないので恐縮ですが、

  • シートの最下行にデータ書き込み

  • シート全体をGAS内配列に書き込み

  • 配列をソート

  • 配列をシートに一発書き出し

  • 今回入力されたデータが何位にあるか検索し、その周辺のデータをウディタ用テキスト形式にして返却

という流れです。ポイントは、【スプレッドシートAPI呼び出し回数を減らす】こと。
参考:【GAS】スプレッドシートの読み書きが遅い!を高速化するコツ
配列の状態でソートして配列を一括書き込みしてます。

ウディタ側

ウディタ側では、自分で定義した区切り記号(行は\n、列はカンマ、など)を文字列置換で改行などに変換加工して、一行ずつデータを取り出して表示しています。

1,2,3,4\n5,6,7,8\n9…
↓↓\nを改行に↓↓

1,2,3,4
5,6,7,8
9…

↓↓一行切り出し&カンマを改行に↓↓

1
2
3
4

↓↓一行切り出し↓↓

1

のように、このあたりは自分で工夫して定義してやるといいと思います。

結果

うまいこと表示するとこんな感じになります。

公式コモンイベント紹介

ダウンロード機能関連で使いやすそうなものをいくつか紹介。

URLエンコード・デコード

Shift-JISでパーセントエンコードを行ないたいとき。

UTF-8 エンコード&デコード

UTF-8でパーセントエンコードを行ないたいとき。

自動アップデートコモン

PHPを使えるサーバがあれば導入しやすい。