3.2 Rolling FoL SS HoTs

Holy Paladin changes in 3.2 seem pretty significant, I’m currently hoping the FoL/HoT mechanic works a little like ignite, where in effect you have n number of buffs up on the target, and WoW just consolidates them into one (As oppose to old ignite rolling, where each time the debuff was added, the damage was added to the previous debuff and the time reset, resulting in massive damage with lots of luck).

I’m 95% sure the FoL SS HoT won’t work like this, but I wanted to test how it would work at current gear levels.

- - - - - - - - - - -
0 5000 5000
0.5 0
1 417 417
1.5 5000 5000
2 417 417
2.5 417 417
3 417 5000 5417
3.5 417 417
4 417 417 833
4.5 417 5000 5417
5 417 417 833
5.5 417 417 833
6 417 417 5000 5833
6.5 417 417 833
7 417 417 417 1250
7.5 417 417 5000 5833
8 417 417 417 1250
8.5 417 417 417 1250
9 417 417 417 5000 6250
9.5 417 417 417 1250
10 417 417 417 417 1667
10.5 417 417 417 5000 6250
11 417 417 417 417 1667
11.5 417 417 417 417 1667
12 417 417 417 417 5000 6667
12.5 417 417 417 417 1667
13 417 417 417 417 1667
13.5 417 417 417 417 1667
14 417 417 417 417 1667
14.5 417 417 417 1250
15 417 417 417 417 1667
15.5 417 417 417 1250
16 417 417 417 1250
16.5 417 417 417 1250
17 417 417 417 1250
17.5 417 417 833
18 417 417 417 1250
18.5 417 417 833
19 417 417 833
19.5 417 417 833
20 417 417 833
20.5 417 417
21 417 417 833
21.5 417 417
22 417 417
22.5 417 417
23 417 417
23.5 0
24 417 417
90000

The above table is 12 seconds of FoL spam on a target with SS. It uses an average FoL heal amount of 5,000 every 1.5s (yes, yes). After 12 seconds, the HoT is full and provides 1,667 healing ever 0.5 seconds. Which is pretty absurd :)

Honestly I like our niche as tank healers, and I feel the changes in 3.2 will not do much for raid healing and with regen nerfs, our tank healing will suffer too, leaving us without a niche.

My preference would be to keep beacon as it is in 3.1 (for topping up OTs), take the regen nerfs and have a FoL (like above) that’s useful for Tank Healing. We still wont be able raid heal, but we’ll have a rotation, have to worry about mana, and we’ll keep our niche.

Edit GC has confirmed that it will not stack or roll in any way. At the moment it can also be overwritten too, so FoL spam = no HoT ticks.

Posted on

Vezax Holy Paladin Spec

After much more fun with General Vezax on 25 this week, I thought I would make a small note about the spec I swapped to for this fight.

The basic spec is 28/43/0 which gives up most of our normal healing tools (no shock, no beacon, no bonus crit from the Retribution tree, etc) for Touched by the Light.

With Touched by the Light, my FoL hits for 6000 and crits for 11,000, which drastically changes the way you can heal. Rather than having to stop casting expensive Holy Lights, you’re able to use FoL almost exclusively and it’s no big deal to over heal a bit.

Update (20090622)

Vezax has finally been killed (WoL). The FoL build does seem pretty good, mana was fine until towards the end, but I object to absorb guessing code not assigning any procs to me :-)

Posted on

I before E except after C…

I before E (yuccamuffin.com)

<?php

    $words = file('/usr/share/dict/words');
    $words = array_map('trim', $words);

    // Ignore words with any punctuation
    $words = array_filter($words, 'ctype_alpha');

    foreach($words as $word)
    {
        // ignore proper nouns (they start with an uppercase letter)
        if(ctype_upper($word[0]))
        {
            continue;
        }

        if(preg_match("#[^c]ei#", $word) === 1)
        {
            echo "$word\n";
        }
    }

?>
absenteeism
ageing
ageings
ageism
agreeing
albeit
anteing
apartheid
atheism
atheist
atheistic
atheists
aweigh
bantamweight
bantamweights
beige
being
beings
bingeing
birdieing
blueing
boogieing
caffeine
canoeist
canoeists
casein
clueing
codeine
counterfeit
counterfeited
counterfeiter
counterfeiters
counterfeiting
counterfeits
counterweight
counterweights
cueing
cuneiform
decaffeinate
decaffeinated
decaffeinates
decaffeinating
decreeing
deice
deiced
deicer
deicers
deices
deicing
deification
deified
deifies
deify
deifying
deign
deigned
deigning
deigns
deism
deities
deity
dieing
disagreeing
dyeing
edelweiss
emceeing
facsimileing
featherweight
featherweights
feign
feigned
feigning
feigns
feint
feinted
feinting
feints
feistier
feistiest
feisty
filigreeing
flambeing
fleeing
flyweight
flyweights
foreign
foreigner
foreigners
foreseeing
forfeit
forfeited
forfeiting
forfeits
forfeiture
freeing
freight
freighted
freighter
freighters
freighting
freights
fricasseeing
garnisheeing
geeing
geisha
geishas
gesundheit
glueing
gneiss
guaranteeing
heavyweight
heavyweights
heifer
heifers
height
heighten
heightened
heightening
heightens
heights
heinous
heinously
heinousness
heir
heiress
heiresses
heirloom
heirlooms
heirs
heist
heisted
heisting
heists
herein
heterogeneity
hieing
hoeing
homogeneity
horseshoeing
hundredweight
hundredweights
inveigh
inveighed
inveighing
inveighs
inveigle
inveigled
inveigles
inveigling
kaleidoscope
kaleidoscopes
kaleidoscopic
kneeing
lei
leis
leisure
leisurely
leitmotif
leitmotifs
lightweight
lightweights
middleweight
middleweights
monotheism
monotheist
monotheistic
monotheists
neigh
neighbor
neighbored
neighborhood
neighborhoods
neighboring
neighborliness
neighborly
neighbors
neighed
neighing
neighs
neither
nonpareil
nonpareils
nuclei
nucleic
obeisance
obeisances
obeisant
onomatopoeia
onomatopoeic
outweigh
outweighed
outweighing
outweighs
overseeing
overweight
pantheism
pantheist
pantheistic
pantheists
paperweight
paperweights
peeing
pennyweight
pennyweights
pharmacopoeia
pharmacopoeias
pieing
plebeian
plebeians
poltergeist
poltergeists
polytheism
polytheist
polytheistic
polytheists
protein
proteins
pureeing
queueing
refereeing
reign
reigned
reigning
reigns
reimburse
reimbursed
reimbursement
reimbursements
reimburses
reimbursing
reimpose
reimposed
reimposes
reimposing
rein
reincarnate
reincarnated
reincarnates
reincarnating
reincarnation
reincarnations
reindeer
reindeers
reined
reinforce
reinforced
reinforcement
reinforcements
reinforces
reinforcing
reining
reinitialize
reinitialized
reins
reinsert
reinserted
reinserting
reinserts
reinstate
reinstated
reinstatement
reinstates
reinstating
reinterpret
reinterpretation
reinterpretations
reinterpreted
reinterpreting
reinterprets
reinvent
reinvented
reinventing
reinvents
reinvest
reinvested
reinvesting
reinvests
reissue
reissued
reissues
reissuing
reiterate
reiterated
reiterates
reiterating
reiteration
reiterations
reparteeing
reveille
seeing
seeings
segueing
seismic
seismically
seismograph
seismographic
seismographs
seismologist
seismologists
seismology
seize
seized
seizes
seizing
seizure
seizures
sheik
sheikdom
sheikdoms
sheikh
sheikhs
sheiks
shoeing
sightseeing
singeing
skein
skeined
skeining
skeins
sleigh
sleighed
sleighing
sleighs
snowshoeing
sortieing
sovereign
sovereigns
sovereignty
spontaneity
spreeing
squeegeeing
stein
steined
steining
steins
stymieing
surfeit
surfeited
surfeiting
surfeits
surveillance
teeing
theeing
their
theirs
theism
theist
theistic
theists
therein
throeing
tieing
tingeing
tiptoeing
toeing
treeing
trueing
twingeing
underweight
unfeigned
unseeing
unveil
unveiled
unveiling
unveils
vagueing
veil
veiled
veiling
veils
vein
veined
veining
veins
villein
villeins
vogueing
weeing
weigh
weighed
weighing
weighs
weight
weighted
weightier
weightiest
weightiness
weighting
weightless
weightlessness
weightlifter
weightlifters
weightlifting
weights
weighty
weir
weird
weirded
weirder
weirdest
weirding
weirdly
weirdness
weirdo
weirdos
weirds
weired
weiring
weirs
welterweight
welterweights
wherein

Posted on

Sacred Shield vs Aura

I’m not sure how correct this is, but I thought it would be fun to compared how much Sacred Shield can absorb against a regular source of raid damage (in this case Sapphiron’s frost aura in Naxx25)

The mechanics of SS is a little strange, best to read up on the skill on WoWHead, or WoWWiki

  • Each tick of Sacred Shield absorbs, 500 + 0.75% of your Spell power.
  • Each tick has a 6 second cooldown, and the buff lasts for 30 seconds
  • We are using Sapphiron’s frost aura in Naxx25 for this example. 1600 frost damage every two seconds, to ever member of the raid
  • Our paladin also has has 2000 spell power (which works out to be 2000 absorbed each tick)

Example time line (2 ticks):

00  SS Cast

01  Take   1600   SS Up (2000 left)
02  --
03  Absorb 1600   SS Up (400 left)
04  --
05  Absorb 400    SS Down
    Take   1200
06  --

07  Take   1600   SS Up (2000 left)
08  --
09  Absorb 1600   SS Up (400 Left)
10  --
11  Absorb 400    SS Down
    Take   1200  
12  --

This gives us our base numbers

  • Every 6s, absorb 2000, miss 2800
  • Each cast, absorb 10,000, missing 14,000
  • With 25 people in a raid and a 1.4s cast time (all GCD)
  • SS can kept up on 21 people (1.4 * 21 = 29.4) at a cost of 445 per cast
  • Every 6 seconds: Absorbs 42,000 damage (miss 58,800 damage)
  • Every 30 seconds: Absorbs 210,000 damage (miss 294,000 damage) and costs 9345 mana
  • This results in a very reasonable 7000 damage absorbed per second, at a cost of 1500MP5

Sounds like something fun to test next raid

Updated: Blizzard nerfed SS in 3.1 allowing it to be only cast on one person at a time. Everything above is now as useless as SS itself.

Posted on

array_unique javascript snippet

function array_unique(a)
{
    return a.reduce(function(u, e)
    {
        if(!(e in u))
            u.push(e);

        return u;
    }, []);
}

Posted on

Divine Plea returns in WoW

Divine Plea is one of a Holy Paladins two main sources of mana regen (along with illumination). The spell is on a one minute cool down and returns 25% of your total (maximum) mana over 15 seconds while reducing healing done by 20%. Because the spell is based off total mana, it scales with intellect, and raid buffs (Mark, Kings and AI).

Note, when considering to stack Int, remember that each point also gives a small amount of spell crit and spell power (which is not considered here).

Int Mana DP MP5 (60s CD) MP5 (90s CD)
1500 28510 7127 594 396
1400 26785 6696 558 372
1300 25060 6265 522 348
1200 23335 5834 486 324
1100 21610 5402 450 300
1000 19885 4971 414 276
900 18160 4540 378 252
800 16435 4109 342 228
700 14710 3677 306 204

Returns on Divine Plea by character intellect

Per Int Mana DP MP5 (60s CD) MP5 (90s CD)
1 17.25 4.31 0.36 0.24
3 51.75 12.94 1.08 0.72
10 172.50 43.12 3.59 2.40
20 345.00 86.25 7.19 4.79
30 517.50 129.38 10.78 7.19
50 862.50 215.62 17.97 11.98

Returns on Divine Plea per point on intellect

Notes

Total mana from character intellect = 4394 + (15 * (Intellect – 102) * 1.15)

4394 is the base mana, and 102 is the base intellect of a level 80 Paladin. Intellect after the base amount gives 15 mana per point, then multiplied by 15% from holy talents.

Posted on

obsessed with anonymous functions

Any normal person would just live without anonymous functions in PHP, they are buggy and non trivial ones are pain to write and read. I’m not sure why I seam to obsess over them.

At the very least, the below code will test unicode in your dev tools

Edit: Of course after I wrote that I discovered that WordPress was ignoring the λ character. A little fix from here and everything is working again.

<?php

    // Create an 'anonymous' function without specifying arguments.
    // Arguments are considered to be named $a to $z
    function λ($body)
    {
        $args = '';
        if(preg_match_all('#(\$[a-z])\b#', $body, $matches, PREG_SET_ORDER) !== 0)
        {
            $allArgs = array();
            foreach($matches as $match)
            {
                $allArgs[] = $match[1];
            }
            $allArgs = array_unique($allArgs);
            sort($allArgs);
            $args = implode(',', $allArgs);
        }

        // Make sure it's terminated (we don't care about extra trailing ';')
        return create_function($args, $body . ';');
    }


    // Creating
    $multiply = λ('return $a * $b');
    echo "23 * 65 = " . $multiply(23, 65) . "\n";

    // Only $a to $z are reserved
    $bSquaredByA = λ('$unused = "Hello"; $b_square = $b * $b; return $b_square * $a');
    echo "8 * 6^2 = " . $bSquaredByA(8, 6) . "\n";

    // Embedding in strings
    $square      = λ('return $a * $a');
    $numbers     = array(2,4,8);
    foreach($numbers as $num)
    {
      echo "$num * $num = {$square($num)}\n";
    }

    // Note you don't have to use $a for your first argument, and $b for your second.  They just
    // Need to be in the right order
    $print_two_things = λ('echo "Second: " . $y . "\n"; echo "First: " . $d . "\n";');
    $print_two_things("Hello", "World!");

    // Practical use
    $numbers     = array(1,1,1,2,2,3,3,3,4,5,5,6,7,8,9);
    $above_three = array_filter($numbers, λ('return $x > 3;'));
    echo "Numbers above three =  " . implode(", ", $above_three) . "\n";    

?>

Posted on

Javascript map-sort

I’m sure sorting method has a real name, but I’ve had no luck searching for it.

function mapSort(array, mapFunction, sortFunction)
{
    // Store both original value, and transformed value
    var mapData = array.map(function(e)
    {
        return [e, mapFunction(e)];
    });

    // Sort the data using the second element of each array item (the mapped one)
    var sortedData = mapData.sort(function(a, b)
    {
        return sortFunction(a[1], b[1]);
    });

    // Remove the extra transformed value from the sorted array
    return sortedData.map(function(e)
    {
        return e[0];
    });
}

// Example

var data = ["a", "b", "A", "B", "C", "c"];
var cmp  = function(a, b) { return a > b; };
var map  = function(ch) { return ch.toLowerCase(); };

print("Normal:   " + data.sort(cmp));
print("Map Sort: " + mapSort(data, map, cmp));

// Normal:   A,B,C,a,b,c
// Map Sort: a,A,B,b,c,C

Posted on

I hate working with dates

This little snippet gets all the days in a month, and groups them by week.

<?php

    error_reporting(E_ALL);

    // Return an array of all the days in a month grouped by week number
    // (Sunday is considered to be the first day of the week)
    function weeksInMonth($month, $year)
    {
        $firstDay    = mktime(0, 0, 0, $month, 1, $year);
        $daysInMonth = date('t', $firstDay);

        $week        = 1;
        $breakdown   = array();

        for($i = 1; $i <= $daysInMonth; $i++)
        {
            $date = mktime(0, 0, 0, $month, $i, $year);
            $day  = date('l', $date);

            // Sunday triggers the start of a new week, except if it's
            // also the first day of the month.
            if(($day == 'Sunday') && ($i != 1))
            {
                $week++;
            }

            $breakdown[$week][] = $date;
        }

        return $breakdown;
    }


    $results = monthToWeek(6, 2008);

    printf("There are %d weeks in June 2008\n\n", count($results));

    foreach($results as $weekNumber => $days)
    {
        printf("Week %d\n", $weekNumber);

        foreach($days as $day)
        {
            printf("%10s  %s\n", date("l", $day), date("Y-m-d", $day));
        }

        printf("\n");
    }

/*
There are 5 weeks in June 2008

Week 1
    Sunday  2008-06-01
    Monday  2008-06-02
   Tuesday  2008-06-03
 Wednesday  2008-06-04
  Thursday  2008-06-05
    Friday  2008-06-06
  Saturday  2008-06-07

Week 2
    Sunday  2008-06-08
    Monday  2008-06-09
   Tuesday  2008-06-10
 Wednesday  2008-06-11
  Thursday  2008-06-12
    Friday  2008-06-13
  Saturday  2008-06-14

Week 3
    Sunday  2008-06-15
    Monday  2008-06-16
   Tuesday  2008-06-17
 Wednesday  2008-06-18
  Thursday  2008-06-19
    Friday  2008-06-20
  Saturday  2008-06-21

Week 4
    Sunday  2008-06-22
    Monday  2008-06-23
   Tuesday  2008-06-24
 Wednesday  2008-06-25
  Thursday  2008-06-26
    Friday  2008-06-27
  Saturday  2008-06-28

Week 5
    Sunday  2008-06-29
    Monday  2008-06-30
*/
?>

Posted on

K100D Gallery Added

Just added a couple of quick photos to the k100d gallery. Really wish I could have spent longer watching the surfers near The Spit

Camera is Pentax K100D 6MP with a Sigma 70-300 / Sigma 28-70 F2.8

Edit: 2022-04-10 - New Gallery link

Posted on