basic stacking hats pattern and basic woody ennemy
This commit is contained in:
BIN
assets/sprites/bullets/example_bullet.png
Normal file
BIN
assets/sprites/bullets/example_bullet.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
assets/sprites/bullets/hatbullet.png
Normal file
BIN
assets/sprites/bullets/hatbullet.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 210 B |
BIN
assets/sprites/enemies/woody/idle.png
Normal file
BIN
assets/sprites/enemies/woody/idle.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
27
scripts/battle/bullets/hatbulllet.lua
Normal file
27
scripts/battle/bullets/hatbulllet.lua
Normal file
@@ -0,0 +1,27 @@
|
||||
---@class HatBullet : Bullet
|
||||
local HatBullet, super = Class(Bullet)
|
||||
|
||||
---@param x number # The X position of the bullet
|
||||
---@param y number # The Y position of the bullet
|
||||
---@param dir number # The dir (in radians) of the bullet
|
||||
---@param speed number # The speed the bullet will move at in the specified direction
|
||||
function HatBullet:init(x, y, dir, speed)
|
||||
-- Last argument = sprite path
|
||||
super.init(self, x, y, "bullets/hatbullet")
|
||||
|
||||
-- Move the bullet in dir radians (0 = right, pi = left, clockwise rotation)
|
||||
self.physics.direction = dir
|
||||
-- Speed the bullet moves (pixels per frame at 30FPS)
|
||||
self.physics.speed = speed
|
||||
self.collision = false
|
||||
|
||||
|
||||
end
|
||||
|
||||
function HatBullet:update()
|
||||
-- For more complicated bullet behaviours, code here gets called every update
|
||||
|
||||
super.update(self)
|
||||
end
|
||||
|
||||
return HatBullet
|
||||
21
scripts/battle/encounters/woody.lua
Normal file
21
scripts/battle/encounters/woody.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
local Woody, super = Class(Encounter)
|
||||
|
||||
function Woody:init()
|
||||
super.init(self)
|
||||
|
||||
-- Text displayed at the bottom of the screen at the start of the encounter
|
||||
self.text = "* The tutorial begins...?"
|
||||
|
||||
-- Battle music ("battle" is rude buster)
|
||||
self.music = "battle"
|
||||
-- Enables the purple grid battle background
|
||||
self.background = true
|
||||
|
||||
-- Add the woody enemy to the encounter
|
||||
self:addEnemy("woody")
|
||||
|
||||
--- Uncomment this line to add another!
|
||||
--self:addEnemy("woody")
|
||||
end
|
||||
|
||||
return Woody
|
||||
96
scripts/battle/enemies/woody.lua
Normal file
96
scripts/battle/enemies/woody.lua
Normal file
@@ -0,0 +1,96 @@
|
||||
local Woody, super = Class(EnemyBattler)
|
||||
|
||||
function Woody:init()
|
||||
super.init(self)
|
||||
|
||||
-- Enemy name
|
||||
self.name = "Woody"
|
||||
-- Sets the actor, which handles the enemy's sprites (see scripts/data/actors/Woody.lua)
|
||||
self:setActor("woody")
|
||||
|
||||
-- Enemy health
|
||||
self.max_health = 450
|
||||
self.health = 450
|
||||
-- Enemy attack (determines bullet damage)
|
||||
self.attack = 4
|
||||
-- Enemy defense (usually 0)
|
||||
self.defense = 0
|
||||
-- Enemy reward
|
||||
self.money = 100
|
||||
|
||||
-- Mercy given when sparing this enemy before its spareable (20% for basic enemies)
|
||||
self.spare_points = 20
|
||||
|
||||
-- List of possible wave ids, randomly picked each turn
|
||||
self.waves = {
|
||||
"basic",
|
||||
"aiming",
|
||||
"movingarena"
|
||||
}
|
||||
|
||||
-- Dialogue randomly displayed in the enemy's speech bubble
|
||||
self.dialogue = {
|
||||
"..."
|
||||
}
|
||||
|
||||
-- Check text (automatically has "ENEMY NAME - " at the start)
|
||||
self.check = "AT 4 DF 0\n* Cotton heart and button eye\n* Looks just like a fluffy guy."
|
||||
|
||||
-- Text randomly displayed at the bottom of the screen each turn
|
||||
self.text = {
|
||||
"* The Woody gives you a soft\nsmile.",
|
||||
"* The power of fluffy boys is\nin the air.",
|
||||
"* Smells like cardboard.",
|
||||
}
|
||||
-- Text displayed at the bottom of the screen when the enemy has low health
|
||||
self.low_health_text = "* The Woody looks like it's\nabout to fall over."
|
||||
|
||||
-- Register act called "Smile"
|
||||
self:registerAct("Smile")
|
||||
-- Register party act with Ralsei called "Tell Story"
|
||||
-- (second argument is description, usually empty)
|
||||
self:registerAct("Tell Story", "", {"ralsei"})
|
||||
end
|
||||
|
||||
function Woody:onAct(battler, name)
|
||||
if name == "Smile" then
|
||||
-- Give the enemy 100% mercy
|
||||
self:addMercy(100)
|
||||
-- Change this enemy's dialogue for 1 turn
|
||||
self.dialogue_override = "... ^^"
|
||||
-- Act text (since it's a list, multiple textboxes)
|
||||
return {
|
||||
"* You smile.[wait:5]\n* The Woody smiles back.",
|
||||
"* It seems the Woody just wanted\nto see you happy."
|
||||
}
|
||||
|
||||
elseif name == "Tell Story" then
|
||||
-- Loop through all enemies
|
||||
for _, enemy in ipairs(Game.battle.enemies) do
|
||||
-- Make the enemy tired
|
||||
enemy:setTired(true)
|
||||
end
|
||||
return "* You and Ralsei told the Woody\na bedtime story.\n* The enemies became [color:blue]TIRED[color:reset]..."
|
||||
|
||||
elseif name == "Standard" then --X-Action
|
||||
-- Give the enemy 50% mercy
|
||||
self:addMercy(50)
|
||||
if battler.chara.id == "ralsei" then
|
||||
-- R-Action text
|
||||
return "* Ralsei bowed politely.\n* The Woody spiritually bowed\nin return."
|
||||
elseif battler.chara.id == "susie" then
|
||||
-- S-Action: start a cutscene (see scripts/battle/cutscenes/Woody.lua)
|
||||
Game.battle:startActCutscene("Woody", "susie_punch")
|
||||
return
|
||||
else
|
||||
-- Text for any other character (like Noelle)
|
||||
return "* "..battler.chara:getName().." straightened the\nWoody's hat."
|
||||
end
|
||||
end
|
||||
|
||||
-- If the act is none of the above, run the base onAct function
|
||||
-- (this handles the Check act)
|
||||
return super.onAct(self, battler, name)
|
||||
end
|
||||
|
||||
return Woody
|
||||
50
scripts/battle/waves/stackinghats.lua
Normal file
50
scripts/battle/waves/stackinghats.lua
Normal file
@@ -0,0 +1,50 @@
|
||||
local StackingHats, super = Class(Wave)
|
||||
|
||||
function StackingHats:init()
|
||||
super.init(self)
|
||||
|
||||
-- The duration of our wave, in seconds. (Defaults to `5`)
|
||||
self.time = 10
|
||||
self.count = 0
|
||||
|
||||
end
|
||||
|
||||
function StackingHats:onStart()
|
||||
-- code here gets called at the start of the wave
|
||||
-- create a bullet in the center of the screen
|
||||
arena = Game.battle.arena
|
||||
arenaX, arenaY = arena:getBottomLeft()
|
||||
arenaX2, arenaY2 = arena:getBottomRight()
|
||||
self.collider = LineCollider(self, arenaX, arenaY, arenaX2, arenaY2)
|
||||
self.timer:everyInstant(1, function()
|
||||
|
||||
local x = SCREEN_WIDTH / 2
|
||||
local y = arena:getTop() * 0.5
|
||||
self.bullets[self.count] = self:spawnBullet("hatbulllet", x, y)
|
||||
-- set the bullet's speed to 4 (pixels per 1/30th second)
|
||||
self.bullets[self.count].physics.speed = 4
|
||||
self.count = self.count + 1
|
||||
end)
|
||||
super.onStart(self)
|
||||
end
|
||||
|
||||
function StackingHats:update()
|
||||
-- code here gets called every frame
|
||||
|
||||
for i = 0, self.count -1, 1 do
|
||||
for j = 0, i-1, 1 do
|
||||
if (i ~= j) then
|
||||
if (self.bullets[i].collider:collidesWith(self.bullets[j])) then
|
||||
self.bullets[i].physics.speed = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
if (self.bullets[i].collider:collidesWith(self)) then
|
||||
self.bullets[i].physics.speed = 0
|
||||
end
|
||||
end
|
||||
|
||||
super.update(self)
|
||||
end
|
||||
|
||||
return StackingHats
|
||||
54
scripts/data/actors/woody.lua
Normal file
54
scripts/data/actors/woody.lua
Normal file
@@ -0,0 +1,54 @@
|
||||
local actor, super = Class(Actor, "woody")
|
||||
|
||||
function actor:init()
|
||||
super.init(self)
|
||||
|
||||
-- Display name (optional)
|
||||
self.name = "Woody"
|
||||
|
||||
-- Width and height for this actor, used to determine its center
|
||||
self.width = 27
|
||||
self.height = 45
|
||||
|
||||
-- Hitbox for this actor in the overworld (optional, uses width and height by default)
|
||||
self.hitbox = { 0, 25, 19, 14 }
|
||||
|
||||
-- Color for this actor used in outline areas (optional, defaults to red)
|
||||
self.color = { 1, 0, 0 }
|
||||
|
||||
-- Whether this actor flips horizontally (optional, values are "right" or "left", indicating the flip direction)
|
||||
self.flip = nil
|
||||
|
||||
-- Path to this actor's sprites (defaults to "")
|
||||
self.path = "enemies/woody"
|
||||
-- This actor's default sprite or animation, relative to the path (defaults to "")
|
||||
self.default = "idle"
|
||||
|
||||
-- Sound to play when this actor speaks (optional)
|
||||
self.voice = nil
|
||||
-- Path to this actor's portrait for dialogue (optional)
|
||||
self.portrait_path = nil
|
||||
-- Offset position for this actor's portrait (optional)
|
||||
self.portrait_offset = nil
|
||||
|
||||
-- Whether this actor as a follower will blush when close to the player
|
||||
self.can_blush = false
|
||||
|
||||
-- Table of talk sprites and their talk speeds (default 0.25)
|
||||
self.talk_sprites = {}
|
||||
|
||||
-- Table of sprite animations
|
||||
self.animations = {
|
||||
-- Looping animation with 0.25 seconds between each frame
|
||||
-- (even though there's only 1 idle frame)
|
||||
["idle"] = { "idle", 0.25, true },
|
||||
}
|
||||
|
||||
-- Table of sprite offsets (indexed by sprite name)
|
||||
self.offsets = {
|
||||
-- Since the width and height is the idle sprite size, the offset is 0,0
|
||||
["idle"] = { 0, 0 },
|
||||
}
|
||||
end
|
||||
|
||||
return actor
|
||||
Reference in New Issue
Block a user