diff --git a/CCBN/ccbn-data/chipdata/airshot1 b/CCBN/ccbn-data/chipdata/airshot1 index 55e957d..762c6c2 100644 --- a/CCBN/ccbn-data/chipdata/airshot1 +++ b/CCBN/ccbn-data/chipdata/airshot1 @@ -34,4 +34,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/airshot2 b/CCBN/ccbn-data/chipdata/airshot2 index a158720..bdada75 100644 --- a/CCBN/ccbn-data/chipdata/airshot2 +++ b/CCBN/ccbn-data/chipdata/airshot2 @@ -34,4 +34,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/airshot3 b/CCBN/ccbn-data/chipdata/airshot3 index 3200de2..761b4c9 100644 --- a/CCBN/ccbn-data/chipdata/airshot3 +++ b/CCBN/ccbn-data/chipdata/airshot3 @@ -34,4 +34,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/areagrab b/CCBN/ccbn-data/chipdata/areagrab index cd13471..f3972fd 100644 --- a/CCBN/ccbn-data/chipdata/areagrab +++ b/CCBN/ccbn-data/chipdata/areagrab @@ -40,4 +40,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/bigbomb b/CCBN/ccbn-data/chipdata/bigbomb index a02a2a3..abd1c11 100644 --- a/CCBN/ccbn-data/chipdata/bigbomb +++ b/CCBN/ccbn-data/chipdata/bigbomb @@ -24,4 +24,4 @@ return { end return true, {{images.cannon, info.x, info.y - parabola}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/boomer1 b/CCBN/ccbn-data/chipdata/boomer1 index 3a771c5..534270e 100644 --- a/CCBN/ccbn-data/chipdata/boomer1 +++ b/CCBN/ccbn-data/chipdata/boomer1 @@ -51,4 +51,4 @@ return { act.stage.setDamage(info.x, info.y, 60, info.owner, 2, false, {}, info.safeObjects) return true, {{images.cannon, info.x, info.y}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/buster b/CCBN/ccbn-data/chipdata/buster index bfb91b0..1b6019b 100644 --- a/CCBN/ccbn-data/chipdata/buster +++ b/CCBN/ccbn-data/chipdata/buster @@ -21,4 +21,4 @@ return { return true, {{images.buster, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/busterup b/CCBN/ccbn-data/chipdata/busterup index 0cb2ad7..48f36ef 100644 --- a/CCBN/ccbn-data/chipdata/busterup +++ b/CCBN/ccbn-data/chipdata/busterup @@ -14,4 +14,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/cannon b/CCBN/ccbn-data/chipdata/cannon index e195503..2ea54e5 100644 --- a/CCBN/ccbn-data/chipdata/cannon +++ b/CCBN/ccbn-data/chipdata/cannon @@ -21,4 +21,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/crackout b/CCBN/ccbn-data/chipdata/crackout index c3dab40..707d028 100644 --- a/CCBN/ccbn-data/chipdata/crackout +++ b/CCBN/ccbn-data/chipdata/crackout @@ -14,4 +14,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/crossbomb b/CCBN/ccbn-data/chipdata/crossbomb index e6e6153..2cb872f 100644 --- a/CCBN/ccbn-data/chipdata/crossbomb +++ b/CCBN/ccbn-data/chipdata/crossbomb @@ -24,4 +24,4 @@ return { end return true, {{images.cannon, info.x, info.y - parabola}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/crossgun b/CCBN/ccbn-data/chipdata/crossgun index ae0aeb9..18e2ea7 100644 --- a/CCBN/ccbn-data/chipdata/crossgun +++ b/CCBN/ccbn-data/chipdata/crossgun @@ -28,4 +28,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/dash b/CCBN/ccbn-data/chipdata/dash index 0d8e2d7..8f562bd 100644 --- a/CCBN/ccbn-data/chipdata/dash +++ b/CCBN/ccbn-data/chipdata/dash @@ -33,4 +33,4 @@ return { return true end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/doublecrack b/CCBN/ccbn-data/chipdata/doublecrack index 4c5c060..78525b5 100644 --- a/CCBN/ccbn-data/chipdata/doublecrack +++ b/CCBN/ccbn-data/chipdata/doublecrack @@ -15,4 +15,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/doubleshot b/CCBN/ccbn-data/chipdata/doubleshot index cf9b233..71122bb 100644 --- a/CCBN/ccbn-data/chipdata/doubleshot +++ b/CCBN/ccbn-data/chipdata/doubleshot @@ -16,4 +16,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/fightersword b/CCBN/ccbn-data/chipdata/fightersword index 193d771..58c4222 100644 --- a/CCBN/ccbn-data/chipdata/fightersword +++ b/CCBN/ccbn-data/chipdata/fightersword @@ -16,4 +16,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/geddon1 b/CCBN/ccbn-data/chipdata/geddon1 index 9f38d49..de51dcf 100644 --- a/CCBN/ccbn-data/chipdata/geddon1 +++ b/CCBN/ccbn-data/chipdata/geddon1 @@ -18,4 +18,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/geddon2 b/CCBN/ccbn-data/chipdata/geddon2 index edf0d07..41663f3 100644 --- a/CCBN/ccbn-data/chipdata/geddon2 +++ b/CCBN/ccbn-data/chipdata/geddon2 @@ -18,4 +18,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/hicannon b/CCBN/ccbn-data/chipdata/hicannon index f72053f..61269e8 100644 --- a/CCBN/ccbn-data/chipdata/hicannon +++ b/CCBN/ccbn-data/chipdata/hicannon @@ -21,4 +21,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/invis b/CCBN/ccbn-data/chipdata/invis index 46b9580..b515418 100644 --- a/CCBN/ccbn-data/chipdata/invis +++ b/CCBN/ccbn-data/chipdata/invis @@ -12,4 +12,4 @@ return { info.player.cooldown.iframe = 50 return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/lifesword b/CCBN/ccbn-data/chipdata/lifesword index 721b4f1..caef1cb 100644 --- a/CCBN/ccbn-data/chipdata/lifesword +++ b/CCBN/ccbn-data/chipdata/lifesword @@ -19,4 +19,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/lilbomb b/CCBN/ccbn-data/chipdata/lilbomb index e9bf3bd..0977c65 100644 --- a/CCBN/ccbn-data/chipdata/lilbomb +++ b/CCBN/ccbn-data/chipdata/lilbomb @@ -22,4 +22,4 @@ return { end return true, {{images.cannon, info.x, info.y - parabola}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/longsword b/CCBN/ccbn-data/chipdata/longsword index 7c2e987..b62470b 100644 --- a/CCBN/ccbn-data/chipdata/longsword +++ b/CCBN/ccbn-data/chipdata/longsword @@ -15,4 +15,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/mcannon b/CCBN/ccbn-data/chipdata/mcannon index 36e7d17..833add3 100644 --- a/CCBN/ccbn-data/chipdata/mcannon +++ b/CCBN/ccbn-data/chipdata/mcannon @@ -21,4 +21,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/minibomb b/CCBN/ccbn-data/chipdata/minibomb index d04fde5..8c493bb 100644 --- a/CCBN/ccbn-data/chipdata/minibomb +++ b/CCBN/ccbn-data/chipdata/minibomb @@ -20,4 +20,4 @@ return { end return true, {{images.cannon, info.x, info.y - parabola}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/muramasa b/CCBN/ccbn-data/chipdata/muramasa index 4b48984..a345113 100644 --- a/CCBN/ccbn-data/chipdata/muramasa +++ b/CCBN/ccbn-data/chipdata/muramasa @@ -14,4 +14,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/panelgrab b/CCBN/ccbn-data/chipdata/panelgrab index 2a08a82..cde5cd9 100644 --- a/CCBN/ccbn-data/chipdata/panelgrab +++ b/CCBN/ccbn-data/chipdata/panelgrab @@ -34,4 +34,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/panelgrab_internal b/CCBN/ccbn-data/chipdata/panelgrab_internal index b46abdd..ade9f95 100644 --- a/CCBN/ccbn-data/chipdata/panelgrab_internal +++ b/CCBN/ccbn-data/chipdata/panelgrab_internal @@ -31,4 +31,4 @@ return { return true, {{images.cannon, info.x, info.y - info.yadj}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/panelreturn b/CCBN/ccbn-data/chipdata/panelreturn index 3c87ce9..8f721cc 100644 --- a/CCBN/ccbn-data/chipdata/panelreturn +++ b/CCBN/ccbn-data/chipdata/panelreturn @@ -20,4 +20,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/panelshot b/CCBN/ccbn-data/chipdata/panelshot index ac418d3..49f60d8 100644 --- a/CCBN/ccbn-data/chipdata/panelshot +++ b/CCBN/ccbn-data/chipdata/panelshot @@ -32,4 +32,4 @@ return { end return {{images.panel[info.panelType], info.x, info.y}} end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov10 b/CCBN/ccbn-data/chipdata/recov10 index f5f6bf5..153792c 100644 --- a/CCBN/ccbn-data/chipdata/recov10 +++ b/CCBN/ccbn-data/chipdata/recov10 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 10, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov120 b/CCBN/ccbn-data/chipdata/recov120 index 209c5a4..466fa93 100644 --- a/CCBN/ccbn-data/chipdata/recov120 +++ b/CCBN/ccbn-data/chipdata/recov120 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 120, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov150 b/CCBN/ccbn-data/chipdata/recov150 index bd97e57..1a93d38 100644 --- a/CCBN/ccbn-data/chipdata/recov150 +++ b/CCBN/ccbn-data/chipdata/recov150 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 150, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov200 b/CCBN/ccbn-data/chipdata/recov200 index 0d262ff..609c3fd 100644 --- a/CCBN/ccbn-data/chipdata/recov200 +++ b/CCBN/ccbn-data/chipdata/recov200 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 200, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov30 b/CCBN/ccbn-data/chipdata/recov30 index d8351d0..2778495 100644 --- a/CCBN/ccbn-data/chipdata/recov30 +++ b/CCBN/ccbn-data/chipdata/recov30 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 30, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov300 b/CCBN/ccbn-data/chipdata/recov300 index 3a28128..cb1bbe0 100644 --- a/CCBN/ccbn-data/chipdata/recov300 +++ b/CCBN/ccbn-data/chipdata/recov300 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 300, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov50 b/CCBN/ccbn-data/chipdata/recov50 index 770a6c5..8356a4a 100644 --- a/CCBN/ccbn-data/chipdata/recov50 +++ b/CCBN/ccbn-data/chipdata/recov50 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 50, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/recov80 b/CCBN/ccbn-data/chipdata/recov80 index 0f97d94..08e9805 100644 --- a/CCBN/ccbn-data/chipdata/recov80 +++ b/CCBN/ccbn-data/chipdata/recov80 @@ -12,4 +12,4 @@ return { info.player.health = math.min(info.player.health + 80, info.player.maxHealth) return false end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/rockcube b/CCBN/ccbn-data/chipdata/rockcube index 19bdfd3..184d58c 100644 --- a/CCBN/ccbn-data/chipdata/rockcube +++ b/CCBN/ccbn-data/chipdata/rockcube @@ -14,4 +14,4 @@ return { end return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/shockwave b/CCBN/ccbn-data/chipdata/shockwave index 8830b48..b1b93b2 100644 --- a/CCBN/ccbn-data/chipdata/shockwave +++ b/CCBN/ccbn-data/chipdata/shockwave @@ -27,4 +27,4 @@ return { return true end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/shotgun b/CCBN/ccbn-data/chipdata/shotgun index 84fc5e7..3e081f1 100644 --- a/CCBN/ccbn-data/chipdata/shotgun +++ b/CCBN/ccbn-data/chipdata/shotgun @@ -25,4 +25,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/sidegun b/CCBN/ccbn-data/chipdata/sidegun index 2404465..6a3bfaa 100644 --- a/CCBN/ccbn-data/chipdata/sidegun +++ b/CCBN/ccbn-data/chipdata/sidegun @@ -26,4 +26,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/spreader b/CCBN/ccbn-data/chipdata/spreader index 32e2fb9..b05020b 100644 --- a/CCBN/ccbn-data/chipdata/spreader +++ b/CCBN/ccbn-data/chipdata/spreader @@ -28,4 +28,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/supervulcan b/CCBN/ccbn-data/chipdata/supervulcan index de722e7..373f2aa 100644 --- a/CCBN/ccbn-data/chipdata/supervulcan +++ b/CCBN/ccbn-data/chipdata/supervulcan @@ -20,7 +20,7 @@ return { info.player.cooldown.shoot = 4 return false elseif info.frame % 2 == 0 then - act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal") + act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal", frame < 12 * 2) end end return true diff --git a/CCBN/ccbn-data/chipdata/sword b/CCBN/ccbn-data/chipdata/sword index e682511..6dc67b8 100644 --- a/CCBN/ccbn-data/chipdata/sword +++ b/CCBN/ccbn-data/chipdata/sword @@ -14,4 +14,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/triplecrack b/CCBN/ccbn-data/chipdata/triplecrack index 54d3c7b..381ced3 100644 --- a/CCBN/ccbn-data/chipdata/triplecrack +++ b/CCBN/ccbn-data/chipdata/triplecrack @@ -16,4 +16,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/tripleshot b/CCBN/ccbn-data/chipdata/tripleshot index 51d6977..9381cc3 100644 --- a/CCBN/ccbn-data/chipdata/tripleshot +++ b/CCBN/ccbn-data/chipdata/tripleshot @@ -17,4 +17,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/vgun b/CCBN/ccbn-data/chipdata/vgun index d4f0609..95d1de2 100644 --- a/CCBN/ccbn-data/chipdata/vgun +++ b/CCBN/ccbn-data/chipdata/vgun @@ -26,4 +26,4 @@ return { return true, {{images.cannon, info.x, info.y}} end end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/chipdata/vulcan1 b/CCBN/ccbn-data/chipdata/vulcan1 index d2f06ff..4cfeba6 100644 --- a/CCBN/ccbn-data/chipdata/vulcan1 +++ b/CCBN/ccbn-data/chipdata/vulcan1 @@ -20,7 +20,7 @@ return { info.player.cooldown.shoot = 4 return false elseif info.frame % 2 == 0 then - act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal") + act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal", info.frame < 3 * 2) end end return true diff --git a/CCBN/ccbn-data/chipdata/vulcan2 b/CCBN/ccbn-data/chipdata/vulcan2 index 6d7c783..00dec0c 100644 --- a/CCBN/ccbn-data/chipdata/vulcan2 +++ b/CCBN/ccbn-data/chipdata/vulcan2 @@ -20,7 +20,7 @@ return { info.player.cooldown.shoot = 4 return false elseif info.frame % 2 == 0 then - act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal") + act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal", info.frame < 5 * 2) end end return true diff --git a/CCBN/ccbn-data/chipdata/vulcan3 b/CCBN/ccbn-data/chipdata/vulcan3 index a09a6cf..f94764c 100644 --- a/CCBN/ccbn-data/chipdata/vulcan3 +++ b/CCBN/ccbn-data/chipdata/vulcan3 @@ -20,7 +20,7 @@ return { info.player.cooldown.shoot = 4 return false elseif info.frame % 2 == 0 then - act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal") + act.projectile.newProjectile(info.x, info.y, info.player, "vulcan_internal", info.frame < 7 * 2) end end return true diff --git a/CCBN/ccbn-data/chipdata/vulcan_internal b/CCBN/ccbn-data/chipdata/vulcan_internal index 31e6f72..8a490d7 100644 --- a/CCBN/ccbn-data/chipdata/vulcan_internal +++ b/CCBN/ccbn-data/chipdata/vulcan_internal @@ -11,12 +11,12 @@ return { logic = function(info) info.x = info.x + (3 / stage.panelWidth) * info.direction - act.stage.setDamage(info.x, info.y, 10, info.owner, 1, true) + act.stage.setDamage(info.x, info.y, 10, info.owner, 1, info.noFlinch) local struckPlayer, struckObject = act.projectile.checkProjectileCollisions(info) if info.frame > 50 or struckPlayer or struckObject then - act.stage.setDamage(info.x + info.direction, info.y, 10, info.owner, 1, true) + act.stage.setDamage(info.x + info.direction, info.y, 10, info.owner, 1, info.noFlinch) return false else return true, {{images.cannon, info.x, info.y}} diff --git a/CCBN/ccbn-data/chipdata/widesword b/CCBN/ccbn-data/chipdata/widesword index 0a4ab06..646d1fa 100644 --- a/CCBN/ccbn-data/chipdata/widesword +++ b/CCBN/ccbn-data/chipdata/widesword @@ -16,4 +16,4 @@ return { return false end -} +} \ No newline at end of file diff --git a/CCBN/ccbn-data/objectdata/rockcube b/CCBN/ccbn-data/objectdata/rockcube index 2143bd6..9d64bf6 100644 --- a/CCBN/ccbn-data/objectdata/rockcube +++ b/CCBN/ccbn-data/objectdata/rockcube @@ -10,4 +10,4 @@ return { delayedFunc = function() -- will run every delayedTime frames -- rockcubes do what rock cubes do end, -} +} \ No newline at end of file diff --git a/CCBN/ccbn.lua b/CCBN/ccbn.lua index 55328be..b26b786 100644 --- a/CCBN/ccbn.lua +++ b/CCBN/ccbn.lua @@ -12,9 +12,22 @@ config.objectDir = fs.combine(config.mainDir, "objectdata") local players = {} local objects = {} local projectiles = {} +local game = { + custom = 0, + customMax = 200, + customSpeed = 1, + inChipSelect = true, + paused = false +} + local you = 1 local yourID = os.getComputerID() +local revKeys = {} +for k,v in pairs(keys) do + revKeys[v] = k +end + -- recommended at 0.1 for netplay, which you'll be doing all the time so yeah local gameDelayInit = 0.05 @@ -82,6 +95,8 @@ local stage = { scrollY = 6 } +stage.scrollX = -1 + (scr_x - (6 * stage.panelWidth)) / 2 + local stageChanged = true local round = function(num) @@ -308,8 +323,93 @@ local receive = function() end local images = { - win = {{"€• €•‡€€€‚€• €• €• €•€€€€€•€Š €•—€‚","‚‡€…€— ‚€•€• €• €• •€ €• €• €€‚ €••€€"," ‹€Ÿ €• €•€• €• €• €€• €• €• €•‹€‹€•Š€Ÿ"," €• €Š Ÿ€•€• €• •€•€•€•€ €• €• ‚€• ‹"," €• ‹€€€Ÿ‹€€€Ÿ €€• €€• €€€€€•€• €• €•"},{"dd ddfdddfddd dd dd dddddddddf ddfdf","ffdfdddd ddddd dd dd fd dd dd ddfd ddfdd"," dddd dd dddd dd dd ddd dd dd ddddfddddd"," dd df fdddd dd fdfdfdfd dd dd dfdd dd"," dd dddddddddddd ddd ddd dddddddd dd dd"},{"df dfdddddfdf df df dfdddddfdd dfddd","ddfddfdf fdfdf df df dd df df dddf dfddd"," fdff df dfdf df df ddf df df dffdddffdf"," df dd ddfdf df dddddddd df df fddf ff"," df fdddfffdddff ddf ddf dddddfdf df df"}}, - lose = {{"€€€‚‹ €€€€€•€• €€€€€•€€€€€•€€€€€•€€€‚‹ ","€• ‚€•€• €• €• €• €• €• ‚€•","€• €•€Ÿ… €• €Ÿ… €• €Ÿ… €• €•","€• Ÿ€•€• €• €• €• €• €• Ÿ€•","€€€Ÿ‡ €€€€€•€€€€€•€€€€€• €• €€€€€•€€€Ÿ‡ "},{"eeeff eeeeeeee eeeeeeeeeeeeeeeeeeeeeff ","ee eeeee ee ee ee ee ee eee","ee eeeeeee ee eeeee ee eeeee ee ee","ee feeee ee ee ee ee ee fee","eeeee eeeeeeeeeeeeeeeeee ee eeeeeeeeeee "},{"eeeee eeeeefef eeeeefeeeeefeeeeefeeeee","ef fefef ef ef ef ef ef fef","ef efeffff ef effff ef effff ef ef","ef eefef ef ef ef ef ef eef","eeeff eeeeefeeeeefeeeeef ef eeeeefeeeff "}}, + logo = { + { + " ‡’——””€” •€ƒ‚••••ƒ€ƒ•—ƒ•—””‡’•—””ƒ‚•—ƒƒ€ƒ ", + " € Ÿ••••€‹ž”•€ƒ•••• € •—•—””€ Ÿ•—””€ƒ€•—ƒ € ", + " ‹‡‚Ž Š… ‚Ž  ŠŒŠ…Š…‹‡Š…Š…€Š…  ", + " —œŒ‹ŸœŒ‹ˆŒƒŒ„Œ“œŒ—”€€ƒŒŒ„€€‡ƒƒƒƒƒƒƒ ", + " •ŠŸ•Š€€€€€€€••€••€€€€—€€€€€€€€€€‹€", + " ••€€••€€€€€€€€••€••€€€€€€€€€€€€€˜†€€€”‚", + " Ÿ•ŠŸ••€€€€€€€€••€•Š€€€€€€˜†€€€€€•€", + "—ƒ€€—”ƒŒŒ„Œ“œŒ—”€€€€€—”‡œƒƒŒ“ƒ€‡„€€€˜†€€€€€€€…Ÿ", + "•€’••€€€••€€Ÿ€ŸŸ€€€••€……€€”€€€€€€€€€€‡€ ", + "•€€‹•€€€€€••€€‚‚ƒ‚€€€••€€••€‚‚€€ƒ€€€Ÿ‡‡ ", + "Š€€Š…ŒŒ„€Š…€€€Š…€Š…€€‹€Š…€Š…‡ƒ‹‡ƒ ", + }, + { + " f3ff3f333 f333ff3f3333f33f3f3f3ff3f3f3ff333333 ", + " b ffbfbbbbfbbbbfbfb b fbbfbfbb ffbfbbbbfbb b ", + " bbbbbbbb bbb bbbb b bbbbbbbbbbbbbbbfbbb b ", + " a11aa11a11a111a11a1aaa111aaaaaaaaaa3fa ", + " aaa1aaa1aa1aaaa1aa1aa1aaaaeeeeeeee33aaa", + " a1a1a1a1aa1aaaa1aa1aa1aaaeeeeeee00eeeef", + " faaa1a1a1aa1aaaa1aaaa11aa1eeeee00eeeeeea", + "faaaa1a1111a11a1aaaaaa1a1a1a1a1aaa1eee00eeeeeeeea", + "f1a1a11aaaaa1aaa1a11a1a1aa11aa11a1aa33eeeeeeeeea ", + "f1a1a11aaaaa1aa1aa1aa1a1aa11aa111aaa33aeeeeeeea ", + "a1aa111111a11aaa11a11aa11111a111a11aaaaaaaaaa ", + }, + { + " 3f33f3f3f 3f3f33f3ff3f3ff3f3f3f33f3f3f33ffff3f ", + " b bbfbfbffbfbffbfbf b bffbfbfb bbfbfbfbbff b ", + " ffffffff fff ffff f fffffffffffffffffff f ", + " 1aa11aa1aa1aaa1aa1aaa1aaaaaeeeeeee3aaf ", + " 111a1111aa1aaa1aa1aaa111aeeeeeeeee333af", + " 1aa11aa1aa1aaa1aa1aaa1aaaeeeeeeeeeeeeaa", + " a111a1aa1aa1aaa1aa111a111aeeeeeeeeeeeeaa", + "a1aa1a1aaaa1aa1aaaaaa1a1a1a1a1a1a1aeeeeeeeeeeeeaf", + "a11a1a111aa1aaa1a11a1aa1a1a111a11aa333eeeeeeeeaa ", + "a1aa1a1aaaa1aaaa11a11aa1a1a1a1a1a1aaaaeeeeaaaaf ", + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffffffffff ", + }, + }, + win = { + { + "€• €•‡€€€‚€• €• €• €•€€€€€•€Š €•—€‚", + "‚‡€…€— ‚€•€• €• €• •€ €• €• €€‚ €••€€", + " ‹€Ÿ €• €•€• €• €• €€• €• €• €•‹€‹€•Š€Ÿ", + " €• €Š Ÿ€•€• €• •€•€•€•€ €• €• ‚€• ‹", + " €• ‹€€€Ÿ‹€€€Ÿ €€•€€€• €€€€€•€• €• €•", + }, + { + "55 55f555f555 55 55 555555555f 55f5f", + "ff5f5555 55555 55 55 f5 55 55 55f5 55f55", + " 5555 55 5555 55 55 555 55 55 5555f55555", + " 55 5f f5555 55 f5f5f5f5 55 55 5f55 55", + " 55 555555555555 555f555 55555555 55 55", + }, + { + "5f 5f55555f5f 5f 5f 5f55555f55 5f555", + "55f55f5f f5f5f 5f 5f 55 5f 5f 555f 5f555", + " f5ff 5f 5f5f 5f 5f 55f 5f 5f 5ff555ff5f", + " 5f 55 55f5f 5f 55555555 5f 5f f55f ff", + " 5f f555fff555ff 55ff55f 55555f5f 5f 5f", + }, + }, + lose = { + { + "€€€‚‹ €€€€€•€• €€€€€•€€€€€•€€€€€•€€€‚‹ ", + "€• ‹€•€• €• €• €• €• €• ‹€•", + "€• €•€Ÿ… €• €Ÿ… €• €Ÿ… €• €•", + "€• ‡€•€• €• €• €• €• €• ‡€•", + "€€€Ÿ‡ €€€€€•€€€€€•€€€€€• €• €€€€€•€€€Ÿ‡ ", + }, + { + "111ff 11111111 111111111111111111111ff ", + "11 11111 11 11 11 11 11 111", + "11 1111111 11 11111 11 11111 11 11", + "11 f1111 11 11 11 11 11 f11", + "11111 111111111111111111 11 11111111111 ", + }, + { + "11111 11111f1f 11111f11111f11111f11111 ", + "1f f1f1f 1f 1f 1f 1f 1f f1f", + "1f 1f1ffff 1f 1ffff 1f 1ffff 1f 1f", + "1f 11f1f 1f 1f 1f 1f 1f 11f", + "111ff 11111f11111f11111f 1f 11111f111ff ", + }, + }, panel = { normal = {{"—ƒƒƒƒ”","•€€‚•","€€€€€€"},{"eeeee7","e78877","eeeeee"},{"77777e","78888e","eeeeee"}}, cracked = {{"—››››”","•™™™™•","€€€€€€"},{"eeeee7","e88888","eeeeee"},{"77777e","87777e","eeeeee"}}, @@ -324,6 +424,12 @@ local images = { buster = {{"‘"},{"f4"},{"4f"}} } +local cwrite = function(text, y) + local cx, cy = term.getCursorPos() + term.setCursorPos(scr_x / 2 - #text / 2, y or (scr_y / 2)) + term.write(text) +end + local act = {stage = {}, player = {}, projectile = {}, object = {}} act.stage.newPanel = function(x, y, panelType, owner) stage.panels[y] = stage.panels[y] or {} @@ -409,6 +515,105 @@ act.stage.getDamage = function(x, y, pID, oID, pIDsafeCheck, oIDsafeCheck) return totalDamage, flinching end +local premadeFolders = { + [1] = { -- BN2 starting folder, modified slightly + {"cannon", "a"}, + {"cannon", "a"}, + {"hicannon", "b"}, + {"hicannon", "b"}, + {"shotgun", "b"}, + {"shotgun", "b"}, + {"vgun", "l"}, + {"vgun", "l"}, + {"crossgun", "l"}, + {"minibomb", "b"}, + {"minibomb", "b"}, + {"lilbomb", "b"}, + {"recov120", "a"}, + {"recov120", "a"}, + {"recov80", "l"}, + {"recov50", "l"}, + {"recov50", "l"}, + {"sword", "s"}, + {"sword", "s"}, + {"sword", "s"}, + {"panelreturn", "s"}, + {"widesword", "s"}, + {"widesword", "s"}, + {"longsword", "s"}, + {"busterup", "s"}, + {"crackout", "b"}, + {"shockwave", "b"}, + {"areagrab", "s"}, + {"areagrab", "s"}, + {"panelgrab", "s"}, + }, + [2] = { + {"cannon", "a"}, + {"cannon", "a"}, + {"hicannon", "a"}, + {"hicannon", "a"}, + {"mcannon", "a"}, + {"mcannon", "a"}, + {"airshot1", "a"}, + {"airshot1", "a"}, + {"airshot2", "a"}, + {"vulcan1", "c"}, + {"vulcan1", "c"}, + {"shockwave", "c"}, + {"minibomb", "c"}, + {"minibomb", "c"}, + {"crossbomb", "c"}, + {"panelreturn", "s"}, + {"sword", "s"}, + {"sword", "s"}, + {"longsword", "s"}, + {"busterup", "s"}, + {"widesword", "s"}, + {"rockcube", "a"}, + {"areagrab", "s"}, + {"areagrab", "s"}, + {"panelgrab", "s"}, + {"panelshot", "s"}, + {"panelshot", "s"}, + {"recov50", "l"}, + {"recov50", "l"}, + {"recov50", "l"}, + }, + [3] = { + {"cannon", "a"}, + {"hicannon", "a"}, + {"mcannon", "b"}, + {"airshot2", "a"}, + {"airshot2", "a"}, + {"rockcube", "s"}, + {"shockwave", "a"}, + {"lilbomb", "l"}, + {"lilbomb", "l"}, + {"areagrab", "s"}, + {"areagrab", "s"}, + {"fightersword", "f"}, + {"panelreturn", "s"}, + {"panelreturn", "s"}, + {"panelshot", "f"}, + {"panelshot", "f"}, + {"doubleshot", "f"}, + {"tripleshot", "f"}, + {"invis", "l"}, + {"recov30", "l"}, + {"recov30", "l"}, + {"vulcan2", "c"}, + {"vulcan1", "c"}, + {"vulcan1", "c"}, + {"geddon1", "f"}, + {"shotgun", "d"}, + {"shotgun", "d"}, + {"vgun", "d"}, + {"vgun", "d"}, + {"spreader", "d"}, + } +} + act.player.newPlayer = function(x, y, owner, direction, image) local pID = #players + 1 players[pID] = { @@ -417,11 +622,12 @@ act.player.newPlayer = function(x, y, owner, direction, image) owner = owner, -- Either 1 or 2, indicates the red/blue alignment type = "player", -- Used for quickly identifying a player/object/projectile at a glance direction = direction or 1, -- Either -1 or 1, indicates facing left or right - health = 1000, -- Once it hits 0, your player is deleted - maxHealth = 1000, -- You cannot regen past this value + health = 600, -- Once it hits 0, your player is deleted + maxHealth = 600, -- You cannot heal past this value image = image, -- Because of CC limitations, I'm just going to have one player sprite canMove = true, -- If false, pushing the move buttons won't do diddly fuck - canShoot = true, -- If false, pushing the shoot buttons won't do fuckly did + canShoot = true, -- If false, pushing the shoot buttons won't do fuckly didd + isDead = false, -- If true, the current game is over and the opponent wins busterPower = 2, -- Strength of MegaBuster cooldown = { -- All cooldown values are decremented every tick move = 0, -- If above 0, you cannot move @@ -437,11 +643,9 @@ act.player.newPlayer = function(x, y, owner, direction, image) chip = false, custom = false }, - chipQueue = {} -- Attacks are used in a queue, which is filled each turn + chipQueue = {}, -- Attacks are used in a queue, which is filled each turn + folder = premadeFolders[math.random(1, 3)] } - for k,v in pairs(chips) do - players[pID].chipQueue[#players[pID].chipQueue + 1] = k - end return pID end @@ -695,12 +899,6 @@ act.projectile.newProjectile = function(x, y, player, chipType, noFlinch, altDam return id end -for y = 1, 3 do - for x = 1, 6 do - act.stage.newPanel(x, y, "normal") - end -end - -- loads all chips and objects from file local loadChips = function(env) local cList = fs.list(config.chipDir) @@ -734,11 +932,6 @@ local loadChips = function(env) return cOutput, oOutput end -chips, objectTypes = loadChips(getfenv()) - -act.player.newPlayer(2, 2, 1, 1, "6") -act.player.newPlayer(5, 2, 2, -1, "7") - local stageImageStitch local makeStageImageStitch = function() @@ -762,8 +955,8 @@ local makeStageImageStitch = function() end buffer[#buffer + 1] = { im, - (x - 1) * stage.panelWidth + 2, - (y - 1) * stage.panelHeight + 2 + (x - 1) * stage.panelWidth + 1, + (y - 1) * stage.panelHeight + 1 } end end @@ -772,7 +965,7 @@ local makeStageImageStitch = function() return merge(table.unpack(buffer)) end -local render = function() +local render = function(extraImage) local buffer, im = {} local sx, sy if stageChanged or true then @@ -790,20 +983,29 @@ local render = function() sortedList[#sortedList+1] = v end table.sort(sortedList, function(a,b) return a.y >= b.y end) + if extraImage then + buffer[#buffer + 1] = { + colorSwap(extraImage[1], {["f"] = " "}), + extraImage[2], + extraImage[3] + } + end for k,v in pairs(sortedList) do if v.type == "player" then - if v.cooldown.iframe == 0 or (FRAME % 2 == 0) then - sx = (v.x - 1) * stage.panelWidth + 3 + stage.scrollX - sy = (v.y - 1) * stage.panelHeight - 1 + stage.scrollY - buffer[#buffer + 1] = { - colorSwap(images.player[v.image], {["f"] = " "}), - sx, - sy - } + if not v.isDead then + if v.cooldown.iframe == 0 or (FRAME % 2 == 0) then + sx = (v.x - 1) * stage.panelWidth + 2 + sy = (v.y - 1) * stage.panelHeight - 2 + buffer[#buffer + 1] = { + colorSwap(images.player[v.image], {["f"] = " "}), + sx + stage.scrollX, + sy + stage.scrollY + } + end end elseif v.type == "projectile" then - sx = math.floor((v.x - 1) * stage.panelWidth + 4 + stage.scrollX) - sy = math.floor((v.y - 1) * stage.panelHeight + 1 + stage.scrollY) + sx = math.floor((v.x - 1) * stage.panelWidth + 4) + sy = math.floor((v.y - 1) * stage.panelHeight) if sx >= -1 and sx <= scr_x and v.imageData then for kk, imd in pairs(v.imageData) do @@ -816,12 +1018,12 @@ local render = function() end elseif v.type == "object" then - sx = (v.x - 1) * stage.panelWidth + 3 + stage.scrollX - sy = (v.y - 1) * stage.panelHeight - 1 + stage.scrollY + sx = (v.x - 1) * stage.panelWidth + 3 + sy = (v.y - 1) * stage.panelHeight buffer[#buffer + 1] = { colorSwap(v.image, {["f"] = " "}), - math.floor((v.x - 1) * stage.panelWidth + 3 + stage.scrollX), - math.floor((v.y - 1) * stage.panelHeight + 1 + stage.scrollY) + math.floor(sx + stage.scrollX), + math.floor(sy + stage.scrollY) } end end @@ -853,6 +1055,32 @@ local render = function() term.write(player.health) end end + + term.setTextColor(colors.white) + term.setBackgroundColor(colors.black) + if game.custom == game.customMax and FRAME % 8 <= 5 then + cwrite("PUSH '" .. revKeys[control.custom]:upper() .. "'!", 2) + end + term.setBackgroundColor(colors.gray) + term.setCursorPos(6, 1) + term.write("[CUSTOM][") + local barLength = scr_x - 20 + if game.custom == game.customMax then + term.setBackgroundColor(colors.lime) + else + term.setBackgroundColor(colors.green) + end + for i = 1, barLength do + if (i / barLength) <= (game.custom / game.customMax) then + term.write("=") + else + term.setBackgroundColor(colors.gray) + term.write(" ") + end + end + term.setBackgroundColor(colors.gray) + term.write("]") + if showDebug then term.setCursorPos(1, scr_y - 1) term.write("Frame: " .. FRAME .. ", isHost = " .. tostring(isHost) .. ", you = " .. tostring(you)) @@ -881,14 +1109,187 @@ local getInput = function() end end +local chipSelectScreen = function() + local inQueue = {} -- selected chips in menu, by folder position + local pile = {} -- chips for you to choose from, by folder position + local rPile, r = {} + local player = players[you] + for i = 1, 5 do + repeat + r = math.random(1, #player.folder) + until not rPile[r] + pile[#pile + 1] = r + rPile[r] = true + end + local cursor = 1 + + local checkIfChoosable = function(c) + local chip, compareChip = player.folder[pile[c]] + local isSameChip = true + local isSameCode = true + for i = 1, #inQueue do + compareChip = player.folder[inQueue[i]] + if compareChip[1] ~= chip[1] then + isSameChip = false + end + if compareChip[2] ~= chip[2] then + isSameCode = false + end + end + return isSameCode or isSameChip + end + + local renderMenu = function() + local chip + term.setBackgroundColor(colors.gray) + term.setTextColor(colors.yellow) + for y = 4, scr_y - 2 do + term.setCursorPos(3, y) + term.write((" "):rep(scr_x - 4)) + end + cwrite(" Select Chips: ", 3) + term.setTextColor(colors.lightGray) + cwrite(" (Push '" .. revKeys[control.chip]:upper() .. "' to add / '" .. revKeys[control.buster]:upper() .. "' to remove) ", 4) + cwrite(" (Push ENTER to confirm loadout) ", 5) + for y = 1, #pile do + if checkIfChoosable(y) then + if y == cursor then + term.setBackgroundColor(colors.lightGray) + term.setTextColor(colors.white) + else + term.setBackgroundColor(colors.gray) + term.setTextColor(colors.white) + end + else + if y == cursor then + term.setBackgroundColor(colors.lightGray) + term.setTextColor(colors.gray) + else + term.setBackgroundColor(colors.gray) + term.setTextColor(colors.lightGray) + end + end + chip = player.folder[pile[y]] + term.setCursorPos(4, y + 5) + term.write(chips[chip[1]].info.name .. " " .. chip[2]:upper()) + end + term.setBackgroundColor(colors.gray) + term.setTextColor(colors.lightBlue) + for y = 1, #inQueue do + chip = player.folder[inQueue[y]] + term.setCursorPos(20, y + 5) + term.write(chips[chip[1]].info.name .. " " .. chip[2]:upper()) + end + term.setTextColor(colors.white) + if player.folder[pile[cursor]] then + term.setCursorPos(5, 12) + term.write("Description:") + term.setCursorPos(4, 13) + term.write(chips[player.folder[pile[cursor]][1]].info.description) + end + end + + local evt + while true do +-- render() + renderMenu() + evt = {os.pullEvent()} + if evt[1] == "key" then + if evt[2] == keys.up then + cursor = math.max(cursor - 1, 1) + elseif evt[2] == keys.down then + cursor = math.min(cursor + 1, #pile) + elseif evt[2] == control.chip then + if pile[cursor] then + if checkIfChoosable(cursor) then + table.insert(inQueue, pile[cursor]) + table.remove(pile, cursor) + end + end + elseif evt[2] == control.buster then + if #inQueue > 0 then + table.insert(pile, inQueue[#inQueue]) + table.remove(inQueue, #inQueue) + end + elseif evt[2] == keys.enter then + player.chipQueue = {} + for i = 1, #inQueue do + player.chipQueue[#player.chipQueue + 1] = player.folder[inQueue[i]][1] + end + table.sort(inQueue, function(a,b) return a > b end) + for i = 1, #inQueue do + table.remove(inQueue, i) + end + return + end + cursor = math.min(math.max(cursor, 1), #pile) + end + end +end + +local checkDeadPlayers = function() + local deadPlayers, thereIsDead = {}, false + for id, player in pairs(players) do + if player.isDead then + deadPlayers[id] = true + thereIsDead = true + end + end + return thereIsDead, deadPlayers +end + +local waitingForClientChipSelection = false local runGame = function() local evt, getStateInfo + render() + sleep(0.5) while true do FRAME = FRAME + 1 render() + if game.inChipSelect then + chipSelectScreen() + if isHost then + game.inChipSelect = false + game.custom = 0 + local msg + cwrite("Waiting...", scr_y - 3) + repeat + sleep(0) + until cliChipSelect + + players[cliChipSelect.pID].chipQueue = cliChipSelect.chipQueue + players[cliChipSelect.pID].folder = cliChipSelect.folder + cliChipSelect = false + + transmit({ + gameID = gameID, + command = "turn_ready", + pID = you, + }) + else + transmit({ + gameID = gameID, + command = "turn_ready", + pID = you, + chipQueue = players[you].chipQueue, + folder = players[you].folder, + }) + cwrite("Waiting...", scr_y - 3) + repeat + msg = receive() + msg = type(msg) == "table" and msg or {} + until ( + msg.gameID == gameID and + msg.command == "turn_ready" and + players[msg.pID] + ) + end + end + if isHost then + game.custom = math.min(game.customMax, game.custom + 1) getControls() for id, proj in pairs(projectiles) do local success, imageData = chips[proj.chipType].logic(proj) @@ -907,40 +1308,42 @@ local runGame = function() end for id, player in pairs(players) do - if player.canMove then - stage.panels[player.y][player.x].reserved = id - end - local dmg, flinching = act.stage.getDamage(player.x, player.y, id) - if player.cooldown.iframe == 0 and dmg > 0 then - player.health = player.health - dmg - if player.health <= 0 then - table.remove(players, id) - elseif flinching then - player.cooldown.iframe = 16 - player.cooldown.move = 8 - player.cooldown.shoot = 6 + if not player.isDead then + if player.canMove then + stage.panels[player.y][player.x].reserved = id end - elseif player.cooldown.shoot == 0 then - if player.canShoot then - if player.control.chip then - if player.chipQueue[1] then - if chips[player.chipQueue[1]] then - act.projectile.newProjectile(player.x, player.y, player, player.chipQueue[1]) - for k,v in pairs(chips[player.chipQueue[1]].info.cooldown or {}) do - player.cooldown[k] = v - end - if false then - table.remove(player.chipQueue, 1) - else - player.chipQueue[#player.chipQueue + 1] = player.chipQueue[1] - table.remove(player.chipQueue, 1) + local dmg, flinching = act.stage.getDamage(player.x, player.y, id) + if player.cooldown.iframe == 0 and dmg > 0 then + player.health = math.max(0, player.health - dmg) + if player.health == 0 then + player.isDead = true + elseif flinching then + player.cooldown.iframe = 16 + player.cooldown.move = 8 + player.cooldown.shoot = 6 + end + elseif player.cooldown.shoot == 0 then + if player.canShoot then + if player.control.chip then + if player.chipQueue[1] then + if chips[player.chipQueue[1]] then + act.projectile.newProjectile(player.x, player.y, player, player.chipQueue[1]) + for k,v in pairs(chips[player.chipQueue[1]].info.cooldown or {}) do + player.cooldown[k] = v + end + if true then + table.remove(player.chipQueue, 1) + else + player.chipQueue[#player.chipQueue + 1] = player.chipQueue[1] + table.remove(player.chipQueue, 1) + end end end - end - elseif player.control.buster then - act.projectile.newProjectile(player.x, player.y, player, "buster") - for k,v in pairs(chips.buster.info.cooldown or {}) do - player.cooldown[k] = v + elseif player.control.buster then + act.projectile.newProjectile(player.x, player.y, player, "buster") + for k,v in pairs(chips.buster.info.cooldown or {}) do + player.cooldown[k] = v + end end end end @@ -978,6 +1381,11 @@ local runGame = function() end reduceCooldowns() movePlayers() + if players[you] then + if players[you].control.custom and game.custom == game.customMax then + game.inChipSelect = true + end + end sleep(gameDelayInit) transmit({ gameID = gameID, @@ -985,6 +1393,7 @@ local runGame = function() players = players, projectiles = projectiles, objects = objects, + game = game, stageDamage = stage.damage, stagePanels = stage.panels, id = id @@ -1000,14 +1409,47 @@ local runGame = function() control = players[you].control }) end + if players[you] then + if players[you].control.custom and game.custom == game.customMax then + transmit({ + gameID = gameID, + command = "chip_select", + id = yourID, + }) + end + end evt, getStateInfo = os.pullEvent("ccbn_get_state") players = getStateInfo.players projectiles = getStateInfo.projectiles objects = getStateInfo.objects + game = getStateInfo.game stage.damage = getStateInfo.stageDamage stage.panels = getStateInfo.stagePanels end + if checkDeadPlayers() then + render() + break + end + + end + + local thereIsDead, deadPlayers = checkDeadPlayers() + if thereIsDead then + sleep(0.5) + parallel.waitForAny(function() + while true do + if deadPlayers[you] then + render({images.lose, true, 6}) + else + render({images.win, true, 6}) + end + sleep(1) + render() + sleep(0.5) + end + end, function() os.pullEvent("key") end) + sleep(0.05) end end @@ -1030,6 +1472,22 @@ local interpretNetMessage = function(msg) if players[msg.pID] then players[msg.pID].control = msg.control end + elseif msg.command == "chip_select" then + if game.custom == game.customMax then + game.inChipSelect = true + end + elseif msg.command == "turn_ready" then + if ( + type(msg.chipQueue) == "table" and + players[msg.pID] and + type(msg.folder) == "table" + ) then + cliChipSelect = { + folder = msg.folder, + chipQueue = msg.chipQueue, + pID = msg.pID + } + end end else if msg.command == "get_state" then @@ -1037,6 +1495,7 @@ local interpretNetMessage = function(msg) players = msg.players, projectiles = msg.projectiles, objects = msg.objects, + game = msg.game, stageDamage = msg.stageDamage, stagePanels = msg.stagePanels }) @@ -1055,22 +1514,33 @@ local networking = function() end end -local cwrite = function(text, y) - local cx, cy = term.getCursorPos() - term.setCursorPos(scr_x / 2 - #text / 2, y or (scr_y / 2)) - term.write(text) -end - local startGame = function() getModem() local time = os.epoch("utc") + chips, objectTypes = loadChips(getfenv()) + stage.panels = {} + stage.damage = {} + players = {} + objects = {} + projectiles = {} + game.custom = 0 + game.customSpeed = 1 + game.inChipSelect = true + game.paused = false + act.player.newPlayer(2, 2, 1, 1, "6") + act.player.newPlayer(5, 2, 2, -1, "7") + for y = 1, 3 do + for x = 1, 6 do + act.stage.newPanel(x, y, "normal") + end + end transmit({ gameID = gameID, command = "find_game", respond = false, id = yourID, time = time, - chips = chips +-- chips = chips }) local msg waitingForGame = true @@ -1080,20 +1550,103 @@ local startGame = function() msg = receive() until interpretNetMessage(msg) gameID = isHost and gameID or msg.gameID - chips = isHost and chips or msg.chips +-- chips = isHost and chips or msg.chips transmit({ gameID = gameID, command = "find_game", respond = true, id = yourID, time = isHost and math.huge or -math.huge, - chips = isHost and chips +-- chips = isHost and chips }) waitingForGame = false parallel.waitForAny(runGame, networking) end -parallel.waitForAny(startGame, getInput) +local makeMenu = function(x, y, options, _cpos) + local cpos = _cpos or 1 + local cursor = "> " + local lastPos = cpos + local rend = function() + for i = 1, #options do + if i == cpos then + term.setCursorPos(x, y + (i - 1)) + term.setTextColor(colors.white) + term.write(cursor .. options[i]) + else + if i == lastPos then + term.setCursorPos(x, y + (i - 1)) + term.write((" "):rep(#cursor)) + lastPos = nil + else + term.setCursorPos(x + #cursor, y + (i - 1)) + end + term.setTextColor(colors.gray) + term.write(options[i]) + end + end + end + local evt + rend() + while true do + evt = {os.pullEvent()} + if evt[1] == "key" then + if evt[2] == keys.up then + lastPos = cpos + cpos = (cpos - 2) % #options + 1 + elseif evt[2] == keys.down then + lastPos = cpos + cpos = (cpos % #options) + 1 + elseif evt[2] == keys.home then + lastPos = cpos + cpos = 1 + elseif evt[2] == keys["end"] then + lastPos = cpos + cpos = #options + elseif evt[2] == keys.enter then + return cpos + end + elseif evt[1] == "mouse_click" then + if evt[4] >= y and evt[4] < y+#options then + if cpos == evt[4] - (y - 1) then + return cpos + else + lastPos = cpos + cpos = evt[4] - (y - 1) + rend() + end + end + end + if lastPos ~= cpos then + rend() + end + end +end + +local titleScreen = function() + local menuOptions = { + "Start Game", + "Exit" + } + local choice + while true do + term.setBackgroundColor(colors.black) + term.clear() + drawImage(images.logo, 2, 2) + if useSkynet then + term.setTextColor(colors.lightGray) + cwrite("Skynet Enabled", 2 + #images.logo[1]) + end + choice = makeMenu(2, scr_y - #menuOptions, menuOptions) + if choice == 1 then + parallel.waitForAny(startGame, getInput) + elseif choice == 2 then + return + end + end +end + +titleScreen() term.setBackgroundColor(colors.black) term.clear()