view code/ghost1.gq @ 71:920f02a880fc

Added interceptor ghost
author Michael Pavone <pavone@retrodev.com>
date Mon, 28 Jul 2014 00:41:59 -0700
parents
children
line wrap: on
line source

#{
	up <- 0
	right <- 1
	down <- 2
	left <- 3
	lastX <- 0
	lastY <- 0
	
	getDirX <- :dir startX {
		if: dir = right {
			startX <- startX + 1
		} else: {
			if: dir = left {
				startX <- startX - 1 
			}
		}
		startX
	}
	
	getDirY <- :dir startY {
		if: dir = up {
			startY <- startY - 1
		} else: {
			if: dir = down {
				startY <- startY + 1 
			}
		}
		startY
	}
	
	opDir <- :dir {
		if: dir < 2 {
			dir <- dir + 2
		} else: {
			dir <- dir - 2
		}
		dir
	}

	goTowardsX:Y <- :targetX targetY {
		myIdx <- (me: )
		myX <- ghostPos: myIdx
		myY <- yCoord
		myVit <- ghostStatus: myIdx
		myDir <- direction
		
		
		firstChoice <- 0
		secondChoice <- 0
		
		if: myX > targetX {
			//ghost is to the right of target
			if: myY > targetY {
				//ghost is below target
				if: (myX - targetX) > (myY - targetY) {
					//target is more left than up
					firstChoice <- left
					secondChoice <- up
				} else: {
					firstChoice <- up
					secondChoice <- left
				}
			} else: {
				//ghost is above or directly to the right of target
				if: (myX - targetX) > (targetY - myY) {
					//target is more left than down
					firstChoice <- left
					secondChoice <- down
				} else: {
					//target is more down than left
					firstChoice <- down
					secondChoice <- left
				}
			}
		} else: {
			//ghost is to the left of or directly above/below target
			if: myY > targetY {
				//ghost is below target
				if: (targetX - myX) > (myY - targetY) {
					//target is more right than up
					firstChoice <- right
					secondChoice <- up
				} else: {
					firstChoice <- up
					secondChoice <- right
				}
			} else: {
				//ghost is above or directly to the left of target
				if: (targetX - myX) > (targetY - myY) {
					//target is more right than down
					firstChoice <- right
					secondChoice <- down
				} else: {
					//target is more down than right
					firstChoice <- down
					secondChoice <- right
				}
			}
		}
		if: myVit = 1 {
			//currently in fright mode, try to run away
			firstChoice <- opDir: firstChoice
			secondChoice <- opDir: secondChoice
		}
		
		
		
		tmp <- 0
		i <- 0
		while: { i < 3} do: {
			targetX <- getDirX: firstChoice myX
			targetY <- getDirY: firstChoice myY
		
			if: (mapContentsAt: targetX targetY) - 1 > 4 {
				//first choice is a wall or ghost start pos
				tmp <- firstChoice
				firstChoice <- secondChoice
				secondChoice <- opDir: firstChoice
				i <- i + 1
			} else: {
				if: firstChoice = (opDir: myDir) {
					//first choice is backwards
					tmp <- firstChoice
					firstChoice <- secondChoice
					secondChoice <- opDir: firstChoice
					i <- i + 1
				} else: {
					i <- 3
				}
			}
		}
		direction!: firstChoice

		0
	}

	//tries to intercept lambda man by targeting a
	//position two cells ahead of his current position
	main <- {
		lmX <- lambdamanPos:
		lmY <- yCoord
		diffX <- 0
		diffY <- 0
		
		if: notFirst? = 1 {
			diffX <- lmX - lastX
			diffY <- lmY - lastY
		}
		lastX <- lmX
		lastY <- lmY
		
		lmX <- (lmX + diffX) + diffX
		lmY <- (lmY + diffY) + diffY
		
		goTowardsX: lmX Y: lmY
		
	}
}