1
Bugs & Feature requests / Re: Upgrading game data v1.2 to v1.3
« on: May 10, 2015, 12:50:23 AM »
I sent you the link.
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
local entities = ...
local boingIsReady = true
--TODO: Make it compatible with separator manager script
function entities:on_created()
-- Call a function every 22 milliseconds.
sol.timer.start(22, function()
if(boingIsReady == true) then
-- Get hero position
local hero_x, hero_y, hero_layer = self:get_map():get_entity("hero"):get_position()
-- When changed in engine, get hero width & height here
local hero_width = 16
local hero_height = 16
-- Get entity position
local ent_x, ent_y, ent_layer = self:get_position()
local ent_width, ent_height = self:get_size()
--TODO: change this line, I hate it, not clean at all
if( ( (ent_x - 12) < hero_x) and ( (ent_x + ent_width - 3) > hero_x) and ( (ent_y - 12) < hero_y) and ( (ent_y - 11 + ent_height) > hero_y) ) then
--self:get_map():get_entity("hero"):set_position(hero_x, hero_y + 1, hero_layer)
self:get_map():get_entity("hero"):freeze()
-- Get center point of entity and hero
local ent_center_x = ent_x + (ent_width / 2)
local ent_center_y = ent_y + (ent_height / 2)
local hero_center_x = hero_x + (hero_width / 2)
local hero_center_y = hero_y + (hero_height / 2)
-- Get delta x and delta y
local delta_x = hero_center_x - ent_center_x
local delta_y = hero_center_y - ent_center_y
local angle = 0
--Check if value is 0 or else division by 0
if(delta_x == 0) then
if(delta_y <= 0) then
angle = math.pi / 2
else
angle = 3 * math.pi / 2
end
else
-- Get angle with arctan
angle = math.atan(delta_y / delta_x)
-- Check the side of the angle
if(ent_center_x < hero_center_x) then
-- reverse angle, for some weird reason, atan start it's angle at pi instead of 0... Correct me if I am wrong
angle = angle * -1
elseif(ent_center_x > hero_center_x) then
-- Substract from pi
angle = math.pi - angle
end
end
-- Set movement stuff
local m = sol.movement.create("straight")
m:set_speed(130)
m:set_max_distance(32)
m:get_ignore_obstacles(false)
-- Set movement angle
m:set_angle(angle)
-- Start movement
m:start(self:get_map():get_entity("hero"))
-- Boing!
sol.audio.play_sound("bounce")
-- Lock function
boingIsReady = false
sol.timer.start(300, function()
-- Check if hero is still freezed, if not, do nothing
if( self:get_map():get_entity("hero"):get_state() == "freezed") then
self:get_map():get_entity("hero"):unfreeze()
end
-- Unlock function
boingIsReady = true
end)
end --If position
end --if(boingIsReady == true)
return true
end) --main timer
end
-- This script manages enemies when there are separators in a map.
-- Enemies that are prefixed by "auto_enemy" are automatically
-- reset at their initial position when taking separators prefixed by "auto_separator".
local separator_manager = {}
function separator_manager:manage_map(map)
local enemy_places = {}
-- Store the position and properties of enemies.
for enemy in map:get_entities("auto_enemy") do
local x, y, layer = enemy:get_position()
local spriteTemp = enemy:get_sprite()
local reappear = 0
if( string.find(enemy:get_name(), "reappear") ~= nil ) then
reappear = 1
else
reappear = 0
end
enemy_places[#enemy_places + 1] = {
x = x,
y = y,
layer = layer,
--direction = enemy:get_sprite():get_direction(),
enemy = enemy,
-- Get breed to recreate it if it has to reappear
breed = enemy:get_breed(),
name = enemy:get_name(),
life = enemy:get_life(),
--Set if enemy should reappear or not
reappear = reappear,
}
enemy:set_enabled(false)
end
-- Function called when a separator was just taken.
local function separator_on_activating(separator)
local hero = map:get_hero()
for _, enemy_place in ipairs(enemy_places) do
local enemy = enemy_place.enemy
--Check if enemy is tagged to reappear unpon entering the screen
if( enemy_place.reappear == 1 ) then
-- if enemy is destroyed or about to be
if( enemy:exists() == false ) or ( enemy:get_life() <= 0 ) then
-- Create enemy
enemy_place.enemy = map:create_enemy{
name = enemy_place.name,
breed = enemy_place.breed,
x = enemy_place.x,
y = enemy_place.y,
layer = enemy_place.layer,
direction = 0,
}
enemy = enemy_place.enemy
else
-- If not destroyed or about to then reset life counter
enemy:set_life(enemy_place.life)
end
end
if enemy:exists() then
if enemy:get_life() > 0 then
if enemy:is_in_same_region(hero) then
enemy:set_position(enemy_place.x, enemy_place.y, enemy_place.layer)
--enemy:get_sprite():set_direction(enemy_place.direction)
enemy:set_enabled(false)
end
end
end
end
end
-- Function called after a separator was just taken.
local function separator_on_activated(separator)
local hero = map:get_hero()
for _, enemy_place in ipairs(enemy_places) do
local enemy = enemy_place.enemy
if enemy:exists() then
if enemy:get_life() > 0 then
if enemy:is_in_same_region(hero) then
enemy:set_enabled(true)
enemy:restart()
end
end
end
end
end
for separator in map:get_entities("auto_separator") do
separator.on_activating = separator_on_activating
separator.on_activated = separator_on_activated
end
end
return separator_manager
-- This script manages enemies when there are separators in a map.
-- Enemies that are prefixed by "auto_enemy" are automatically
-- reset at their initial position when taking separators prefixed by "auto_separator".
local separator_manager = {}
function separator_manager:manage_map(map)
local enemy_places = {}
-- Store the position and properties of enemies.
for enemy in map:get_entities("auto_enemy") do
local x, y, layer = enemy:get_position()
local spriteTemp = enemy:get_sprite()
enemy_places[#enemy_places + 1] = {
x = x,
y = y,
layer = layer,
--direction = enemy:get_sprite():get_direction(),
enemy = enemy,
--Set if enemy should reappear or not
--reappear = 0,
}
enemy:set_enabled(false)
end
-- Function called when a separator was just taken.
local function separator_on_activating(separator)
local hero = map:get_hero()
for _, enemy_place in ipairs(enemy_places) do
local enemy = enemy_place.enemy
--string.find(s, pattern [, index [, plain]])
if enemy:exists() then
if enemy:get_life() <= 0 then
if enemy:is_in_same_region(hero) then
enemy:set_position(enemy_place.x, enemy_place.y, enemy_place.layer)
--enemy:get_sprite():set_direction(enemy_place.direction)
enemy:set_enabled(false)
end
end
end
end
end
-- Function called after a separator was just taken.
local function separator_on_activated(separator)
local hero = map:get_hero()
for _, enemy_place in ipairs(enemy_places) do
local enemy = enemy_place.enemy
if enemy:exists() then
if enemy:get_life() <= 0 then
if enemy:is_in_same_region(hero) then
enemy:set_enabled(true)
enemy:restart()
end
end
end
end
end
for separator in map:get_entities("auto_separator") do
separator.on_activating = separator_on_activating
separator.on_activated = separator_on_activated
end
end
return separator_manager
animation{
name = "walking",
src_image = "enemies/fireBall.png",
frame_delay = 50,
frame_to_loop_on = 0,
directions = {
{ x = 0, y = 0, frame_width = 16, frame_height = 16, origin_x = 0, origin_y = 0, num_frames = 2 },
{ x = 0, y = 0, frame_width = 16, frame_height = 16, origin_x = 0, origin_y = 0, num_frames = 2 },
{ x = 0, y = 0, frame_width = 16, frame_height = 16, origin_x = 0, origin_y = 0, num_frames = 2 },
{ x = 0, y = 0, frame_width = 16, frame_height = 16, origin_x = 0, origin_y = 0, num_frames = 2 },
},
}
local enemy = ...
function enemy:on_created()
self:set_life(1)
self:set_damage(2)
self:create_sprite("fireBall")
self:set_size(16, 16)
self:set_origin(8, 8)
self:set_invincible()
self:set_obstacle_behavior("flying")
end
-- Circles around the enemy that created it
function enemy:go_circle(center_entity, rayon, notRev)
local m = sol.movement.create("circle")
m:set_center(center_entity, -8, -29)
m:set_radius(rayon)
m:set_angle_speed(88)
m:set_ignore_obstacles(true)
m:set_clockwise(notRev)
m:start(self)
end
local enemy = ...
local son, son2, son3, son4
function enemy:on_created()
self:set_life(1)
self:set_damage(0)
self:set_size(16, 16)
self:set_origin(8, 8)
self:set_invincible()
self:set_obstacle_behavior("flying")
son = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son:go_circle(self, 16, true)
son:set_optimization_distance(0) -- We do not want the enemy to ever stop if player is too far,
-- take note this is consuming resourcces. Use disabled() function stop.
son2 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son2:go_circle(self, 32, true)
son2:set_optimization_distance(0)
son3 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son3:go_circle(self, 48, true)
son3:set_optimization_distance(0)
son4 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son4:go_circle(self, 64, true)
son4:set_optimization_distance(0)
son:set_enabled(true)
son2:set_enabled(true)
son3:set_enabled(true)
son4:set_enabled(true)
end
function enemy:on_restarted()
son:set_enabled(true)
son2:set_enabled(true)
son3:set_enabled(true)
son4:set_enabled(true)
son:go_circle(self, 16, true)
son:set_optimization_distance(0)
son2:go_circle(self, 32, true)
son2:set_optimization_distance(0)
son3:go_circle(self, 48, true)
son3:set_optimization_distance(0)
son4:go_circle(self, 64, true)
son4:set_optimization_distance(0)
end
function enemy:on_disabled()
son:set_enabled(false)
son2:set_enabled(false)
son3:set_enabled(false)
son4:set_enabled(false)
end
local enemy = ...
local son, son2, son3, son4
function enemy:on_created()
self:set_life(1)
self:set_damage(0)
self:set_size(16, 16)
self:set_origin(8, 8)
self:set_invincible()
self:set_obstacle_behavior("flying")
son = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son:go_circle(self, 16, false)
son:set_optimization_distance(0)
son2 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son2:go_circle(self, 32, false)
son2:set_optimization_distance(0)
son3 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son3:go_circle(self, 48, false)
son3:set_optimization_distance(0)
son4 = self:create_enemy{
name = son_name,
breed = "fireBall",
x = 0,
y = 0,
layer = 0,
}
son4:go_circle(self, 64, false)
son4:set_optimization_distance(0)
son:set_enabled(true)
son2:set_enabled(true)
son3:set_enabled(true)
son4:set_enabled(true)
end
function enemy:on_restarted()
son:set_enabled(true)
son2:set_enabled(true)
son3:set_enabled(true)
son4:set_enabled(true)
son:go_circle(self, 16, false)
son:set_optimization_distance(0)
son2:go_circle(self, 32, false)
son2:set_optimization_distance(0)
son3:go_circle(self, 48, false)
son3:set_optimization_distance(0)
son4:go_circle(self, 64, false)
son4:set_optimization_distance(0)
end
function enemy:on_disabled()
son:set_enabled(false)
son2:set_enabled(false)
son3:set_enabled(false)
son4:set_enabled(false)
end
animation{
name = "stopped",
src_image = "enemies/fire_bat.png",
directions = {
{ x = 160, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 1 },
{ x = 160, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 1 },
{ x = 160, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 1 },
{ x = 160, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 1 },
},
}
animation{
name = "walking",
src_image = "enemies/fire_bat.png",
frame_delay = 50,
frame_to_loop_on = 2,
directions = {
{ x = 96, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 4 },
{ x = 96, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 4 },
{ x = 96, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 4 },
{ x = 96, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 4 },
},
}
animation{
name = "hurt",
src_image = "enemies/fire_bat.png",
frame_delay = 50,
frame_to_loop_on = 0,
directions = {
{ x = 192, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 2 },
{ x = 192, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 2 },
{ x = 192, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 2 },
{ x = 192, y = 0, frame_width = 32, frame_height = 32, origin_x = 16, origin_y = 16, num_frames = 2 },
},
}
local enemy = ...
local going_hero = false
local m
function enemy:on_created()
self:set_life(1)
self:set_damage(2)
self:create_sprite("enemies/fire_bat")
self:set_size(16, 8)
self:set_origin(8, 0)
self:set_obstacle_behavior("flying")
m = sol.movement.create("target")
m:set_ignore_obstacles(false)
m:set_speed(0)
m:start(self)
end
function enemy:on_restarted()
local sprite = self:get_sprite()
sprite:set_animation("stopped")
m:set_speed(0)
going_hero = false
self:go_random()
self:check_hero()
end
function enemy:check_hero()
local hero = self:get_map():get_entity("hero")
local _, _, layer = self:get_position()
local _, _, hero_layer = hero:get_position()
local near_hero = layer == hero_layer
and self:get_distance(hero) < 150
if near_hero and not going_hero then
self:go_hero()
sol.audio.play_sound("bat")
elseif not near_hero and going_hero then
self:go_random()
end
sol.timer.stop_all(self)
sol.timer.start(self, 100, function() self:check_hero() end)
end
function enemy:go_random()
going_hero = false
local sprite = self:get_sprite()
sprite:set_animation("stopped")
m:set_speed(0)
end
function enemy:go_hero()
going_hero = true
local sprite = self:get_sprite()
sprite:set_animation("walking")
m:set_speed(88)
end