私設SoS2オーナー応援BBS

新規発言一覧最新記事過去一覧検索ダウンロードページHOME

スレッド

└◇1841:
カードトレードと、カード画像の実装を目指して… [YOUME] 08/12 15:30

 └◇1842:Re:カードトレードと、カード画像の実装を目指して… [moon] 08/12 21:47
  └◇1843:Re[2]:カードトレードと、カード画像の実装を目指して… [moon] 08/12 22:03
   ├◇1844:Re[3]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/12 22:36
   └◇1845:Re[3]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/13 18:45
    └◇1846:Re[4]:カードトレードと、カード画像の実装を目指して… [moon] 08/13 20:28
     └◇1847:Re[5]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/14 09:22
      └◇1848:Re[6]:カードトレードと、カード画像の実装を目指して… [moon] 08/14 12:22
       └◇1849:Re[7]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/15 09:52
        └◇1850:Re[8]:カードトレードと、カード画像の実装を目指して… [moon] 08/15 11:19
         └◇1851:Re[9]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/15 19:58
          └◇1852:Re[10]:カードトレードと、カード画像の実装を目指して… [moon] 08/15 22:19
           └◇1853:Re[11]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/16 16:08
            └◇1855:Re[12]:カードトレードと、カード画像の実装を目指して… [moon] 08/16 21:42
             └◇1857:Re[13]:カードトレードと、カード画像の実装を目指して… [YOUME] 08/16 21:49
              └◇1859:Re[14]:カードトレードと、カード画像の実装を目指して… [moon] 08/16 22:00<-last


1841● カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/12 15:30
ご無沙汰しております!
いつもお世話になっております、YOUMEです。

ふと思い立って、カードバトルメインのSOS2を設置しようかなと思い、「Script Of Saga II Ver 1.8」を土台に「カードのコレクション」や「カードファイル」を実装してみたのですが「カードトレード」だけがどうしても上手く実装できず…

過去の資料を見ながら悩みに悩んで半日経ってしまい…
自分だけでは解決できそうになかったので、ご指導いただきたくやってきました…

文法チェック等々を行いながら試行錯誤した結果、おそらく上手くいかない原因はcardtrade.plにありそうだということが分かったのですが、ステラトレードの仕組み等々をみながら調整しても、何故か「カードの設定」(カードトレードの設定)ができず…

もともと
# Sub CardEdit After #
sub caed_after {
@rcdlines = &get_user("$Fm{'id'}");
&splititem('i');
foreach (0 .. $#items) {
($item,$sts,$price) = split(/△/,$items[$_]);
if ($Fm{$_}) {
$sts .= /Td/ if $sts !~ /Td/;
splice(@items,$_,1,"$item△$sts");
}
}
else { $sp =~ s/Td//g }
$fg = ''; &joinitem('i');
&userout;
push (@msg,"カードのトレード設定を変更しました");
}

だったのですが、これだと500エラーが出るので

# Sub CardEdit After #
sub caed_after {
    @rcdlines = &get_user("$Fm{'id'}");
    &splititem('i');
    $sp =~ s/Td//g;
    foreach (0 .. $#items) {
        ($item,$sts,$price) = split(/△/,$items[$_]);
        if ($Fm{$_}) {
            $sts .= /Td/ if $sts !~ /Td/;
            splice(@items,$_,1,"$item△$sts");
                }
                }
    &joinitem('i');
    $fg = '';
    &userout;
    push (@msg,"カードのトレード設定を変更しました");
        }

に変更して、エラーはでなくなったのですが、何度やってもカードトレード設定が反映されず…

どうしたものか…といった感じになっております…。


カードトレードまで実装できたら、今度はカード1枚1枚に画像をつけたいと思っているのですが、どのような方法が一番良いか、全く思い浮かんでいない現状で…お知恵を借りれたらなと…!


もうSOS2関連の相談ができる場所がこちらしかなく、いつもすがってしまって申し訳ないです…ご指導いただけたら嬉しいです!
コメントを書く(引用) | スレッド一覧


1842● Re:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/12 21:47
> $sts .= /Td/ if $sts !~ /Td/;

おそらく、上記の「.= /Td/」が原因だと思われます。
「.= 'Td'」に修正して試してみてください。

あと、変更前の「else { $sp =~ s/Td//g }」は「if ($Fm{$_})」に対するelseであり、以下のようにしたほうがより良いと思います。
elsif($sts =~ s/Td//g){ # $spではなく$sts、ステータスに'Td'が含まれていたらすべて削除
  # 'Td'が削除されたらデータ更新
  splice(@items, $_, 1, "$item△$sts");
}

> カードトレードまで実装できたら、今度はカード1枚1枚に画像をつけたいと思っているのですが、どのような方法が一番良いか、全く思い浮かんでいない現状で…お知恵を借りれたらなと…!

アイテム名が表示されるタイミングすべてで画像も表示して良いのでしたらアイテム名にimgタグを含めてしまうのが簡単だと思います。(例:「<img src="card/example.png">カード名」)
他には、ステータスに番号やファイル名などを持たせておいて画像を表示したいタイミングでそれを参照して表示する、ということもできると思います。
コメントを書く(引用) | スレッド一覧


1843● Re[2]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/12 22:03
一点補足します。

> (例:「<img src="card/example.png">カード名」)

これは「"」ではなく「'」にしたほうが良さそうです。
また、別の副作用があるかもしれないので、簡単ですがあまりお勧めできない方法でした。
コメントを書く(引用) | スレッド一覧


1844● Re[3]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/12 22:36
ありがとうございます!
無事にトレードカードの設定ができるようになりました!

ただ、トレード設定しているプレイヤーの名前とIDをリストで出そうとしているのが上手くいかず…

以下のようにsos2.cgiに追記しているのですが、

# Sub Trades In Order #
sub trade_order {
&get_file; &list_in;
foreach (0 .. $#lstlines) {
($id,$nm,$ps,$jb,$ig,$sp,$bp,$bn,$ak,$dd,$hp,$xp,$ab,$db,
$av,$wn,$lz,$dt,$mn,$bg,$others) = split(/<>/,$lstlines[$_]);
splititem('i');
foreach (0 .. $#items) {
($item,$sts,$price) = split(/△/,$items[$_]);
if ($sts =~ /Td/) {
push (@odrlines,"$item<>$sts<>$id<>$nm");
}
}
}
@odrlines = sort(@odrlines);
&header;
if ($sts =~ /C0/) {$cde = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde = "<font color=blown>地</font>";}
if ($sts =~ /C4/) {$cde = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde = "<font color=gray>聖</font>";}
if ($sts =~ /C6/) {$cde = "<font color=purple>魔</font>";}
if ($sts =~ /C7/) {$cde = "<font color=black>虚</font>";}
$idd = int(substr($sts,6,2));
print qq|<table align=center border=0 bgcolor=$tblbdc cellspacing=1 cellpadding=$tblcpd>\n|;
print qq|<tr><td colspan=7 bgcolor=$tblbdc align=center><b><font color=$scdclr>トレード情報</font></b></td></tr>\n|;
print qq|<tr bgcolor=$nmclr><td>トレード希望カード</td><td>攻撃値</td><td>属性</td><td>ID</td><td>提供者</td></tr>\n|;
foreach (0 .. $#odrlines) {
($item,$break,$sts,$iimg,$id,$nm) = split(/<>/,$odrlines[$_]);
print qq|<tr bgcolor=$ltclr><td>$item</td><td><b>$idd</b></td><td><b>$cde</b></td><td>$id</td><td>$nm</td></tr>\n|;
}
print qq|</table>\n|;
}

これだと「ID」「プレイヤー名」が空欄になってしまって…
他のリストと見比べたものの、原因が分からず…
どこが悪いのか診て頂けると助かります(涙)



そしカード画像のご指導もありがとうございます!

自分の中で、まず、どうしたいのかを考えてみたのですが、

現状「カードをコレクションする」から「コレクションを見る」ことができるようにしてあるので、
そのコレクションカードリストから、
カードごとの画像を見れるようにしたいなと…!

140×180サイズのカードごとのサムネイル画像を並べて、クリックすると280×360くらいのサイズが見れるようにできたら最高だなと…!

しかし、そんな妄想だけで、どうすればいいのか全く思い浮かんでいないのが現状です…

もしよければ、お知恵を貸して頂けたら嬉しいです…!
コメントを書く(引用) | スレッド一覧


1845● Re[3]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/13 18:45
たびたび申し訳ないです!
動作確認のテストをいろいろしていたところ、
カードトレードを他のプレイヤーと行おうとすると、
お互いのカードを選択しているにも関わらず
「自分のカードが選択されていません」と出てしまい…

# Sub CardTrade Before #
sub catd_before {
    @rcdlines = &get_user("$Fm{'id'}");
    @prclines = &get_partner("$Fm{'pd'}");
    &splititem('iI');
    if ($bg !~ /Td/) { push (@msg,'手持ちのトレードできるカードがありません'); return }
    if ($pbg !~ /Td/){ push (@msg,'相手にトレードできるカードがありません'); return }
    $fg='TRB'; &userout;
    push (@msg,"$pnmとトレードするカードにチェックを入れ$def_okボタンを押してください");
    &form('start'); print qq|<tr><td colspan=2>|;
    print qq|$nm<br>|;
        foreach (0 .. $#items) {
        ($item,$sts,$price) = split(/△/,$items[$_]);
            if ($sts =~ /Td/) {
            $number = $_;
            print qq|<input type=radio name=M value=$number>\n|;
            print qq|$item \n|;
                    }
                    }
    print qq|<hr>$pnm<br>|;
    foreach (0 .. $#pitems) {
    ($item,$sts,$price) = split(/△/,$pitems[$_]);
        if ($sts =~ /Td/) {
        $number = $_;
        print qq|<input type=radio name=Y value=$number>\n|;
        print qq|$item \n|;
                }
                }
    &OKbuttoninform('on','catd_after');
    print qq|</td></tr>|; &form('end');
        }

# Sub CardTrade After #
sub catd_after {
    if (!$Fm{'tm'}) { push (@msg,'自分のカードが選択されていません'); return }
    if (!$Fm{'ty'}) { push (@msg,'相手のカードが選択されていません'); return }
    @rcdlines = &get_user("$Fm{'id'}");
    return if $fg ne 'TRB';
    @prclines = &get_partner("$Fm{'pd'}");
    &splititem('iI');
    ($item,$sts,$price) = split(/△/,$items[$Fm{'M'}]);
    ($pitem,$psts,$pprice) = split(/△/,$pitems[$Fm{'Y'}]);
    $sts =~ s/Td//g; $psts =~ s/Td//g;
    splice(@items,$Fm{'M'},1,"$pitem△$psts");
    splice(@pitems,$Fm{'Y'},1,"$item△$sts");
    push (@msg,"「$item」と$pnmの「$pitem」を交換しました");
    $woeds .= "[$id]$nmの「$item」と「$pitem」を交換しました。";
    &joinitem('iI');
    $fg = ''; &userout; &add_record($words);
        }

この辺が原因だとは思うのですが、どこに原因があるのか分からず…悩みに悩んでいる途中ではあるのですが、moonさんのお知恵をお借りできたら幸いです…
コメントを書く(引用) | スレッド一覧


1846● Re[4]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/13 20:28
> これだと「ID」「プレイヤー名」が空欄になってしまって…
> 他のリストと見比べたものの、原因が分からず…
> どこが悪いのか診て頂けると助かります(涙)

> push (@odrlines,"$item<>$sts<>$id<>$nm");
> ($item,$break,$sts,$iimg,$id,$nm) = split(/<>/,$odrlines[$_]);

この2つの中で扱っているデータの中身の対応が取れていない($breakと$iimgが余計)のが原因だと思います。

> 現状「カードをコレクションする」から「コレクションを見る」ことができるようにしてあるので、
> そのコレクションカードリストから、
> カードごとの画像を見れるようにしたいなと…!
>
> 140×180サイズのカードごとのサムネイル画像を並べて、クリックすると280×360くらいのサイズが見れるようにできたら最高だなと…!

カード名(アイテム名)は固定だと思いますので以下のようにハッシュで画像名を保持しておいて利用すれば良いのではないかと思います。
# 定義
%card_name_hash = (
    'カード名1' => '画像名1',
    'カード名2' => '画像名2',
    ...
    'カード名n' => '画像名n',
);
# 利用
my $image_path = exists($card_name_hash{$item}) ? $card_name_hash{$item} : 'unknown'; # $itemはカード名、未定義の場合は'unknown'
$image_path = './image/' . $image_path . '_' . $etc . '.png'; # ディレクトリ、拡張子、その他の情報(解像度を区別するため等)を付加
# 最終的に'./image/example_thumb.png'のようなパスになる

> カードトレードを他のプレイヤーと行おうとすると、
> お互いのカードを選択しているにも関わらず
> 「自分のカードが選択されていません」と出てしまい…

> if (!$Fm{'tm'}) { push (@msg,'自分のカードが選択されていません'); return }
> if (!$Fm{'ty'}) { push (@msg,'相手のカードが選択されていません'); return }

渡されてくる名前は'M'と'Y'なのでここを修正する必要があります。

あと、今回の件とは関係ありませんが、入力値チェックが行われていないので通常のアイテムとも交換できてしまいます。
「$sts =~ s/Td//g;」の上付近に以下を追加してみてください。
if(index($sts, 'Td') == -1){push(@msg, '自分の交換できないカードが選択されました。'); return;}
if(index($psts, 'Td') == -1){push(@msg, '相手の交換できないカードが選択されました。'); return;}
コメントを書く(引用) | スレッド一覧


1847● Re[5]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/14 09:22
おはようございます!
カードのトレードリストは無事に名前とIDが表示されるようになりました!ありがとうございます!


カードの画像表示についてもご教授ありがとうございます!

とりあえずコレクション画面に画像を表示させるところから始めようと思い、下記のようにしてみたのですが

# Sub Collection #
sub collection {
@rcdlines = &get_user("$Fm{'id'}");
@collines = &get_coll("$Fm{'id'}");
&header;
&splititem('F');

foreach $items (@fitems) {
($item,$sts) = split(/△/,$items);
$at = int(substr($sts,7,1));
$co = int(substr($sts,0,4));
$el = int(substr($sts,8,2));
if ($Fm{'sort'} eq 'N') { push(@Alines,"$item△$item△$sts") }
if ($Fm{'sort'} eq 'L') { push(@Alines,"$break△$item△$sts") }
if ($Fm{'sort'} eq 'A') { push(@Alines,"$at△$item△$sts") }
if ($Fm{'sort'} eq 'E') { push(@Alines,"$el△$item△$sts") }
if ($Fm{'sort'} eq 'S') { push(@Alines,"$se△$item△$sts") }
if ($Fm{'sort'} eq 'C') { push(@Alines,"$co△$item△$sts") }
}
@Alines = sort(@Alines);

foreach $items (@Alines) {
($dammy,$item,$sts) = split(/△/,$items);
push(@Blines,"$item△$sts");
}
@fitems = @Blines;

print qq|<center>$nmのコレクション<br>\n|;

print qq|<hr><TABLE border="0" cellpadding="0" cellspacing="0"><TBODY><TR><TD><IMG src="img/(1).jpg" width="59" height="135" border="0"></TD><TD><IMG src="img/(2).jpg" width="379" height="135" border="0"></TD><TD><IMG src="img/(3).jpg" width="62" height="135" border="0"></TD></TR><TR><TD><IMG src="img/(4).jpg" width="59" height="306" border="0"></TD><TD bgcolor="#000000" valign="top" width="379">|;
print qq|<table>|;
print qq|<tr><td><b>▼カード名</b></td><td><b>▼攻撃力</b></td><td><b>▼属性</b></td></tr>\n|;
foreach $items (@fitems) {
($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,7,1));
$pc = int(substr($sts,0,4));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>地</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>聖</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=purple>魔</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=black>虚</font>";}

#カード画像表示
# 定義
$card_name_hash = (
'魔女・ヴィクトリア' => '0000',
'カード名2' => '画像名2',
'カード名n' => '画像名n',
);
#カード画像表示

#カード画像表示
# 利用
my $image_path = exists($card_name_hash{$item}) ? $card_name_hash{$item} : 'unknown';
$image_path = 'img/' . $image_path . '_' . $etc . '.jpg';
#カード画像表示

print qq|<tr><td><img src="$card_name_hash"><b>$item</b></td><td>$idd</td><td>$cde1</td></tr> \n|;
}
print qq|</table>|;
print qq|<hr>|;
print qq|全<b>$fco</b>種</TD><TD><IMG src="img/(5).jpg" width="62" height="306" border="0"></TD></TR><TR><TD><IMG src="img/(6).jpg" width="59" height="59" border="0"></TD><TD><IMG src="img/(7).jpg" width="379" height="59" border="0"></TD><TD><IMG src="img/(8).jpg" width="62" height="59" border="0"></TD></TR></TBODY></TABLE></center>|;
}

上手くいかず…
WEB上のソースを見ると、

<b>▼カード名</b></td><td><b>▼攻撃力</b></td><td><b>▼属性</b></td></tr>
<tr><td><img src="画像名n"><b></b></td><td>0</td><td></td></tr>
<tr><td><img src="画像名n"><b>魔女・ヴィクトリア</b></td><td>3</td><td><font color=yellow>雷</font></td></tr>

こんな感じになっています…

そして画像表示とは別件なのですが、コレクションファイルを生成した時に何故か「0」の値が1行目にできてしまう原因も分かっておらず…
画像を表示させることを考えると、これも修正できれば…と思いつつ下記の部分に問題を見つけることもできず;

# Sub Make File #
sub make_file {
@rcdlines = &get_user("$Fm{'id'}");
$line = join('<>',$id,'',"$maxcard","\n");
$sp .= 'Ca';
$mn -= $cost;
&writedat("$cardir$id\.cgi",$line);
chmod(0666,"$cardir$id\.cgi");
push (@msg,"カードファイルを作成しました。");
&userout;
}

ただ今回moonさんにご指摘いただいた
余計なフラグの$break、$iimg…
これがSub Up AfterとSub Collectionにも記載があったので、これを削除すれば治るのかな…?と思いつつ、関係ない気もしてまだ検証まではしていない感じです;(とりあえず画像表示を何とかしたい…!)

# Sub Up After #
sub up_after {
@rcdlines = &get_user("$Fm{'id'}");
return if $fg ne 'UPB';
@carlines = &get_card("$Fm{'id'}");
&splititem('iC');
foreach (0 .. $#items) {
($item,$sts,$price) = split(/△/,$items[$_]);
$upbag = 1;
if ($Fm{"$_"}) {
if ($csp > 0) {
push (@msg,"$itemを入れました");
$space++;
$csp--;
push (@citems,"$item△$sts△$break△$iimg");
$upbag = 0;
} else { push (@msg,"ファイルがいっぱいです") }
}
if ($upbag) { push(@newitems,$items[$_]); }
}
@items = @newitems; &joinitem('iC');
$fg = ''; &userout; &cardout;
}


カードトレードの件もご指導ありがとうございます!

> 渡されてくる名前は'M'と'Y'なのでここを修正する必要があります。
> あと、今回の件とは関係ありませんが、入力値チェックが行われていないので通常のアイテムとも交換できてしまいます。

危ない…全く気づきませんでした;
ありがとうございます!

早速、下記のように修正してみたのですが

# Sub CardTrade After #
sub catd_after {
    if (!$Fm{'M'}) { push (@msg,'自分のカードが選択されていません'); return }#tm⇒M修正
    if (!$Fm{'Y'}) { push (@msg,'相手のカードが選択されていません'); return }#ty⇒Y修正
    @rcdlines = &get_user("$Fm{'id'}");
    return if $fg ne 'TRB';
    @prclines = &get_partner("$Fm{'pd'}");
    &splititem('iI');
    ($item,$sts,$price) = split(/△/,$items[$Fm{'M'}]);
    ($pitem,$psts,$pprice) = split(/△/,$pitems[$Fm{'Y'}]);
#入力値チェック追加
if(index($sts, 'Td') == -1){push(@msg, '自分の交換できないカードが選択されました。'); return;}
if(index($psts, 'Td') == -1){push(@msg, '相手の交換できないカードが選択されました。'); return;}
#入力値チェック追加
    $sts =~ s/Td//g; $psts =~ s/Td//g;
    splice(@items,$Fm{'M'},1,"$pitem△$psts");
    splice(@pitems,$Fm{'Y'},1,"$item△$sts");
    push (@msg,"「$item」と$pnmの「$pitem」を交換しました");
    $woeds .= "[$id]$nmの「$item」と「$pitem」を交換しました。";
    &joinitem('iI');
    $fg = ''; &userout; &add_record($words);
        }

動作確認をしたところ、今度は
「相手のカードが選択されていません」
と出てトレードできない状態に…涙

お知恵をお借りできたら幸いです…!
コメントを書く(引用) | スレッド一覧


1848● Re[6]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/14 12:22
今更ですが、いのそうさんが公開されていた改造方法についての話題だったのですね。


> <b>▼カード名</b></td><td><b>▼攻撃力</b></td><td><b>▼属性</b></td></tr>
> <tr><td><img src="画像名n"><b></b></td><td>0</td><td></td></tr>
> <tr><td><img src="画像名n"><b>魔女・ヴィクトリア</b></td><td>3</td><td><font color=yellow>雷</font></td></tr>
>
> こんな感じになっています…

> print qq|<tr><td><img src="$card_name_hash"><b>$item</b></td><td>$idd</td><td>$cde1</td></tr> \n|;
画像のパスは$image_pathです。
また、$etcは適切な値で定義するか、使用しないのでしたら$image_pathの作成時に使わなくても構いません。

先頭行が空なのはデータ的に余計なものが存在するか、先頭に余計なデータが含まれるようにsplitされているか、だと思います。

> そして画像表示とは別件なのですが、コレクションファイルを生成した時に何故か「0」の値が1行目にできてしまう原因も分かっておらず…

sub make_fileはカードファイルを貰った際の処理なので関係はないと思います。
ファイルを貰うと以下のようなデータになります。
  0000<><>20
  ※ 0000はID、次の空文字列は所持カード、最後の20は空きの数、最後に改行
以下を確認してみてください。
・sub get_cardで正常に読み込まれているか?
・sub cardoutで正常に保存できているか?
・これ以外のサブルーチンでカードファイルを誤って保存していないか?
・何をした後におかしなデータになるか?

> 余計なフラグの$break、$iimg…
> これがSub Up AfterとSub Collectionにも記載があったので、これを削除すれば治るのかな…?と思いつつ、関係ない気もしてまだ検証まではしていない感じです;(とりあえず画像表示を何とかしたい…!)

いのそうさんが公開されていたsos2の名残なのだろうと思います。($breakはわかりませんが、$iimgはアイコン用画像ファイルのパスのようです。)

> 動作確認をしたところ、今度は
> 「相手のカードが選択されていません」
> と出てトレードできない状態に…涙

渡されてくる値が0からなので、自分か相手の先頭のものが選択されるとチェックに引っかかるのだと思います。
以下のように変更してみてください。
  if ($Fm{'M'} eq '') { push (@msg,'自分のカードが選択されていません'); return }#tm⇒M修正
  if ($Fm{'Y'} eq '') { push (@msg,'相手のカードが選択されていません'); return }#ty⇒Y修正
コメントを書く(引用) | スレッド一覧


1849● Re[7]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/15 09:52
おはようございます!
カードトレードの方は上手く動くようになりました!
ありがとうございます!

> 今更ですが、いのそうさんが公開されていた改造方法についての話題だったのですね。

はい!懐かしいなぁなんて思いながらも、頭を悩ませております…

> 画像のパスは$image_pathです。
> また、$etcは適切な値で定義するか、使用しないのでしたら$image_pathの作成時に使わなくても構いません。

なるほど!早速以下のようにしてみたのですが
---------------------
print qq|<tr><td><b>▼カード名</b></td><td><b>▼攻撃力</b></td><td><b>▼属性</b></td></tr>\n|;
foreach $items (@fitems) {
($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,7,1));
$pc = int(substr($sts,0,4));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>土</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>天</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=#8C008C>冥</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=powderblue>空</font>";}

#カード画像表示
# 利用
my $image_path = exists($card_name_hash{$item}) ? $card_name_hash{$item}:'2011-12-23_1-246.gif';
# $itemはカード名、未定義の場合は'2011-12-23_1-246.gif'
$image_path = 'img/' . $image_path . '';
# ディレクトリ、拡張子、その他の情報(解像度を区別するため等)を付加
# 最終的に'./image/example_thumb.png'のようなパスになる
#カード画像表示

#カード画像表示
# 定義
$card_name_hash = (
'C1カード' => 'test.jpg',
'C2カード' => 'test2.jpg',
'C3カード' => 'test3.jpg',
);
#カード画像表示

print qq|<tr><td><img src="$image_path"><b>$item</b></td><td>$idd</td><td>$cde1</td></tr> \n|;
}
---------------------
カード名が一致していても全てが未定義状態になってしまい…

「カード画像表示」の定義部分は別の場所に移した方が良いでしょうか?
可能であれば、カード画像表示の定義部分は(カード数が増えたことを想定して)別ファイルから読み込むような形をとりたいなとも考えているのですが、難しいでしょうか…?


> 先頭行が空なのはデータ的に余計なものが存在するか、先頭に余計なデータが含まれるようにsplitされているか、だと思います。
> 以下を確認してみてください。
> ・sub get_cardで正常に読み込まれているか?
> ・sub cardoutで正常に保存できているか?
> ・これ以外のサブルーチンでカードファイルを誤って保存していないか?
> ・何をした後におかしなデータになるか?

自分なりに条件を変えて確認してみたのですが、コレクションファイルを作成した時は問題なく、カードを1枚でもいれると0行ができ…
ただ現在は何故か入れたカードの最下部に0行が並ぶように;
0行の場所が変わったのは下記のように変更したせいかも;
---------------------
foreach $items (@fitems) {
($item,$sts) = split(/△/,$items);
$at = int(substr($sts,7,1));
$co = int(substr($sts,0,4));
$el = int(substr($sts,8,2));
if ($Fm{'sort'} eq 'N') { push(@Alines,"$item△$item△$sts") }
#if ($Fm{'sort'} eq 'N') { push(@Alines,"$item△$sts") }
#if ($Fm{'sort'} eq 'L') { push(@Alines,"$break△$item△$sts") }
if ($Fm{'sort'} eq 'L') { push(@Alines,"$item△$sts") }
if ($Fm{'sort'} eq 'A') { push(@Alines,"$at△$item△$sts") }
if ($Fm{'sort'} eq 'E') { push(@Alines,"$el△$item△$sts") }
if ($Fm{'sort'} eq 'S') { push(@Alines,"$se△$item△$sts") }
#if ($Fm{'sort'} eq 'S') { push(@Alines,"$item△$sts") }
if ($Fm{'sort'} eq 'C') { push(@Alines,"$co△$item△$sts") }
}
---------------------
コレクションカードデータの中身は、
---------------------
0004<>,C2カード△10000264C2,C0カード△00300264C0,C1カード△01000264C1,C3カード△00300264C3,C4カード△00300264C4,C5カード△00300264C5,C6カード△00300264C6,C7カード△00300264C7<>8<>
---------------------
こんな感じになっていました。
「,C2カード」が変な気がしたのですが、,がついている理由が分からず…

sub get_cardとsub cardoutは現状こんな感じです。
---------------------
# Sub Get Card #
sub get_card {
return if $getcardflag;
if ( $sp =~ /Ca/ ) {
open(IN,"$cardir$_[0]\.cgi") || &error("ID $_[0]は存在しません");
@_ = <IN>;
close(IN);
if (!@_) { &error("ID $_[0] 読みこみエラー") }
($cid,$cbg,$csp) = split(/<>/,$_[0]);
shift(@_);
$getcardflag = 1;
return @_;
}
}

# Sub Card Out #
sub cardout {
$carline = join('<>',$cid,$cbg,$csp,"\n");
unshift (@carlines,$carline);
&writedat("$cardir$id\.cgi",@carlines);
}
---------------------

いろいろ見てはみたものの、どこが良くない動きをしているのか現状わからず…お知恵をお借りできたら幸いです…!
コメントを書く(引用) | スレッド一覧


1850● Re[8]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/15 11:19
> # 利用
> # 定義
> カード名が一致していても全てが未定義状態になってしまい…

「# 定義」と「# 利用」の順番が逆になってしまっています。
あと、card_name_hashの定義はハッシュなので「$」ではなく「%」です。

> 「カード画像表示」の定義部分は別の場所に移した方が良いでしょうか?
> 可能であれば、カード画像表示の定義部分は(カード数が増えたことを想定して)別ファイルから読み込むような形をとりたいなとも考えているのですが、難しいでしょうか…?

以下のような別ファイルを作成してrequireで呼び出せば良いです。
なお、返信されたコードに少し修正を加えてあります。

#### ここから ####
my $image_dir = 'img/'; # 画像ディレクトリ
my %card_name_hash = (
'C1カード' => 'test.jpg',
'C2カード' => 'test2.jpg',
'C3カード' => 'test3.jpg',
); # カード名と画像ファイルパスのハッシュ

# 画像のパスを取得する
# 【引数】
# name: カード名
# 【戻り値】
# カード名に対応する画像のパス
sub get_card_image_path{
  my $name = shift;

  my $image_file = exists($card_name_hash{$name}) ? $card_name_hash{$name}:'2011-12-23_1-246.gif';
  # $nameはカード名、未定義の場合は'2011-12-23_1-246.gif'
  return $image_dir . $image_file;
}

1;
#### ここまで ####

利用は以下のようにします。
  require './ディレクトリ/ファイル名'; # ループ中で毎回requireするのは無駄なので場所はforeach以前が良い
  print qq|<tr><td><img src="|, &get_card_image_path($item), qq|"><b>$item</b></td><td>$idd</td><td>$cde1</td></tr> \n|;

> > 先頭行が空なのはデータ的に余計なものが存在するか、先頭に余計なデータが含まれるようにsplitされているか、だと思います。
> > 以下を確認してみてください。
> > ・sub get_cardで正常に読み込まれているか?
> > ・sub cardoutで正常に保存できているか?
> > ・これ以外のサブルーチンでカードファイルを誤って保存していないか?
> > ・何をした後におかしなデータになるか?

すみません、上記のget_card、cardoutと「0000<><>20」に関しては勘違いしておりましてカードファイルだった場合でした。
コレクションなのでsub get_coll、sub fileout、あとsub file_in_afterが関連個所です。

> 自分なりに条件を変えて確認してみたのですが、コレクションファイルを作成した時は問題なく、カードを1枚でもいれると0行ができ…
> ただ現在は何故か入れたカードの最下部に0行が並ぶように;
> 0行の場所が変わったのは下記のように変更したせいかも;
...
> コレクションカードデータの中身は、
> ---------------------
> 0004<>,C2カード△10000264C2,C0カード△00300264C0,C1カード△01000264C1,C3カード△00300264C3,C4カード△00300264C4,C5カード△00300264C5,C6カード△00300264C6,C7カード△00300264C7<>8<>
> ---------------------
> こんな感じになっていました。
> 「,C2カード」が変な気がしたのですが、,がついている理由が分からず…

sub file_in_afterで「&joinitem('iF');」が行われていないか、sub joinitemが変更されていない場合にこのようになりそうですので、これらを確認してみてください。
コメントを書く(引用) | スレッド一覧


1851● Re[9]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/15 19:58
ご教授ありがとうございます!
つ、ついにカードごとの画像を出せるようになりました!!!
本当にありがとうございます!!!
理想のカードコレクション画面が出せるように調整していきたいと思います!


そして、0行の件につきまして…

> sub file_in_afterで「&joinitem('iF');」が行われていないか、sub joinitemが変更されていない場合にこのようになりそうですので、これらを確認してみてください。

ご指摘通り、# Sub File In After #に、&joinitem('iF');がありました!

無ければ良いのかな?と思い

# Sub File In After #
sub file_in_after{
@rcdlines = &get_user("$Fm{'id'}");
return if $fg ne 'FIBB';
@collines = &get_coll("$Fm{'id'}");
&splititem('iF');
foreach (0 .. $#items) {
($item,$sts) = split(/△/,$items[$_]);
$filebag = 1;
if ($Fm{"$_"}) {
my $tmpflg=0; ##
foreach $tmp (@fitems) {
($tmpitem,$tmpsts) = split(/△/,$tmp);
if ($tmpitem eq $item) {$tmpflg=1;}
}
if (!$tmpflg) {
$fco++;
push (@fitems,"$item△$sts");
push (@msg,"$itemをファイルに入れました。");
$fbg .= ",$item△$sts"; #(4/8)修正
$filebag = 0;
} else { push (@msg,"既に「$item」はファイル内に存在します。") }
}
if ($filebag) { push(@newitems,$items[$_]); }
}
@items = @newitems; #&joinitem('iF');
$fg = ''; &userout; &fileout;
}

としてみたのですが、0行は生成されてしまうままで…
別の表記にした方が良いのでしょうか?


また、これとは別件なのですが…

現状だとカードデュエルがプレイヤーと行えないので、
これをデッキを持っているプレイヤーが相手でもデュエルできるようにしたいなと思い始めました。

理想は、プレイヤーと接触した際に、相手とデュエルできるようにしたいとは思いつつ…
ただデュエルできる場所が隔離された場所で実行されてるので、デュエルする相手をデッキを持っているプレイヤーからプルダウンで選ぶか、NPCにするかを選択できるようにしたほうが良いのかな…とも思いつつ…

現状のデュエルバトルシステムがduel.pl内にある下記の部分に相当しているのですが

# バトルシステム #
sub battle_duel {
    $reid = $Fm{'id'};
    &read_dc;
@cardlines = &get_card("$Fm{'id'}");
&splitcard('c');
&mcard_dat;
        $catm = $cat1+$cat2+$cat3;
$battle_mn = $catm * 5;
if ($mn < $battle_mn) { &duel_error("お金が足りません。");}
$mn = $mn - $battle_mn;
    &write_dc;
    open(IN,"$pcard_d");
    @PCARDD = <IN>;
    close(IN);
    $eld = @PCARDD;
    srand;
    $rnd = int(rand($eld));
    ($dekkinm,$wn_point,$pcd1,$pcd2,$pcd3) = split(/<>/,$PCARDD[$rnd]);
    &splitcard('C');
    &pcard_dat;
        $pcatm = $pcat1+$pcat2+$pcat3;
    $pcom_nm = "なっしんぐ";$com_nm = "なっしんぐ";
    &go_combo;
    &go_combop;
&header;
&table_top;
&msg;
#先鋒戦#
$zokusei1 = 0;
$pzokusei1 = 0;
if (($cds1 =~ /C0/) && ($pcds1 =~ /C1/)) { $pzokusei1 = "1"; } #自分火<相手水
if (($cds1 =~ /C1/) && ($pcds1 =~ /C0/)) { $zokusei1 = "1"; } #相手火<自分水
if (($cds1 =~ /C1/) && ($pcds1 =~ /C2/)) { $pzokusei1 = "1"; } #自分水<相手雷
if (($cds1 =~ /C2/) && ($pcds1 =~ /C1/)) { $zokusei1 = "1"; } #相手水<自分雷
if (($cds1 =~ /C2/) && ($pcds1 =~ /C3/)) { $pzokusei1 = "1"; } #自分雷<相手土
if (($cds1 =~ /C3/) && ($pcds1 =~ /C2/)) { $zokusei1 = "1"; } #相手雷<自分土
if (($cds1 =~ /C3/) && ($pcds1 =~ /C4/)) { $pzokusei1 = "1"; } #自分土<相手風
if (($cds1 =~ /C4/) && ($pcds1 =~ /C3/)) { $zokusei1 = "1"; } #相手土<自分風
if (($cds1 =~ /C4/) && ($pcds1 =~ /C0/)) { $pzokusei1 = "1"; } #自分風<相手火
if (($cds1 =~ /C0/) && ($pcds1 =~ /C4/)) { $zokusei1 = "1"; } #相手風<自分火
if ($cds1 =~ /C5/) { $zokusei1 = "1"; } #自分天
if ($pcds1 =~ /C5/) { $pzokusei1 = "1"; } #相手天
if ($cds1 =~ /C6/) { $zokusei1 = "2"; } #自分冥
if ($pcds1 =~ /C6/) { $pzokusei1 = "2"; } #相手冥
    $bat1 = $cat1 + $zokusei1 + $combo1 - $pcombo1;
    $pbat1 = $pcat1 + $pzokusei1 + $pcombop1 - $combop1;
        if ($bat1 > $pbat1) { $bwin1 = "1"; $pbwin1 = "0"; $result1 = "<font color=blue>$cdn1の勝利!!"; }
        elsif ($bat1 < $pbat1) { $bwin1 = "0"; $pbwin1 = "1"; $result1 = "<font color=red>$pcdn1の勝利!!"; }
        else { $bwin1 = "0"; $pbwin1 = "0"; $result1 = "<font color=gray>引き分け</font>"; }
#中堅戦#
$zokusei2 = 0;
$pzokusei2 = 0;
if (($cds2 =~ /C0/) && ($pcds2 =~ /C1/)) { $pzokusei2 = "1"; } #自分火<相手水
if (($cds2 =~ /C1/) && ($pcds2 =~ /C0/)) { $zokusei2 = "1"; } #相手火<自分水
if (($cds2 =~ /C1/) && ($pcds2 =~ /C2/)) { $pzokusei2 = "1"; } #自分水<相手雷
if (($cds2 =~ /C2/) && ($pcds2 =~ /C1/)) { $zokusei2 = "1"; } #相手水<自分雷
if (($cds2 =~ /C2/) && ($pcds2 =~ /C3/)) { $pzokusei2 = "1"; } #自分雷<相手土
if (($cds2 =~ /C3/) && ($pcds2 =~ /C2/)) { $zokusei2 = "1"; } #相手雷<自分土
if (($cds2 =~ /C3/) && ($pcds2 =~ /C4/)) { $pzokusei2 = "1"; } #自分土<相手風
if (($cds2 =~ /C4/) && ($pcds2 =~ /C3/)) { $zokusei2 = "1"; } #相手土<自分風
if (($cds2 =~ /C4/) && ($pcds2 =~ /C0/)) { $pzokusei2 = "1"; } #自分風<相手火
if (($cds2 =~ /C0/) && ($pcds2 =~ /C4/)) { $zokusei2 = "1"; } #相手風<自分火
if ($cds2 =~ /C5/) { $zokusei2 = "1"; } #自分天
if ($pcds2 =~ /C5/) { $pzokusei2 = "1"; } #相手天
if ($cds2 =~ /C6/) { $zokusei2 = "2"; } #自分冥
if ($pcds2 =~ /C6/) { $pzokusei2 = "2"; } #相手冥
    $bat2 = $cat2 + $zokusei2 + $combo2 - $pcombo2;
    $pbat2 = $pcat2 + $pzokusei2 + $pcombop2 - $combop2;
        if ($bat2 > $pbat2) { $bwin2 = "1"; $pbwin2 = "0"; $result2 = "<font color=blue>$cdn2の勝利!!"; }
        elsif ($bat2 < $pbat2) { $bwin2 = "0"; $pbwin2 = "1"; $result2 = "<font color=red>$pcdn2の勝利!!"; }
        else { $bwin2 = "0"; $pbwin2 = "0"; $result2 = "<font color=gray>引き分け</font>"; }
#大将戦#
$zokusei3 = 0;
$pzokusei3 = 0;
if (($cds3 =~ /C0/) && ($pcds3 =~ /C1/)) { $pzokusei3 = "1"; } #自分火<相手水
if (($cds3 =~ /C1/) && ($pcds3 =~ /C0/)) { $zokusei3 = "1"; } #相手火<自分水
if (($cds3 =~ /C1/) && ($pcds3 =~ /C2/)) { $pzokusei3 = "1"; } #自分水<相手雷
if (($cds3 =~ /C2/) && ($pcds3 =~ /C1/)) { $zokusei3 = "1"; } #相手水<自分雷
if (($cds3 =~ /C2/) && ($pcds3 =~ /C3/)) { $pzokusei3 = "1"; } #自分雷<相手土
if (($cds3 =~ /C3/) && ($pcds3 =~ /C2/)) { $zokusei3 = "1"; } #相手雷<自分土
if (($cds3 =~ /C3/) && ($pcds3 =~ /C4/)) { $pzokusei3 = "1"; } #自分土<相手風
if (($cds3 =~ /C4/) && ($pcds3 =~ /C3/)) { $zokusei3 = "1"; } #相手土<自分風
if (($cds3 =~ /C4/) && ($pcds3 =~ /C0/)) { $pzokusei3 = "1"; } #自分風<相手火
if (($cds3 =~ /C0/) && ($pcds3 =~ /C4/)) { $zokusei3 = "1"; } #相手風<自分火
if ($cds3 =~ /C5/) { $zokusei3 = "1"; } #自分天
if ($pcds3 =~ /C5/) { $pzokusei3 = "1"; } #相手天
if ($cds3 =~ /C6/) { $zokusei3 = "2"; } #自分冥
if ($pcds3 =~ /C6/) { $pzokusei3 = "2"; } #相手冥
    $bat3 = $cat3 + $zokusei3 + $combo3 - $pcombo3;
    $pbat3 = $pcat3 + $pzokusei3 + $pcombop3 - $combop3;
        if ($bat3 > $pbat3) { $bwin3 = "1"; $pbwin3 = "0"; $result3 = "<font color=blue>$cdn3の勝利!!</font>"; }
        elsif ($bat3 < $pbat3) { $bwin3 = "0"; $pbwin3 = "1"; $result3 = "<font color=red>$pcdn3の勝利!!</font>"; }
        else { $bwin3 = "0"; $pbwin3 = "0"; $result3 = "<font color=gray>引き分け</font>"; }
#戦闘結果#
$bwin_l = $bwin1 + $bwin2 + $bwin3;
$pbwin_l = $pbwin1 + $pbwin2 + $pbwin3;
    if ($bwin_l > $pbwin_l) {$cdwn = $cdwn + 1;$cdpoint = $cdpoint + $wn_point;
    $result_l = "<font color=Yellow>おめでとうございます。$nmさんの勝利です!<br>勝利ボーナスとして、デュエルポイントを<b>$wn_point</b>を得た。</font>";
    }
    elsif ($bwin_l < $pbwin_l) {$cdlz = $cdlz + 1;
    $result_l = "<font color=red>残念でした。$nmさんの敗北です。</font></font>";
    }
    else {
    $result_l = "<font color=gray>残念でした。引き分けです。</font>";
    }
$line = join('<>',$cdid,$cdpoint,$cdwn,$cdlz,$cd1,$cd2,$cd3,"\n");
&writedat("$carddir$id\.dat",$line);
print <<"_EOF_";
<tr><td>
<center>
<img src=img/card_b.jpg><br>
<br>
<table width=80% border="1" bordercolor="#0000FF">
<tr bgcolor="#000066"><td align=center><font color="#F4F4F4">デュエルアリーナ</font></td></tr>
<tr><td> デュエルの相手は自動的に決まります。デッキによっては相性の良い悪いがあると思いますが、いかに効率よく勝てるかという事を研究するのも大事ですね。攻撃力も重要ですが、カードの配置、コンボの組立等見直すところはたくさんありますよ。攻撃力が全然なくてもコンボで生きてくるカードもあります。<br> 例え勝てなくても相手のデッキを見て得ることもあるでしょう。どんどん挑戦しましょう!</td></tr>
</table><br>
<table width=80% border="1" bordercolor="#9ACD32">
<tr bgcolor="#556B2F"><td colspan=4 align=center><font color="#F4F4F4">+$nmのデッキ+<br>(合計値:$catm/$cdall_max|勝:$cdwn/負:$cdlz)</font></td></tr>
<tr bgcolor="#6B8E23"><td width=15% align=center>順番</td><td width=55% align=center>カード名</td><td width=15% align=center>攻撃</td><td width=15% align=center>属性</td></tr>
<tr><td align=center>先鋒</td><td>$cdn1</td><td align=center>$cat1</td><td align=center>$cde1</td></tr>
<tr><td align=center>中堅</td><td>$cdn2</td><td align=center>$cat2</td><td align=center>$cde2</td></tr>
<tr><td align=center>大将</td><td>$cdn3</td><td align=center>$cat3</td><td align=center>$cde3</td></tr>
</table><br>
<table width=80% border="1" bordercolor="darkred">
<tr bgcolor="Maroon"><td colspan=4 align=center><font color="#F4F4F4">+対戦相手:$dekkinm+<br>(合計値:$pcatm/$cdall_max)</font></td></tr>
<tr bgcolor="brown"><td width=15% align=center>順番</td><td width=55% align=center>カード名</td><td width=15% align=center>攻撃</td><td width=15% align=center>属性</td></tr>
<tr><td align=center>先鋒</td><td>$pcdn1</td><td align=center>$pcat1</td><td align=center>$pcde1</td></tr>
<tr><td align=center>中堅</td><td>$pcdn2</td><td align=center>$pcat2</td><td align=center>$pcde2</td></tr>
<tr><td align=center>大将</td><td>$pcdn3</td><td align=center>$pcat3</td><td align=center>$pcde3</td></tr>
</table><br>
<table width=80% border="1" bordercolor="#0000FF">
<tr><td width=25% bgcolor=#000066 align=center><font color="#F4F4F4">所持金</font></td><td width=25% align=center>$mn</td><td width=25% bgcolor=#000066 align=center><font color="#F4F4F4">ポイント</font></td><td width=25% align=center>$cdpoint</td></tr>
</table>
<br>
<table width=85%><tr><td>
<tr bgcolor="#000066"><td colspan=3 align=center><font color="#F4F4F4"><b>特別処理</b></font></td></tr>
<tr><td align=center><font color=#808080>
<b><$nm側の特別効果></b><br>必殺コンボ『<b>$com_nm</b>』!<br>$com_mes<br><b><$dekkinm側の特別効果></b><br>必殺コンボ『<b>$pcom_nm</b>』!<br>$pcom_mes
</font></td></tr></table><br>
<table width=85%>
<tr bgcolor="#000066"><td colspan=3 align=center><font color="#F4F4F4"><b>先鋒戦</b></font></td></tr>
<tr><td width=25% align=center><font color=blue>$cdn1<br>$cde1<br>$bat1</font></td><td width=50%>
<font color=blue>
「基本攻撃力:<b>$cat1</b>」+「属性効果:<b>$zokusei1</b>」<br>+「自特殊効果:<b>$combo1</b>」−「敵特殊効果:<b>$pcombo1</b>」<br>=「合計攻撃力:<b>$bat1</b>」</font><br>
<font color=red>
「基本攻撃力:<b>$pcat1</b>」+「属性効果:<b>$pzokusei1</b>」<br>+「自特殊効果:<b>$pcombop1</b>」−「敵特殊効果:<b>$combop1</b>」<br>=「合計攻撃力:<b>$pbat1</b>」</font><br><center><b>$result1</b></center>
</td><td width=25% align=center><font color=red>$pcdn1<br>$pcde1<br>$pbat1</font></td></tr></table>
<table width=85%>
<tr bgcolor="#000066"><td colspan=3 align=center><font color="#F4F4F4"><b>中堅戦</b></font></td></tr>
<tr><td width=25% align=center><font color=blue>$cdn2<br>$cde2<br>$bat2</font></td><td width=50%>
<font color=blue>
「基本攻撃力:<b>$cat2</b>」+「属性効果:<b>$zokusei2</b>」<br>+「自特殊効果:<b>$combo2</b>」−「敵特殊効果:<b>$pcombo2</b>」<br>=「合計攻撃力:<b>$bat2</b>」</font><br>
<font color=red>
「基本攻撃力:<b>$pcat2</b>」+「属性効果:<b>$pzokusei2</b>」<br>+「自特殊効果:<b>$pcombop2</b>」−「敵特殊効果:<b>$combop2</b>」<br>=「合計攻撃力:<b>$pbat2</b>」</font><br><center><b>$result2</b></center>
</td><td width=25% align=center><font color=red>$pcdn2<br>$pcde2<br>$pbat2</font></td></tr></table>
<table width=85%>
<tr bgcolor="#000066"><td colspan=3 align=center><font color="#F4F4F4"><b>大将戦</b></font></td></tr>
<tr><td width=25% align=center><font color=blue>$cdn3<br>$cde3<br>$bat3</font></td><td width=50%>
<font color=blue>
「基本攻撃力:<b>$cat3</b>」+「属性効果:<b>$zokusei3</b>」<br>+「自特殊効果:<b>$combo3</b>」−「敵特殊効果:<b>$pcombo3</b>」<br>=「合計攻撃力:<b>$bat3</b>」</font><br>
<font color=red>
「基本攻撃力:<b>$pcat3</b>」+「属性効果:<b>$pzokusei3</b>」<br>+「自特殊効果:<b>$pcombop3</b>」−「敵特殊効果:<b>$combop3</b>」<br>=「合計攻撃力:<b>$pbat3</b>」</font><br><center><b>$result3</b></center>
</td><td width=25% align=center><font color=red>$pcdn3<br>$pcde3<br>$pbat3</font></td></tr></table>
<table width=85%>
<tr bgcolor="darkorange"><td colspan=3 align=center><font color="#000000"><b>総合結果報告</b></font></td></tr>
<tr><td align=center><font color=#808080>$result_l<br><br>デュエル代 <b>$battle_mn</b> KIRAを支払った。</font><br><br>

<form method="POST" action="sos2.cgi">
<input type="hidden" name="mode" value="duel">
<input type="hidden" name="name" value="$nm">
<input type="hidden" name="id" value="$id">
<input type="hidden" name="pass" value="$ps">
<input type="submit" class="buttonY" value=" 戻る ">
</form>

</td></tr></table>
</center>

<table width=100%><tr><td align=right><small>『Duel of Sphere $cd_ver』 By <a href="http://www.bellcity.ne.jp/~yamato/" target="_blank">Sphere(大和)</a></small></td></tr></table>
</td></tr>
_EOF_

&table_bottom;

}

プレイヤー同士のデュエルをとなると、上記バトルシステムの、プレイヤーverが必要になるのかな…?と思いつつ…

どうしたものかと…
お知恵を借りれたら幸いです…!
コメントを書く(引用) | スレッド一覧


1852● Re[10]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/15 22:19
> そして、0行の件につきまして…
>
> > sub file_in_afterで「&joinitem('iF');」が行われていないか、sub joinitemが変更されていない場合にこのようになりそうですので、これらを確認してみてください。
>
> ご指摘通り、# Sub File In After #に、&joinitem('iF');がありました!
>
> 無ければ良いのかな?と思い

いえ、先に書いたようにjoinitemが行われていないとその症状になるので、あるのが正しいです。
まず、データの先頭にある「,」を削除してから動作させ、症状がでた場合はsub joinitemの中身を確認してみてください。

> また、これとは別件なのですが…
>
> 現状だとカードデュエルがプレイヤーと行えないので、
> これをデッキを持っているプレイヤーが相手でもデュエルできるようにしたいなと思い始めました。
>
> 理想は、プレイヤーと接触した際に、相手とデュエルできるようにしたいとは思いつつ…
> ただデュエルできる場所が隔離された場所で実行されてるので、デュエルする相手をデッキを持っているプレイヤーからプルダウンで選ぶか、NPCにするかを選択できるようにしたほうが良いのかな…とも思いつつ…

リストから選ぶ方式は表示時に毎回各ファイル(もしくはそのファイルがあるディレクトリ)を読まなければいけないのでお勧めはしません。
まあ、利便性はあると思いますのでメリット・デメリットを考慮して仕様はお好きなように。

> プレイヤー同士のデュエルをとなると、上記バトルシステムの、プレイヤーverが必要になるのかな…?と思いつつ…
>
> どうしたものかと…

sub battle_duelで行っている処理のプレイヤーバージョンが必要なのは当然ですが、それを実現するにあたってはコピーして修正するよりは引数で区別して処理を振り分けるようにしたほうがシンプルだと思います。
以下のような流れで作っていくのが良いです。
1. デュエルを開始する流れの仕様を決める。
2. 1.の流れ(ダミーで良いのでデュエルのサブルーチンが正常に呼び出されるまでの処理)を実装する。
3. 実際のデュエル処理を実装する。(随時動作させてみて、意図しない動作の場合はデバッグ用メッセージを仕込むなどして原因を特定して修正する。)
コメントを書く(引用) | スレッド一覧


1853● Re[11]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/16 16:08
0行の件について、ご指導ありがとうございます!

",$item△$sts";を"$item△$sts,";に変更したところ、0行が生成されなくなりました!
他に弊害が出ないか心配ではあるのですが、これで様子をみてみようと思います…!

プレイヤー同士のデュエルについてもご指導ありがとうございます!もう少しちゃんと考えて試してみたいと思います…!

いつもお知恵を貸して頂き、ありがとうございます!
また一人ではどうにもならなくなった時に相談させて頂けたら幸いです!
コメントを書く(引用) | スレッド一覧


1855● Re[12]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/16 21:42
> 0行の件について、ご指導ありがとうございます!
>
> ",$item△$sts";を"$item△$sts,";に変更したところ、0行が生成されなくなりました!

これは「(4/8)修正」とのコメントがあるところでしょうか?
先に書いたのはそうではなくて、ファイルに保存されたデータ自体を意図していたのですが…。
その処理自体が不要と思われますので、もしそこの修正で変化があったのだとしたらsub joinitemの変更が行われていない可能性が高くなります。
コメントを書く(引用) | スレッド一覧


1857● Re[13]:カードトレードと、カード画像の実装を目指して…[ YOUME ] 2015 08/16 21:49
> これは「(4/8)修正」とのコメントがあるところでしょうか?

はい、そうです…!
ここではなかったのですね…汗

> その処理自体が不要と思われますので、もしそこの修正で変化があったのだとしたらsub joinitemの変更が行われていない可能性が高くなります。

現状のsos2.cgi内にあるsub joinitemの状態は下記のような感じで…

# Sub Join Item #
sub joinitem {
@items = sort(@items) if $_[0] =~ /i/ && $def_so;
    $bg = join(',',@items) if $_[0] =~ /i/;
@pitems = sort(@pitems) if $_[0] =~ /I/ && $def_so;
    $pbg = join(',',@pitems) if $_[0] =~ /I/;
#カードファイル
@citems = sort(@citems) if $_[0] =~ /C/ && $def_so; # カード
$cbg = join(',',@citems) if $_[0] =~ /C/; # カード
}
#カードファイル
#コレクションファイル
@fitems = sort(@fitems) if $_[0] =~ /F/ && $def_so; # コレクション
$fbg = join(',',@fitems) if $_[0] =~ /F/; # コレクション
#コレクションファイル

ここに問題がある感じでしょうか?
理解が上手くできず申し訳ないです…
コメントを書く(引用) | スレッド一覧


1859● Re[14]:カードトレードと、カード画像の実装を目指して…[ moon ] 2015 08/16 22:00
> #カードファイル
> #コレクションファイル
> @fitems = sort(@fitems) if $_[0] =~ /F/ && $def_so; # コレクション
> $fbg = join(',',@fitems) if $_[0] =~ /F/; # コレクション
> #コレクションファイル
>
> ここに問題がある感じでしょうか?

上記がsub joinitemのブロック外にあるのでjoinitemを実行しても処理されないようです。
コメントを書く(引用) | スレッド一覧

CGIROOM