#MASTER BARで質問しているΣのルーチン。NPCと遭遇することができずエラーに(泣 # Sub Change Condition # sub change_condition { my $S = shift; my $T = shift; # da,ij,cd my $V = shift; # 状態略字 my $F = shift; # true -> 追加, false -> 削除 if ($F) { if ($T eq 'cd') { $S->{Cd}{$V} = $set::cnd{$V}[1] if $V; } else { $S->{$T} = $V; } } else { if ($T eq 'cd') { undef $S->{Cd}{$V} if $V; } elsif ($T eq 'ij') { undef $S->{ij}; } else { $S->{da} = 'Av'; $S->{Da} = $set::cnd{$S->{da}}[1]; $S->{lf} = 1; &reload_gage('lf','V'); } } return if $S->{id} ne $F{id}; &condition_initial($S,$T,1); } # Sub Condition_initial # sub condition_initial { my $S = shift; my $T = shift; # da,ij,cd my $F = shift; # true -> reload my (@L,$K,$V); if ($T eq 'da') { $S->{Da}{in} = $set::cnd{$S->{da}}[0]; $V = $set::cnd{$S->{da}}[1]; } elsif ($T eq 'ij') { $V = $S->{Ij}{in} = $set::cnd{$S->{ij}}[0]; undef $S->{ij} if !$V; } else { delete $S->{Cd}{in}; while (($K,$V) = each %{$S->{Cd}}) { push(@L,$set::cnd{$K}[0]) if $V; } @L = sort @L; $V = $S->{Cd}{in} = join('・',@L); undef $S->{cd} if !$V; } return if !$F; &reload_data($T,$V); } # Sub Get Equipment # sub get_equipment { my $S = shift; my $E = shift; my @L; @L = split(/\//,$S->{$E}); $E = ucfirst $E; $S->{$E}{nm} = $L[0]; # Name $S->{$E}{cl} = $L[1]; # Class map { $S->{$E}{ql}{$_} = 1 } split(/,/,$L[2]); # Quality $S->{$E}{ef} = $L[3]; # Effect $S->{$E}{db} = $L[4]; # Durability $S->{$E}{im} = $L[5]; # Image $S->{$E}{gd} = $L[6]; # Grade $S->{$E}{pl} = $L[7]; # Plus $S->{$E}{cr} = $L[8]; # Creator $S->{$E}{Im} = &item_image($S->{$E}); # Image with Tag } # Sub Change Status # sub change_status { my $S = shift; my $T = shift; # ステータス略字 my $V = shift; # 増減させる値 my $F = shift; # true -> メッセージを表示する my $X = shift; # Max値が他にある場合 my ($Y,$Z); $V += 1 if $T eq 'vt' && $S->{Cd}{En} && $V < 0; $S->{$T} += $V; $Y = $T eq 'hl' ? 'Mn': $T eq 'ap' ? 'Dt': $T eq 'hy' ? 'En': ''; if ($S->{$T} <= 0) { $S->{$T} = 0; if ($Y && !$S->{Cd}{$Y}) { &change_condition($S,'cd',$Y,1); $Z = "$set::cnd{$Y}[1]になりました。"; } } elsif ($S->{"M$T"} && $S->{$T} >= $S->{"M$T"} && !$X) { $S->{$T} = $S->{"M$T"}; if ($Y && $S->{Cd}{$Y}) { &change_condition($S,'cd',$Y); $Z = "$set::cnd{$Y}[1]が治りました。"; } } elsif ($X && $S->{$T} > $X) { $S->{$T} = $X; } return if !$F; if ($V > 0) { &M("$set::lab{$T}が$V上昇"); } else { $V = abs($V); &M("$set::lab{$T}が$V減少"); } &M(" $Z") if $Z; } # Sub Item Image # sub item_image { my $V = shift; return "{im}> " if $V->{im}; } # Sub Sort Item # sub sort_item { my $S = shift; require "$set::dat_dir/sort.cgi"; @{$S->{Bg}} = sort { $SO{$a->{cl}} <=> $SO{$b->{cl}} || $a->{id} cmp $b->{id} || $b->{qn} <=> $a->{qn} } @{$S->{Bg}}; } # Sub Roll Dice # sub roll_dice { my $dice = shift; my $plus; my $roll; my $V; # srand(time|$$) if !$diceflag; return $' if $dice =~ s/^S//; ($dice,$plus) = split(/\+/,$dice); ($roll,$dice) = split(/D/,$dice); if (!$dice) { $dice = $roll; $roll = 1; } if ($dice < 2) { return 1 } while ($roll--) { $V += int(rand($dice)) + 1; } $V += $plus; $V = 1 if $V < 1; # $diceflag = 1; return $V; } # Sub M # sub M { my $M = shift; my $break = shift; # value = 1; $break = $break == 1 ? '' : "
\n"; push(@{$I->{M}},"$M$break"); return 1; } # Sub Select Acquisition # sub select_acquisition { my $D = shift; my $i = 1; my (@L,$V); while ($D->{"i$i"}) { push(@L,$D->{"i$i"}); $i++; } $V = &roll_dice($#L + 1) - 1; return $L[$V]; } # Sub Get Item # sub get_item { my $S = shift; my $T = shift; my ($V,$i,$j,@L,@K); $V = $T == 2 ? $S->{op} : $S->{Bg}; @L = map { chomp $_; [split(/<>/)] } @$V; $V = \@set::idt; foreach $i (0 .. $#L) { foreach $j (0 .. $#$V) { $K[$i]{$V->[$j]} = $L[$i][$j]; } map { $K[$i]{Ql}{$_} = 1 } split(/,/,$K[$i]{ql}); } $S->{Bs} = @K if $T == 0; $S->{Bk} = @K if $T == 3; $S->{Bg} = [@K]; } # Sub Set Item # sub set_item { } # Sub Reload Data # sub reload_data { } # Sub Reload Gage # sub reload_gage { } # Sub SOS2 to SOS3 # sub SOS2toSOS3 { my $V = shift || ''; my $S; my $T; my ($i,$MG); my ($Si,$item,$sts,$price,$ipc,$iak,$idd); # 魔法選択 # if (${$V.'sp'} =~ /Mg/) { require "$set::dat_dir/magic.cgi"; for (1 .. $set::ffx) { $i = int(rand ${$V.'ak'}+${$V.'ab'}); $i = $#MG if $i > $#MG; push(@{$MG}, $i); } } $S->{id} = ${$V.'id'}; # ID Identification $S->{nm} = ${$V.'nm'}; # 名前 Name $S->{ps} = ${$V.'ps'}; # パスワード Password $S->{ip} = ${$V.'ht'}; # IP Host IP $S->{im} = ${$V.'ig'}; # イメージ Image $S->{sx} = ${$V.'sx'} || 0; # 性別 Sex $S->{kg} = 'ven'; # 所属国 Kingdom $S->{pl} = 'qui'; # 現在場所 Place $S->{jb} = ${$V.'jb'}; # 職業 Job $S->{sk} = join(',',split(/(?=[A-Z])/,${$V.'sp'})); # スキル Skill $S->{lv} = ${$V.'lv'} || 1; # レベル Level $S->{ex} = ${$V.'ex'}; # 経験値 Experience $S->{gl} = ${$V.'mn'}; # 所持金 Gold $S->{lf} = join('/',${$V.'hp'},${$V.'xp'}); # 生命値(LIF) Life $S->{tc} = ${$V.'dd'}; # 技能(TEC) Technique $S->{st} = ${$V.'ak'}; # 腕力(STR) Strength $S->{dx} = ${$V.'dd'}; # 敏捷/器用さ(DEX) Dexterity $S->{in} = ${$V.'ak'}; # 知性(INT) Intelligence $S->{cn} = ${$V.'dd'}; # 体力(CON) Constitusion $S->{vt} = join('/',${$V.'hp'},${$V.'xp'}); # 気力(VIT) Vitality $S->{hl} = join('/',${$V.'hp'},${$V.'xp'}); # 健康(HEA) Health $S->{ap} = join('/',${$V.'hp'},${$V.'xp'}); # 外見/清潔(APP) Appearance $S->{hy} = join('/',${$V.'hp'},${$V.'xp'}); # 幸福(HAP) Happiness $S->{da} = ${$V.'av'} eq 'dead' ? 'Dd' : ${$V.'av'} eq 'stone' ? 'St' : 'Av'; # 生死 Dead or Alive $S->{ij} = ''; # 怪我 Injury $S->{cd} = ${$V.'av'} eq 'poison' ? 'Ps' : ''; # 状態 Condition $S->{wn} = ${$V.'wn'}; # 勝利数 Win $S->{ls} = ${$V.'lz'}; # 敗北数 Lose $S->{dr} = ${$V.'dr'}; # ドロー数 Draw $S->{kl} = ${$V.'kl'}; # 殺害数 Kill $S->{dt} = ${$V.'dt'}; # 死亡数 Death $S->{rt} = 1500; # 戦闘レート Rate $S->{rw} = ${$V.'rw'}; # 報奨金 Reward $S->{sc} = 1; # スタンス Stance $S->{bg} = ${$V.'xi'}; # 所持(上限) Bag $S->{bs} = ${$V.'bs'}; # 荷物スロット Bag Slot $S->{gu} = ''; # ギルド Guild $S->{fr} = ''; # 友達 Friends $S->{en} = ${$V.'lf'}; # 対戦相手 Enemy $S->{mg} = join(',',@{$MG}); # 魔法 Magic $S->{bt} = 0; # 登録日 Birth $S->{su} = ''; # 状態異常 Status Unusual $S->{tl} = 0; # タイムリミット Time Limit $S->{dd} = 0; # 死亡日 Death Date $S->{li} = !$fg || $fg =~ /B/ ? 'in' : 'out'; # 接続状態 Login $S->{w1} = ${$V.'cm'}; # 自己紹介(簡) Words 1 $S->{ob} = ${$V.'is'}; # オーブ Orb $S->{vx} = ${$V.'xi'}; # 販売上限 Vendor Max $S->{fc} = '#000000'; # 文字色 Font Color $S->{mb} = time + 10; # 手紙の確認時間 Mail Box $S->{px} = join('/',0,${$V.'xi'}); # ペット(上限) Pet Max $S->{co} = ''; # 共にするペット Companion $S->{pc} = ${$V.'xi'}; # パック技能 Packing Skill $S->{lb} = 0; # LevelUpボーナス Level Up Bonus $S->{bk} = ${$V.'xi'}; # 銀行の最大保管数 Bank $S->{ab} = ''; # 乗船 Aboard $S->{vp} = 1; # 対戦受付フラグ Versus Player $S->{dg} = ''; # ダンジョンデータ Dungeon Data map { $S->{Cd}{$_} = $set::cnd{$_}[1] } split(/,/,$S->{cd}); $S->{Da} = $set::cnd{$S->{da}}[1]; $S->{Ij} = $set::cnd{$S->{ij}}[1]; map { $S->{Sk}{$_} = 1 } split(/,/,$S->{sk}); foreach (@set::sdt,@set::gva) { ($S->{$_},$S->{"M$_"}) = split(/\//,$S->{$_},2); } $T = \@set::idt; for (split(/,/,${$V.'bg'})) { ($item,$sts,$price) = split(/△/); $ipc = int(substr($sts,0,4)); $iak = int(substr($sts,2,2)); $idd = int(substr($sts,4,2)); $sts = substr($sts,8); $Si->{nm} = $item; $Si->{ql} = join(',',split(/(?=[A-Z])/,$sts)); $Si->{im} = '_pal.gif'; $Si->{qn} = 1; $Si->{bp} = $ipc; $Si->{gd} = $sts =~ /Li/ ? 2 : 0; $Si->{ef} = "lf=$iak,hl=$idd"; $Si->{db} = $ipc; $Si->{wt} = $ipc; $Si->{cp} = "st=$iak,tc=$idd"; $Si->{eq} = $sts =~ /Qw/ ? 'rh' : $sts =~ /Qs/ ? 'lh' : $sts =~ /Qa/ ? 'bd' : $sts =~ /Qt/ ? 'nk' : ''; $Si->{pl} = $sts =~ /Li/ ? 2 : 0; $Si->{sp} = $price; $S->{$Si->{eq}} = "$Si->{nm}/$Si->{cl}/$Si->{ql}/$Si->{ef}/$Si->{db}/$Si->{im}/$Si->{gd}/$Si->{pl}/$Si->{cr}" if $Si->{eq}; push(@{$S->{Bg}},join('<>',@{$Si}{@set::idt},"\n")); } if (${$V.'bn'}) { $item = ${$V.'bn'}; ($iak) = ${$V.'bp'} =~ /(\d+)/; ($sts) = ${$V.'bp'} =~ /^([A-Za-z]+)/; $Si->{nm} = $item; $Si->{ql} = join(',',split(/(?=[A-Z])/,$sts)); $Si->{im} = '_pal.gif'; $Si->{qn} = 1; $Si->{gd} = $sts =~ /Li/ ? 2 : 0; $Si->{ef} = "lf=$iak,hl=$idd"; $Si->{cp} = "st=$iak,tc=$idd"; $Si->{pl} = $sts =~ /Li/ ? 2 : 0; $Si->{sp} = $price; push(@{$S->{op}},join('<>',@{$Si}{@set::idt},"\n")); } return $S; } # Sub SOS3 to SOS2 # sub SOS3toSOS2 { my $S = shift; my $V = shift || ''; my @L; my ($Si,$new,$i,$Y,$Z,$item,$sts,$price,$ipc,$iak,$idd); ${$V.'lv'} = $S->{lv}; # レベル Level ${$V.'ex'} = $S->{ex}; # 経験値 Experience ${$V.'mn'} = $S->{gl}; # 所持金 Gold ${$V.'hp'} = $S->{lf}; # 生命値(LIF) Life ${$V.'xp'} = $S->{Mlf}; # 生命値(LIF) Life ${$V.'av'} = $S->{da} eq 'Dd' ? 'dead' : $S->{da} eq 'St' ? 'stone' : $S->{Cd}{Ps} ? 'poison' : 'alive'; # 生死 Dead or Alive ${$V.'wn'} = $S->{wn}; # 勝利数 Win ${$V.'lz'} = $S->{ls}; # 敗北数 Lose ${$V.'dr'} = $S->{dr}; # ドロー数 Draw ${$V.'kl'} = $S->{kl}; # 殺害数 Kill ${$V.'dt'} = $S->{dt}; # 死亡数 Death ${$V.'rw'} = $S->{rw}; # 報奨金 Reward for $Si (@{$S->{Bg}}) { for $i (split(/,/,$Si->{ef})) { ($Y,$Z) = split(/=/,$i); $iak = $Y eq 'lf' ? $Z : $Si->{ql} =~ /Rh/ ? $Y : 0; $idd = $Y eq 'hl' ? $Z : $Si->{ql} =~ /Lh|Bd/ ? $Y : 0; $iak =~ tr/a-zA-Z//d; $idd =~ tr/a-zA-Z//d; } $sts = $Si->{cl}; ($sts .= $Si->{ql}) =~ tr/,//d; $item = $Si->{nm}; $sts = sprintf("%04d%02d%02d%s",$Si->{bp},$iak,$idd,$sts); $price = $Si->{sp}; $new = "$item△$sts"; $new .= "$new△$price" if $price; push(@L,$new); } ${$V.'bg'} = join(',',@L); if (!$V) { for (@{$S->{M}}) { s/
$//; push(@msg,$_) } } } # Sub Break Item # sub break_item { $Bidice = int(rand($Bidice)); &splititem('i'); if (!$Bidice) { foreach (0 .. $#items) { ($item,$sts,$price) = split(/△/,$items[$_]); if ($sts =~ /Li/ && $Bldice) { next } if ($result == 1 && $sts =~ /Qw/ && $sts !~ /Ie/) { $breakitem = 1 } if ($result == -1 && $sts =~ /Qs/ && $sts !~ /Qw/ && $sts !~ /Ie/) { $breakitem = 1 } elsif ($result == -1 && $sts =~ /Qa/ && $sts !~ /Ie/) { $breakitem = 1 } if ($result == 0 && $sts =~ /Qt/ && $sts !~ /Ie/) { $breakitem = 1 } if ($breakitem) { $ab -= substr($sts,4,2); $db -= substr($sts,6,2); splice(@items,$_,1); &joinitem('i'); $sp =~ s/Qb//g if $sts =~ /Bw/; $sp =~ s/Qk//g if $sts =~ /Kt/; $sp =~ s/Qx//g if $sts =~ /Ax/; $sp =~ s/Qm//g if $sts =~ /Sw/; push (@msg,"$itemが壊れました"); last; } } } } 1; *おかしな箇所があったら指摘して下さい - Σ (2007年05月21日 10時28分35秒)