fceux/output/luaScripts/PunchOutChallenge.lua

335 lines
10 KiB
Lua

--Mike Tyson's Punch Out!!
--Intended to Challenge the PROs!
--adelikat
local NumStars = 0x0342
local UntilStar = 0x0347 --Number of punches to land until Mac can get a star
local NumHearts = 0x0321 --Number of hearts, single digit
local NumHearts10 = 0x0322 --Number of hearts, 10's digit
local CurrentRoundA = 0x0006 --Address for which round we are in
local Round = 0 --Stores which round we are on
local OppMove = 0x0090 --What move the opponent is making
local DizzyFlag = 0x00BA -- If Opponent will be insta-knocked down by any punch
local StarKOFlag = 0x03CB -- If OPponent will be insta-knocked down by a star
local KaiserKOFlag = 0x004B -- Setting this to 0 disables his ability to be stunned, thus you can't KO Star him
local OppDodgeStar = 0x0348 -- Counter for how many unstunned stars before the opponent starts to dodge
local OpponentIDA = 0x0031
local OpponentID = 0 --Stores contents of OpponentIDA
--Oppenent ID Table
--Round 1, R2, R3
--36,47,64, 66 Glass Joe 47 = After round 1 Jump back begins
--114,116,118,120=R1 Von Kaiser
--220 Piston Honda I
--225 Don I
--52,62,66 King Hippo
--226,241 Great Tiger
--207 Bald Bull
--23 Piston Honda
--71,87,95 Soda Popinski
--111 Bald Bull II
--19 Don II
--231 Sandman
--105 Super Macho Man
--34 Mike Tyson (Mr. Dream)
local AltOppIDAddress = 0x0330 --Alternate flag for determining the opponent
--0 = Kaiser R2, PistonI R1 R2 R3
--1 = Tiger R1
--2 = Don I R2, Don I R3
--3 = Don I R1
--4 = Tyson R1
--5 = Glass Joe R3, Von R1, Von R3, Soda R1
--6 = Piston II R1
--7 = Bull I R1, BullI R1, Sandman R1, Macho R1
--9 = Glass R1, Glass R2, KHippo RI & Don II
local OppIDAlt --stores the contents of 0x0330
local EHP = 0x0398 -- Enemy HP address
local EHPx= 178
local EHPy= 14
local EnemyHP = 0
local lastEHP = 0
local EMod = 0 --Amount that the opponents health will be modded by at the end of a frame
local MHP = 0x0391 -- Mac HP address
local MHPx = 122
local MHPy = 14
local MacHP = 0
local lastMHP = 0
local OppKnockedDown = 0x0005 -- Oppoenent is on the canvas flag
local OppDown -- Stores contents of 0x0005
local OppDx = 130
local OppDy = 70
local OppWillGetUpWith = 0x039E -- Health that the oppoenent will get up with
local OppWillGet -- Stores contents of 0x039E
local OppHitFlag = 0x03E0
local OppHit
local OppHitTimer = 0
local OppHitToDisplay = 0
local OppJustHit = false
local joy = {}
joy.select = 1
OHitValuex = 100
OHitValuey = 100
--*****************************************************************************
function IsOppDown()
--*****************************************************************************
OppDown = memory.readbyte(OppKnockedDown)
if OppDown > 0 then
return true
end
return false
end
--*****************************************************************************
function OppIsHit()
--*****************************************************************************
OppHit = memory.readbyte(OppHitFlag)
if OppHit > 0 then
return true
end
return false
end
--*****************************************************************************
while true do
--*****************************************************************************
Timer1 = memory.readbyte(0x0302) --Keep track of the clock in the game
Timer2 = memory.readbyte(0x0304)
Timer3 = memory.readbyte(0x0305)
Timer4 = memory.readbyte(0x0306)
Timer5 = memory.readbyte(0x0307)
EnemyHP = memory.readbyte(EHP)
gui.text(EHPx,EHPy,EnemyHP)
MacHP = memory.readbyte(MHP)
gui.text(MHPx,MHPy,MacHP)
OpponentID = memory.readbyte(OpponentIDA)
OppIDAlt = memory.readbyte(AltOppIDAddress)
OppWhichMove = memory.readbyte(OppMove)
Round = memory.readbyte(CurrentRoundA)
--***************************************
--Display how much health the opponent will get up with
if IsOppDown() then
OppWillGet = memory.readbyte(OppWillGetUpWith)
gui.text(OppDx, OppDy, OppWillGet)
gui.text(OppDx+16,OppDy, "Next health")
--Unfair opponent health boosts!
--This will affect the oppenent both on his knock downs and Mac's :)
if OppWillGet >= 88 then
memory.writebyte(OppWillGetUpWith, 128)
end
if OppWillGet > 64 then
memory.writebyte(OppWillGetUpWith, 96)
end
if OppWillGet > 9 then
memory.writebyte(OppWillGetUpWith, 64)
end
if OppWillGet and EnemyHP < 64 and EnemyHP > 0 then
memory.writebyte(OppWillGetUpWith, 64)
end
if OppWillGet and EnemyHP < 9 and EnemyHP > 0 then
memory.writebyte(OppWillGetUpWith, 128) --Now that's just rude.
end
end
--***************************************
--***************************************
--Get the amount Mac damaged the opponent
if OppIsHit() then
OppHitToDisplay = lastEHP - EnemyHP
OppHitTimer = 60
OppJustHit = true
else OppJustHit = false
end
--***************************************
--***************************************
--Display damage amount
if OppHitTimer > 0 then
gui.text(OHitValuex, OHitValuey, OppHitToDisplay)
end
if OppHitTimer > 0 then
OppHitTimer = OppHitTimer - 1
end
--***************************************
--***************************************
--Force the pressing of select between rounds!
x = memory.readbyte(0x0004)
if x == 1 then
joypad.set(1, joy)
end
--***************************************
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
--***************************************
--Glass Joe custom mods
--***************************************
if OpponentID == 36 or OpponentID == 47 or OpponentID == 64 then
if OppJustHit and OppHitToDisplay < 5 and EnemyHP > 1 then
EMod = EnemyHP + 3
end
if OppWhichMove == 25 then
memory.writebyte(OppMove, 1) --Remove his jump back and replace with a regular punch
end
end
--***************************************
--Von Kaiser custom mods
--***************************************
if OppIDAlt == 5 then
gui.text(10,10,"Von Kaiser")
memory.writebyte(KaiserKOFlag, 1)
if Timer1 == 0 and Timer2 == 0 and Round == 1 then
memory.writebyte(OppDodgeStar, 2)
end
end
--***************************************
--Piston Honda I custom mods
--***************************************
if (OppIDAlt == 0 and (Timer3 > 0 or Timer2 > 0 or Timer1 > 0)) then
gui.text(10,10,"Piston Honda I")
if Timer1 == 0 and Timer2 == 0 and Round == 1 then
memory.writebyte(OppDodgeStar, 2)
end
if OppWhichMove == 25 then
memory.writebyte(OppMove, 1) --Remove his jump back and replace with a regular punch
end
end
--***************************************
--Don Flamenco I custom mods
--***************************************
if OppIDAlt == 3 then
gui.text(10,10,"Don Flamenco I")
if Timer1 == 0 and Timer2 == 0 and Round == 1 then
memory.writebyte(OppDodgeStar, 0)
end
end
--***************************************
--King Hippo custom mods
--***************************************
if OpponentID == 52 then --Round 1 only
if Timer1 == 0 and Timer2 == 0 then
EMod = 128
end
end
if OpponentID == 52 or OpponentID == 62 or OpponentID == 66 then --All rounds
gui.text(10,10,"King Hippo")
if OppJustHit and OppHitToDisplay < 4 and OppHitToDisplay > 0 and EnemyHP > 1 then
EMod = EnemyHP + 2
end
end
--***************************************
--Great Tiger custom mods
--***************************************
if OppIDAlt == 3 then
gui.text(10,10,"Great Tiger")
end
if OpponentID == 230 then --Round 1 Tiger punch only
IsTigerDizzy = memory.readbyte(DizzyFlag)
if IsTigerDizzy > 0 then
memory.writebyte(DizzyFlag, 0)
end
end
--***************************************
--Bald Bull I Custom mods
--***************************************
--***************************************
--Piston Honda II Custom mods
--***************************************
--***************************************
--Soda Popinski Custom mods
--***************************************
if OpponentID == 71 or OpponentID == 87 or OpponentID == 95 then
gui.text(10,10,"Soda Popinski")
--Nullify the instant star knockdown, and punish mac for trying!
Soda = memory.readbyte(StarKOFlag) --TODO declare a variable instead of using 0x03CB (this is the soda instand knockdown flag)
if Soda > 0 then
memory.writebyte(0x03CB, 0) --Return it back to 0
memory.writebyte(NumStars, 0) --Mac loses his stars
memory.writebyte(UntilStar, 12) --Mac won't get a star, and can't get a star in the next 10 punches!
EMod = 128 --Ouch!
end
end
--***************************************
--Bald Bull II Custom mods
--***************************************
--***************************************
--Don Flamenco II Custom mods
--***************************************
--***************************************
--Mr Sandman Custom mods
--***************************************
--***************************************
--Super Macho Man Custom mods
--***************************************
--***************************************
--Mike Tyson
--***************************************
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
FCEU.frameadvance()
if EMod > 0 then
memory.writebyte(EHP, EMod)
EMod = 0
end
lastEHP = EnemyHP
lastMHP = MacHP
end