#!/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
$version
目標のアーマーまで上げるにはマナがいくら必要か計算して、途方もない数に絶望するための計算機です。
または、手持ちのマナを全部つぎこんでもたったこれだけしか上がらないと絶望するための計算機です。
強化回数 | 必要マナ | フレイ | フレイヤ |
---|---|---|---|
0 | 初期値 | 300 | 250 |
$fortify | $mana | $fley | $fleyja |
以降、必要マナ数は2000で固定され、フレイは20、フレイヤは10ずつ上昇する。
最大値は1万回の強化でフレイ200300、フレイヤ100250となる。
1万回の強化に必要なマナ数は19808900。
現在のアーマーが未記入
) 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}です。
現在のアーマーが未記入
) 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}回です。
@_
\n); print qq(\n); exit 0; }