335 lines
10 KiB
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
|