mirror of
https://github.com/LDDestroier/CC/
synced 2025-05-28 17:44:05 +00:00
Delete game.lua
This commit is contained in:
parent
13729986a8
commit
3577a33008
@ -1,513 +0,0 @@
|
|||||||
local game = {}
|
|
||||||
game.path = fs.combine(fs.getDir(shell.getRunningProgram()),".game")
|
|
||||||
game.apiPath = fs.combine(game.path, "api")
|
|
||||||
game.spritePath = fs.combine(game.path, "sprites")
|
|
||||||
game.mapPath = fs.combine(game.path, "maps")
|
|
||||||
game.imagePath = fs.combine(game.path, "image")
|
|
||||||
game.configPath = fs.combine(game.path, "config.cfg")
|
|
||||||
|
|
||||||
local scr_x, scr_y = term.getSize()
|
|
||||||
local mapname = "testmap"
|
|
||||||
|
|
||||||
local scrollX = 0
|
|
||||||
local scrollY = 0
|
|
||||||
|
|
||||||
local keysDown = {}
|
|
||||||
|
|
||||||
local tsv = function(visible)
|
|
||||||
if term.current().setVisible then
|
|
||||||
term.current().setVisible(visible)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local getAPI = function(apiName, apiPath, apiURL, doDoFile)
|
|
||||||
if not fs.exists(apiPath) then
|
|
||||||
write("Getting " .. apiName .. "...")
|
|
||||||
local prog = http.get(apiURL)
|
|
||||||
if prog then
|
|
||||||
print("success!")
|
|
||||||
local file = fs.open(apiPath, "w")
|
|
||||||
file.write(prog.readAll())
|
|
||||||
file.close()
|
|
||||||
else
|
|
||||||
error("fail!")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if doDoFile then
|
|
||||||
_ENV[fs.getName(apiPath)] = dofile(apiPath)
|
|
||||||
else
|
|
||||||
os.loadAPI(apiPath)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
getAPI("NFT Extra", "nfte", "https://github.com/LDDestroier/NFT-Extra/raw/master/nfte", false)
|
|
||||||
|
|
||||||
-- load sprites from sprite folder
|
|
||||||
-- sprites are separated into "sets", but the only one here is "megaman" so whatever
|
|
||||||
|
|
||||||
local sprites, maps = {}, {}
|
|
||||||
for k, set in pairs(fs.list(game.spritePath)) do
|
|
||||||
sprites[set] = {}
|
|
||||||
for num, name in pairs(fs.list(fs.combine(game.spritePath, set))) do
|
|
||||||
sprites[set][name:gsub(".nft", "")] = nfte.loadImage(fs.combine(game.spritePath, set .. "/" .. name))
|
|
||||||
print("Loaded sprite " .. name:gsub(".nft",""))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for num, name in pairs(fs.list(game.mapPath)) do
|
|
||||||
maps[name:gsub(".nft", "")] = nfte.loadImage(fs.combine(game.mapPath, name))
|
|
||||||
print("Loaded map " .. name:gsub(".nft",""))
|
|
||||||
end
|
|
||||||
|
|
||||||
local projectiles = {}
|
|
||||||
local players = {}
|
|
||||||
|
|
||||||
local newPlayer = function(name, spriteset, x, y)
|
|
||||||
return {
|
|
||||||
name = name, -- player name
|
|
||||||
spriteset = spriteset, -- set of sprites to use
|
|
||||||
sprite = "stand", -- current sprite
|
|
||||||
direction = 1, -- 1 is right, -1 is left
|
|
||||||
xsize = 10, -- hitbox x size
|
|
||||||
ysize = 8, -- hitbox y size
|
|
||||||
x = x, -- x position
|
|
||||||
y = y, -- y position
|
|
||||||
xadj = 0, -- adjust x for good looks
|
|
||||||
yadj = 0, -- adjust y for good looks
|
|
||||||
xvel = 0, -- x velocity
|
|
||||||
yvel = 0, -- y velocity
|
|
||||||
jumpHeight = 3, -- height of jump
|
|
||||||
jumpAssist = 0.5, -- assists jump while in air
|
|
||||||
moveSpeed = 1.5, -- speed of walking
|
|
||||||
gravity = 0.75, -- force of gravity
|
|
||||||
slideSpeed = 4, -- speed of sliding
|
|
||||||
grounded = false, -- is on solid ground
|
|
||||||
shots = 0, -- how many shots onscreen
|
|
||||||
maxShots = 3, -- maximum shots onscreen
|
|
||||||
lemonSpeed = 3, -- speed of megabuster shots
|
|
||||||
chargeLevel = 0, -- current charged buster level
|
|
||||||
cycle = { -- used for animation cycles
|
|
||||||
run = 0, -- used for run sprite
|
|
||||||
shoot = 0, -- determines duration of shoot sprite
|
|
||||||
shootHold = 0, -- forces user to release then push shoot
|
|
||||||
stand = 0, -- used for high-octane eye blinking action
|
|
||||||
slide = 0, -- used to limit slide length
|
|
||||||
jump = 0, -- used to prevent auto-bunnyhopping
|
|
||||||
shootCharge = 0, -- records how charged your megabuster is
|
|
||||||
ouch = 0, -- records hitstun
|
|
||||||
iddqd = 0 -- records invincibility frames
|
|
||||||
},
|
|
||||||
chargeDiscolor = { -- swaps colors during buster charging
|
|
||||||
[0] = {{}},
|
|
||||||
[1] = { -- charge level one
|
|
||||||
{
|
|
||||||
["b"] = "a"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
["b"] = "b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[2] = { -- woAH charge level two
|
|
||||||
{
|
|
||||||
--["f"] = "b",
|
|
||||||
["b"] = "3",
|
|
||||||
["3"] = "f"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
--["f"] = "3",
|
|
||||||
["3"] = "b",
|
|
||||||
["b"] = "f"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
--["f"] = "3",
|
|
||||||
["3"] = "b",
|
|
||||||
["b"] = "8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
control = { -- inputs
|
|
||||||
up = false, -- move up ladders
|
|
||||||
down = false, -- move down ladders, or slide
|
|
||||||
left = false, -- point and walk left
|
|
||||||
right = false, -- point and walk right
|
|
||||||
jump = false, -- jump, or slide
|
|
||||||
shoot = false -- fire your weapon
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local deriveControls = function(keyList)
|
|
||||||
return {
|
|
||||||
up = keyList[keys.up],
|
|
||||||
down = keyList[keys.down],
|
|
||||||
left = keyList[keys.left],
|
|
||||||
right = keyList[keys.right],
|
|
||||||
jump = keyList[keys.x],
|
|
||||||
shoot = keyList[keys.z]
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- main colision function
|
|
||||||
local isSolid = function(x, y)
|
|
||||||
x = math.floor(x)
|
|
||||||
y = math.floor(y)
|
|
||||||
if (not maps[mapname][1][y]) or (x < 1) then
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
if (maps[mapname][1][y]:sub(x,x) == " " or
|
|
||||||
maps[mapname][1][y]:sub(x,x) == "") and
|
|
||||||
(maps[mapname][3][y]:sub(x,x) == " " or
|
|
||||||
maps[mapname][3][y]:sub(x,x) == "") then
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local isPlayerTouchingSolid = function(player, xmod, ymod, ycutoff)
|
|
||||||
for y = player.y + (ycutoff or 0), player.ysize + player.y - 1 do
|
|
||||||
for x = player.x, player.xsize + player.x - 1 do
|
|
||||||
if isSolid(x + (xmod or 0), y + (ymod or 0)) then
|
|
||||||
return "map"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
you = 1
|
|
||||||
players[you] = newPlayer("LDD", "megaman", 40, 8)
|
|
||||||
|
|
||||||
local movePlayer = function(player, x, y)
|
|
||||||
i = player.yvel / math.abs(player.yvel)
|
|
||||||
for y = 1, math.abs(player.yvel) do
|
|
||||||
if isPlayerTouchingSolid(player, 0, -i, (player.cycle.slide > 0 and 2 or 0)) then
|
|
||||||
if player.yvel < 0 then
|
|
||||||
player.grounded = true
|
|
||||||
end
|
|
||||||
player.yvel = 0
|
|
||||||
break
|
|
||||||
else
|
|
||||||
player.y = player.y - i
|
|
||||||
player.grounded = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
i = player.xvel / math.abs(player.xvel)
|
|
||||||
for x = 1, math.abs(player.xvel) do
|
|
||||||
if isPlayerTouchingSolid(player, i, 0, (player.cycle.slide > 0 and 2 or 0)) then
|
|
||||||
if player.grounded and not isPlayerTouchingSolid(player, i, -1) then -- upward slope detection
|
|
||||||
player.y = player.y - 1
|
|
||||||
player.x = player.x + i
|
|
||||||
grounded = true
|
|
||||||
else
|
|
||||||
player.xvel = 0
|
|
||||||
break
|
|
||||||
end
|
|
||||||
else
|
|
||||||
player.x = player.x + i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- types of projectiles
|
|
||||||
|
|
||||||
local bullet = {
|
|
||||||
lemon = {
|
|
||||||
damage = 1,
|
|
||||||
element = "neutral",
|
|
||||||
sprites = {
|
|
||||||
sprites["megaman"]["buster1"]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
lemon2 = {
|
|
||||||
damage = 1,
|
|
||||||
element = "neutral",
|
|
||||||
sprites = {
|
|
||||||
sprites["megaman"]["buster2-1"],
|
|
||||||
sprites["megaman"]["buster2-2"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
lemon3 = {
|
|
||||||
damage = 4,
|
|
||||||
element = "neutral",
|
|
||||||
sprites = {
|
|
||||||
sprites["megaman"]["buster3-1"],
|
|
||||||
sprites["megaman"]["buster3-2"],
|
|
||||||
sprites["megaman"]["buster3-3"],
|
|
||||||
sprites["megaman"]["buster3-4"],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
local spawnProjectile = function(boolit, owner, x, y, xvel, yvel)
|
|
||||||
projectiles[#projectiles+1] = {
|
|
||||||
owner = owner,
|
|
||||||
bullet = boolit,
|
|
||||||
x = x,
|
|
||||||
y = y,
|
|
||||||
xvel = xvel,
|
|
||||||
yvel = yvel,
|
|
||||||
direction = xvel / math.abs(xvel),
|
|
||||||
life = 32,
|
|
||||||
cycle = 0,
|
|
||||||
phaze = false,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local moveTick = function()
|
|
||||||
local i
|
|
||||||
for num, player in pairs(players) do
|
|
||||||
|
|
||||||
-- falling
|
|
||||||
|
|
||||||
player.yvel = player.yvel - player.gravity
|
|
||||||
|
|
||||||
-- jumping
|
|
||||||
|
|
||||||
if player.control.jump then
|
|
||||||
if player.grounded then
|
|
||||||
if player.cycle.jump == 0 then
|
|
||||||
if player.control.down and player.cycle.slide == 0 then
|
|
||||||
player.cycle.slide = 6
|
|
||||||
elseif not isPlayerTouchingSolid(player, 0, 0, 0) then
|
|
||||||
player.yvel = player.yvel + player.jumpHeight
|
|
||||||
player.cycle.slide = 0
|
|
||||||
player.grounded = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
player.cycle.jump = 1
|
|
||||||
end
|
|
||||||
if player.yvel > 0 and not player.grounded then
|
|
||||||
player.yvel = player.yvel + player.jumpAssist
|
|
||||||
end
|
|
||||||
else
|
|
||||||
player.cycle.jump = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
-- walking
|
|
||||||
|
|
||||||
if player.control.right then
|
|
||||||
player.direction = 1
|
|
||||||
player.xvel = player.moveSpeed
|
|
||||||
elseif player.control.left then
|
|
||||||
player.direction = -1
|
|
||||||
player.xvel = -player.moveSpeed
|
|
||||||
else
|
|
||||||
player.xvel = 0
|
|
||||||
end
|
|
||||||
if player.cycle.slide > 0 then
|
|
||||||
player.xvel = player.direction * player.slideSpeed
|
|
||||||
end
|
|
||||||
|
|
||||||
-- shooting
|
|
||||||
|
|
||||||
if player.control.shoot then
|
|
||||||
if player.cycle.shootHold == 0 then
|
|
||||||
if player.shots < player.maxShots then
|
|
||||||
spawnProjectile(
|
|
||||||
bullet.lemon,
|
|
||||||
player,
|
|
||||||
player.x + player.xsize * player.direction,
|
|
||||||
player.y + 2,
|
|
||||||
player.lemonSpeed * player.direction,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
player.cycle.shoot = 5
|
|
||||||
player.shots = player.shots + 1
|
|
||||||
end
|
|
||||||
player.cycle.shootHold = 1
|
|
||||||
end
|
|
||||||
if player.cycle.shootHold == 1 then
|
|
||||||
player.cycle.shootCharge = player.cycle.shootCharge + 1
|
|
||||||
if player.cycle.shootCharge < 16 then
|
|
||||||
player.chargeLevel = 0
|
|
||||||
elseif player.cycle.shootCharge < 32 then
|
|
||||||
player.chargeLevel = 1
|
|
||||||
else
|
|
||||||
player.chargeLevel = 2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
player.cycle.shootHold = 0
|
|
||||||
if player.shots < player.maxShots then
|
|
||||||
if player.cycle.shootCharge > 16 then
|
|
||||||
if player.cycle.shootCharge >= 32 then
|
|
||||||
spawnProjectile(
|
|
||||||
bullet.lemon3,
|
|
||||||
player,
|
|
||||||
player.x + math.max(0, player.direction * player.xsize),
|
|
||||||
player.y,
|
|
||||||
player.lemonSpeed * player.direction,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
else
|
|
||||||
spawnProjectile(
|
|
||||||
bullet.lemon2,
|
|
||||||
player,
|
|
||||||
player.x + math.max(0, player.direction * player.xsize),
|
|
||||||
player.y + 1,
|
|
||||||
player.lemonSpeed * player.direction,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
end
|
|
||||||
player.shots = player.shots + 1
|
|
||||||
player.cycle.shoot = 5
|
|
||||||
end
|
|
||||||
end
|
|
||||||
player.cycle.shootCharge = 0
|
|
||||||
player.chargeLevel = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
-- movement
|
|
||||||
|
|
||||||
movePlayer(player, xvel, yvel)
|
|
||||||
|
|
||||||
scrollX = player.x - math.floor(scr_x / 2) + math.floor(player.xsize / 2)
|
|
||||||
scrollY = player.y - math.floor(scr_y / 2) + math.floor(player.ysize / 2)
|
|
||||||
|
|
||||||
-- projectile management
|
|
||||||
|
|
||||||
for i = #projectiles, 1, -1 do
|
|
||||||
projectiles[i].x = projectiles[i].x + projectiles[i].xvel
|
|
||||||
projectiles[i].y = projectiles[i].y + projectiles[i].yvel
|
|
||||||
projectiles[i].cycle = projectiles[i].cycle + 1
|
|
||||||
projectiles[i].life = projectiles[i].life - 1
|
|
||||||
if projectiles[i].life <= 0 then
|
|
||||||
table.remove(projectiles, i)
|
|
||||||
player.shots = player.shots - 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local render = function()
|
|
||||||
tsv(false)
|
|
||||||
term.clear()
|
|
||||||
nfte.drawImage(maps[mapname], -scrollX + 1, -scrollY + 1)
|
|
||||||
for num,player in pairs(players) do
|
|
||||||
term.setCursorPos(1,num)
|
|
||||||
print("(" .. player.x .. ", " .. player.y .. ", " .. tostring(player.shots) .. ")")
|
|
||||||
if player.direction == -1 then
|
|
||||||
nfte.drawImageTransparent(
|
|
||||||
nfte.colorSwap(
|
|
||||||
nfte.flipX(
|
|
||||||
sprites[player.spriteset][player.sprite]
|
|
||||||
),
|
|
||||||
player.chargeDiscolor[player.chargeLevel][
|
|
||||||
(math.floor(player.cycle.shootCharge / 2) % #player.chargeDiscolor[player.chargeLevel]) + 1
|
|
||||||
]
|
|
||||||
),
|
|
||||||
player.x - scrollX + player.xadj,
|
|
||||||
player.y - scrollY + player.yadj
|
|
||||||
)
|
|
||||||
else
|
|
||||||
nfte.drawImageTransparent(
|
|
||||||
nfte.colorSwap(
|
|
||||||
sprites[player.spriteset][player.sprite],
|
|
||||||
player.chargeDiscolor[player.chargeLevel][
|
|
||||||
(math.floor(player.cycle.shootCharge / 2) % #player.chargeDiscolor[player.chargeLevel]) + 1
|
|
||||||
]
|
|
||||||
),
|
|
||||||
player.x - scrollX,
|
|
||||||
player.y - scrollY
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for num,p in pairs(projectiles) do
|
|
||||||
if p.direction == -1 then
|
|
||||||
nfte.drawImageTransparent(
|
|
||||||
nfte.flipX(p.bullet.sprites[(p.cycle % #p.bullet.sprites) + 1]),
|
|
||||||
p.x - scrollX,
|
|
||||||
p.y - scrollY
|
|
||||||
)
|
|
||||||
else
|
|
||||||
nfte.drawImageTransparent(
|
|
||||||
p.bullet.sprites[(p.cycle % #p.bullet.sprites) + 1],
|
|
||||||
p.x - scrollX,
|
|
||||||
p.y - scrollY
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
tsv(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- determines what sprite a player uses
|
|
||||||
local determineSprite = function(player)
|
|
||||||
local output
|
|
||||||
player.xadj = 0
|
|
||||||
player.yadj = 0
|
|
||||||
if player.grounded then
|
|
||||||
if player.cycle.slide > 0 then
|
|
||||||
player.cycle.slide = math.max(player.cycle.slide - 1, isPlayerTouchingSolid(player, 0, 0, 0) and 1 or 0)
|
|
||||||
output = "slide"
|
|
||||||
else
|
|
||||||
if player.xvel == 0 then
|
|
||||||
player.cycle.run = -1
|
|
||||||
player.cycle.stand = (player.cycle.stand + 1) % 40
|
|
||||||
if player.cycle.shoot > 0 then
|
|
||||||
player.cycle.shoot = player.cycle.shoot - 1
|
|
||||||
output = "shoot"
|
|
||||||
if player.direction == -1 then
|
|
||||||
player.xadj = -5
|
|
||||||
end
|
|
||||||
else
|
|
||||||
output = player.cycle.stand == 39 and "stand2" or "stand1"
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if player.cycle.run == -1 and player.cycle.shoot == 0 then
|
|
||||||
player.cycle.run = 0
|
|
||||||
output = "walk0"
|
|
||||||
else
|
|
||||||
player.cycle.run = (player.cycle.run + 0.35) % 4
|
|
||||||
if player.cycle.shoot > 0 then
|
|
||||||
output = "walkshoot" .. (math.floor(player.cycle.run) + 1)
|
|
||||||
else
|
|
||||||
output = "walk" .. (math.floor(player.cycle.run) + 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
player.cycle.slide = isPlayerTouchingSolid(player, 0, 0, 0) and 1 or 0
|
|
||||||
if player.cycle.shoot > 0 then
|
|
||||||
output = "jumpshoot"
|
|
||||||
if player.direction == -1 then
|
|
||||||
player.xadj = -1
|
|
||||||
end
|
|
||||||
else
|
|
||||||
output = "jump"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return output
|
|
||||||
end
|
|
||||||
|
|
||||||
local getInput = function()
|
|
||||||
local evt
|
|
||||||
while true do
|
|
||||||
evt = {os.pullEvent()}
|
|
||||||
if evt[1] == "key" then
|
|
||||||
keysDown[evt[2]] = true
|
|
||||||
elseif evt[1] == "key_up" then
|
|
||||||
keysDown[evt[2]] = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local main = function()
|
|
||||||
while true do
|
|
||||||
players[you].control = deriveControls(keysDown)
|
|
||||||
moveTick()
|
|
||||||
players[you].sprite = determineSprite(players[you])
|
|
||||||
render()
|
|
||||||
if keysDown[keys.q] then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
sleep(0.05)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
parallel.waitForAny(getInput, main)
|
|
||||||
|
|
||||||
term.setCursorPos(1, scr_y)
|
|
||||||
term.clearLine()
|
|
Loading…
x
Reference in New Issue
Block a user