require "pattern" imp = {} local DEBUG_FN_NAME = false function imp.reset() imp.hit=imp.hit imp.update=imp.update imp.draw=imp.draw imp.hab=abad.hab imp.enabled=false imp.counter=500 end -- function imp.new(_hab, _x, _y) -- local world_x, world_y = coords.room_to_world(_hab,_x,_y) -- _fight_modes={"chase","away","super","end_super","shot"} -- for i,v in ipairs(_fight_modes) do _fight_modes[v] = i end -- -- return { name="imp", -- hab=_hab, -- x=world_x, y=world_y, -- w=32, h=32, -- flip=true, -- frame=28, -- wait=0, -- vides=1, -- energia=21, -- max_energia=21, -- falling=0, -- step=0, -- hurting=0, -- jumpfwd=false, -- step_length=1, -- vmove_space=1, -- max_jump_height=24, -- jump_height=0, -- jump_in_half_block=0, -- jump_in_half_block_used = false, -- -- max_shoot_cooldown=24, -- shot_power=1, -- shot_num_shots=1, -- shoot_cooldown=25, -- anim={28,29,28,30}, -- bb={x=8,y=0,w=16,h=32}, -- -- scene_intro=false, -- -- scene_object=false, -- enabled=true, -- disable_reason="", -- can_warp=false, -- -- Atributs de jefe -- movement_type="", -- Mode de moviment {pattern, free} -- action="", -- Acció a realitzar en el "pad" -- movement="", -- Cap on es mou independentment de si està "flipat" -- fight_modes=_fight_modes, -- mode de lluita (Llevar?) -- fight_mode="stop", -- mode de lluita actiu -- fight_mode_cooldown=1500, -- cicles fins al canvi de mode -- -- super_cooldown=2000, -- cicles fins a Super actiu -- super_cooldown=200, -- cicles fins a Super actiu -- shot_cooldown=100, -- cicles fina a poder disparar -- hot_points={}, -- llista de punts del mapa on anar -- target={}, -- següent punt on anar -- old_target={}, -- target anterior -- paths={}, -- Llista de "camins" a fer des d'un hot_point -- path={}, -- Cami actiu -- path_curr_action=1, -- Index d'acció dins del cami actiu -- action_event="", -- Event d'acció que ha passat -- analisis={}, -- Resultat de la informació extreta de l'entorn -- old_action="-", -- invencible=false, -- invencible_time=50, -- flip_wait=100, -- Temps per a forçar un flip -- super_wait=200, -- zoom=1, -- super_pal={[13]=13,[14]=14,[15]=15}, -- super_fired = false, -- -- direccio=imp.direccio, -- draw=imp.draw, -- hit=imp.hit, -- do_jump=imp.do_jump, -- jump=imp.jump, -- state_jumping=imp.state_jumping, -- update=imp.state_normal, -- land=imp.land, -- advance=imp.advance, -- -- Funcions de jefe -- fight=imp.fight, -- Inicialització per al combat. Crea el punts, carrega els paths, etc. -- -- chase=imp.chase, -- -- away=imp.away, -- move=imp.move, -- Determina el següent moviment a fer (dreta, esq, bot, etc...) -- super=imp.super, -- Activa el mode super poder -- state_super=imp.state_super, -- Entra en estat super poder -- shot=imp.shot, -- Dispara -- do_flip=imp.do_flip, -- Orienta a l'imp cap a l'actor -- -- mode_controller=imp.mode_controller, -- reduce_cooldown=imp.reduce_cooldown, -- Decrementa els cooldown -- reset_fight_mode_cooldown=imp.reset_fight_mode_cooldown, -- Asignar un valor a fight_mode_cooldown (per a mantindre una coherència cada volta que es crida) -- controller_input=imp.controller_input, -- Traduir l'accio en moviment -- actualitzar_comportament=imp.actualitzar_comportament, -- "Pensar" que fer -- analyze_env=imp.analyze_env, -- Analitza l'entorn a vore que està pasant -- -- path_reset=imp.path_reset, -- Elimina el path actiu -- path_next_action=imp.path_next_action, -- Següent acció del path actiu -- path_action=imp.path_action, -- Acció actual del path actiu -- -- pattern_movement=imp.pattern_movement, -- Pasar a mode de moviment per patró -- pattern_next_action=imp.pattern_next_action, -- Següent acció en mode pattern -- pattern_next_target=imp.pattern_next_target, -- Següent target en mode pattern -- pattern_recovery=imp.pattern_recovery, -- Si per algun motiu perd el mode pattern recuperar-lo -- -- -- Al afegir pattern_recovery el moviment lliure no te sentit (ni es gasta en este moment), se queda ara per si de cas -- free_movement=imp.free_movement, -- Pasar a mode de moviment lliure -- free_next_action=imp.free_next_action, -- Següent acció en mode lliure -- free_next_target=imp.free_next_target, -- Següent target en mode free -- -- super_ready=imp.super_ready, -- super_movement=imp.super_movement, -- super_next_action=imp.super_next_action, -- super_next_target=imp.super_next_target, -- -- next_action=imp.next_action, -- Següent acció en qualsevol mode de moviment -- next_target=imp.next_target, -- Següent target en qualsevol mode de moviment -- -- -- imp.enabled=false -- -- imp.counter=500 -- } -- end -- function imp.new(_hab,_x,_y) local world_x, world_y = coords.room_to_world(_hab,_x,_y) return { -- Venia de caco name="imp", hab=_hab, x=world_x, y=world_y, w=32, h=32, flip=true, frame=28, wait=0, step=0, can_warp=true, warping=false, shrink=1, d_shrink=1, angle=0, d_angle=15, hit=imp.hit, update=imp.update_normal, draw=imp.draw, jumpfwd=false, dying=false, death_time=40, anim={28,29,28,30}, -- seqüencia de frames bb={x=8,y=0,w=16,h=32}, enabled= true, disable_reason="", -- Ve de imp1 energia=21, max_energia=21, actions={no_action=0, up=1, down=2, left=4, right=8, jump=16, shot=32, super=64}, moods={stop=0, chase=1, avoid=2, neutral=4}, mood=0, --anterior fight_mode timers={mood=150,target=250, shot=2500, super=20000, flip_wait=50}, --anterior *_cooldown move_types={free=0, pattern=1, super=2}, move_type=1, -- anterior movement_type -- hot_points={}, -- llista de punts del mapa on anar -- paths={}, -- Llista de "camins" a fer des d'un hot_point -- -- paths_active = 0, -- Número de path seleccionat -- pattern={}, -- Instruccions per a moviment per patró, anterior path -- pattern_point=1, -- anterior path_curr_action -- target={}, -- Punt al que anar shot_target=nil, -- a qui disparar analisis = {}, -- memoria per a guardar el resultat de l'analisis step_length=1, falling = 0, action_event="", -- Event d'acció que ha passat jump_height=0, max_jump_height=24, pattern= pattern.new(), vmove_space = 1, -- funcions next_frame = imp.staying_next_frame, -- funcio de seleccio del frame choose_mood = imp.choose_mood, analyze_env = imp.analyze_env, choose_target = imp.choose_target, choose_action = imp.choose_action, do_flip = imp.do_flip, colisions = imp.colisions, fight = imp.fight, create_hot_points = imp.create_hot_points, load_pattern_paths= imp.load_pattern_paths, free_movement = imp.free_movement, pattern_movement = imp.pattern_movement, next_action = imp.next_action, pattern_next_action = imp.pattern_next_action, pattern_action = imp.pattern_action, moure = imp.state_normal, controller_input = imp.controller_input, reduce_timers = imp.reduce_timers, reset_mood_timer = imp.reset_mood_timer, path_reset = imp.path_reset, next_target = imp.next_target, free_next_target = imp.free_next_target, pattern_next_target = imp.pattern_next_target, super_next_target = imp.super_next_target, pattern_recovery = imp.pattern_recovery, pattern_get_next_path = imp.pattern_get_next_path, do_jump = imp.do_jump, land = imp.land, shot = imp.shot, advance=imp.advance, jump=imp.jump, reset_target_timer=imp.reset_target_timer, _moure=imp._moure, -- temporal debug } end function imp:draw() --OK local scr_x, scr_y = viewp:screen_coords( self.x, self.y ) -- Modo super if self.moure==self.state_super then -- rotar paleta for col=13,15 do local newc = self.super_pal[col] if self.super_wait%6 == 0 then newc = newc+1 if newc>15 then newc=13 end end pal.subpal(col,newc) self.super_pal[col]=newc end -- pintar draw.surf(96, 32, self.w, self.h, scr_x, scr_y-self.h*(self.zoom-1), self.w*self.zoom, self.h*self.zoom, self.flip) -- restaurar paleta for col=13,15 do pal.subpal(col) end else -- Modo normal if self.invencible then pal.subpal(5,1) end draw.surf((self.frame&7)*self.w, (self.frame>>cxr2)*self.h, self.w, self.h, scr_x, scr_y, self.w, self.h, self.flip) pal.subpal(5) end end function imp:hit() -- OK if DEBUG_FN_NAME then print("hit") end if not self.invencible then self.energia = self.energia -1 if distancia(self, abad)<50 and self.invencible_time<=0 then self.invencible = true self.invencible_time = 50 end end if self.energia==1 then self.can_warp=true end if self.energia <= 0 then self.energia = 0 -- self.enabled = false print("END BOSS") if self.can_warp then self.warping=true end self.shrink=1 self.angle=0 self.dying=true -- calcular velocitat per al warp local warp_time = self.death_time/3 self.d_angle = 720 / warp_time; -- 720 = 2 voltes self.d_shrink = self.shrink / warp_time end end function imp:update_hit() if not self.enabled then return end -- Que pasa quan "mor" end function imp:update_normal() print("-------------------------------------------------") print("") if self.mood~=self.moods.stop then print("TARGET= "..self.pattern:target()) end if self.mood~=self.moods.stop then print("ACTIONS= "..#self.pattern:actions()) end print("TARGET TIMER= "..self.timers.target) self:reduce_timers() -- Ajustar mood (emocions) -- self:choose_mood() -- self:choose_target() -- analisis self:analyze_env() -- decisio self:choose_action() -- moviment self:controller_input() self:moure() -- Logica per a selecció de frame -- self:next_frame() -- colisions en personatges -- self:colisions() end -- imp.next_frame() function imp:walking_next_frame() -- Selecció de frame if self.wait==6 then self.wait=0 self.step=(self.step+1)%4 self.frame=self.anim[self.step+1] end -- Orientar self:do_flip() -- Aguantar el flip if self.timers.flip_wait<=0 then if self.mood==self.moods.chase then self:do_flip(abad) else self:do_flip(self.target) end end end function imp:jumping_next_frame() self.frame=30 end function imp:falling_next_frame() self.frame=30 end function imp:staying_next_frame() self.frame=28 end function imp:super_next_frame() self.frame=11 end -- /imp.next_frame() -- imp.move() function walking_move() -- comprovar colsions en l'entorn en cas de moure -- moure el personatge end function jumping_move() end function falling_move() end function staying_move() end function super_move() end -- /imp.move() function imp:do_flip( actor ) actor = actor or self.target -- enllaçat a actor if actor.xabad.x then flip=true x_ini = self.x-4 end local hab, tx, ty, off_x, off_y = coords.world_to_tile(x_ini,self.y+(self.h/4)) fireball.init(hab, tx, ty, flip, off_x, off_y) sound.play(audio_hit) self.shot_cooldown = 100 end -- function imp:actualitzar_comportament() -- if DEBUG_FN_NAME then print("actualitzar_comportament") end -- self:reduce_cooldown() -- if self.invencible_time<=0 then self.invencible=false end -- -- if self.update==imp.state_jumping or self.update==imp.state_falling then -- -- -- self:think() -- -- -- self:move() -- -- end -- self:analyze_env() -- if self.moure==imp.state_walking or self.update==imp.state_normal then -- self:move() -- end -- self:controller_input() -- end require "imp_mood" require "imp_action" require "imp_target" require "imp_movement" require "imp_states" require "imp_super"