/* Sarien - A Sierra AGI resource interpreter engine * Copyright (C) 1999-2001 Stuart George and Claudio Matsuoka * * $Id: patches.c,v 1.3 2001/06/27 16:48:02 cmatsuoka Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; see docs/COPYING for further details. */ #include #include #include "sarien.h" #include "agi.h" #include "opcodes.h" #define ip (game.logics[n].cIP) #define code (game.logics[n].data) /* * Patches */ static UINT8 kq4data_find[]= { 0x0C, 0x04, 0xFF, 0x07, 0x05, 0xFF, 0x15, 0x00, 0x03, 0x0A, 0x00, 0x77, 0x83, 0x71, 0x0D, 0x97, 0x03, 0x98, 0xCE, 0x18, 0x98, 0x19, 0x98, 0x1B, 0x98, 0x0C, 0x5A, 0x1A, 0x00 }; static UINT8 kq4data_fix[]= { /* v19 = 0 * new.room(96) * return */ 0x03, 0x13, 0x0, 0x12, 0x60, 0x00 }; static UINT8 grdata_find[]= { 0x0C, 0x04, 0xFF, 0x07, 0x05, 0xFF, 0x16, 0x00, 0x0C, 0x96, 0x03, 0x0A, 0x00, 0x77, 0x83, 0x71, 0x0D, 0xD9, 0x03, 0xDC, 0xBF, 0x18, 0xDC, 0x19, 0xDC, 0x1B, 0xDC, 0x0C, 0x95, 0x1A }; static UINT8 grdata_fix[]= { /* reset(227) * v19 = 0 * v246 = 1 * set(15) * new.room(73) */ 0x0D, 0xE3, 0x03, 0x13, 0x00, 0x03, 0xF6, 0x01, 0x0C, 0x0F, 0x12, 0x49 }; static UINT8 lsl1data_find[]= { 0xFF, 0xFD, 0x07, 0x1E, 0xFC, 0x07, 0x6D, 0x01, 0x5F, 0x03, 0xFC, 0xFF, 0x12, 0x00, 0x0C, 0x6D, 0x78, 0x8A, 0x77, 0x69, 0x16, 0x18, 0x00, 0x0D, 0x30, 0x0D, 0x55, 0x78, 0x65, 0x0A }; static UINT8 lsl1data_fix[]= { /* set(109) * reset(48) * reset(85) * accept.input() * new.room(11) */ 0x0C, 0x6D, 0x0D, 0x30, 0x0D, 0x55, 0x78, 0x12, 0x0B }; static UINT8 mh1data_find[]= { 0xFF, 0x07, 0x05, 0xFF, 0xE6, 0x00, 0x03, 0x0A, 0x02, 0x77, 0x83, 0x71, 0x6F, 0x01, 0x17, 0x00, 0x03, 0x00, 0x9F, 0x03, 0x37, 0x00, 0x03, 0x32, 0x03, 0x03, 0x3B, 0x00, 0x6C, 0x03 }; static UINT8 mh1data_fix[]= { 0x0C, 0x05, 0x16, 0x5A, 0x12, 0x99 }; void patch_logic (int n) { switch(n) { case 6: /* lsl1 bypass questions */ if (!strcmp (game.id, "LLLLL")) { if (!memcmp (lsl1data_find, (code+ip), 30)) memmove ((code+ip), lsl1data_fix, 9); } break; case 125: /* gold rush code break */ if (!strcmp (game.id, "GR")) { if (!memcmp (grdata_find, (code+ip), 30)) memmove ((code+ip), grdata_fix, 12); } break; case 140: /* kings quest 4 code break */ if (!strcmp (game.id, "KQ4")) { if(memcmp (kq4data_find, (code+ip), 29)==0) memmove ((code+ip), kq4data_fix, 6); } break; case 159: /* manhunter 1 amiga */ if(!memcmp (mh1data_find, (code+ip), 30)) { memmove ((code+ip), mh1data_fix, 6); } break; } }