Day 20-21

master
a327ex 2021-03-10 02:47:27 -03:00
parent edbcdba3dc
commit 45b29dc137
6 changed files with 198 additions and 18 deletions

View File

@ -11,6 +11,7 @@ function Arena:on_enter(from, level, units)
self.hfx:add('condition1', 1) self.hfx:add('condition1', 1)
self.hfx:add('condition2', 1) self.hfx:add('condition2', 1)
self.level = level or 1 self.level = level or 1
self.units = units
self.floor = Group() self.floor = Group()
self.main = Group():set_as_physics_world(32, 0, 0, {'player', 'enemy', 'projectile', 'enemy_projectile'}) self.main = Group():set_as_physics_world(32, 0, 0, {'player', 'enemy', 'projectile', 'enemy_projectile'})
@ -166,10 +167,10 @@ function Arena:on_enter(from, level, units)
end end
if self.level == 1 then if self.level == 1 then
local t1 = Text2{group = self.floor, x = gw/2, y = gh/2 + 12, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]<- or a -> or d', font = fat_font, alignment = 'center'}}} local t1 = Text2{group = self.floor, x = gw/2, y = gh/2 + 2, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]<- or a -> or d', font = fat_font, alignment = 'center'}}}
local t2 = Text2{group = self.floor, x = gw/2, y = gh/2 + 28, lines = {{text = '[light_bg]turn left turn right', font = pixul_font, alignment = 'center'}}} local t2 = Text2{group = self.floor, x = gw/2, y = gh/2 + 18, lines = {{text = '[light_bg]turn left turn right', font = pixul_font, alignment = 'center'}}}
local t3 = Text2{group = self.floor, x = gw/2, y = gh/2 + 56, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]n - mute sfx', font = fat_font, alignment = 'center'}}} local t3 = Text2{group = self.floor, x = gw/2, y = gh/2 + 46, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]n - mute sfx', font = fat_font, alignment = 'center'}}}
local t4 = Text2{group = self.floor, x = gw/2, y = gh/2 + 78, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]m - mute music', font = fat_font, alignment = 'center'}}} local t4 = Text2{group = self.floor, x = gw/2, y = gh/2 + 68, sx = 0.6, sy = 0.6, lines = {{text = '[light_bg]m - mute music', font = fat_font, alignment = 'center'}}}
t1.t:after(8, function() t1.t:tween(0.2, t1, {sy = 0}, math.linear, function() t1.sy = 0 end) end) t1.t:after(8, function() t1.t:tween(0.2, t1, {sy = 0}, math.linear, function() t1.sy = 0 end) end)
t2.t:after(8, function() t2.t:tween(0.2, t2, {sy = 0}, math.linear, function() t2.sy = 0 end) end) t2.t:after(8, function() t2.t:tween(0.2, t2, {sy = 0}, math.linear, function() t2.sy = 0 end) end)
t3.t:after(8, function() t3.t:tween(0.2, t3, {sy = 0}, math.linear, function() t3.sy = 0 end) end) t3.t:after(8, function() t3.t:tween(0.2, t3, {sy = 0}, math.linear, function() t3.sy = 0 end) end)
@ -250,7 +251,7 @@ function Arena:update(dt)
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t) TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t)
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
main:go_to('buy_screen', self, self.level, self.color) main:go_to('buy_screen', self.level, self.units)
t.t:after(0.1, function() t.t:after(0.1, function()
t.text:set_text({ t.text:set_text({
{text = '[nudge_down, bg]resources gained: ' .. tostring(self.resources_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[nudge_down, bg]resources gained: ' .. tostring(self.resources_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5},

View File

@ -7,13 +7,17 @@ function BuyScreen:init(name)
end end
function BuyScreen:on_enter(from, level) function BuyScreen:on_enter(from, level, units)
self.level = level self.level = level
self.main = Group() self.main = Group()
self.top = Group()
self.ui = Group()
if self.level == 0 then if self.level == 0 then
pop1:play{pitch = random:float(0.95, 1.05), volume = 0.5} pop1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
player_hit_wall1:play{pitch = r, volume = 0.5}
self.first_screen = true self.first_screen = true
self.cards = {} self.cards = {}
self.selected_card_index = 1 self.selected_card_index = 1
@ -23,9 +27,49 @@ function BuyScreen:on_enter(from, level)
self.cards[2] = PairCard{group = self.main, x = gw/2, y = 155, w = gw, h = gh/4, unit_1 = random:table_remove(units), unit_2 = random:table_remove(units), i = 2, parent = self} self.cards[2] = PairCard{group = self.main, x = gw/2, y = 155, w = gw, h = gh/4, unit_1 = random:table_remove(units), unit_2 = random:table_remove(units), i = 2, parent = self}
local units = {'vagrant', 'swordsman', 'wizard', 'archer', 'scout', 'cleric'} local units = {'vagrant', 'swordsman', 'wizard', 'archer', 'scout', 'cleric'}
self.cards[3] = PairCard{group = self.main, x = gw/2, y = 225, w = gw, h = gh/4, unit_1 = random:table_remove(units), unit_2 = random:table_remove(units), i = 3, parent = self} self.cards[3] = PairCard{group = self.main, x = gw/2, y = 225, w = gw, h = gh/4, unit_1 = random:table_remove(units), unit_2 = random:table_remove(units), i = 3, parent = self}
self.title_sy = 1 self.title_sy = 1
self.title = Text({{text = '[wavy_mid, fg]choose your initial party', font = pixul_font, alignment = 'center'}}, global_text_tags) self.title = Text({{text = '[wavy_mid, fg]choose your initial party', font = pixul_font, alignment = 'center'}}, global_text_tags)
else
local tier_to_units = {
[1] = {'vagrant', 'swordsman', 'wizard', 'archer', 'cleric', 'scout'},
[2] = {'saboteur', 'hunter', 'cannoneer', 'stormweaver', 'squire', 'dual_gunner', 'chronomancer', 'sage', 'cannoneer'},
[3] = {'blade', 'outlaw', 'elementor', 'psykeeper', 'spellblade'},
}
local level_to_tier_weights = {
[1] = {100, 0, 0},
[2] = {95, 5, 0},
[3] = {90, 10, 0},
[4] = {85, 15, 0},
[5] = {80, 20, 0},
[6] = {75, 25, 0},
[7] = {70, 30, 0},
[8] = {65, 35, 0},
[9] = {60, 40, 0},
[10] = {55, 45, 0},
[11] = {50, 50, 0},
[12] = {45, 50, 5},
[13] = {40, 50, 10},
[14] = {35, 50, 15},
[15] = {30, 50, 20},
[16] = {25, 50, 25},
[17] = {20, 55, 25},
[18] = {15, 60, 25},
[19] = {10, 65, 25},
[20] = {5, 70, 25},
[21] = {0, 75, 25},
[22] = {0, 70, 30},
[23] = {0, 65, 35},
[24] = {0, 60, 40},
[25] = {0, 55, 45},
}
self.cards = {}
self.selected_card_index = 1
self.cards[1] = ShopCard{group = self.main, x = gw/2 - 120, y = gh/4, w = 100, h = 90, unit = random:table(tier_to_units[random:weighted_pick(unpack(level_to_tier_weights[self.level]))]), parent = self}
self.cards[2] = ShopCard{group = self.main, x = gw/2, y = gh/4, w = 100, h = 90, unit = random:table(tier_to_units[random:weighted_pick(unpack(level_to_tier_weights[self.level]))]), parent = self}
self.cards[3] = ShopCard{group = self.main, x = gw/2 + 120, y = gh/4, w = 100, h = 90, unit = random:table(tier_to_units[random:weighted_pick(unpack(level_to_tier_weights[self.level]))]), parent = self}
self.shop_text_sy = 1
self.shop_text = Text({{text = '[wavy_mid, fg]shop', font = pixul_font, alignment = 'center'}}, global_text_tags)
end end
end end
@ -33,6 +77,8 @@ end
function BuyScreen:update(dt) function BuyScreen:update(dt)
self:update_game_object(dt*slow_amount) self:update_game_object(dt*slow_amount)
self.main:update(dt*slow_amount) self.main:update(dt*slow_amount)
self.top:update(dt*slow_amount)
self.ui:update(dt*slow_amount)
if self.level == 0 and self.first_screen then if self.level == 0 and self.first_screen then
if self.title then self.title:update(dt) end if self.title then self.title:update(dt) end
@ -80,29 +126,146 @@ function BuyScreen:update(dt)
}, global_text_tags)} }, global_text_tags)}
]]-- ]]--
end end
else
if self.shop_text then self.shop_text:update(dt) end
end end
end end
function BuyScreen:draw() function BuyScreen:draw()
self.main:draw() self.main:draw()
self.top:draw()
self.ui:draw()
if self.level == 0 then if self.level == 0 then
if self.title then self.title:draw(3.25*gw/4, 25, 0, 1, self.title_sy) end if self.title then self.title:draw(3.25*gw/4, 25, 0, 1, self.title_sy) end
if self.unit_info_text then if self.unit_info_text then self.unit_info_text:draw(gw/2, gh/2) end
self.unit_info_text:draw(gw/2, gh/2) else
end if self.shop_text then self.shop_text:draw(gw/2, 15, 0, 1, self.shop_text_sy) end
end end
end end
ShopCard = Object:extend()
ShopCard:implement(GameObject)
function ShopCard:init(args)
self:init_game_object(args)
self.character_icon = CharacterIcon{group = main.current.top, x = self.x, y = self.y, character = self.unit}
self.class_icons = {}
for i, class in ipairs(character_classes[self.unit]) do
local x = self.x
if #character_classes[self.unit] == 2 then x = self.x - 10
elseif #character_classes[self.unit] == 3 then x = self.x - 20 end
table.insert(self.class_icons, ClassIcon{group = main.current.top, x = x + (i-1)*20, y = self.y + 10, class = class})
end
end
function ShopCard:update(dt)
self:update_game_object(dt)
if self.unit_text then self.unit_text:update(dt) end
end
function ShopCard:select()
self.selected = true
self.spring:pull(0.2, 200, 10)
self.t:every_immediate(1.4, function()
if self.selected then
self.t:tween(0.7, self, {sx = 0.97, sy = 0.97, plus_r = -math.pi/32}, math.linear, function()
self.t:tween(0.7, self, {sx = 1.03, sy = 1.03, plus_r = math.pi/32}, math.linear, nil, 'pulse_1')
end, 'pulse_2')
end
end, nil, nil, 'pulse')
end
function ShopCard:unselect()
self.selected = false
self.t:cancel'pulse'
self.t:cancel'pulse_1'
self.t:cancel'pulse_2'
self.t:tween(0.1, self, {sx = 1, sy = 1, plus_r = 0}, math.linear, function() self.sx, self.sy, self.plus_r = 1, 1, 0 end, 'pulse')
end
function ShopCard:draw()
end
CharacterIcon = Object:extend()
CharacterIcon:implement(GameObject)
function CharacterIcon:init(args)
self:init_game_object(args)
self.character_text = Text({{text = '[' .. character_color_strings[self.character] .. ']' .. self.character, font = pixul_font, alignment = 'center'}}, global_text_tags)
end
function CharacterIcon:update(dt)
self:update_game_object(dt)
self.character_text:update(dt)
end
function CharacterIcon:draw()
graphics.push(self.x, self.y, 0, self.spring.x, self.spring.x)
graphics.rectangle(self.x, self.y - 25, 12, 12, 3, 3, character_colors[self.character])
self.character_text:draw(self.x, self.y - 10)
graphics.pop()
end
ClassIcon = Object:extend()
ClassIcon:implement(GameObject)
function ClassIcon:init(args)
self:init_game_object(args)
self.shape = Rectangle(self.x, self.y, 20, 30)
self.interact_with_mouse = true
end
function ClassIcon:update(dt)
self:update_game_object(dt)
end
function ClassIcon:draw()
graphics.push(self.x, self.y, 0, self.spring.x, self.spring.x)
_G[self.class]:draw(self.x, self.y, 0, 0.4, 0.4, 0, 0, class_colors[self.class])
graphics.pop()
end
function ClassIcon:on_mouse_enter()
self.spring:pull(0.2, 200, 10)
self.info_text = InfoText{group = main.current.ui}
self.info_text:activate({
{text = '[' .. class_color_strings[self.class] .. ']' .. self.class:capitalize(), font = pixul_font, alignment = 'center', height_multiplier = 1.25},
{text = class_descriptions[self.class](0), font = pixul_font, alignment = 'center'},
}, nil, nil, nil, nil, 16, 4, nil, 2)
self.info_text.x, self.info_text.y = gw/2, self.y + 60
end
function ClassIcon:on_mouse_exit()
self.info_text:deactivate()
self.info_text = nil
end
PairCard = Object:extend() PairCard = Object:extend()
PairCard:implement(GameObject) PairCard:implement(GameObject)
function PairCard:init(args) function PairCard:init(args)
self:init_game_object(args) self:init_game_object(args)
self.plus_r = 0 self.plus_r = 0
if self.i == 1 then self:select() end if self.i == 1 then self:select() end
end end

View File

@ -341,3 +341,9 @@ screen.
First screen, transition from it to arena, arena and transition from arena to next screen are 99% complete and polished. There's one small bug left that I can't replicate where it will end the level right away, but I can't tell First screen, transition from it to arena, arena and transition from arena to next screen are 99% complete and polished. There's one small bug left that I can't replicate where it will end the level right away, but I can't tell
with which win condition it's happening... I'll fix it in time. Tomorrow I can get started on the main buy screen for real. with which win condition it's happening... I'll fix it in time. Tomorrow I can get started on the main buy screen for real.
# Day 20-21 - 08-09/03/21
Initial work done on the main buy screen. Fairly slow moving still. There's a sort of conceptual fuzziness that happens when writing UI code where there's a few different ways of doing it and this freedom seems fairly paralyzing.
I've been thinking really hard about what to do about that but it's still up in the air. The "dead simple layouts" thing is a good idea but layouting is not necessarily the main problem I have, it's more like relationships between
different objects and a UI coordination issue that seems to stop me.

View File

@ -77,7 +77,11 @@ end
-- The closer to 0, the more of a parallaxing effect there will be. -- The closer to 0, the more of a parallaxing effect there will be.
function Group:draw(scroll_factor_x, scroll_factor_y) function Group:draw(scroll_factor_x, scroll_factor_y)
if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end
for _, object in ipairs(self.objects) do object:draw() end for _, object in ipairs(self.objects) do
if not object.hidden then
object:draw()
end
end
if self.camera then self.camera:detach() end if self.camera then self.camera:detach() end
end end
@ -86,7 +90,11 @@ end
-- group:draw_range(1, 3) -> draws only 1st, 2nd and 3rd objects in this group -- group:draw_range(1, 3) -> draws only 1st, 2nd and 3rd objects in this group
function Group:draw_range(i, j, scroll_factor_x, scroll_factor_y) function Group:draw_range(i, j, scroll_factor_x, scroll_factor_y)
if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end
for k = i, j do self.objects[k]:draw() end for k = i, j do
if not self.objects[k].hidden then
self.objects[k]:draw()
end
end
if self.camera then self.camera:detach() end if self.camera then self.camera:detach() end
end end
@ -96,7 +104,7 @@ end
function Group:draw_class(class, scroll_factor_x, scroll_factor_y) function Group:draw_class(class, scroll_factor_x, scroll_factor_y)
if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end
for _, object in ipairs(self.objects) do for _, object in ipairs(self.objects) do
if object:is(class) then if object:is(class) and not object.hidden then
object:draw() object:draw()
end end
end end
@ -109,7 +117,7 @@ end
function Group:draw_all_except(classes, scroll_factor_x, scroll_factor_y) function Group:draw_all_except(classes, scroll_factor_x, scroll_factor_y)
if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end if self.camera then self.camera:attach(scroll_factor_x, scroll_factor_y) end
for _, object in ipairs(self.objects) do for _, object in ipairs(self.objects) do
if not table.any(classes, function(v) return object:is(v) end) then if not table.any(classes, function(v) return object:is(v) end) and not object.hidden then
object:draw() object:draw()
end end
end end

View File

@ -263,14 +263,14 @@ function init()
['healer'] = function(lvl) return '[' .. ylb1(lvl) .. ']3 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]healing effectiveness' end, ['healer'] = function(lvl) return '[' .. ylb1(lvl) .. ']3 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]healing effectiveness' end,
['conjurer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]construct damage and duration' end, ['conjurer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]construct damage and duration' end,
['enchanter'] = function(lvl) return '[' .. ylb1(lvl) .. ']3 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]damage to all allies' end, ['enchanter'] = function(lvl) return '[' .. ylb1(lvl) .. ']3 [fg]- [' .. ylb1(lvl) .. ']+25% [fg]damage to all allies' end,
['psy'] = function(lvl) return 'damage taken by psy units is reflected to enemies at double its value' end, ['psy'] = function(lvl) return '[fg]damage taken by psy units is reflected to enemies at double its value' end,
} }
resource = 0 resource = 0
main = Main() main = Main()
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
main:go_to('buy_screen', 0) main:go_to('buy_screen', 1, {})
end end

View File

@ -433,6 +433,7 @@ global_text_tags = {
fg = TextTag{draw = function(c, i, text) graphics.set_color(fg[0]) end}, fg = TextTag{draw = function(c, i, text) graphics.set_color(fg[0]) end},
wavy = TextTag{update = function(c, dt, i, text) c.oy = 2*math.sin(4*time + i) end}, wavy = TextTag{update = function(c, dt, i, text) c.oy = 2*math.sin(4*time + i) end},
wavy_mid = TextTag{update = function(c, dt, i, text) c.oy = 0.75*math.sin(3*time + i) end}, wavy_mid = TextTag{update = function(c, dt, i, text) c.oy = 0.75*math.sin(3*time + i) end},
wavy_mid2 = TextTag{update = function(c, dt, i, text) c.oy = 0.5*math.sin(3*time + i) end},
wavy_lower = TextTag{update = function(c, dt, i, text) c.oy = 0.25*math.sin(2*time + i) end}, wavy_lower = TextTag{update = function(c, dt, i, text) c.oy = 0.25*math.sin(2*time + i) end},
cbyc = TextTag{init = function(c, i, text) cbyc = TextTag{init = function(c, i, text)
@ -485,6 +486,7 @@ function InfoText:init(args)
self.ow, self.oh = 0, 0 self.ow, self.oh = 0, 0
self.tox, self.toy = 0, 0 self.tox, self.toy = 0, 0
self.text = Text({}, global_text_tags) self.text = Text({}, global_text_tags)
return self
end end
@ -515,7 +517,7 @@ end
function InfoText:deactivate() function InfoText:deactivate()
self.t:cancel'activate' self.t:cancel'activate'
self.t:tween(0.05, self, {sy = 0}, math.linear, function() self.sy = 0 end, 'deactivate') self.t:tween(0.05, self, {sy = 0}, math.linear, function() self.sy = 0; self.dead = true end, 'deactivate')
end end