Starcraft 1 Pathfinding: A technical analysis

Imagine a Starcraft map as one big grid which is divided into hundreds of little squares. Most units, the smaller units (like marines and zerglings) occupy a single square while the larger units (such as dragoons and ultralisks) occupy multiple squares.

Starcraft 1 pathfinding grid

When a unit is issued a move command, the parameters of that command (the current location and destination in the grid) are run through the pathfinding algorithm which spits out an array of path coordinates. The unit then moves along the path, but it only goes 1 square at a time, one set of coordinates at a time. Each time it travels to a new square, it asks “is the next square along the path occupied?” If the answer is “no,” the unit keeps moving along the path. If the answer is “yes,” the unit waits a fraction of a second, and checks again. If the path is still unoccupied after a certain time increment, a new path is generated from the algorithm and the unit walks around the square that was unwalkable.

Another circumstance in which the path is re-calculated is when a new move command is issued while the unit is en route. This behavior has given rise to spam-clicking. The path is literally re-calculated each time you click, so technically a unit is finding the most efficient path at the point of time closest to the click. Because the grid (remember the starcraft map is just 1 big grid) which marks the walkable and unwalkable areas is constantly changing, so also are the results of the pathfinding algorithm. And the older those results are, the less efficient they will be. Hence: spam-clicking!

If you clicked your marine to go across the map, and a building gets placed in the middle of the map while the marine was en route, the original path calculated can no longer be considered accurate (because it was generated before the building was placed). A helper function detects when a path is no longer “accurate”. It asks “is the square in front of me occupied?” If no, it will continue along the path. If yes, it will wait, check again, and generate a new path if it is still occupied. All of this happens very quickly between animation frames.

At one point in the development of Strike Tactics, I utilized this same technique for pathfinding.

Notice how the units stop when they detect an object in front and politely wait for the object to move before continuing along the path? This is Starcraft 1 pathfinding. Units always remain visually separated at the expense of pathfinding efficiency. In other words, units take longer to get from point A to point B but they do so without walking on top of each other.

Here's a look at what the "helper function" which asks "is this node in front of me occupied?" looks like in Javascript. Each time a new node is walked to, the next node in the path is checked. If it's occupied, an interval begins (unit.waitInt) which waits for the node to become un-occupied. If it takes too long, the path is thrown out and a new one is calculated (in my game, setting the unit.goToTarget will cause the unit to find a new path). 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
function checkGoToNextNode(unit) {

    if (unit.path[0] != undefined) {

        var grid = staticGrid;
        var findPathMatrixNodeSize = matrixNodeSize;

        if (unitDefinitions[unit.unitName].size == 'lg') {
            var findPathMatrixNodeSize = matrixNodeSizeLG;
            var grid = getGridCloneOfStaticLGFromStatic(unit);
        }

        // lg units should reserve all 9 rather than just center 1
        var gridX = fnRound((unit.path[0] - (findPathMatrixNodeSize / 2)) / findPathMatrixNodeSize);
        var gridY = fnRound((unit.path[1] - (findPathMatrixNodeSize / 2)) / findPathMatrixNodeSize);

        // check if next path is walkable, if not, wait till it is
        if (grid.nodes[gridY][gridX].walkable || smoothPaths) {

            if (unit.nextWalkToNode != undefined) {
                var goToNodeCopy = [unit.nextWalkToNode.x, unit.nextWalkToNode.y];


                game.time.events.add(500, (function(goToNodeCopy) {
                    return function() {
                        setNode(goToNodeCopy);
                    };
                })(goToNodeCopy), this);

            }

            if (unitDefinitions[unit.unitName].size == 'lg') {
                // large units must reserve a node in the staticGrid to prevent other large units from going there
                var gridXInStatic = fnRound((unit.path[0] - (matrixNodeSize / 2)) / matrixNodeSize);
                var gridYInStatic = fnRound((unit.path[1] - (matrixNodeSize / 2)) / matrixNodeSize);

                staticGrid.nodes[gridYInStatic][gridXInStatic].walkable = false;

                unit.nextWalkToNode = staticGrid.nodes[gridYInStatic][gridXInStatic];

            } else {
                grid.nodes[gridY][gridX].walkable = false;

                unit.nextWalkToNode = grid.nodes[gridY][gridX];

            }
            moveToNext(unit);
        } else {


            if (unit.unitName != 'drone') {
                stopAnimationsNetwork(unit, false, 0);
            }
            unit.waitInt = setInterval(function() {
                unit.timesWaited++;

                var distanceFromEnd = Phaser.Math.distance(unit.x, unit.y, unit.goingX, unit.goingY);

                if ((distanceFromEnd <= 100) && (unit.timesWaited > 3)) {
                    clearInterval(unit.waitInt);
                    actionsAfterCompletingPath(unit);
                    return;
                } else if ((distanceFromEnd >= 100) && (unit.timesWaited > 20)) {
                    // find a new path
                    actionsAfterCompletingPath(unit);
                    clearInterval(unit.waitInt);
                    unit.goToTarget = {
                        'x': unit.goingX,
                        'y': unit.goingY

                    }
                    return;
                }

                if (grid.nodes[gridY][gridX].walkable) {
                    if (unit.nextWalkToNode != undefined) {
                        unit.nextWalkToNode.walkable = true;
                    }
                    unit.timesWaited = 0;
                    grid.nodes[gridY][gridX].walkable = false;
                    unit.nextWalkToNode = grid.nodes[gridY][gridX];

                    clearInterval(unit.waitInt);
                    walkMech(unit);

                    moveToNext(unit);

                }

            }, 50);

        }

    }

}

If you think that's complicated and messy, consider that this is just one small component of the system. That to me, was a big red flag. The more complicated a system is, the more likely it will fail. Simpler systems work better because there are fewer things in them that can fail. 

I discovered this technique on my own through experimentation and had no idea Starcraft used it until I saw Day9’s video. Although Day9 doesn't appear to understand what is going on under the hood, he explains what the pathfinding system feels like to the player and what the gameplay implications are - it just made me think hard about what the units were doing when looking for a path. I came to realize the units were constantly stopping and going because they were asking "is this square occupied?" just like in my own implementation.

At some point in pre-alpha, I ditched this entire approach and revamped pathfinding to something much simpler. Instead of units constantly checking if the node they are about to walk to is occupied, the units simply maintain relative distance from each other when they walk. The only nodes which are marked as unwalkable are the start and end destinations. Even though the same grid structure is used, units don't move like they are playing hopskotch because a second algorithm (independent of the pathfinding algorithm) smooths the paths. This is the system currently used in Strike Tactics.

Early feedback from alpha testers was the impetus to overhaul pathfinding in this way, and as soon as I made the change, “pathinding” ceased to even be a topic of discussion among alpha testers. That to me proved the new pathfinding was good, because it did its job unnoticed. My reasoning is that If players notice your pathfinding, that’s when you know it’s bad. The contrapositive is that you don’t get praise for good pathfinding, because no one notices it. SC2 pathfinding is probably the best pathfinding system ever devised for a dynamic world. Units of all sizes miraculously find their way to destinations, without overlapping each other and without stopping. Despite this, the only discussions surrounding SC2 pathfinding are in relation to brood war pathfinding, and how it just doesn’t have the same charm to it. Brood War pathfinding is considered "fun" for some players, because it requires more micro-management to move your units effectively. 

Anyway, I don’t recall the last time someone complained about pathfinding in Strike Tactics, so I like to think it’s a solved problem at this point. The units simply go directly to their destination in the fastest way mathematically possible. It might not look as good as the original system where units always remain visually separated, but it certainly feels better. And if there’s anything I’ve learned, feel is much more important than looks. Players prefer more efficient unit movement and pathfinding over all else. They don't care how it looks. Truthfully, I don’t think anyone (other than me) has noticed that units occasionally walk on top of each other in Strike Tactics. Yet that was one of my greatest fears and where i spend 99% of my energy writing pathfinding. Funny, the things developers feel are important don’t always align with the things players feel are important.

In Starcraft 1, you will also notice that units move in grid-fashion. In simpler terms, units move like they are playing one giant game of hop scotch. A unit can move to the square in front, the square to the left, the square behind, etc. But what units can’t do is move forward 1 degrees, back 2 degrees, left 3 degrees, etc. Movement is strictly limited to cardinal direction: N, S, E, W and NE, NW, SE, SW, etc. This is why the movement feels so “blocky.” Units need to move like this because they need to be able to ask "is this node i am walking to occupied?" If they moved outside the grid (like in sc2), they would not be able to ask that question. 

If the path the algorithm spits out is most accurate when it is newly created, why didn’t Blizzard automatically recalculate the path instead of only recalculating it on click or when a unit bangs into another?

Because these calculations are expensive, even by modern computing standards. Depending on the size of the grid, and the algorithm used calculating hundreds of paths for hundreds of units 10 times a second adds up. Thus algorithms like A* are only run when needed, on click or when a unit gets stuck.

The difficulties in implementing pathfinding is never a simple as “determining the quickest route to get from point a to point b,” although gamers - and people who have never worked on pathfinding - probably assume it as such. A lot of devs seem to think good pathfinding is all about choosing good pathfinding algorithms, but that's an oversimplification. It's sort of like assuming Chevy can design the best car by simply realizing they need to use wheels to move the car. The wheel part is already a solved problem. The algorithm part is already a solved problem. The difficulty is in implementation. 

Since in an RTS game, the world is constantly changing, the problem is never as simple as determining the fastest route to get from point a to point b. In a changing world, the problem is determining the fastest route from point a to point b  while not bumping into objects c, d, e, f, g, etc, which are  by the way, constantly moving at various speeds an in various directions. The difference between solving dynamic world pathfinding and static world pathfinding is the difference between shooting a moving target and one which stands still.

Many modern RTS games avoid the problem altogether by simply doing overlap/collision checks on every frame and separating units which get too close (think of it like bumper cars). Starcraft 2 uses this technique to some extent, but the technique is CPU intensive. With SC1 pathfinding, the only real CPU-heavy stuff (computing the path with the algorithm) happens when you issue a click command or when a unit gets stuck and needs to generate a new path. But with collision detection, the CPU intensive stuff is happening every millisecond. It absolutely would not be possible with 1999 tech.

Comments

If anyone is interested in reading one of the original Starcraft developer's writing on this very subject you can read the article at:

https://www.codeofhonor.com/blog/the-starcraft-path-finding-hack

Generic Cialis Soft Periactin Otc Where To Buy Tab Isotretinoin Visa <a href=http://viaacost.com>viagra</a> Cialis 20mg Effets Secondaires Glucotrol Antibiotics Without A Script

Generic Viagra From Us Pharmacy <a href=http://cialisab.com>cheapest cialis 20mg</a> Cialis Giornaliero Generico Cialis English

Levitra Fertilita Comparatif Cialis Viagra <a href=http://bakgol.com>achat viagra forum</a> Buy Diflucan No Prescription

Pillola Viagra Senza Ricetta Cytotec In South Africa <a href=http://cthosts.net>cialis without a doctor's prescription</a> Buy Isotretinoin Without Perscription

Cialis Alcool <a href=http://adrugo.com>cialis online</a> Buy Lasix 100mg Cephalexin Dog No Prescriptions Hydrochlorothiazide 25 Mg Without An Rx

Kamagra Alcohol Cialis 2 Day Delivery [url=http://cialusa.com]tadalafil cialis from india[/url] Is Cephalexin Good For Celulitis Propecia Direct Cialis Online

Order Now Amoxicilina Price Discount Pharmacy <a href=http://rxasian.com>generic viagra</a> Canadian Pharmacy Online Cialis Propecia Side Effects Temporary Zithromax For Tooth Abscess

Cytotec En Pharmacie Cialis Tablets For Sale Au <a href=http://sildenaf100mg.com>buy viagra online</a> All Day Chemist Retin A

Rezept Fur Viagra Cialis Sirve Para Diabeticos Pfizer Viagra Tablets <a href=http://antabusefast.com>antabuse</a> Online Propecia Prescription Drugs Chewable Visgra

Online cialis generika kaufen <a href=http://vhsfp.com>viagra</a> Achat Viagra Cialis Cialis Viagra Levitra Comparaison Amoxicillin Vs Strep Throat

Amazing loads of useful tips!
pharmacie canadienne
<a href="https://www.pharmacyonline-canadian.com//">canadian pharmacies</a>
pharmacy on line
<a href="https://www.canadianpharmacy-guide.com//">canadian pharmacy online</a>
drugstore online shopping - https://www.trustedwebpharmacy.com/

<a href="http://www.chuchilandia.com/?p=1156#comment-1131844">canadadrugs.com pharmacy Bib</a> f6b3cb1

Superb data. With thanks.
canada pharmacies online prescriptions
<a href="https://www.canadianpharmacyu.com//">canadian online pharmacies</a>
canadian pharmacies that ship to us
<a href="https://canadianpharmaciescubarx.com//">canadian online pharmacies legitimate by aarp</a>
online pharmacy without prescription - https://www.canadianpharmacy-guide.com/

<a href="http://chinaymg.cn/Derrell8463?unapproved=14984&moderation-hash=58a3e2e5... pharmacies-247 Si</a> 1a34e5e

You said it nicely..
<a href="https://canadianpharmaciescubarx.com//">canadian drugs</a>
international pharmacies that ship to the usa - https://www.canadianpharmacy-ltd.com/

<a href=http://hollymariecombs.info/forum/viewtopic.php?f=19&t=1390341>canadian online pharmacy reviews vect</a> a34e5eb

Wow lots of great data.
canada rx
<a href="https://www.trustedwebpharmacy.com//">online pharmacies of canada</a>
canada prescription drugs
<a href="https://www.pharmacyonline-canadian.com//">online drugstore</a>
canada pharmacies prescription drugs - https://www.safeonlinecanadian.com/

3a4c4_5

Nicely put, Appreciate it!
legal canadian prescription drugs online
<a href="http://canadianpharmaceuticalsonlinerx.com//">canada pharmacy online</a>
canadian pharmacy online
<a href="https://www.trustedwebpharmacy.com//">ed meds online without doctor prescription</a>
best canadian online pharmacy - https://www.canadianpharmacy-ltd.com/

<a href="http://traba.be/?p=1768#comment-856056">pharmacies in canada Ker</a> b1a34e5

Nicely put. Thanks a lot!
prescription discount
<a href="https://www.trustedwebpharmacy.com//">canada pharmaceutical online ordering</a>
canadian online pharmacies legitimate by aarp
<a href="https://www.canadianpharmacycom.com//">canadian pharmacy world</a>
canada prescriptions drugs - https://www.canadianpharmacyu.com/

<a href="https://bizlaunch.co.uk/?attachment_id=286">viagra from canada nef</a> b1a34e5

Wow plenty of beneficial material!
<a href="https://www.pharmacyonline-canadian.com//">london drugs canada</a>
canadian pharcharmy online fda approved - https://www.canadianpharmacyopen.com/

[url=http://lanpanya.com/aram/?p=90#comment-149316]canadian rx con[/url] e5ebdcb

Incredible tons of excellent data.
canada drugs online pharmacy
<a href="http://canadianpharmaceuticalsonlinerx.com//">londondrugs</a>
canadian drugs
<a href="http://canadianpharmacyntv.com//">northwest pharmacy</a>
canadian pharmacies online - https://www.canadianonlinepharmacytrust.com/

<a href="http://cien-byarhair.com/archives/7757#comment-1489587">cheap prescription drugs Hism</a> 1af6b3c

Seriously a lot of excellent material!
ordering prescriptions from canada legally
<a href="http://canadianpharmacyntv.com//">canadian pharmacy</a>
prescription drugs online without doctor
<a href="https://www.canadianpharmacyopen.com//">canada pharmaceutical online ordering</a>
pharmacy online - https://www.canadianwwwonlinepharmacy.com/

<a href="https://www.deindoktor.ch/de/medikamente-online/Gutron-%2810-mg-ml%29_76... meds online Ma</a> 66ead55

Nicely put. Many thanks!
top rated online canadian pharmacies
<a href="https://www.canadianpharmacy-guide.com//">canadian pharmacy viagra</a>
canadian drug store
<a href="https://www.canadianwwwonlinepharmacy.com//">london drugs canada</a>
online pharmacy no prescription needed - http://canadianpharmaceuticalsonlinerx.com/

<a href="https://www.busanjob.net/?pCode=1484721688&mode=view&idx=7178">prescription drugs prices et</a> af6b3cb

Cheers. Fantastic information!
<a href="http://canadianpharmacyntv.com//">canadian pharmacies that ship to us</a>
drugstore online shopping - https://www.canadianpharmacyu.com/

[url=http://nueakhlong.krabi.doae.go.th/?p=547#comment-960108]canadian pharmacies-24h jast[/url] 2_69056

Nicely put, With thanks.
online discount pharmacy
<a href="https://www.canadianpharmacy-ltd.com//">online canadian pharmacy</a>
best online pharmacies no prescription
<a href="https://www.canadianpharmacyopen.com//">canadian pharcharmy</a>
online pharmacy without prescription - https://www.canadianpharmacy-guide.com/

<a href="http://www.sheyuan.com/goods/7432.htm">canadapharmacy com Jen</a> af6b3cb

Nicely put. Regards.
drugstore online
<a href="https://www.safeonlinecanadian.com//">canadian pharmaceuticals online</a>
list of approved canadian pharmacies
<a href="https://www.canadianwwwonlinepharmacy.com//">canadian pharmacies</a>
canadian viagra - https://canadianpharmaciescubarx.com/

<a href="https://www.tugaleaks.com/cne-nao-cumpre-lei.html?unapproved=617181&mode... drug pharmacy ml</a> 6b3cb1a

Wonderful info. Cheers.
canadian pharmacy online canada
<a href="https://www.canadianonlinepharmacytrust.com//">london drugs canada</a>
canadian prescriptions online
<a href="https://www.canadianpharmacy-guide.com//">canadian drugs</a>
discount pharmacy online - https://www.pharmacyonline-canadian.com/

<a href="http://www.bakerexplosion.com/?p=184&unapproved=51391&moderation-hash=0c... canada Sort</a> 1af6b3c

Reliable material. Thanks a lot!
online pharmacy no prescription
<a href="https://www.trustedwebpharmacy.com//">canada drugs</a>
canadian pharcharmy online
<a href="https://www.canadianpharmacyopen.com//">canadian drugs</a>
safe canadian online pharmacies - https://www.canadianpharmacycom.com/

<a href="http://www.sheyuan.com/goods/7432.htm">canadapharmacy com Jen</a> ebdcb3a

You said this terrifically!
<a href="https://www.canadianpharmacy-guide.com//">canadian pharmacy king</a>
pharmacy prices - https://www.canadianonlinepharmacytrust.com/

[url=https://www.tugaleaks.com/siria-hackers-atacam-marines.html?unapproved=6... pharmacy online ml[/url] cb3a4c2

Seriously all kinds of great tips.
canadian pharmacy certified canada pharmacy online
<a href="https://www.trustedwebpharmacy.com//">canadian online pharmacy</a>
compare prescription prices
<a href="http://canadianpharmaceuticalsonlinerx.com//">canadianpharmacy</a>
canadian drugs - https://www.canadianwwwonlinepharmacy.com/

<a href="http://www.chinaymg.cn/Derrell9239?unapproved=4576&moderation-hash=d4861... canada drug database Si</a> 6066ead

Really lots of beneficial material!
prescription drugs online without
<a href="https://www.canadianwwwonlinepharmacy.com//">canadian drug</a>
canadadrugstore365
<a href="https://www.canadianpharmacycom.com//">canada pharmaceuticals online</a>
canadian pharmacies without an rx - https://www.safeonlinecanadian.com/

<a href="https://www.deindoktor.ch/de/medikamente-online/Liv.-52,-comprim%D0%93%C...(244-mg)_7680456820136.html">candrugstore com Ma</a> a4c0_50

You explained it fantastically.
canada pharmacy
<a href="https://www.canadianpharmacy-ltd.com//">best 10 online canadian pharmacies</a>
canada pharmacy online reviews
<a href="https://www.canadianpharmacyopen.com//">canadian pharcharmy</a>
drug stores near me - https://www.canadianpharmacy-ltd.com/

<a href="http://www.sheyuan.com/goods/4719.htm">meds online without doctor prescription Jen</a> 6066ead

Nicely put. Regards.
prescription pricing
<a href="https://www.canadianpharmacycom.com//">legal canadian prescription drugs online</a>
northwest pharmacy/com
<a href="https://www.canadianonlinepharmacytrust.com//">health canada drug database</a>
mexican pharmacies - https://canadianpharmaciescubarx.com/

<a href="http://enjoy-middy.jugem.jp/?eid=11">doctor prescription Oa</a> af6b3cb

Really a good deal of amazing data!
best canadian mail order pharmacies
<a href="https://www.safeonlinecanadian.com//">canadian pharmacy</a>
discount prescription drug
<a href="https://canadianpharmaciescubarx.com//">canadian pharmacy king</a>
canadian pharcharmy online - http://canadianpharmaceuticalsonlinerx.com/

<a href="http://www.nfd.com.tw/62/62-board/default.asp">safe canadian online pharmacies ki</a> 34e5ebd

Regards, Fantastic stuff.
<a href="https://www.canadianpharmacy-ltd.com//">canadian pharmacy</a>
northwest pharmacy/com - https://www.canadianpharmacycom.com/

[url=https://hemeroscopea.com/mariajose/forums/topic/custom-dissertation-hypo... pharmacy Kn[/url] 3_69056

Really a good deal of superb info!
discount pharmacy online
<a href="https://www.canadianpharmacycom.com//">online pharmacies</a>
canadadrugs.com pharmacy
<a href="https://www.canadianpharmacyu.com//">canadian pharmaceuticals online</a>
list of legitimate canadian pharmacies - https://www.trustedwebpharmacy.com/

<a href="https://bra3.bbs10.net/?thread=29#19697">ed meds online Wame</a> e5ebdcb

Awesome info. Kudos.
canadian pharmacy world
<a href="http://canadianpharmaceuticalsonlinerx.com//">canada pharmacy</a>
mexican pharmacy online
<a href="http://canadianpharmacyntv.com//">cvs pharmacy online</a>
pharmacy on line - https://www.pharmacyonline-canadian.com/

<a href="http://goodroad.jp/?eid=1204">online pharmacies in usa mn</a> 066ead5

Nicely put, Thank you!
<a href="https://www.safeonlinecanadian.com//">canada pharmacy online</a>
top rated online canadian pharmacies - https://www.trustedwebpharmacy.com/

[url=https://www.ebaglung.com/archives/45381?unapproved=33595&moderation-hash... of legitimate canadian pharmacies disp[/url] d551af6

Superb knowledge. Regards.
legitimate canadian mail order pharmacies
<a href="https://www.pharmacyonline-canadian.com//">london drugs canada</a>
best online canadian pharcharmy
<a href="https://www.canadianpharmacyu.com//">canada rx</a>
legitimate online pharmacies - https://www.canadianpharmacyu.com/

<a href="http://www.fhukaktus.pl/forum/post370907.html#p370907">londondrugs caf</a> dcb3a4c

Thank you! Plenty of facts!

online pharmacy
<a href="https://www.safeonlinecanadian.com//">canadian pharmacies</a>
prescription drugs prices
<a href="https://canadianpharmaciescubarx.com//">online pharmacies</a>
mexican pharmacies shipping to usa - https://www.safeonlinecanadian.com/

<a href="http://www.catanduvas.com/how-to-leave-smoking-pan-how-to-give-up-smokin... order pharmacies jepe</a> bdcb3a4

Appreciate it, Lots of write ups.

<a href="https://www.canadianpharmacy-ltd.com//">canada pharmacy online</a>
cheap drugs online - https://www.safeonlinecanadian.com/

[url=http://www.vm2b.ru/viewtopic.php?f=32&t=221231]discount prescription drugs online Pi[/url] b1a34e5

Valuable data. Many thanks.
canadian prescription drugs
<a href="https://www.canadianpharmacycom.com//">canadian pharmaceuticals online</a>
prescription drug cost
<a href="https://canadianpharmaciescubarx.com//">canadian online pharmacies legitimate</a>
canadapharmacyonline com - https://www.canadianonlinepharmacytrust.com/

<a href="https://www.arifnizami.com/forums/topic/film-douleur-et-gloire-en-stream... drugs pharmacy Nib</a> 66ead55

This is nicely put. !
board of pharmacy
<a href="http://canadianpharmacyntv.com//">pharmacy online</a>
canadapharmacyonline.com
<a href="https://www.canadianpharmacycom.com//">canadian pharmacy online</a>
drugs without prescription - https://www.canadianpharmacy-ltd.com/

<a href="http://www.allfreight.co.kr/dbms/board/ttboard.cgi?act=read&db=en_counse... drugs</a> 551af6b

Cheers! Loads of knowledge.

no prior prescription required pharmacy
<a href="https://www.safeonlinecanadian.com//">ed meds online without doctor prescription</a>
rx price comparison
<a href="https://www.canadianpharmacy-guide.com//">canada pharmacy</a>
canadapharmacy com - https://www.canadianonlinepharmacytrust.com/

<a href="https://photo.capsule.org/?popup=comment&showimage=83">canada drugs pharmacy Lom</a> ebdcb3a

Thanks a lot. I value it!
<a href="https://www.canadianpharmacy-ltd.com//">canadian drug store</a>
overseas pharmacies - https://www.canadianpharmacycom.com/

[url=http://lockmasters.ru/forum/viewtopic.php?f=2&t=27594]pharmacies near me Sn[/url] 066ead5

Superb content. Thanks a lot.
overseas pharmacies
<a href="https://www.canadianpharmacycom.com//">canadian pharmacies</a>
canadadrugstore365
<a href="https://www.canadianonlinepharmacytrust.com//">canadian pharmaceuticals online</a>
best canadian online pharmacies - https://www.canadianwwwonlinepharmacy.com/

<a href="http://blog.kingstreetsounds.com/carnao-beats-leave-me?unapproved=109614... pharmacies-247 Bumn</a> 6ead551

Kudos, Terrific information!
canada prescription plus pharmacy
<a href="http://canadianpharmacyntv.com//">canadian pharmacies online</a>
buy prescription drugs canada
<a href="https://www.canadianonlinepharmacytrust.com//">canada pharmaceuticals online</a>
drug costs - https://www.canadianpharmacycom.com/

<a href="http://fastbet.online/webboard/index.php?topic=20.new#new">canadian rx nex</a> 4e5ebdc

Kudos! I appreciate this.
canada prescription drugs
<a href="http://canadianpharmacyntv.com//">ordering prescriptions from canada legally</a>
canadian meds
<a href="https://www.canadianpharmacyopen.com//">canadian pharmacies that ship to us</a>
canadian pharmacies top best - https://www.canadianpharmacy-guide.com/

<a href="https://teamlionx.com/2017/10/21/slider2-office2/#comment-48565">viagra from canada ea</a> 1a34e5e

With thanks, Valuable information.
buy prescription drugs without doctor
<a href="https://canadianpharmaciescubarx.com//">canadian pharmacy king</a>
canada prescription plus pharmacy
<a href="https://www.canadianpharmacy-guide.com//">pharmacy online</a>
rx price comparison - https://www.canadianpharmacy-guide.com/

<a href="http://hollymariecombs.info/forum/viewtopic.php?f=19&t=1402638">order prescriptions online without doctor vect</a> ead551a

Thanks! I value it!
canadapharmacy
<a href="https://www.canadianpharmacycom.com//">pharmacy online</a>
canada drugs pharmacy
<a href="https://www.pharmacyonline-canadian.com//">canadian online pharmacies</a>
global pharmacy canada - https://www.pharmacyonline-canadian.com/

<a href="http://www.sheyuan.com/goods/5563.htm">drugs from canada online Jen</a> 8_5ac9f

Nicely put, Thanks a lot!
canadian online pharmacies
<a href="https://www.safeonlinecanadian.com//">london drugs canada</a>
buy prescription drugs from canada
<a href="https://canadianpharmaciescubarx.com//">ed meds online without doctor prescription</a>
pharmacy on line - https://www.canadianpharmacyopen.com/

<a href="http://essayservicesreviews.com/2015/09/law-essays.html?unapproved=10221... king pharmacy Foes</a> 066ead5

You actually said this superbly.
canada rx
<a href="https://www.canadianpharmacy-ltd.com//">canadian pharmaceuticals online</a>
safeway pharmacy
<a href="https://www.canadianpharmacyu.com//">canadian pharmacies online</a>
canadadrugstore365 - https://www.canadianpharmacycom.com/

<a href="http://shop.mevrouwbouwers.nl/product/antenna-earring-silver/#comment-27... meds online en</a> 4c6_508

Pages