Skip to content

Commit

Permalink
Add Crash Bandicoot: Warped
Browse files Browse the repository at this point in the history
  • Loading branch information
PFedak committed Feb 10, 2025
1 parent b7274d1 commit 3d0bd07
Show file tree
Hide file tree
Showing 8 changed files with 6,904 additions and 12 deletions.
2,125 changes: 2,125 additions & 0 deletions src/CrashWarped/bin.ts

Large diffs are not rendered by default.

1,309 changes: 1,309 additions & 0 deletions src/CrashWarped/render.ts

Large diffs are not rendered by default.

356 changes: 356 additions & 0 deletions src/CrashWarped/scenes.ts

Large diffs are not rendered by default.

3,026 changes: 3,026 additions & 0 deletions src/CrashWarped/script.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/DebugFloaters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ export class FloatingPanel implements Widget {
} else {
valueStr = value.toFixed(fracDig);
}

slider.setLabel(`${labelName} = ${valueStr}`);

let changedCallback = Reflect.getMetadata('df:changedcallback', obj, paramName);
Expand Down
38 changes: 37 additions & 1 deletion src/DefaultSaveStates.json
Original file line number Diff line number Diff line change
Expand Up @@ -6462,5 +6462,41 @@
"SaveState_WorldOfWarcraftWOTLK/Icecrown Citadel, Icecrown-822688": "ShareData=ALNpLUMl[fUmuX3UYqnMW2ql}R4hV7UmmUm90u3nV_bgZ90W0UUS*hxUDU^zWq",
"SaveState_WorldOfWarcraftWOTLK/Dalaran, Crystalsong Forest-822688": "ShareData=ADJ:h9j,(-UK7!XUV_*yW3;vSRc:s=Ud}FF9Vc:JV@ha+96V4q9S9pX91s,6Wq",
"SaveState_WorldOfWarcraftWOTLK/Wyrmrest Temple, Dragonblight-822688": "ShareData=AawT/91&Zu8)UL$9xotfW9D7bR4TOAUbA669X9LVVeNR0Uq]M89SvGH9o}m6Wq",
"SaveState_WorldOfWarcraft/Mauradon-788656/1": "ShareData=AAo@!9O=vs86WZLUk&7qWORD06X!HUUV*5BT,llX+XN:f9wZemTw9W)9Q!f?+^"
"SaveState_WorldOfWarcraft/Mauradon-788656/1": "ShareData=AAo@!9O=vs86WZLUk&7qWORD06X!HUUV*5BT,llX+XN:f9wZemTw9W)9Q!f?+^",
"SaveState_CrashWarped/2/1": "ShareData=AQQ!4Ua6UR8hp,OT9L?oUkUQkQP/!OUnYu:T=f}_Vpz-O8-E!]8;]*9Up]3mVt",
"SaveState_CrashWarped/3/1": "ShareData=AZOJ891nXn8@!$WT|)nmVUWvb5|)/9UurzmUfVX4Vw[,59H4a(UrmM69xm,;+5",
"SaveState_CrashWarped/4/1": "ShareData=AY]AGUkRox8dC|!Th@sFU7s6OP;RBKUjI!&T^cmFVU&fq8oVhR9OAEEUmGBpVt",
"SaveState_CrashWarped/6/1": "ShareData=AY]hRUZUW|8P7rzTKT!Q9,l1J5I95jUebs}T|BUyVwV3e8pdRA9X|EvUk*N)Vt",
"SaveState_CrashWarped/7/1": "ShareData=AQAgPUvQE$8d4]{Tr4/c9]C8*QDl9fUg3I8UG!hAV1?DB81;g/9a!KwUr*25Vt",
"SaveState_CrashWarped/a/1": "ShareData=APL^~UgE,5SvI8$TfGfuWWZ=)RAT-:Utto58y!RtWMQ^v8wud4TjAnCUtTO{Wq",
"SaveState_CrashWarped/b/1": "ShareData=AW9W+Uv*V?7}+QBTx9t2WSi?UQ=B;)Ur1+FT&T+@Vukva823A}9EGA[UqtnZWq",
"SaveState_CrashWarped/c/1": "ShareData=AUu+nUs!Jy8i_5QT?@;LWKrbX6J]UrUjg^:T33qMWAAY=8_gaX9B-AlUhgo]Wq",
"SaveState_CrashWarped/d/1": "ShareData=AEuH5UpRwLTiL|29FwWAV$(oUQzMc9Uac~cT))w?V9K7JT&Z,=9ZdvZUhP;mWq",
"SaveState_CrashWarped/e/1": "ShareData=AENI+Ucku+8OYkE8rzxuWNR/*Q|9^dUtF}u9dQCn=HMPTTeYslT|K}PUYrR}V[",
"SaveState_CrashWarped/f/1": "ShareData=APLt4UXAgZ7}^OET,6EGWlF8a5=r=~UjbVFT&=~5V+ODL8~XFX8/W-PUn*tTWq",
"SaveState_CrashWarped/10/1": "ShareData=ACDqGUis!MTlK]99b@KLWhPp]RY+RTUion;T;h^GV}P9SUFgOv8;n:eUm)[sWq",
"SaveState_CrashWarped/11/1": "ShareData=ANc~{UsbkxST8hp8RV;lWSiUK5$mS@Un,{uTflY&WEl}iS}EZn8z?!WUb8KsWq",
"SaveState_CrashWarped/12/1": "ShareData=AE^YfUlWM08kKAcT:~jYWl8/F5v+|uUe?GYUA{XxV;+g;8*^5}9I}4IUa/(rWq",
"SaveState_CrashWarped/13/1": "ShareData=AAgrV9kOn,8xDgAUQr*MVe=J15/4pwUalqOT}-VbWKPED9XHhkT{::v9uq8Q=a",
"SaveState_CrashWarped/14/1": "ShareData=AZBJkUk8/j8Y]f$T5HH-Wxjm@6bOn^UcHNwT;83aVXV[n8!-7O8=~A}UZR;&Wq",
"SaveState_CrashWarped/15/1": "ShareData=AGiTQUbw2JS[y/g8L0i(WjPjGQ(GO4UtDnwUM0)AVjII_TFz^[9e|AMUbE]zW~",
"SaveState_CrashWarped/16/1": "ShareData=AYSxAUtHjm8etNDTe[!:V$Rcd5*!e*UlRIdUH(BgV+s{H8qd139d]k3Ui4dCWq",
"SaveState_CrashWarped/17/1": "ShareData=ABwO8Uu4M48V7}CT019;9,uF5Qz;VbUgBE7T;0gVV!=6P8[VBW9BoHqUWzIOVt",
"SaveState_CrashWarped/18/1": "ShareData=APxILUj~2}7&8X*TY&l!WmDvk5*tnNUiKWbT]5e|Vwqtl8u+~o9D61HUq:d)Wq",
"SaveState_CrashWarped/19/1": "ShareData=AZa(_9xgTtUOf_F9rtzeWOAqh560IjUnO2}UC88nV+:KnUmhl&T&HJb9ttEhV[",
"SaveState_CrashWarped/1a/1": "ShareData=AXEWCUpLA!Skm?y8hs/zV|rtS5[7]MUpK2TUOi0GV2vPOTP!xG9cZ+9Up|PqWq",
"SaveState_CrashWarped/1b/1": "ShareData=AJ(RnUg)_07?j:CTaz[p=m5c4Q{X$WUf@paT/?(YVw0bT82Icq8;(IIUm$xXWq",
"SaveState_CrashWarped/1c/1": "ShareData=AC,^NUpC/ZTPgL!9OZ2zVwa+X5EsE,UZ}mcTx}Ku=H)xzUOV/989,LvUk{9BV[",
"SaveState_CrashWarped/1d/1": "ShareData=AP_SpUiW]nTO3m98])BCWjlxF5x?R;Um_uXT9{p4VuCB}T]XPG8_lc$Ur0l=Wq",
"SaveState_CrashWarped/1e/1": "ShareData=AYlJNUpeMz5p!m^TtGVzWiJwA5[iFzUZ}/d537k2V=)|F8vL-I5qjKXUVk6GWq",
"SaveState_CrashWarped/20/1": "ShareData=AYlPPUkL{w7Mj3NTF2q&Wvke!5yqusUW6wfT[l1HVTc1S8M6dI8_OXVUimg0W~",
"SaveState_CrashWarped/21/1": "ShareData=AIrM7Uf{DXT/C169okaMWAwM[6fQMlUhny+T;/xSVz6]^Uh=[}8?}@mUmw@oWq",
"SaveState_CrashWarped/22/1": "ShareData=AC-reUpoCwTACxw8!kVyWUt-56baW$UrMjSUHUAZV8J^VT[S5/9f8]EUdUg}Wq",
"SaveState_CrashWarped/23/1": "ShareData=AGQBMUsGPC7]TZrTgj0iWiSX=6f0(0UXf8)UT+?qV?!Aj8pA+69e8SyUg!b_Wq",
"SaveState_CrashWarped/25/1": "ShareData=AP$aOUg)f47~&Q:Th*pOW-;K@QZ(s*Uv)7aT!{h5Vl)nV8kKN;8[$QfUqp+7W~",
"SaveState_CrashWarped/26/1": "ShareData=AT/oKUVh/cS?rNK9B{ki=-H[~5$I5FUmUp5T_),)=oun|T3!r;9BN39Uagx7V[",
"SaveState_CrashWarped/27/1": "ShareData=AY2n$Udd]kTm0Dd9RWTlW0nN255^W&UskWeUL&92VrRF8ULQok8*lmUUa+|NWq",
"SaveState_CrashWarped/29/1": "ShareData=AIWn+UuaLv8A{bLT+BnQ9mhy}5qH&UUXc;UTf=rRV[Eis8[2a28pTdyUq_rbVt",
"SaveState_CrashWarped/2a/1": "ShareData=AGw-BUd8|@8Zcc6T]6!S=LQgS6I2nDUcXPjT4XvtVhuwl8{0d(9Cd8VUs|0iVt",
"SaveState_CrashWarped/3c/1": "ShareData=ARtabUg2H=Tjys(T!(eu+FzRN4=+sJUYHA}8~C@,+bUuA8-FGVT=VuUUv;w;Vt"
}
58 changes: 48 additions & 10 deletions src/PokemonSnap/mips.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { nArray, assert } from '../util.js';

export const enum Opcode {
NOP = 0x00,

BRANCH = 0x01,
JAL = 0x03,
BEQ = 0x04,
BNE = 0x05,
Expand Down Expand Up @@ -33,10 +33,28 @@ export const enum Opcode {

// register opcode block
REGOP = 0x100,
SLL = 0x100,
SRL = 0x102,
SRA = 0x103,
SLLV = 0x104,
SRLV = 0x106,
SRAV = 0x107,

JR = 0x108,
JALR = 0x109,
MFHI = 0x110,
MFLO = 0x112,
MULT = 0x118,
DIV = 0x11A,
ADD = 0x120,
ADDU = 0x121,
SUB = 0x122,
SUBU = 0x123,
AND = 0x124,
OR = 0x125,
XOR = 0x126,
NOR = 0x127,
SLT = 0x12A,

// coprocessor 1 opcode block
COPOP = 0x200,
Expand All @@ -49,6 +67,10 @@ export const enum Opcode {
SUBS = 0x301,
MULS = 0x302,
MOVS = 0x306,

// extra branch instruction block
BLTZ = 0x400,
BGEZ = 0x401,
}

export const enum RegName {
Expand All @@ -62,12 +84,36 @@ export const enum RegName {
A3 = 0x07,

S0 = 0x10,
S1 = 0x11,
S2 = 0x12,
S3 = 0x13,
S4 = 0x14,
S5 = 0x15,
S6 = 0x16,
S7 = 0x17,

SP = 0x1D,
FP = 0x1E,
RA = 0x1F,
}

export function parseMIPSOpcode(instr: number): Opcode {
let op: Opcode = instr >>> 26;
const rs = (instr >>> 21) & 0x1F;
const rt = (instr >>> 16) & 0x1F;
if (op === Opcode.NOP && instr !== 0)
op = (instr & 0x3F) | Opcode.REGOP;
else if (op === Opcode.COP1) {
if (rs === Opcode.COP0 || rs === Opcode.COP1)
op = Opcode.FLOATOP | (instr & 0x3F);
else
op = Opcode.COPOP | rs;
} else if (op === Opcode.BRANCH) {
op = Opcode.BLTZ | rt;
}
return op;
}

export interface Register {
value: number,
lastOp: Opcode,
Expand Down Expand Up @@ -124,16 +170,8 @@ export class NaiveInterpreter {
const instr = view.getUint32(offs + 0x00);
this.lastInstr = instr;

let op: Opcode = instr >>> 26;
const op = parseMIPSOpcode(instr);
const rs = (instr >>> 21) & 0x1F;
if (op === Opcode.NOP && instr !== 0)
op = (instr & 0x3F) | Opcode.REGOP;
else if (op === Opcode.COP1) {
if (rs === Opcode.COP0 || rs === Opcode.COP1)
op = Opcode.FLOATOP | (instr & 0x3F);
else
op = Opcode.COPOP | rs;
}
const rt = (instr >>> 16) & 0x1F;
const rd = (instr >>> 11) & 0x1F;
const frd = (instr >>> 6) & 0x1F;
Expand Down
2 changes: 2 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ import * as Scenes_EstrangedActI from './SourceEngine/Scenes_EstrangedActI.js';
import * as Scenes_AShortHike from './AShortHike/Scenes.js';
import * as Scenes_NeonWhite from './NeonWhite/Scenes.js';
import * as Scenes_OuterWilds from './OuterWilds/Scenes.js';
import * as Scenes_CrashWarped from './CrashWarped/scenes.js';

import { DroppedFileSceneDesc, traverseFileSystemDataTransfer } from './Scenes_FileDrops.js';

Expand Down Expand Up @@ -187,6 +188,7 @@ const sceneGroups: (string | SceneGroup)[] = [
Scenes_Portal2.sceneGroup,
Scenes_WorldOfWarcraft.vanillaSceneGroup,
"Experimental",
Scenes_CrashWarped.sceneGroup,
Scenes_DonkeyKong64.sceneGroup,
Scenes_DonkeyKongCountryReturns.sceneGroup,
Scenes_Elebits.sceneGroup,
Expand Down

0 comments on commit 3d0bd07

Please sign in to comment.