// File: KellerMartins[P]PDS2-Pacman/source/game/enemy.cpp
// Function: Enemy::OnUpdate()
void Enemy::OnUpdate(){
	if(!_isOver){
		int pac_x = Pacman::GetX();
		int pac_y = Pacman::GetY();
		int dirX =  Pacman::GetDirX();
		int dirY =  Pacman::GetDirY();

		_timerScatter += GetFrameTime();
		if(_timerScatter > SCATTER_TIME) {
			_scatter = true;
		}
		if(_timerScatter <= 0){
			_scatter = false;
		}

		if(GetAlive() && IsScared()){
			_model.SetColor(PURPLE);
			_timerScatter = 0;
		}
		else if(GetAlive() && !IsScared()){
			_model.SetColor(_color);
		}
		
		int newGoalX,newGoalY;
		SetGoal(newGoalX, newGoalY, pac_x,pac_y, dirX, dirY);


		if(newGoalX >= 0 && newGoalX < LARGURA && 
		newGoalY >= 0 && newGoalY < ALTURA && 
		Mapa::GetElementoMapa(newGoalX, newGoalY) != ElementoMapa::Parede){
			_goalX = newGoalX;
			_goalY = newGoalY;
		}

		_velocidade = _scared && _alive ? GHOST_SPEED_SCARED : GHOST_SPEED_DEFAULT;
		_timerMovimento += GetFrameTime()*_velocidade;
		
		if(abs(_x-Modulus(_x+_direcaoX, LARGURA)) != LARGURA-1){
			_model.position.x = Lerp(_x, _x+_direcaoX, _timerMovimento);
		}else{
			_model.position.x = _x+_direcaoX;
			_timerMovimento = 1;
		}

		if(abs(_y-Modulus(_y+_direcaoY, ALTURA)) != ALTURA-1){
			_model.position.z = Lerp(_y, _y+_direcaoY, _timerMovimento);
		}else{
			_model.position.z = _y+_direcaoY;
			_timerMovimento = 1;
		}

		if(_timerMovimento >= 1){
			_timerMovimento = 0;
			_x = Modulus(_x+_direcaoX, LARGURA);
			_y = Modulus(_y+_direcaoY, ALTURA);
			_model.position.x = _x;
			_model.position.z = _y;
			Mapa::ObtemDirecao(_x, _y, _goalX,_goalY, _direcaoX, _direcaoY);

			if(!_alive && _x == _goalX && _y == _goalY){
				_alive = true;
				_model.SetColor(_color);
				_model.Load3DModel("assets/models/ghost.obj");
			}
		}

		float lookAngle = _direcaoX < 0 ? -90 : 
						  _direcaoX > 0 ? 90 :
						  _direcaoY < 0 ? 180 : 
						  _direcaoY > 0 ? 0 : _model.rotationAngle;
		
		_model.rotationAngle = Lerp(_model.rotationAngle, lookAngle, GetFrameTime()*5);

	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x70(%rbp)
testb $0x1, 0xdf11a(%rip)     # 0xeae88
jne 0xc344
callq 0x14790
movl %eax, -0xc(%rbp)
callq 0x147a0
movl %eax, -0x10(%rbp)
callq 0x147b0
movl %eax, -0x14(%rbp)
callq 0x147c0
movl %eax, -0x18(%rbp)
callq 0x3b476
movq -0x70(%rbp), %rax
addss 0x2e8(%rax), %xmm0
movss %xmm0, 0x2e8(%rax)
movss 0x2e8(%rax), %xmm0
movss 0x99393(%rip), %xmm1    # 0xa5150
ucomiss %xmm1, %xmm0
jbe 0xbdcd
movq -0x70(%rbp), %rax
movb $0x1, 0x2d8(%rax)
movq -0x70(%rbp), %rax
xorps %xmm0, %xmm0
ucomiss 0x2e8(%rax), %xmm0
jb 0xbde8
movq -0x70(%rbp), %rax
movb $0x0, 0x2d8(%rax)
movq -0x70(%rbp), %rdi
callq 0xc360
testb $0x1, %al
jne 0xbdf7
jmp 0xbe33
callq 0xc380
testb $0x1, %al
jne 0xbe02
jmp 0xbe33
movq -0x70(%rbp), %rdi
addq $0x8, %rdi
movb $-0x38, -0x1c(%rbp)
movb $0x7a, -0x1b(%rbp)
movb $-0x1, -0x1a(%rbp)
movb $-0x1, -0x19(%rbp)
movl -0x1c(%rbp), %esi
callq 0x16050
movq -0x70(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, 0x2e8(%rax)
jmp 0xbe69
movq -0x70(%rbp), %rdi
callq 0xc360
testb $0x1, %al
jne 0xbe42
jmp 0xbe67
callq 0xc380
testb $0x1, %al
jne 0xbe67
movq -0x70(%rbp), %rax
movq %rax, %rdi
addq $0x8, %rdi
movl 0x2e0(%rax), %eax
movl %eax, -0x20(%rbp)
movl -0x20(%rbp), %esi
callq 0x16050
jmp 0xbe69
movq -0x70(%rbp), %rdi
movl -0xc(%rbp), %ecx
movl -0x10(%rbp), %r8d
movl -0x14(%rbp), %r9d
movl -0x18(%rbp), %r10d
movq (%rdi), %rax
leaq -0x24(%rbp), %rsi
leaq -0x28(%rbp), %rdx
movl %r10d, (%rsp)
callq *0x28(%rax)
cmpl $0x0, -0x24(%rbp)
jl 0xbecc
cmpl $0x15, -0x24(%rbp)
jge 0xbecc
cmpl $0x0, -0x28(%rbp)
jl 0xbecc
cmpl $0x1b, -0x28(%rbp)
jge 0xbecc
movl -0x24(%rbp), %edi
movl -0x28(%rbp), %esi
callq 0x104d0
cmpl $0x1, %eax
je 0xbecc
movq -0x70(%rbp), %rax
movl -0x24(%rbp), %ecx
movl %ecx, 0x2ec(%rax)
movl -0x28(%rbp), %ecx
movl %ecx, 0x2f0(%rax)
xorl %eax, %eax
testb $0x1, 0xdefb4(%rip)     # 0xeae89
movb %al, -0x71(%rbp)
je 0xbee7
movq -0x70(%rbp), %rax
movb 0x2d9(%rax), %al
movb %al, -0x71(%rbp)
movb -0x71(%rbp), %al
movsd 0x9926e(%rip), %xmm0    # 0xa5160
movsd 0x9926e(%rip), %xmm1    # 0xa5168
movsd %xmm1, -0x88(%rbp)
testb $0x1, %al
movsd %xmm0, -0x80(%rbp)
jne 0xbf18
movsd -0x88(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movq -0x70(%rbp), %rax
movsd -0x80(%rbp), %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x2dc(%rax)
callq 0x3b476
movq -0x70(%rbp), %rax
movss 0x2dc(%rax), %xmm2
movss 0x2e4(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, 0x2e4(%rax)
movl 0x2c8(%rax), %ecx
movl %ecx, -0x8c(%rbp)
movl 0x2c8(%rax), %edi
addl 0x2d4(%rax), %edi
movl $0x15, %esi
callq 0xb9e0
movl %eax, %ecx
movl -0x8c(%rbp), %eax
subl %ecx, %eax
movl %eax, %ecx
negl %ecx
cmovnsl %ecx, %eax
cmpl $0x14, %eax
je 0xbfc2
movq -0x70(%rbp), %rax
cvtsi2ssl 0x2c8(%rax), %xmm0
movl 0x2c8(%rax), %ecx
addl 0x2d4(%rax), %ecx
cvtsi2ss %ecx, %xmm1
movss 0x2e4(%rax), %xmm2
callq 0xb670
movq -0x70(%rbp), %rax
movss %xmm0, 0x18(%rax)
jmp 0xbfeb
movq -0x70(%rbp), %rax
movl 0x2c8(%rax), %ecx
addl 0x2d4(%rax), %ecx
cvtsi2ss %ecx, %xmm0
movss %xmm0, 0x18(%rax)
movss 0x9902d(%rip), %xmm0    # 0xa5010
movss %xmm0, 0x2e4(%rax)
movq -0x70(%rbp), %rax
movl 0x2cc(%rax), %ecx
movl %ecx, -0x90(%rbp)
movl 0x2cc(%rax), %edi
addl 0x2d0(%rax), %edi
movl $0x1b, %esi
callq 0xb9e0
movl %eax, %ecx
movl -0x90(%rbp), %eax
subl %ecx, %eax
movl %eax, %ecx
negl %ecx
cmovnsl %ecx, %eax
cmpl $0x1a, %eax
je 0xc05b
movq -0x70(%rbp), %rax
cvtsi2ssl 0x2cc(%rax), %xmm0
movl 0x2cc(%rax), %ecx
addl 0x2d0(%rax), %ecx
cvtsi2ss %ecx, %xmm1
movss 0x2e4(%rax), %xmm2
callq 0xb670
movq -0x70(%rbp), %rax
movss %xmm0, 0x20(%rax)
jmp 0xc084
movq -0x70(%rbp), %rax
movl 0x2cc(%rax), %ecx
addl 0x2d0(%rax), %ecx
cvtsi2ss %ecx, %xmm0
movss %xmm0, 0x20(%rax)
movss 0x98f94(%rip), %xmm0    # 0xa5010
movss %xmm0, 0x2e4(%rax)
movq -0x70(%rbp), %rax
movss 0x2e4(%rax), %xmm0
movss 0x98f78(%rip), %xmm1    # 0xa5010
ucomiss %xmm1, %xmm0
jb 0xc22c
movq -0x70(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, 0x2e4(%rax)
movl 0x2c8(%rax), %edi
addl 0x2d4(%rax), %edi
movl $0x15, %esi
callq 0xb9e0
movl %eax, %ecx
movq -0x70(%rbp), %rax
movl %ecx, 0x2c8(%rax)
movl 0x2cc(%rax), %edi
addl 0x2d0(%rax), %edi
movl $0x1b, %esi
callq 0xb9e0
movq -0x70(%rbp), %r9
movl %eax, 0x2cc(%r9)
cvtsi2ssl 0x2c8(%r9), %xmm0
movss %xmm0, 0x18(%r9)
cvtsi2ssl 0x2cc(%r9), %xmm0
movss %xmm0, 0x20(%r9)
movl 0x2c8(%r9), %edi
movl 0x2cc(%r9), %esi
movl 0x2ec(%r9), %edx
movl 0x2f0(%r9), %ecx
movq %r9, %r8
addq $0x2d4, %r8             # imm = 0x2D4
addq $0x2d0, %r9             # imm = 0x2D0
callq 0x10370
movq -0x70(%rbp), %rax
testb $0x1, 0x2d9(%rax)
jne 0xc22a
movq -0x70(%rbp), %rcx
movl 0x2c8(%rcx), %eax
cmpl 0x2ec(%rcx), %eax
jne 0xc22a
movq -0x70(%rbp), %rcx
movl 0x2cc(%rcx), %eax
cmpl 0x2f0(%rcx), %eax
jne 0xc22a
movq -0x70(%rbp), %rax
movb $0x1, 0x2d9(%rax)
movq %rax, %rdi
addq $0x8, %rdi
movq %rdi, -0xa0(%rbp)
movl 0x2e0(%rax), %eax
movl %eax, -0x2c(%rbp)
movl -0x2c(%rbp), %esi
callq 0x16050
leaq -0x51(%rbp), %rdi
movq %rdi, -0x98(%rbp)
callq 0x9f60
movq -0x98(%rbp), %rdx
leaq 0x98fa8(%rip), %rsi     # 0xa5170
leaq -0x50(%rbp), %rdi
callq 0x9b20
jmp 0xc1d3
movq -0xa0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x15e90
jmp 0xc1e5
leaq -0x50(%rbp), %rdi
callq 0x9530
leaq -0x51(%rbp), %rdi
callq 0x9960
jmp 0xc22a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
jmp 0xc21c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x9530
leaq -0x51(%rbp), %rdi
callq 0x9960
jmp 0xc34d
jmp 0xc22c
movq -0x70(%rbp), %rax
cmpl $0x0, 0x2d4(%rax)
jge 0xc24e
movss 0x98f1b(%rip), %xmm0    # 0xa515c
movss %xmm0, -0xa4(%rbp)
jmp 0xc2e7
movq -0x70(%rbp), %rax
cmpl $0x0, 0x2d4(%rax)
jle 0xc26d
movss 0x98ef5(%rip), %xmm0    # 0xa5158
movss %xmm0, -0xa8(%rbp)
jmp 0xc2d7
movq -0x70(%rbp), %rax
cmpl $0x0, 0x2d0(%rax)
jge 0xc28c
movss 0x98ed2(%rip), %xmm0    # 0xa5154
movss %xmm0, -0xac(%rbp)
jmp 0xc2c7
movq -0x70(%rbp), %rax
cmpl $0x0, 0x2d0(%rax)
jle 0xc2a6
xorps %xmm0, %xmm0
movss %xmm0, -0xb0(%rbp)
jmp 0xc2b7
movq -0x70(%rbp), %rax
movss 0x3c(%rax), %xmm0
movss %xmm0, -0xb0(%rbp)
movss -0xb0(%rbp), %xmm0
movss %xmm0, -0xac(%rbp)
movss -0xac(%rbp), %xmm0
movss %xmm0, -0xa8(%rbp)
movss -0xa8(%rbp), %xmm0
movss %xmm0, -0xa4(%rbp)
movq -0x70(%rbp), %rax
movss -0xa4(%rbp), %xmm0
movss %xmm0, -0x68(%rbp)
movss 0x3c(%rax), %xmm0
movss %xmm0, -0xb4(%rbp)
movss -0x68(%rbp), %xmm0
movss %xmm0, -0xb8(%rbp)
callq 0x3b476
movss -0xb8(%rbp), %xmm1
movaps %xmm0, %xmm2
movss -0xb4(%rbp), %xmm0
movss 0x98ce2(%rip), %xmm3    # 0xa5014
mulss %xmm3, %xmm2
callq 0xb670
movq -0x70(%rbp), %rax
movss %xmm0, 0x3c(%rax)
addq $0xc0, %rsp
popq %rbp
retq
movq -0x60(%rbp), %rdi
callq 0x9f50
nopw %cs:(%rax,%rax)