private List<Integer> getItemOffsets() {

		List<Integer> itemOffs = new ArrayList<Integer>();

		for (int i = 0; i < maps.length; i++) {
			if (maps[i] != null) {
				itemOffs.addAll(maps[i].itemOffsets);
			}
		}

		int hiRoutine = romEntry.getValue("HiddenItemRoutine");
		int spclTable = romEntry.getValue("SpecialMapPointerTable");
		int spclBank = bankOf(spclTable);

		if (!isYellow()) {

			int spclList = romEntry.getValue("SpecialMapList");

			int lOffs = spclList;
			int idx = 0;

			while ((rom[lOffs] & 0xFF) != 0xFF) {

				int spclOffset = calculateOffset(spclBank, readWord(spclTable
						+ idx));

				while ((rom[spclOffset] & 0xFF) != 0xFF) {
					if (calculateOffset(rom[spclOffset + 3] & 0xFF,
							readWord(spclOffset + 4)) == hiRoutine) {
						itemOffs.add(spclOffset + 2);
					}
					spclOffset += 6;
				}
				lOffs++;
				idx += 2;
			}
		} else {

			int lOffs = spclTable;

			while ((rom[lOffs] & 0xFF) != 0xFF) {

				int spclOffset = calculateOffset(spclBank, readWord(lOffs + 1));

				while ((rom[spclOffset] & 0xFF) != 0xFF) {
					if (calculateOffset(rom[spclOffset + 3] & 0xFF,
							readWord(spclOffset + 4)) == hiRoutine) {
						itemOffs.add(spclOffset + 2);
					}
					spclOffset += 6;
				}
				lOffs += 3;
			}
		}

		return itemOffs;
	}