#!/usr/local/bin/perl package armorculc; require 5.8.0; use strict; use utf8; my $version = 'Ver.0.01 / 2010.7.8'; ### このソースコードは改変・転載自由です ### &initialize(); sub initialize { &viewSource() if ($ENV{QUERY_STRING} eq 'sourcecode'); #クエリを得る my $store = sub { my $query = {}; my @pairs = split(/[&;]/, $ENV{QUERY_STRING}); foreach (@pairs) { my($k, $v) = split(/=/); $query->{$k} = $v; } return $query; }; my $query = $store->(); my $currentArmor = $query->{current}; my $currentMana = $query->{mana}; my $aimArmor = $query->{aim}; my $chara = $query->{chara} eq 'fleyja' ? 'fleyja' : 'fley'; #エラーチェック if ($chara eq 'fley') { &error('フレイの現在のアーマーは300~200280の数字で頼む') if ($currentArmor && ($currentArmor !~ /^\d+$/ || $currentArmor < 300 || $currentArmor > 200280)); &error('フレイのアーマーは20単位で頼む') if ($currentArmor && $currentArmor %20 != 0); &error('フレイの目標アーマーは320~200300の数字で頼む') if ($aimArmor && ($aimArmor !~ /^\d+$/ || $aimArmor < 320 || $aimArmor > 200300)); &error('フレイの目標アーマーは20単位で頼む') if ($aimArmor && $aimArmor %20 != 0); } else { &error('フレイヤの現在のアーマーは250~100240の数字で頼む') if ($currentArmor && ($currentArmor !~ /^\d+$/ || $currentArmor < 250 || $currentArmor > 100240)); &error('フレイヤのアーマーは10単位で頼む') if ($currentArmor && $currentArmor %10 != 0); &error('フレイヤの目標アーマーは260~1002450の数字で頼む') if ($aimArmor && ($aimArmor !~ /^\d+$/ || $aimArmor < 260 || $aimArmor > 100250)); &error('フレイヤの目標アーマーは10単位で頼む') if ($aimArmor && $aimArmor %10 != 0); } &error('使用マナ数は50~19808900の数字で頼む') if ($currentMana && ($currentMana !~ /^\d+$/ || $currentMana < 50 || $currentMana > 19808900)); my $fley_checked = ' checked="checked"' if ($chara eq 'fley'); my $fleyja_checked = ' checked="checked"' if ($chara eq 'fleyja'); my $mana2armor = &mana2armor($currentArmor, $currentMana, $chara) if ($currentMana); my $armor2mana = &armor2mana($currentArmor, $aimArmor, $chara) if ($aimArmor); # binmode(STDOUT, ':utf8'); print <<"heredocument"; Content-Type: text/html; charset=UTF-8 斬撃のREGINLEIV アーマー計算機

絶望のアーマー計算機

$version

トップページに戻る

目標のアーマーまで上げるにはマナがいくら必要か計算して、途方もない数に絶望するための計算機です。
または、手持ちのマナを全部つぎこんでもたったこれだけしか上がらないと絶望するための計算機です。

数字を半角で入れてね。

基本情報

現在のアーマー :

計算対象のキャラ :

目標アーマーまでマナがいくら必要か計算する

目標アーマー :

$armor2mana
マナをいくら使うとアーマーがいくつ上がるか計算する

使用マナ数 :

$mana2armor


heredocument # # 早見表テーブル # foreach my $fortify (0 .. 195) { my $mana = $fortify *10 +50; #強化するのに必要なマナ数 $mana = 2000 if ($mana > 2000); #マナの上限は2000 $fortify++; #強化したのでインクリメント my $fley = $fortify *20 +300; #強化後のアーマー値を算出 my $fleyja = $fortify *10 +250; my $class = ' class="hilight"' unless ($fortify %10); #10行ごとにハイライト print qq(\n); } # print <<"heredocument";
早見表
強化回数必要マナフレイフレイヤ
0初期値300250
$fortify$mana$fley$fleyja

以降、必要マナ数は2000で固定され、フレイは20、フレイヤは10ずつ上昇する。
最大値は1万回の強化でフレイ200300、フレイヤ100250となる。
1万回の強化に必要なマナ数は19808900。


ソースコード

heredocument # exit 0; #($currentArmor /2 +100) -250 +40 : #フレイ…半分にして100足すとフレイヤと同数値になる #$currentArmor -250 +40; #フレイヤ…250引いて40足すとそのアーマーにする必要マナが出る } # マナをいくら使うとどこまで上がるか計算する # sub mana2armor { my ($currentArmor, $currentMana, $chara) = @_; return qq(

現在のアーマーが未記入

) unless ($currentArmor); #現在の強化回数を算出 my $currentFortify = $chara eq 'fley' ? $currentArmor == 300 ? 0 : ($currentArmor -300) /20: $currentArmor == 250 ? 0 : ($currentArmor -250) /10; #マナがなくなるまで強化していく my $fortify = 0; my $restMana = $currentMana; #残りマナ while ($restMana > 0) { my $useMana = ($currentFortify + $fortify) *10 +50; #強化に必要なマナ数 $useMana = 2000 if ($useMana > 2000); last if ($restMana < $useMana); #マナが足りなくなったら脱出 last if ($currentFortify + $fortify >= 10000); #1万回強化したら脱出 $restMana -= $useMana; $fortify++; } #1回も強化できなかった unless ($fortify) { my $nextMana = $currentFortify *10 +50; $nextMana = 2000 if ($nextMana > 2000); return qq(

マナが足りません。強化するには${nextMana}以上のマナが必要です。

); } #強化回数をアーマー上昇値に変換する my $fortifyArmor = $chara eq 'fley' ? $fortify *20 + $currentArmor: $fortify *10 + $currentArmor; my $charaName = $chara eq 'fley' ? 'フレイ' : 'フレイヤ'; my $useMana = $currentMana - $restMana; return qq(

${currentMana}のマナで${charaName}のアーマーを${currentArmor}から${fortifyArmor}へ強化できます。
\n\t\t強化回数は${fortify}回です。
\n\t\t使用マナは${useMana}、余りは${restMana}です。

); } # 目標アーマーまでマナがいくら必要か計算する # sub armor2mana { my ($currentArmor, $aimArmor, $chara) = @_; return qq(

現在のアーマーが未記入

) unless ($currentArmor); return qq(

目標アーマーは現在のアーマーより上の数字で頼む

) if ($currentArmor >= $aimArmor); #現在の強化回数を算出 my $currentFortify = $chara eq 'fley' ? $currentArmor == 300 ? 0 : ($currentArmor -300) /20: $currentArmor == 250 ? 0 : ($currentArmor -250) /10; #目標値の強化回数を算出 my $aimFortify = $chara eq 'fley' ? ($aimArmor -300) /20: ($aimArmor -250) /10; my $fortify = $aimFortify - $currentFortify -1; #必要な強化回数 my $manaSum = 0; #必要な合計マナ数 foreach my $n (0 .. $fortify) { my $mana = ($currentFortify + $n) *10 +50; $mana = 2000 if ($mana > 2000); $manaSum += $mana; } my $charaName = $chara eq 'fley' ? 'フレイ' : 'フレイヤ'; my $fortifyNum = $fortify +1; return qq(

${charaName}のアーマーを${currentArmor}から${aimArmor}へ強化するには${manaSum}のマナが必要です。
\n\t\t強化回数は${fortifyNum}回です。

); } sub viewSource { print "Content-Type: text/plain; charset=UTF-8\n\n"; open(my $READ, '<', $ENV{SCRIPT_FILENAME}); print <$READ>; close($READ); exit 0; } sub error { binmode(STDOUT, ':utf8'); print "Content-Type: text/html; charset=UTF-8\n\n"; print qq(

@_

\n); print qq(

戻る

\n); exit 0; }