#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秒)