見出し画像

Suika2のwmsについて、Copilot GPTに聞いてみた

今回は、Copilot GPTに、Suika2の独自プログラム要素であるwmsについて質問してみました。Ronron & duo_beraです。こんばんは。

「上級者向けであるwmsを使ってゲームを作ってみたい!」と思うほど、アイデアが浮かばないので今回はCopilot GPTに聞いてみることにしました。解答してもらった内容を貼り付けて装飾していきます。

中の人はプログラミング知識はゼロに近いので、Copilot GPTの回答が正しいのかどうかわかりません。なので、「おい、ここ違ってんぞ」という、つっこみをお待ちしております。

【!】wikiにかかれているものをベースとし、聞いてみました。


wmsの基本的な文法について

wikiにかかれているものを基本として聞いてみました。
形とそれぞれの型とその使用例について、Copilot GPTに説明していただきます。

整数 (int)

整数はゲームのスコアや、プレイヤーの体力、アイテムの数などを表すのによく使われます。例えば、プレイヤーが敵を倒すたびにスコアを1点ずつ増やすことができます。

score = 0; // スコアを初期化
score = score + 1; // 敵を倒すたびにスコアを1点増やす

浮動小数点数 (float)

浮動小数点数は、ゲーム内の時間、移動速度、位置などを表すのに使われます。例えば、プレイヤーの移動速度を0.5と設定することができます。

speed = 0.5; // プレイヤーの移動速度を設定

文字列 (string)

文字列は、ゲーム内のテキスト、プレイヤーの名前、メッセージなどを表すのに使われます。例えば、プレイヤーがゲームをクリアしたときに表示するメッセージを設定することができます。

message = "Congratulations! You have cleared the game."; // ゲームクリアのメッセージを設定

配列 (array)

配列は、複数の値を一度に管理するために使われます。

items[0] = "Sword"; // アイテムリストの最初の要素に"Sword"を設定
items[1] = "Shield"; // アイテムリストの2番目の要素に"Shield"を設定

配列の使われ方

例えば、プレイヤーが所持しているアイテムのリストなども管理することができます。

func main() {
    // アイテムを追加
    items[0] = "Sword";
    print(items);

    // アイテムを削除
    remove(items, 0);
    print(items);

    // アイテムの数を取得
    print(size(items));
}

連想配列 (associative array)

連想配列は、キーと値のペアを管理するために使われます。例えば、各アイテムの価格を管理することができます。

prices["Sword"] = 100; // "Sword"の価格を100に設定
prices["Shield"] = 150; // "Shield"の価格を150に設定

配列の配列 (array of arrays)

配列の配列は、複雑なデータ構造を管理するために使われます。例えば、ゲームのマップを2次元配列として管理することができます。

map[0][0] = "Grass"; // マップの(0, 0)の位置に"Grass"を設定
map[0][1] = "Water"; // マップの(0, 1)の位置に"Water"を設定

関数の呼び出し

他の関数を呼び出すことで、コードの再利用性を高めることができます。例えば、プレイヤーのスコアを計算する関数を作成し、それをゲームの複数の場所で呼び出すことができます。

func main() {
    score = calculate_score(10, 20, 30);
    print(score);
}

func calculate_score(a, b, c) {
    return a + b + c;
}

文字列変数による間接呼び出し

文字列変数を使って関数を間接的に呼び出すことができます。これは、実行時にどの関数を呼び出すかを動的に決定する場合に便利です。例えば、プレイヤーのアクションに基づいて異なる関数を呼び出すことができます。

func main() {
    action = "attack";
    action(10, 20, 30);
}

func attack(a, b, c) {
    // 攻撃の処理
}

func defend(a, b, c) {
    // 防御の処理
}

計算

 整数と浮動小数点数は、ゲームのスコアの計算プレイヤーの位置の更新時間の経過など、さまざまな計算に使用されます。

// 整数の計算
score = 10;
bonus = 20;
total_score = score + bonus;

// 浮動小数点数の計算
time = 1.0;
speed = 2.0;
distance = time * speed;

// 整数と浮動小数点数の混合計算
score = 10;
bonus_ratio = 1.5;
total_score = score * bonus_ratio; // total_scoreは浮動小数点数

// 剰余の計算
remainder = score % 3;

// 文字列の連結
message = "Score: " + total_score;

ループ

ループは、同じコードを複数回実行するために使用されます。例えば、「プレイヤーの全てのアイテムを一つずつ処理する」、「特定の条件が満たされるまでゲームを続ける」、などの場合に使用します。

// 指定した回数の繰り返し
for(i in 0..9) {
    print("This is loop number " + i);
}

// 配列の値についての繰り返し
items[0] = "Sword";
items[1] = "Shield";
items[2] = "Potion";
for(item in items) {
    print("You have a " + item);
}

// 配列のキー/値ペアについての繰り返し
prices["Sword"] = 100;
prices["Shield"] = 150;
prices["Potion"] = 50;
for(item, price in prices) {
    print("The price of a " + item + " is " + price);
}

// 単純な while ループ
time_left = 10;
while (time_left > 0) {
    print("Time left: " + time_left);
    time_left = time_left - 1;
}

// break と continue
for(i in 0..9) {
    if(i == 2) {
        continue; // iが2のときは何もせずに次のループに進む
    }
    if(i == 7) {
        break; // iが7のときはループを終了する
    }
    print(i);
}

分岐 (if - else if - else)

分岐は、ゲームの状況に応じて異なるアクションを実行するために使用されます。例えば、プレイヤーのスコアに基づいて異なるメッセージを表示することができます

ゲームだけでなく、プログラムでは最も使う部分だと思います。

func main() {
    score = get_score();
    if(score > 100) {
        print("Excellent!");
    } else if(score > 50) {
        print("Good job!");
    } else {
        print("Keep trying!");
    }
}

func get_score() {
    // スコアを計算または取得するコード
    return 75;
}

Suika2のスクリプトをで言えば、このように書くことも出来ます。

乱数+条件分岐

#みどりだった場合変数$999が1になり、継続的に実行される
#ランダム変数を呼んでいる
@set $0 = $RAND
@set $0 %= 1001

#わざとデバッグ用にみどりを呼んでいる
@set %a = みどり


現在の名前は%a で 変数は$0 !
<<<
if %a == みどり {
    @set $999 = 1
}-
else if %a != みどり {
    @goto END
}
>>>
# みどりだったら実行を継続します
<<<
if $0 == 1000 {
    おめでとう、ドンピシャや。
}-
else if $0 != 1000 {
    @goto 1000じゃない
}
>>>
:1000じゃない
# 1000じゃない場合の処理
<<<
if $0 >= 500 {
    $0 だね。500含め以上だと表示されるよ。
}-
else if $0 >= 100 {
    $0 だね。100含め以上だと表示されるよ。
}-
else {
    その他の数字だよ。ちなみに$0だ。
}
>>>
:END
おしまい。END

拡張if文がそのままシナリオに書くことが出来るので、wmsでやるのであれば「細かい数字の計算(ダメージ計算など)のあと」に分岐してあげたらいいかなと思っています。

Suika2での乱数は0~9999が出るそうですが、上記の内容では1000まで出るようにしています。

ガチャ仕様を作るときはもっと細かい計算式とか1.2%で【レアアイテムが取れる】なんて確率を作るたい場合、wmsでやったほうがいいと思います。あとこのような計算式を考えるのが好きな仲良しさんがいるので、私は「わがんないおぢえで」という呪文を唱えて聞いてしまっています。

型変換

型変換は、異なる型の値を互いに変換するために使用されます。例えば、スコア(整数)を文字列に変換して表示することができます。

// 整数から文字列への変換
score = 100;
score_str = "" + score;
print("Your score is: " + score_str);

// 浮動小数点数から文字列への変換
time = 1.23;
time_str = "" + time;
print("Your time is: " + time_str);

// 整数から浮動小数点数への変換
score = 100;
score_float = 0.0 + score;
print("Your score is: " + score_float);

// 文字列から整数への変換
score_str = "100";
score = 0 + score_str;
print("Your score is: " + score);

// 文字列から浮動小数点数への変換
time_str = "1.23";
time = 0.0 + time_str;
print("Your time is: " + time);

さいごに・・・

Suika2で開発してみたいなと思っている方が、この記事がお役に立つことを祈っています。正直、私もCopilot GPTに教えてもらうまで「ぽかーん」としていたんですが…ここまでやれてしまうらしいです。

しかし、実際に動いているゲームを直接解剖してスクリプトを見てみたいですね。

だが、アレコレやりたいことを詰め込むと、ゲームのグラフィックの制限とも格闘する必要性があるかなと思いますし、何よりもゲーム制作は「引き算」が大事だと思ってます。単純に諦めるのではなく、〝最初から仕様に入れない勇気〟も必須ということです。

それでは、ここまでお読みくださってありがとうございました!

良いノーコード&ローコードライフを!

この記事が参加している募集

最近の学び

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?