Skip to content

Commit

Permalink
react-gbajs: add hacks
Browse files Browse the repository at this point in the history
  • Loading branch information
macabeus committed May 17, 2021
1 parent 42ed7cb commit 085d504
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 0 deletions.
63 changes: 63 additions & 0 deletions brush/src/components/KloGbaSidebar/Hacks/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import React, { useContext } from 'react'
import {
Checkbox,
SidebarContent,
SidebarLink,
} from 'former-kit'
import { GbaContext } from 'react-gbajs'
import { keys, includes } from 'ramda'
import style from './style.css'

const Hacks = () => {
const {
addFreezeAddress,
frozenAddresses,
removeFreezeAddress,
} = useContext(GbaContext)

const infiniteHeartsActived =
keys(frozenAddresses)
|> includes('21024')

const infiniteLivesActived =
keys(frozenAddresses)
|> includes('21100')

return (
<SidebarLink title="Hacks">
<SidebarContent className={style.content}>
<Checkbox
label="Infinite Hearts"
name="optInfiniteHearts"
value="infiniteHearts"
checked={infiniteHeartsActived}
onChange={() => {
if (infiniteHeartsActived) {
removeFreezeAddress(21024)
return
}

addFreezeAddress({ address: 21024, size: 8, value: 3 })
}}
/>

<Checkbox
label="Infinite Lives"
name="optInfiniteLives"
value="infiniteLives"
checked={infiniteLivesActived}
onChange={() => {
if (infiniteLivesActived) {
removeFreezeAddress(21100)
return
}

addFreezeAddress({ address: 21100, size: 8, value: 99 })
}}
/>
</SidebarContent>
</SidebarLink>
)
}

export default Hacks
15 changes: 15 additions & 0 deletions brush/src/components/KloGbaSidebar/Hacks/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@import "former-kit-skin-pagarme/dist/styles/colors/light.css";
@import "former-kit-skin-pagarme/dist/styles/spacing.css";
@import "former-kit-skin-pagarme/dist/styles/sidebar/properties.css";

.content {
display: flex;
flex-direction: column;
padding-left: calc(var(--spacing-medium) + var(--spacing-large));
padding-top: 0;
padding-bottom: var(--spacing-small);

& * {
color: var(--sidebar-title-color);
}
}
3 changes: 3 additions & 0 deletions brush/src/components/KloGbaSidebar/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import SelectVision from './SelectVision'
import DisplayMapOptions from './DisplayMapOptions'
import ChangeRom from './ChangeRom'
import Community from './Community'
import Hacks from './Hacks'
import style from './style.css'

const KloGbaSidebar = () => (
Expand All @@ -19,6 +20,8 @@ const KloGbaSidebar = () => (

<DisplayMapOptions />

<Hacks />

<ChangeRom />
</SidebarLinks>

Expand Down
28 changes: 28 additions & 0 deletions react-gbajs/src/emulator/gba.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ function GameBoyAdvance() {
this.keypad = new GameBoyAdvanceKeypad();
this.sio = new GameBoyAdvanceSIO();

this.frozenAddresses = {};

// TODO: simplify this graph
this.cpu.mmu = this.mmu;
this.cpu.irq = this.irq;
Expand Down Expand Up @@ -71,6 +73,14 @@ function GameBoyAdvance() {

window.GameBoyAdvance = GameBoyAdvance

GameBoyAdvance.prototype.addFreezeAddress = function({ address, size, value }) {
this.frozenAddresses[address] = { size, value };
};

GameBoyAdvance.prototype.removeFreezeAddress = function(address) {
delete this.frozenAddresses[address];
};

GameBoyAdvance.prototype.setCanvas = function(canvas) {
var self = this;
if (canvas.offsetWidth != 240 || canvas.offsetHeight != 160) {
Expand Down Expand Up @@ -144,8 +154,26 @@ GameBoyAdvance.prototype.reset = function() {
};

GameBoyAdvance.prototype.step = function() {
const mmuMemoryIram = this.mmu.memory[this.mmu.REGION_WORKING_IRAM];

while (this.doStep()) {
this.cpu.step();

for (const address in this.frozenAddresses) {
const { size, value } = this.frozenAddresses[address];

switch (size) {
case 8:
mmuMemoryIram.store8(address, value);
break;
case 16:
mmuMemoryIram.store16(address, value);
break;
case 16:
mmuMemoryIram.store32(address, value);
break;
}
}
}
};

Expand Down
13 changes: 13 additions & 0 deletions react-gbajs/src/react/gba-provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const GbaProvider = ({ children }) => {
const [gba, setGba] = useState()
const [volume, setVolume] = useState(null)
const [romBufferMemory, setRomBufferMemory] = useState()
const [frozenAddresses, setFrozenAddresses] = useState({})

const play = (newRomBufferMemory) => {
setRomBufferMemory(newRomBufferMemory)
Expand All @@ -25,13 +26,25 @@ const GbaProvider = ({ children }) => {
gba.runStable()
}

const updateFrozenAddreses = () =>
setFrozenAddresses(cloneDeep(gba.frozenAddresses))

return (
<GbaContext.Provider value={{
gba,
setRomBufferMemory,
play,
saveState,
restoreState,
frozenAddresses,
addFreezeAddress: gba && ((args) => {
gba.addFreezeAddress(args)
updateFrozenAddreses()
}),
removeFreezeAddress: gba && ((args) => {
gba.removeFreezeAddress(args)
updateFrozenAddreses()
}),
}}
>
{children}
Expand Down

0 comments on commit 085d504

Please sign in to comment.