-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpatches.c
executable file
·130 lines (114 loc) · 2.8 KB
/
patches.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* Sarien - A Sierra AGI resource interpreter engine
* Copyright (C) 1999-2001 Stuart George and Claudio Matsuoka
*
* $Id: patches.c,v 1.7 2002/08/04 16:26:04 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 <stdio.h>
#include <string.h>
#include "sarien.h"
#include "agi.h"
#include "opcodes.h"
#ifdef PATCH_LOGIC
#define ip (game.logics[n].cIP)
#define code (game.logics[n].data)
#define size (game.logics[n].size)
/*
* 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
};
#if 0
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
};
#endif
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) {
#if 0
/* ALT-X in the questions takes care of that */
case 6:
/* lsl1 bypass questions */
if (!strcmp (game.id, "LLLLL")) {
if (!memcmp (lsl1data_find, (code+ip), 30))
memmove ((code+ip), lsl1data_fix, 9);
}
break;
#endif
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(ip + 30 < size && !memcmp (mh1data_find, (code+ip), 30)) {
memmove ((code+ip), mh1data_fix, 6);
}
break;
}
}
#endif