トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Σのsos3_routine.pl

#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("<span class=up>$set::lab{$T}が<span class=alert>$V</span>上昇</span>");
   }
   else {
       $V = abs($V);
       &M("<span class=down>$set::lab{$T}が<span class=alert>$V</span>減少</span>");
   }
   &M("<img src=$set::mim_dir/redcross.gif> <span class=sick>$Z</span>") if $Z;

}

# Sub Item Image #
sub item_image {
my $V = shift;

   return "<img src=$set::iim_dir/$V->{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 ? '' : "<br>\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/<br>$//; 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秒)
お名前: コメント: