宇宙文字解読2

投稿者:       mini @gsenkyg 投稿日:2014/01/18 20:52

難解な宇宙文字解読も少しだけ基本的なものだけですが解読できつつある状態です。
ゲームーも作成中で、なんとかそれらしくなってきた予感。(w
でも課題は多く存在しています。

さて本題です。

このスクリプトは「行った事のある町へワープ」というスクリプト記事をベースにしました。
本来元作者様名を記入すべきですが、二回目訪問で探し出す事ができずに失礼を致します。
申しわけありません。

これは仲間メンバーが新たに増加すると、都度追加されて表示に加えられるというスクリプトです。
#配列
a = createArray()  
b = 0
if getFlag("王子") 
  a[b] = "王子" 
  b = b + 1 
end 
if getFlag("弓士") 
  a[b] = "弓士"  
  b = b + 1
end 
if getFlag("勇者") 
  a[b] = "勇者" 
  b = b + 1
end 

if getFlag("騎士") 
  a[b] = "騎士" 
  b = b + 1
end 

#追加された都度の表示
case speakWithSelectArray(a, "誰を変更しますか?")
#パーティメンバーに居ればメンバーより外します。
#パーティメンバーに居なければメンバーに加えます。
#王子
  when 0 
if removePartyMember(8196)
  speak("王子をパーティからはずしました。")
else
 addPartyMember(8196)
  speak("王子がパーテイに加わりました。")
end
#弓士
  when 1  
if removePartyMember(8204)
  speak("弓士をパーティからはずしました。")
else
 addPartyMember(8204)
  speak("弓士がパーテイに加わりました。")
#勇者
end
  when 2 
if removePartyMember(593)
  speak("勇者をパーティからはずしました。")
else
 addPartyMember(593)
  speak("勇者がパーテイに加わりました。")
end
#騎士
  when 3
if removePartyMember(703)
  speak("騎士をパーティからはずしました。")
else
 addPartyMember(703)
  speak("騎士がパーテイに加わりました。")
end
  end


仲間になる予定キャライベントスクリプト
if getFlag("パンを食べた")
addPartyMember(8196)
speak("喜んで仲間になろう")
speak("王子が仲間に加わりました。")
setFlag("王子", true) 
else
speak("仲間になれとは十年早い!。")
speak("王子を仲間を加えられませんでした。")

end 


仕掛けキャライベントセットフラグ
speak("パンを食べた")
setFlag("パンを食べた", true)



これでも一応仲間が増加する都度、新たに仲間表示に加わりパーテイメンバーの入れ替えが出来ます。
でも完全ではありません。
課題1、 プレイヤーキャラのみ、つまり仲間が誰もいない場合は、
    「誰を変更しますか?」表示が固まってしまう。
課題2、 パーティメンバーがプイヤーキャラ+3キャラ合計4キャラとなり一杯でも、
     「パーテイに加わりました。」となってしまいます。

これらの解決方法がありますなら皆様のお知恵を拝借したいです。
宜しく御願い致します。
自分としてはちこれ

x = 10

#変数「x」の内容を元に分岐する
if x > 99
  #変数「x」が「99」より大きい場合
  speak("100以上")
elsif x > 9
  #変数「x」が「9」より大きい場合
  speak("10以上")
else
  #変数「x」が上記までの条件以外の場合
  speak("条件未達成")
end

何かを変数にして数値化?それとも違う方法? 
とこれ
配列の最後に列を追加

の応用でなんとか?と色々考えたのですが自分には出来ませんでした。
上記にこれを使うと表示はされましたがバグが発生して、誤動作が発生したからです。


何方か教えて頂ければうれしいです。



このように撃沈しない為にも!(w



これは「GIF」アニメです。昔HP用に作成したものの一部です。
自分の所持する「GIF」アニメソフトは16ビットと古く現在PCでは互換性に問題があり、
またかなり重たいので新たなGIFアニメは製作していません。
現在は「AVI」「FLV」で製作しています。
そういえばこのサイトで「FLV」動画をUPできるようですが、試行しましたがリンクしかできませんでした。わかる方教えて頂ければ嬉しいです。ゲームに素材利用できるなら3Dゲームになるのかも?(w

コメントする

コメントするには、ログインする必要があります。

コメント一覧

       mini @gsenkyg(投稿日:2014/01/19 05:37, 履歴)
idohaka様 
aoihikawa様

今回のスクリプトの件本当にありがとうございました。
idohaka様のモンスター図鑑?だったと思います。カッコイイスクリプトですけど応用がなかなか難しそうな気配かも知れませんね。このようなものが出来れば素晴らしいと思いました。
aoihikawa様 ありがとうございました。
最終endを1つ減らすと試行に成功しました。(aoihikawa様のご厚意により修整済みです。このままコピペで使用できます。)
やはり初心者にはシンプルで後で修整し易いスクリプトが良いかと思います。
この関連スクリプトは「初心者コピペ用」で個々の応用使用可能かと思いま。
皆様本当にありがとうございました。これでやっと次の段階へと進む事ができます。
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/01/19 11:49, 履歴)
case文の中で文字列を扱うということは
他の言語において
出来ない場合がありますので

ある程度、作り方に慣れてきたら
idohakaさまの手法も覚えておいて
良いかなとおもいます


なお、スクリプトの問題箇所については
今後の参考時に同じトラブルが発生してはいけないので
修正しておきました
       mini @gsenkyg(投稿日:2014/01/19 18:17, 履歴)
aoihikawa 様ありがとうございます。

>他の言語において 出:来ない場合がありますので
へ~~そうなんですか。色々と言語で制約があるんですね。勉強になりました。
>ある程度、作り方に慣れてきたら
そのようにしたいですね。早く慣れたいものです。
>今後の参考時に同じトラブルが発生してはいけないので
ご丁寧にありがとうございます。
初心者にとってスクリプト作成で一番大切な事は、エラー構文を修整できるようになる事と考えます。
この事が基本構文をしっかりと覚える最大の近道になると考えるからです。
これからも宜しく御願致します。
Material 204926 1 mini 井戸乃博士(投稿日:2014/01/18 22:06, 履歴)
宇宙文字解読お疲れ様です。

まず課題1ですが、配列に「やめる」というような項目を予め追加しておく方法が考えられます。
a = createArray()  
b = 0
if getFlag("王子") 
  a[b] = "王子" 
  b = b + 1 
end 
if getFlag("弓士") 
  a[b] = "弓士"  
  b = b + 1
end 
if getFlag("勇者") 
  a[b] = "勇者" 
  b = b + 1
end 

if getFlag("騎士") 
  a[b] = "騎士" 
  b = b + 1
end 

#配列の最後に「やめる(仲間の入れ替えを中止する選択肢)」を追加
pushArray(a, "やめる")

#選択肢を選ぶ際にループする処理を最初に入れておきます。
close = 0
while close == 0

case speakWithSelectArray(a, "誰を変更しますか?")

#以降のwhen1からwhen3の処理は変えていませんが、選択肢の一番下に「やめる」が追加されているので、選んだ時の処理(when 4)を作ります。

when 4
close = 1

end 


課題2の方は、addPartyMemberの下に
elseを付けると、仲間にできなかった場合の処理を作れると思います。
関数リファレンスの例を挙げておきます。
if addPartyMember(9)
  speak("仲間に加わりました。")
else
  speak("仲間を加えられませんでした。")
end


これでだめでしたら、またお知らせください。
ちなみにspeakWithSelectArrayを変数化してwhileを使うと、
選択肢を選んだ時のスクリプトを効率的に書けると思いますが、
とりあえず問題の箇所だけ答えさせていただきました。
誰か親切な方が教えてくれるかと思います(殴

ところで、GIFアニメが素晴らしい!!!
メカデザインも緻密で壮観です!!
技術力が高いですね・・・


       mini @gsenkyg(投稿日:2014/01/18 23:59, 履歴)
コメントありがとうございます。
課題1に関してこの
pushArray(a, "やめる")

#選択肢を選ぶ際にループする処理を最初に入れておきます。
close = 0
while close == 0
#ーーーーーーーーーーーーーーーー
when 4
close = 1

end 

は当初自分も考えてみましたが、

case speakWithSelectArray(a, "誰を変更しますか?")

との相性が悪いのか?バグが発生して誤作動が起きてしまいます。
症状としては、when 0も一緒に呼び込んでしまいます。
課題2に関して
>elseを付けると、仲間にできなかった場合の処理を作れると思います。

if elsif else構文で speak("メンバーはいっぱいです。誰かを外して下さい")と入れたいのですが、何を基準にして良いのかわからんのです。
>誰か親切な方が教えてくれるかと思います(殴
期待しております。(w

>メカデザインも緻密で壮観です!! 技術力が高いですね・・・
いやいやお恥ずかしいです。(動画の初歩的な技術ですよ。スクリプトでいうなら基本スクリプトと一緒かも?)CG動画の世界はセミプロ及びプロの方がゴチャマンと居られますので。


Material 204926 1 mini 井戸乃博士(投稿日:2014/01/19 03:08, 履歴)
詳しく調べてみるといろいろと複雑な処理が必要なことに気が付きました(^^;
二次元配列を使う方法を考えてみたので、参考にどうぞ。

以下を開始スクリプトに書きます。
#二次元配列を作って変数にします(getVariable("member")[n][m])
#n: 仲間の数
#m(0): "true"か"false"かの判定
#m(1): 仲間の名称
#m(2): 仲間のID
setVariable("member", createArray())
n = 0
while n < 4
  getVariable("member")[n] = createArray()
  n = n + 1
end

i = 0
while i < 4
#m(0)をすべて"false"に設定
getVariable("member")[i][0] = "false"
i = i + 1

getVariable("member")[0][1] ="王子"
getVariable("member")[0][2] ="8196"
getVariable("member")[1][1] ="弓士"
getVariable("member")[1][2] ="8204"
getVariable("member")[2][1] ="勇者"
getVariable("member")[2][2] ="593"
getVariable("member")[3][1] ="騎士"
getVariable("member")[3][2] ="703"


仲間になるイベント時
if getFlag("パンを食べた")
addPartyMember(8196)
speak("喜んで仲間になろう")
speak("王子が仲間に加わりました。")

#最初に書かれていたgetFlagの代わりにこちらを使います。
getVariable("member")[0][0] = "true"

else
speak("仲間になれとは十年早い!。")
speak("王子を仲間を加えられませんでした。")

end


仲間選択時
a = createArray()
i =0

#仲間になったキャラのリストを選択肢に
while i < 4
 if getVariable("member")[i] = "true"
 pushArray(a, getVariable("member")[i])
 end
i = i + 1
end

#「やめる」の項目を追加
pushArray(a, "やめる")

#ループ処理(closeが0以外になると終了) 
close = 0 
while close == 0
 k = speakWithSelectArray(a, "誰を変更しますか?")
 i = 0
 while i < 4
  if a[k] == getVariable("member")[i][1]

#パーティーにいない場合に仲間に加える。   
   if getPartyMember(getVariable("member")[i][2])= -1
    addPartyMember(getVariable("member")[i][2])
    speak(getVariable("member")[i][1]"がパーテイに加わりました。")

#パーティーにいる場合はパーティーから外す。
   elsif getPartyMember(getVariable("member")[i][2])=!-1
    removePartyMember(getVariable("member")[i][2])
    speakgetVariable("member")[i][1]"をパーティからはずしました。")

#パーティーがいっぱいの場合
   else 
    speak("メンバーはいっぱいです。誰かを外して下さい") 
   end

  elsif a[k] == "やめる"
      close = 1 
    end
  i = i +1
  end
end


一部、自信のないところもありますので、不具合が出たらまたおっしゃってください。
このように二次元配列を使ってリスト化したデータを参照するスクリプトは、
RPGで図鑑を作る際によく使われます。
こちらのページもあわせて参照されるといいと思います。

http://rmake.jp/boards/2/topics/398
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/01/19 04:05, 履歴)
シンプルなままにするなら、
こんな作り方でも動作可能

#配列の準備
a = createArray()  
b = 0
if getFlag("王子") 
  a[b] = "王子" 
  b = b + 1 
end 
if getFlag("弓士") 
  a[b] = "弓士"  
  b = b + 1
end 
if getFlag("勇者") 
  a[b] = "勇者" 
  b = b + 1
end 
if getFlag("騎士") 
  a[b] = "騎士" 
  b = b + 1
end 

a[b] = "やめる"


#追加された都度の表示
#パーティメンバーに居ればメンバーより外します。
#パーティメンバーに居なければメンバーに加えます。

case a[speakWithSelectArray(a, "誰を変更しますか?")]
#王子
  when "王子"
    if removePartyMember(8196)
      speak("王子をパーティからはずしました。")
    else
      if addPartyMember(8196)
        speak("王子がパーテイに加わりました。")
      else
        speak("パーティメンバーがいっぱいです。")
      end
    end
#弓士
  when "弓士"
    if removePartyMember(8204)
      speak("弓士をパーティからはずしました。")
    else
      if addPartyMember(8204)
        speak("弓士がパーテイに加わりました。")
      else
        speak("パーティメンバーがいっぱいです。")
      end
    end
#勇者
  when "勇者"
    if removePartyMember(593)
      speak("勇者をパーティからはずしました。")
    else
      if addPartyMember(593)
        speak("勇者がパーテイに加わりました。")
      else
        speak("パーティメンバーがいっぱいです。")
      end
    end
#騎士
  when "騎士"
    if removePartyMember(703)
      speak("騎士をパーティからはずしました。")
    else
      if addPartyMember(703)
        speak("騎士がパーテイに加わりました。")
      else
        speak("パーティメンバーがいっぱいです。")
      end
    end
#やめる
  when "やめる"
    speak("パーティの変更を中断しました。")
end
       mini @gsenkyg(投稿日:2014/01/19 04:57, 履歴)
このような時間までありがとうございます。
二次元配列を作って変数にしますの方はかなり難しそうですね。?
構文エラーを潰していました。でもこの部分のエラーがどうしても分かりませんでした。

#パーティーにいない場合に仲間に加える。   
   if getPartyMember(getVariable("member")[i][2])= -1
    addPartyMember(getVariable("member")[i][2])
    speak(getVariable("member")[i][1]"がパーテイに加わりました。")

シンプルな方がもしもの場合修整し易いので、シンプルな方が初心者マークにはいいかもです。
ありがとうございます。早速試行してみます。
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/01/19 11:51, 履歴)
speak文の、文字連結が
上手くいっていないのかと思います

  speak(getVariable("member")[i][1] + "がパーテイに加わりました。")
Material 204926 1 mini 井戸乃博士(投稿日:2014/01/19 14:44, 履歴)
簸川さん、フォローありがとうございます!
やはり頭で考えるだけでなく、実際に検証してみないとといけませんね・・・ orz
慣れないうちは、多少面倒でもシンプルなスクリプトにした方が混乱しなくて済みますので、
参考程度にしてくだされば幸いです。
       mini @gsenkyg(投稿日:2014/01/19 18:06, 履歴)
idohaka様ありがとうございます。
二次元配列を使ってリスト化したデータを参照するスクリプトについて様々な試行を行いました。
開始スクリプトと、表示スクリプトについて構文エラーを修整できました。で!最後の最後にリストに反映がされませんでした。
かなり前にモンスター図鑑で、どこかに仲間IDを入れて表示に成功していますが、その時の資料が行方不明(涙)またの機会にじっくり検証してみたいです。ありがとうございました。