Skip to content

Instantly share code, notes, and snippets.

@hfsaito
Created May 26, 2024 06:00
Show Gist options
  • Save hfsaito/067d83dbafa07179dc1a05be70297171 to your computer and use it in GitHub Desktop.
Save hfsaito/067d83dbafa07179dc1a05be70297171 to your computer and use it in GitHub Desktop.
Shortcuts in AutoHotKey for Plants vs. Zombies
#Requires AutoHotkey v2.0
PVZ_WINDOW_TITLE := "Plants vs. Zombies"
class Base {
static CARD_COORD := [
{x: 0.14583333333333334, y: 0.06666666666666667},
{x: 0.2111111111111111, y: 0.06666666666666667},
{x: 0.26944444444444443, y: 0.06666666666666667},
{x: 0.34375, y: 0.06666666666666667},
{x: 0.3840277777777778, y: 0.06666666666666667},
{x: 0.4798611111111111, y: 0.06666666666666667},
{x: 0.5229166666666667, y: 0.06666666666666667},
{x: 0.5916666666666667, y: 0.06666666666666667},
{x: 0.6569444444444444, y: 0.06666666666666667},
{x: 0.7194444444444444, y: 0.06666666666666667}
]
static CHOOSE_YOUR_PLANTS_COORD := {
peashooter: {x: 0.06111111111111111, y: 0.2638888888888889},
sunflower: {x: 0.12152777777777778, y: 0.26481481481481484},
cherryBomb: {x: 0.1909722222222222, y: 0.26296296296296295},
wallNut: {x: 0.26458333333333334, y: 0.2611111111111111},
potatoMine: {x: 0.32569444444444445, y: 0.26481481481481484},
snowPea: {x: 0.3923611111111111, y: 0.2601851851851852},
chomper: {x: 0.45625, y: 0.2611111111111111},
repeater: {x: 0.5243055555555556, y: 0.2601851851851852},
puffShroom: {x: 0.059027777777777776, y: 0.3824074074074074},
sunShroom: {x: 0.12916666666666668, y: 0.3851851851851852},
fumeShroom: {x: 0.2, y: 0.37962962962962965},
graveBuster: {x: 0.2569444444444444, y: 0.38333333333333336},
hypnoShroom: {x: 0.3215277777777778, y: 0.3861111111111111},
scaredyShroom: {x: 0.38333333333333336, y: 0.38796296296296295},
icoShroom: {x: 0.45694444444444443, y: 0.39166666666666666},
doomShroom: {x: 0.5138888888888888, y: 0.39351851851851855},
lilyPad: {x: 0.05763888888888889, y: 0.49722222222222223},
squash: {x: 0.1284722222222222, y: 0.49444444444444446},
threepeater: {x: 0.18958333333333333, y: 0.49537037037037035},
tangleKelp: {x: 0.2569444444444444, y: 0.5},
jalapeno: {x: 0.3236111111111111, y: 0.5009259259259259},
spikeweed: {x: 0.39791666666666664, y: 0.5009259259259259},
tourchwoord: {x: 0.4673611111111111, y: 0.5018518518518519},
tallNut: {x: 0.51875, y: 0.5037037037037037},
seaShroom: {x: 0.059027777777777776, y: 0.6129629629629629},
plantern: {x: 0.12430555555555556, y: 0.6138888888888889},
cactus: {x: 0.1909722222222222, y: 0.6148148148148148},
blover: {x: 0.2569444444444444, y: 0.6138888888888889},
splitPea: {x: 0.3229166666666667, y: 0.612037037037037},
starfruit: {x: 0.3902777777777778, y: 0.6064814814814815},
pumpkin: {x: 0.4548611111111111, y: 0.6111111111111112},
magnetShroom: {x: 0.5222222222222223, y: 0.6203703703703703},
cabbagePult: {x: 0.06875, y: 0.7314814814814815},
flowerPot: {x: 0.12708333333333333, y: 0.7268518518518519},
kernelPult: {x: 0.1951388888888889, y: 0.7314814814814815},
coffeeBean: {x: 0.2604166666666667, y: 0.7342592592592593},
garlie: {x: 0.3229166666666667, y: 0.7361111111111112},
umbreallaLeaf: {x: 0.38680555555555557, y: 0.7351851851851852},
marigold: {x: 0.45694444444444443, y: 0.7324074074074074},
melonPult: {x: 0.5208333333333334, y: 0.7398148148148148},
gatlingPea: {x: 0.05694444444444444, y: 0.850925925925926},
twinSunflower: {x: 0.11736111111111111, y: 0.8546296296296296},
gloomShroom: {x: 0.19444444444444445, y: 0.85},
cattail: {x: 0.2611111111111111, y: 0.8481481481481481},
winterMelon: {x: 0.31875, y: 0.8425925925925926},
goldMagnet: {x: 0.3909722222222222, y: 0.8398148148148148},
spikerock: {x: 0.45555555555555555, y: 0.8435185185185186},
cobCannon: {x: 0.5298611111111111, y: 0.8425925925925926}
}
static LETS_GO_BUTTON_POSITION := {x: 0.28125, y: 0.9388888888888889}
static GetPixelCoord(coordInPercentage) {
WinGetPos ,, &WinWidth, &WinHeight, "Plants vs. Zombies"
WinRatio := WinHeight / WinWidth
GameRatio := 0.75
GameWidth := WinWidth
GameHeight := WinHeight
HGap := 0
VGap := 0
if (WinRatio >= GameRatio) {
GameHeight := WinWidth * GameRatio
VGap := (WinHeight - GameHeight) / 2
} else {
GameWidth := WinHeight / GameRatio
HGap := (WinWidth - GameWidth) / 2
}
return {
x: (coordInPercentage.x * GameWidth) + HGap,
y: (coordInPercentage.y * GameHeight) + VGap
}
}
static GetCardCoord(n) {
return Base.GetPixelCoord(Base.CARD_COORD[n])
}
static GetChooseYourPlantsCoord(plantName) {
return Base.GetPixelCoord(Base.CHOOSE_YOUR_PLANTS_COORD.%plantName%)
}
static SelectPlantCard(n) {
cardCoord := Base.GetCardCoord(n)
MouseGetPos &xold, &yold
Click cardCoord.x, cardCoord.y
Click xold, yold, 0
}
static PlaceCard(n) {
cardCoord := Base.GetCardCoord(n)
MouseGetPos &xold, &yold
Click cardCoord.x, cardCoord.y
Click xold, yold
}
static ChooseYourPlants(plantName) {
plantCoord := Base.GetChooseYourPlantsCoord(plantName)
Click plantCoord.x, plantCoord.y
}
static LetsGo() {
letsGoCoord := Base.GetPixelCoord(Base.LETS_GO_BUTTON_POSITION)
Sleep 100
Click letsGoCoord.x, letsGoCoord.y, 0
Sleep 100
Click letsGoCoord.x, letsGoCoord.y
}
static AutoClick(key) {
while GetKeyState(key, "P") {
Click
Sleep 10
}
}
}
class Strategy extends Base {
static PICKED_PLANTS := []
static MAP_CARD_TO_N := {}
static POOL_POSITIONS := [
[
{x: 0.10486111111111111, y: 0.21574074074074073},
{x: 0.19444444444444445, y: 0.2101851851851852},
{x: 0.2826388888888889, y: 0.20925925925925926},
{x: 0.39444444444444443, y: 0.20925925925925926},
{x: 0.5104166666666666, y: 0.20925925925925926},
{x: 0.6020833333333333, y: 0.21851851851851853},
{x: 0.7111111111111111, y: 0.21296296296296297},
{x: 0.8027777777777778, y: 0.22037037037037038},
{x: 0.8916666666666667, y: 0.22685185185185186}
],
[
{x: 0.10208333333333333, y: 0.34629629629629627},
{x: 0.21736111111111112, y: 0.3592592592592593},
{x: 0.30069444444444443, y: 0.36574074074074076},
{x: 0.3854166666666667, y: 0.36666666666666664},
{x: 0.5041666666666667, y: 0.3611111111111111},
{x: 0.5895833333333333, y: 0.3574074074074074},
{x: 0.7020833333333333, y: 0.3712962962962963},
{x: 0.8020833333333334, y: 0.3685185185185185},
{x: 0.8979166666666667, y: 0.3861111111111111},
],
[
{x: 0.10347222222222222, y: 0.5203703703703704},
{x: 0.2, y: 0.5166666666666667},
{x: 0.3090277777777778, y: 0.5194444444444445},
{x: 0.4041666666666667, y: 0.5203703703703704},
{x: 0.5104166666666666, y: 0.5203703703703704},
{x: 0.6041666666666666, y: 0.5222222222222223},
{x: 0.7069444444444445, y: 0.5231481481481481},
{x: 0.8069444444444445, y: 0.5185185185185185},
{x: 0.9076388888888889, y: 0.5259259259259259},
],
[
{x: 0.1, y: 0.674074074074074},
{x: 0.19583333333333333, y: 0.6907407407407408},
{x: 0.2951388888888889, y: 0.6833333333333333},
{x: 0.39652777777777776, y: 0.6916666666666667},
{x: 0.49375, y: 0.6796296296296296},
{x: 0.6020833333333333, y: 0.6722222222222223},
{x: 0.7006944444444444, y: 0.674074074074074},
{x: 0.7993055555555556, y: 0.6694444444444444},
{x: 0.89375, y: 0.6824074074074075},
],
[
{x: 0.1076388888888889, y: 0.8148148148148148},
{x: 0.20416666666666666, y: 0.8092592592592592},
{x: 0.3104166666666667, y: 0.8212962962962963},
{x: 0.4, y: 0.8148148148148148},
{x: 0.5006944444444444, y: 0.812037037037037},
{x: 0.5923611111111111, y: 0.8175925925925925},
{x: 0.7, y: 0.8194444444444444},
{x: 0.7972222222222223, y: 0.825},
{x: 0.9069444444444444, y: 0.8185185185185185},
],
[
{x: 0.10833333333333334, y: 0.9342592592592592},
{x: 0.19722222222222222, y: 0.9305555555555556},
{x: 0.3104166666666667, y: 0.9277777777777778},
{x: 0.4027777777777778, y: 0.9203703703703704},
{x: 0.5, y: 0.9194444444444444},
{x: 0.5979166666666667, y: 0.9194444444444444},
{x: 0.6986111111111111, y: 0.9398148148148148},
{x: 0.7951388888888888, y: 0.937037037037037},
{x: 0.8986111111111111, y: 0.9425925925925925}
]
]
static Reset() {
Strategy.PICKED_PLANTS := []
Strategy.MAP_CARD_TO_N := {}
Strategy.MAP_POSITIONS := []
}
static ChooseYourPlants(plantName) {
super.ChooseYourPlants(plantName)
Strategy.PICKED_PLANTS.push(plantName)
Strategy.MAP_CARD_TO_N.%plantName% := Strategy.PICKED_PLANTS.Length
}
static PlacePlant(row, col, plantName) {
cardN := Strategy.MAP_CARD_TO_N.%plantName%
Strategy.SelectPlantCard(cardN)
position := Strategy.GetPixelCoord(Strategy.MAP_POSITIONS[row][col])
Click position.x, position.y
}
static SelectMap(mapName) {
Strategy.MAP_POSITIONS := {
pool: Strategy.POOL_POSITIONS
}.%mapName%
}
}
class LastStandStrategy extends Strategy {
static Start() {
LastStandStrategy.Reset()
LastStandStrategy.ChooseYourPlants('lilyPad')
LastStandStrategy.ChooseYourPlants('marigold')
LastStandStrategy.ChooseYourPlants('coffeeBean')
LastStandStrategy.ChooseYourPlants('fumeShroom')
LastStandStrategy.ChooseYourPlants('gloomShroom')
LastStandStrategy.ChooseYourPlants('magnetShroom')
LastStandStrategy.ChooseYourPlants('goldMagnet')
LastStandStrategy.ChooseYourPlants('pumpkin')
LastStandStrategy.ChooseYourPlants('garlie')
LastStandStrategy.ChooseYourPlants('wallNut')
LastStandStrategy.LetsGo()
Sleep 3500
LastStandStrategy.SelectMap('pool')
LastStandStrategy.PlacePlant(1, 1, 'marigold')
LastStandStrategy.PlacePlant(1, 2, 'marigold')
LastStandStrategy.PlacePlant(1, 3, 'marigold')
LastStandStrategy.PlacePlant(1, 4, 'marigold')
LastStandStrategy.PlacePlant(1, 5, 'marigold')
LastStandStrategy.PlacePlant(1, 6, 'marigold')
LastStandStrategy.PlacePlant(1, 7, 'marigold')
LastStandStrategy.PlacePlant(1, 8, 'garlie')
LastStandStrategy.PlacePlant(1, 9, 'garlie')
LastStandStrategy.PlacePlant(2, 1, 'marigold')
LastStandStrategy.PlacePlant(2, 2, 'marigold')
LastStandStrategy.PlacePlant(2, 3, 'marigold')
LastStandStrategy.PlacePlant(2, 4, 'marigold')
LastStandStrategy.PlacePlant(2, 5, 'marigold')
LastStandStrategy.PlacePlant(2, 6, 'wallNut')
LastStandStrategy.PlacePlant(3, 1, 'lilyPad')
LastStandStrategy.PlacePlant(3, 2, 'lilyPad')
LastStandStrategy.PlacePlant(3, 3, 'lilyPad')
LastStandStrategy.PlacePlant(3, 4, 'lilyPad')
LastStandStrategy.PlacePlant(3, 5, 'lilyPad')
LastStandStrategy.PlacePlant(3, 6, 'lilyPad')
LastStandStrategy.PlacePlant(3, 7, 'lilyPad')
LastStandStrategy.PlacePlant(3, 8, 'lilyPad')
LastStandStrategy.PlacePlant(3, 1, 'marigold')
LastStandStrategy.PlacePlant(3, 2, 'marigold')
LastStandStrategy.PlacePlant(3, 3, 'marigold')
LastStandStrategy.PlacePlant(3, 6, 'marigold')
LastStandStrategy.PlacePlant(3, 4, 'magnetShroom')
LastStandStrategy.PlacePlant(3, 5, 'magnetShroom')
LastStandStrategy.PlacePlant(3, 5, 'goldMagnet')
LastStandStrategy.PlacePlant(3, 7, 'fumeShroom')
LastStandStrategy.PlacePlant(3, 8, 'fumeShroom')
LastStandStrategy.PlacePlant(3, 7, 'gloomShroom')
LastStandStrategy.PlacePlant(3, 8, 'gloomShroom')
LastStandStrategy.PlacePlant(3, 4, 'coffeeBean')
LastStandStrategy.PlacePlant(3, 7, 'coffeeBean')
LastStandStrategy.PlacePlant(3, 8, 'coffeeBean')
LastStandStrategy.PlacePlant(3, 6, 'pumpkin')
LastStandStrategy.PlacePlant(3, 7, 'pumpkin')
LastStandStrategy.PlacePlant(3, 8, 'pumpkin')
LastStandStrategy.PlacePlant(4, 1, 'lilyPad')
LastStandStrategy.PlacePlant(4, 2, 'lilyPad')
LastStandStrategy.PlacePlant(4, 3, 'lilyPad')
LastStandStrategy.PlacePlant(4, 4, 'lilyPad')
LastStandStrategy.PlacePlant(4, 5, 'lilyPad')
LastStandStrategy.PlacePlant(4, 6, 'lilyPad')
LastStandStrategy.PlacePlant(4, 7, 'lilyPad')
LastStandStrategy.PlacePlant(4, 8, 'lilyPad')
LastStandStrategy.PlacePlant(4, 1, 'marigold')
LastStandStrategy.PlacePlant(4, 2, 'marigold')
LastStandStrategy.PlacePlant(4, 3, 'marigold')
LastStandStrategy.PlacePlant(4, 6, 'marigold')
LastStandStrategy.PlacePlant(4, 4, 'magnetShroom')
LastStandStrategy.PlacePlant(4, 5, 'magnetShroom')
LastStandStrategy.PlacePlant(4, 5, 'goldMagnet')
LastStandStrategy.PlacePlant(4, 7, 'fumeShroom')
LastStandStrategy.PlacePlant(4, 8, 'fumeShroom')
LastStandStrategy.PlacePlant(4, 7, 'gloomShroom')
LastStandStrategy.PlacePlant(4, 8, 'gloomShroom')
LastStandStrategy.PlacePlant(4, 4, 'coffeeBean')
LastStandStrategy.PlacePlant(4, 7, 'coffeeBean')
LastStandStrategy.PlacePlant(4, 8, 'coffeeBean')
LastStandStrategy.PlacePlant(4, 6, 'pumpkin')
LastStandStrategy.PlacePlant(4, 7, 'pumpkin')
LastStandStrategy.PlacePlant(4, 8, 'pumpkin')
LastStandStrategy.PlacePlant(5, 1, 'marigold')
LastStandStrategy.PlacePlant(5, 2, 'marigold')
LastStandStrategy.PlacePlant(5, 3, 'marigold')
LastStandStrategy.PlacePlant(5, 4, 'marigold')
LastStandStrategy.PlacePlant(5, 5, 'marigold')
LastStandStrategy.PlacePlant(5, 6, 'wallNut')
LastStandStrategy.PlacePlant(6, 1, 'marigold')
LastStandStrategy.PlacePlant(6, 2, 'marigold')
LastStandStrategy.PlacePlant(6, 3, 'marigold')
LastStandStrategy.PlacePlant(6, 4, 'marigold')
LastStandStrategy.PlacePlant(6, 5, 'marigold')
LastStandStrategy.PlacePlant(6, 6, 'marigold')
LastStandStrategy.PlacePlant(6, 7, 'marigold')
LastStandStrategy.PlacePlant(6, 8, 'garlie')
LastStandStrategy.PlacePlant(6, 9, 'garlie')
}
}
class IZombieEndlessStrategy extends Strategy {
static MAP_CARD_TO_N := {
imp: 1,
conedheadZombie: 2,
poleVaultingZombie: 3,
bucketHeadZombie: 4,
bungeeZombie: 5,
diggerZombie: 6,
ladderZombie: 7,
footballZombie: 8,
dancingZombie: 9,
}
static GlitchBungeeZombie() {
cardN := IZombieEndlessStrategy.MAP_CARD_TO_N.bungeeZombie
cardCoord := IZombieEndlessStrategy.GetCardCoord(cardN)
MouseGetPos &xold, &yold
Loop 24
{
Click cardCoord.x, cardCoord.y
Click xold, yold
Sleep 5
}
}
}
#HotIf WinActive(PVZ_WINDOW_TITLE)
^esc::ExitApp
q::Base.PlaceCard(1)
w::Base.PlaceCard(2)
e::Base.PlaceCard(3)
r::Base.PlaceCard(4)
t::Base.PlaceCard(5)
a::Base.PlaceCard(6)
s::Base.PlaceCard(7)
d::Base.PlaceCard(8)
f::Base.PlaceCard(9)
g::Base.PlaceCard(10)
z::Base.AutoClick("z")
x::IZombieEndlessStrategy.GlitchBungeeZombie()
F1::LastStandStrategy.Start()
#HotIf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment