Skip to content

Commit

Permalink
Crash Warped: crash fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
PFedak committed Feb 11, 2025
1 parent f668622 commit bafb566
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 27 deletions.
1 change: 0 additions & 1 deletion src/CrashWarped/bin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2050,7 +2050,6 @@ function parseTerrain(view: DataView, name: string, offsets: number[], cache: Te
let offs = offsets[0] + 8;
const textures: number[] = [];
for (let i = 0; i < texCount; i++) {
console.log(view.getUint32(offs, true));
const uv = parseUV(view, offs + 4);
textures.push(cache.findOrParse(texChunk, uv));
offs += 0x10;
Expand Down
2 changes: 1 addition & 1 deletion src/CrashWarped/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,7 @@ export class TerrainMeshData {
depthWrite: true,
cullMode: GfxCullMode.None,
};
setAttachmentStateSimple(this.megaStateFlags, translateBlendMode(BIN.XLUBlendMode.DISABLED));
setAttachmentStateSimple(this.megaStateFlags, translateBlendMode(BIN.XLUBlendMode.AVERAGE));

this.vertexBuffer = makeStaticDataBuffer(device, GfxBufferUsage.Vertex, vertexData.buffer);

Expand Down
63 changes: 38 additions & 25 deletions src/CrashWarped/script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -760,8 +760,7 @@ class InstructionPrinter implements InstructionHandler<string> {
if (this.inMIPS) {
if (inst === 0) {
this.currIndex++;
}
else if (inst === 0x03E00008) {
} else if (inst === 0x03E00008) {
this.instJump = -2;
this.inMIPS = false;
out.push(`${this.currIndex} MIPS RETURN`)
Expand All @@ -775,6 +774,7 @@ class InstructionPrinter implements InstructionHandler<string> {
this.currIndex += 2;
this.inMIPS = false;
} else {
out.push(`${this.currIndex} MIPS ${MIPS[parseMIPSOpcode(inst)]} ${inst.toString(16)}`);
this.currIndex++;
// const res = lookupMIPS(behavior.name, this.currIndex*4, inst, null, null!);
// if (res.blockSize < 0) {
Expand Down Expand Up @@ -1004,13 +1004,12 @@ interface signalReceiver {
args: number[];
}

const receiver: signalReceiver = {
const receivers: signalReceiver[] = nArray(3, () => ({
inUse: false,
wasB: false,
newState: 0,

args: nArray(10, () => 0),
}
}));

const scratchVecs = nArray(3, () => vec3.create());
const pathScratch = nArray(3, () => vec3.create());
Expand Down Expand Up @@ -1205,16 +1204,25 @@ export class CrashObject {
switch (this.get(Source.OBJECT_ID)) {
// case 0x580002: case 0x040018:
// thresh = 1; break;
// rings of power lens flares
case 0x200000: case 0x200003: case 0x300000: case 0x300001:

case 0x440001: case 0x440002: case 0x440003: case 0x440004:
case 0x440006: case 0x44000B: thresh = 0; break;
case 0x440006: case 0x44000B:

thresh = 0; break;
}

return game.frame >= this.lastUpdate + thresh;
}

public tryUpdateSelfAndChildren(game: GameState): void {
this.update(game);
try {
this.update(game);
} catch (e) {
this.errored = true;
console.warn("exception", this.state, this.id, this.index);
}
let child = this.getObj(Source.CHILD, game);
while (child) {
const next = child.getObj(Source.NEXT, game);
Expand Down Expand Up @@ -1359,7 +1367,7 @@ export class CrashObject {
}
let path: ReadonlyVec3[] = this.placement.path;
if (this.db !== this.placement.db) {
console.warn("snapping non-placement path")
// console.warn("snapping non-placement path")
path = assertExists(assertExists(this.db).vecSeries.get(DatabaseKey.PATH))[0];
}

Expand Down Expand Up @@ -2059,7 +2067,16 @@ export class CrashObject {
}
// console.log("sending", signal, "from", this.index, "to", target.index)
let newState = 0xFF;
assert(!receiver.inUse)
let receiver: signalReceiver | null = null;
let receiverIndex = 0;
for (let i = 0; i < receivers.length; i++) {
if (receivers[i].inUse)
continue;
receiver = receivers[i];
receiverIndex = i;
break;
}
assert(receiver !== null)

receiver.newState = -1;
for (let i = 0; i < argCount; i++)
Expand All @@ -2071,7 +2088,7 @@ export class CrashObject {
receiver.inUse = true;

target.push(rawSignal);
target.push(buildPointer(PointerBase.RECEIVER, 0));
target.push(buildPointer(PointerBase.RECEIVER, receiverIndex));
target.stackFrame(2);
target.setScriptPointer(target.get(Source.ON_SIGNAL), game);
target.runScript(ScriptMode.SIGNAL, game);
Expand Down Expand Up @@ -2224,6 +2241,7 @@ class InstructionExecutor implements InstructionHandler<ExecResult> {
break;
}
if (ptr.base === PointerBase.RECEIVER) {
const receiver = receivers[ptr.offset];
assert(receiver.inUse);
result = receiver.args[right >>> 8];
} else if (ptr.base === PointerBase.MEMBER) {
Expand Down Expand Up @@ -2399,12 +2417,6 @@ class InstructionExecutor implements InstructionHandler<ExecResult> {
}
public spawnChild(fileIndex: number, id: number, count: number, argCount: number): ExecResult {
let spawn = true;
// switch (this.behavior.name) {
// case "WillC": case "DispC":
// case "FruiC": case "FshOC":
// case "SmOC": case "EfOC": case "DSmOC":
// spawn = false;
// }
if (this.game.objects.length < 500 && spawn) {
// console.warn('spawn', inst, this.placement);
const name = this.game.level.classNameList[fileIndex];
Expand Down Expand Up @@ -2677,13 +2689,16 @@ class InstructionExecutor implements InstructionHandler<ExecResult> {
this.obj.sendSignal(target, signal, argCount, this.game);
} else if (op === Opcode.COLLIDE_ONE || op === Opcode.COLLIDE_ALL) {
target.collideAllChildren(this.obj, targetSrc, signal, argCount, this.game);
console.log("collide with", varString(targetSrc), signal.toString(16), this.obj.index)
// console.log("collide with", varString(targetSrc), signal.toString(16), this.obj.index)
}
for (let i = 0; i < argCount; i++)
this.obj.pop();
return ExecResult.CONTINUE;
}
public receive(op: Opcode, arg: Source, srcOp: number, action: number, scriptOffset: number): ExecResult {
const receiverInfo = parsePointer(this.obj.getParameter(1));
assert(receiverInfo.base === PointerBase.RECEIVER);
const receiver = receivers[receiverInfo.offset];
if (!receiver.inUse)
return ExecResult.FAILED_SIGNAL;
let value = 1;
Expand Down Expand Up @@ -2793,6 +2808,7 @@ export class NaiveInterpreter {
this.currScript = obj.currScriptBehavior.name;
this.startOffset = start;
this.fileOffset = view.byteOffset + start;
this.regs[RegName.S0] = buildPointer(PointerBase.OBJECT, obj.index);

let branchDest = -1, inDelay = false, shouldBranch = false;
let offs = start;
Expand Down Expand Up @@ -2861,7 +2877,8 @@ export class NaiveInterpreter {
} else
this.regs[rt] = baseObj.get(src);
} else {
debugger;
// bad deref
// debugger;
}
}
} break;
Expand All @@ -2885,13 +2902,9 @@ export class NaiveInterpreter {
game.globals[imm >> 2] = this.regs[rt];
} else {
let baseObj: CrashObject | null = null;
if (rs === RegName.S0) {
baseObj = obj;
} else {
const ptr = parsePointer(this.regs[rs]);
if (ptr.base === PointerBase.OBJECT) {
baseObj = game.objects[ptr.offset];
}
const ptr = parsePointer(this.regs[rs]);
if (ptr.base === PointerBase.OBJECT) {
baseObj = game.objects[ptr.offset];
}
if (baseObj) {
// loading from object
Expand Down
2 changes: 2 additions & 0 deletions src/DefaultSaveStates.json
Original file line number Diff line number Diff line change
Expand Up @@ -6489,10 +6489,12 @@
"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/1f/1": "ShareData=AD9etUjrkC8G09gTZt/SV]A}zQwX7]Up2EhT5Vr]WMgl;825Vg8{obnUiFqcWP",
"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/24/1": "ShareData=ANT=*Uu,0!7=GVVTG8=_WQrrx5,3shUhTnYT?nDaV/|_g8Lys+8?YzBUr3*hWq",
"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",
Expand Down

0 comments on commit bafb566

Please sign in to comment.