トップ 新規 一覧 Farm 検索 ヘルプ RSS ログイン

Σのsos3_routine.plの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
#MASTER BARで質問しているΣのルーチン。NPCと遭遇することができずエラーに(泣

# Sub Find Item #
sub find_item {
	if (!$post) { return }
	@rcdlines = &get_user("$Fm{'id'}");
	if ($av eq 'dead') { push (@msg,'死んでいます');return }
	if ($hp <= 1)	  { push (@msg,'ヒットポイントが足りません');return }
# Sub Change Condition #
sub change_condition {
my  $S = shift;
my  $T = shift; # da,ij,cd
my  $V = shift; # 状態略字
my  $F = shift; # true -> 追加, false -> 削除

	&splititem('i');
	if (@items >= $xi) { push (@msg,'これ以上は持てません');return }
    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');
        }
    }

	@itemlines = &opendat($itmdat);
	if (!@itemlines) { &error('アイテムデータ読みこみエラー') }
    return if $S->{id} ne $F{id};

	sleep(1); srand(time | $$);
	$poison = int(rand(100)) + 1;
	$stellatio = int(rand(100)) + 1;
	$rnd = int(rand(100)) + 1;
	
	# 探索の特殊能力
	if ($sp =~ /Ft/) { $rnd -= 2; $rnd = 1 if $rnd < 1 }
    &condition_initial($S,$T,1);
}

	foreach $item (@itemlines) {
		($inm,$idt,$idc) = split(/<>/,$item);
		if ($rnd <= $idc) { push(@founditems,$item) }
	}
# Sub Condition_initial #
sub condition_initial {
my  $S = shift;
my  $T = shift; # da,ij,cd
my  $F = shift; # true -> reload
my (@L,$K,$V);

	$rnd = int(rand(@founditems));
	($inm,$idt,$idc) = split(/<>/,$founditems[$rnd]);
	if (!$inm) { push (@msg,'何もみつかりませんでした');return }
	$hp--;
    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;
    }

	if ($poison <= $def_pd && $av eq 'poison') {
		$hp--; if ($hp < 1) { $hp = 1 }
		push (@msg,'毒によるダメージのため体力が1減りました');
	}
    return if !$F;

	if ($stellatio <= $def_zd) {
		if ($def_xs && length($is) > $def_xs - 1) { push (@msg,'ステラツィオを発見しましたが、所持オーバーの為捨てました');return }
		$itsrnd = int(rand(12));
		$is .= "$iti[$itsrnd]";
		push (@msg,"<img src=$imgdir$itsrnd$def_jg width=$st_wd height=$st_ht> $itn[$itsrnd]のステラツィオを発見しました");
		&userout; return;
	}
	&reload_data($T,$V);
}

#-ADD-
#-------- NPC出現 -------------------
	if ($idt =~ /Ng/ || $idt =~ /Ms/) {
		$ngid = substr($idt,0,4);
		$Fm{'pd'} = $nghead . $ngid;
		$runtf = substr($idt,4,2);
		$runtv = substr($idt,6,2);
		if ($sp =~ /Tf/) { $run = $runtf } else { $run = $runtv }
		$runrd = int(rand(100) + 1);
		if ($run >= $runrd ) {
#			if ($idt =~ /Ms/) {
# Sub Get Equipment #
sub get_equipment {
my  $S = shift;
my  $E = shift;
my  @L;

			if ($idt =~ /Ms/ && $idt =~ /M3/) {
				require "$set::lib_dir/fight.cgi";
				require "$set::lib_dir/sos3_routine.pl";
				require "$mondat";
    @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
}

				# &joinitem('i'); # 複数回探索を取り入れていて、&joinitemされていない場合はコメントを外す
				$I = &SOS2toSOS3; &get_item($I);
# 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);

				$U = {%{ $FI{$inm} }};
				unless (&fight_creature($set::ffx)) {
					&SOS3toSOS2($I);
					$result = -1; $breakitem = 0;
					&break_item;
					$bp = $bn = '';
					&userout; $getuserflag = 0; # 複数回探索を取り入れている場合は &splititem('i'); に変更する
					return;                     # 複数回探索を取り入れている場合は、last; に変更する。
				}
				if (&roll_dice(1000) > $U->{gi} + $S->{bonus}) {
					&SOS3toSOS2($I);
					$result = !$U->{lf} ? 1 : 0; $breakitem = 0;
					&break_item;
					$bp = $bn = '';
					&userout; $getuserflag = 0; # 複数回探索を取り入れている場合は &splititem('i'); に変更する
					return;                     # 複数回探索を取り入れている場合は、next; に変更する。
				}
				if (!$U->{lf}) {
					$Ii = &select_acquisition($U);
					push (@{$I->{Bg}},$Ii);
					&M("$Ii->{nm}を手に入れました");
				}
    $V += 1 if $T eq 'vt' && $S->{Cd}{En} && $V < 0;

				&SOS3toSOS2($I);
				$result = 1; $breakitem = 0;
				&break_item;
				$bp = $bn = '';
				&userout; $getuserflag = 0; # 複数回探索を取り入れている場合は &splititem('i'); に変更する
				return;                     # 複数回探索を取り入れている場合は、next; に変更する。
			}
			elsif ($idt =~ /Ms/) {
    $S->{$T} += $V;
    $Y = $T eq 'hl' ? 'Mn':
         $T eq 'ap' ? 'Dt':
         $T eq 'hy' ? 'En':
                        '';

				push (@msg,"何かが近づく気配に気付いたので、うまくやり過ごしました。");
				$exp += int(rand(5));	}
			else {
				push (@msg,"何物かが草陰から走り去って行きました。"); }
		} else {
			$find = 'find';
			&joinitem('i'); &userout;
			$getuserflag = 0;
			if ($idt =~ /Ms/) {
				push (@msg,"<HR>$inm が現れ、戦闘となりました。<HR>");
				&fight; }
			else {
				push (@msg,"<HR>$inm に出会いました。");
				$notfound = 0; }
			return; }                   # 複数回探索を取り入れている場合は、last; に変更する。
		return; }
#-END of ADD- SION0002v3.01-4-8/18	
	if ($idt !~ /Gl/) { push(@items,"$inm△$idt"); &joinitem('i') }
	else { $mn += substr($idt,0,4) }
	&userout;
    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;
    }

	if ($idt =~ /Li/) {
		foreach (0 .. $#itemlines) {
			($lnm,$ldt,$ldc) = split(/<>/,$itemlines[$_]);
			if ($inm eq $lnm) { splice (@itemlines,$_,1); last }
    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;
			}
		}
		&writedat($itmdat,@itemlines);
	}
	push (@msg,"$inmをみつけました");
}


1;


*おかしな箇所があったら指摘して下さい - Σ (2007年05月21日 10時28分35秒)