Skip to content

Commit e7f4c52

Browse files
committed
fix sonic cd
1 parent e166da6 commit e7f4c52

File tree

6 files changed

+237
-149
lines changed

6 files changed

+237
-149
lines changed

TODO

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,18 @@
1313
ROADMAP
1414
look at issues related to crashes
1515
drawing mode bugs
16+
disable mapping editing
1617
improve undo/redo when drawing pixels / moving things
1718
animation editor
1819
export to gif
1920

2021

21-
rotsprite
22-
==
23-
better alg
24-
going back when making mappings
2522

2623
==
2724
BUGS
2825

26+
TODO: load / save / load broken in sonic CD
27+
2928
saving 0 tile as nemesis crashes
3029
saving ArtC42 at all crashes
3130
pink surrounding tiles sometimes breaks

app/components/import/ui-import.js

Lines changed: 126 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,169 +1,151 @@
11
import React from 'react';
2-
import { render } from 'react-dom';
32
import { observer } from 'mobx-react';
43
import { importState } from './state';
54
import { Item, Select, Input } from '#ui';
65
import { zoomAssert, paletteLineAssert } from '#util/assertions';
76

8-
export const ImportSprites = observer(
9-
class ImportSprites extends React.Component {
10-
render() {
11-
const {
12-
scale,
13-
sprites,
14-
spriteIndex,
15-
mappings,
16-
importWidth,
17-
importHeight,
18-
} = importState;
7+
export const ImportSprites = observer(() => {
8+
const { scale, sprites, spriteIndex, mappings, importWidth, importHeight } =
9+
importState;
1910

20-
return (
21-
<div className="importer">
22-
<div className="menu">
23-
<div className="menu-section">
11+
return (
12+
<div className="importer">
13+
<div className="menu">
14+
<div className="menu-section">
15+
<Item color="blue" inverted onClick={importState.importOne}>
16+
Import Sprite
17+
</Item>
18+
{sprites.length > 1 && (
19+
<>
2420
<Item
25-
color="blue"
21+
color="magenta"
2622
inverted
27-
onClick={importState.importOne}
23+
onClick={importState.importAll}
2824
>
29-
Import Sprite
25+
Import All
3026
</Item>
31-
{sprites.length > 1 && (
32-
<>
33-
<Item
34-
color="magenta"
35-
inverted
36-
onClick={importState.importAll}
37-
>
38-
Import All
39-
</Item>
40-
<Item
41-
color="yellow"
42-
inverted
43-
onClick={importState.next}
44-
>
45-
Next Sprite
46-
</Item>
47-
<Item
48-
color="yellow"
49-
inverted
50-
onClick={importState.prev}
51-
>
52-
Prev Sprite
53-
</Item>
54-
</>
55-
)}
56-
57-
<Select
58-
options={[
59-
{
60-
label: 'Reduce Mappings',
61-
value: 'mappings',
62-
},
63-
{ label: 'Reduce Tiles', value: 'tiles' },
64-
]}
65-
store={importState}
66-
accessor="type"
67-
onChange={importState.changeType}
68-
/>
69-
70-
<div className="input">
71-
<span>Palette</span>
72-
<Input
73-
store={importState}
74-
accessor="paletteLine"
75-
assert={paletteLineAssert}
76-
onChange={importState.changePalette}
77-
isNumber
78-
/>
79-
</div>
80-
81-
<div className="input">
82-
<span>Zoom</span>
83-
<Input
84-
store={importState}
85-
accessor="scale"
86-
assert={zoomAssert}
87-
isNumber
88-
/>
89-
</div>
90-
91-
<div className="input">
92-
<span>Mappings</span>
93-
<span>{mappings.length}</span>
94-
</div>
95-
96-
<div className="input">
97-
<span>Tiles</span>
98-
<span>{importState.tileQty}</span>
99-
</div>
100-
101-
{sprites.length > 1 && (
102-
<div className="input">
103-
<span>Sprite</span>
104-
<span>
105-
{spriteIndex + 1} / {sprites.length}
106-
</span>
107-
</div>
108-
)}
109-
</div>
110-
111-
<div className="menu-section">
112-
{importState.path &&
11327
<Item
114-
color="orange"
28+
color="yellow"
11529
inverted
116-
onClick={importState.backToDetect}
30+
onClick={importState.next}
11731
>
118-
Back
119-
</Item>}
32+
Next Sprite
33+
</Item>
12034
<Item
121-
color="red"
35+
color="yellow"
12236
inverted
123-
onClick={importState.cancel}
37+
onClick={importState.prev}
12438
>
125-
Cancel
39+
Prev Sprite
12640
</Item>
127-
</div>
41+
</>
42+
)}
43+
44+
<Select
45+
options={[
46+
{
47+
label: 'Reduce Mappings',
48+
value: 'mappings',
49+
},
50+
{ label: 'Reduce Tiles', value: 'tiles' },
51+
]}
52+
store={importState}
53+
accessor="type"
54+
onChange={importState.changeType}
55+
/>
56+
57+
<div className="input">
58+
<span>Palette</span>
59+
<Input
60+
store={importState}
61+
accessor="paletteLine"
62+
assert={paletteLineAssert}
63+
onChange={importState.changePalette}
64+
isNumber
65+
/>
12866
</div>
12967

130-
<div className="container">
131-
<div
132-
className="workspace"
133-
style={{
134-
width: 0,
135-
height: 0,
136-
left: '50%',
137-
top: '50%',
138-
transform: `
68+
<div className="input">
69+
<span>Zoom</span>
70+
<Input
71+
store={importState}
72+
accessor="scale"
73+
assert={zoomAssert}
74+
isNumber
75+
/>
76+
</div>
77+
78+
<div className="input">
79+
<span>Mappings</span>
80+
<span>{mappings.length}</span>
81+
</div>
82+
83+
<div className="input">
84+
<span>Tiles</span>
85+
<span>{importState.tileQty}</span>
86+
</div>
87+
88+
{sprites.length > 1 && (
89+
<div className="input">
90+
<span>Sprite</span>
91+
<span>
92+
{spriteIndex + 1} / {sprites.length}
93+
</span>
94+
</div>
95+
)}
96+
</div>
97+
98+
<div className="menu-section">
99+
{importState.path && (
100+
<Item
101+
color="orange"
102+
inverted
103+
onClick={importState.backToDetect}
104+
>
105+
Back
106+
</Item>
107+
)}
108+
<Item color="red" inverted onClick={importState.cancel}>
109+
Cancel
110+
</Item>
111+
</div>
112+
</div>
113+
114+
<div className="container">
115+
<div
116+
className="workspace"
117+
style={{
118+
width: 0,
119+
height: 0,
120+
left: '50%',
121+
top: '50%',
122+
transform: `
139123
scale(${scale})
140124
translate(-${importWidth / 2}px,-${
141-
importHeight / 2
142-
}px)
125+
importHeight / 2
126+
}px)
143127
`,
128+
}}
129+
>
130+
<canvas
131+
key={`import-${spriteIndex}`}
132+
ref={importState.canvasRefImport}
133+
className="import-canvas"
134+
/>
135+
{mappings.map(({ x, y, width, height }, i) => (
136+
<div
137+
style={{
138+
top: y,
139+
left: x,
140+
width: 8 * width - 1,
141+
height: 8 * height - 1,
144142
}}
145-
>
146-
<canvas
147-
key={`import-${spriteIndex}`}
148-
ref={importState.canvasRefImport}
149-
className="import-canvas"
150-
/>
151-
{mappings.map(({ x, y, width, height }, i) => (
152-
<div
153-
style={{
154-
top: y,
155-
left: x,
156-
width: 8 * width - 1,
157-
height: 8 * height - 1,
158-
}}
159-
key={i}
160-
className="import-mapping"
161-
/>
162-
))}
163-
</div>
164-
</div>
143+
key={i}
144+
className="import-mapping"
145+
/>
146+
))}
165147
</div>
166-
);
167-
}
168-
},
169-
);
148+
</div>
149+
</div>
150+
);
151+
});

app/formats/scripts/debug.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { render } from 'react-dom';
55
import util from 'util';
66
import { Button } from '#ui';
77
import { environment } from '#store/environment';
8+
import { storage } from '#store/storage';
89

910
const inspect = (obj) => util.inspect(toJS(obj));
1011

@@ -40,6 +41,7 @@ class MapLogger {
4041
}
4142

4243
const log = new MapLogger();
44+
storage(log, 'map-logger', ['enabled']);
4345

4446
autorun(
4547
() => {

app/formats/scripts/run-script.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ export default catchFunc((file) => {
184184
sectionList.forEach(([readFrame], i) => {
185185
logger(`====== SECTION ======`, i);
186186
read: for (let spriteIndex = 0; spriteIndex < readLimit; spriteIndex++) {
187+
if (cursor >= buffer.length) break;
187188
logger(`== SPRITE == ${spriteIndex.toString(16)} `);
188189
const sprite = [];
189190
const ref = { global };

scripts/Sonic CD.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ mappings([
3333
});
3434
},
3535
({ sprite }) => {
36-
write(dc.w, sprite.length);
36+
write(dc.b, sprite.length);
3737
return ({ mapping }) => {
3838
write(dc.b, mapping.top);
3939
write(nybble, 0);

0 commit comments

Comments
 (0)