Skip to content

Instantly share code, notes, and snippets.

local startCrystalActivityAddr = 0x6B4
local levelObjAddrs = {
0x167D5,
0x18815,
0x173F6, --FFCount=1
0x14B7A, --FFCount=1
0x1550E, --FFCount=1
0x194D3,
0x128D6,
0x13642, --show 1 fake crystal
from idaapi import *
import struct
sizeBuf = GetManyBytes(0x1A0, 8)
romStart, romEnd = struct.unpack(">II", sizeBuf)
buf = GetManyBytes(romStart, romEnd+1)
i = 0
while True:
i = buf.find("RNC", i+1)
if i == -1:
BANK6:8C34 ; state (81 - patrol, 82 - attack dw)
BANK6:8C34
BANK6:8C34 enemy0_behaviour:
BANK6:8C34 LDA $4D0,X
BANK6:8C37 AND #$F ; state (81 - patrol, 82 - attack dw)
BANK6:8C39 BNE loc_50C51 ; present
BANK6:8C3B STA $530,X ; live state
BANK6:8C3E LDA #1
BANK6:8C40 STA $540,X ; pot.speed = 1
BANK6:8C43 INC $4D0,X ; init state "not viewing dw"
--загружаем библиотеку gd
require "gd"
--начальный адрес для коррапта (сразу от заголовка образа ROM)
START_ADDR = 0x10
--конечный адрес для коррапта (зависит от маппера, на котором сделан картридж, можно просто выставить размер файла)
END_ADDR = 0x20010
CUR_ADDR = START_ADDR
--конечный номер кадра, после которого нужно сделать скриншот (когда игровой экран уже отображается для игрока, номер замерен для созданного сохранения)
FRAME_FOR_SCREEN = 7035
@spiiin
spiiin / scala_vk_get_pictures.scala
Created March 23, 2015 23:57
Загрузка картинок из альбома Вконтакте
package scala_vk_get
import scala.sys.process._
import scala.concurrent._
import scala.concurrent.duration._
import scala.xml.XML
import scala.io.Source
import java.net.URL
import java.io.File
import java.util.concurrent.Executors
import sys
import re
import urllib
import urllib2
import os.path
import md5
import threading
import time
import vk_param
object james_bond_jr {
type State = Vector[Int]
val initialState: State = Vector(1,2,2,1, 3,4,4,3, 3,4,4,3, 2,4,4,2)
val endState: State = Vector(4,3,4,2, 3,1,2,4, 4,2,4,3, 2,4,3,1)
trait Move {
def act(state: State): State
}
case class MoveLeft(row: Int) extends Move {
@spiiin
spiiin / find_longest_8.py
Created October 12, 2014 13:07
find longest sequence of 8-multiple values
import os
fn = os.path.expanduser("~/desktop/dump.bin")
with open(fn, "rb")as f:
d = f.read()
d = map(ord, d)
def repWord(d):
ans = []
for x in xrange(0,len(d),2):
ans.append(d[x]*256+d[x+1])
@spiiin
spiiin / extractPitfallRle_interactive.py
Created October 12, 2014 13:03
extract sega pitfall rle
def extractWord(fullData):
return (fullData[0]*256 + fullData[1], fullData[2:])
def extractTwoBytes(fullData):
return (fullData[0], fullData[1], fullData[2:])
def extractCol(data, colLen):
ans = []
while len(ans) < colLen and len(data)>0:
b1, b2, data = extractTwoBytes(data)
#Суть алгоритма:
# 1. Находим для всех массивов, какой длины у него есть "торчащие" голова и хвост из одинаковых элементов. Получаем массив из туплов - голова, хвост, индекс элемента.
# 2. Выбираем самую лучшую пару для соединения - ищем, какие голова и хвост могут образовать самую длинную цепочку
# 3. Соединяем два элемента массива в один - склеиваем голову и хвост, получаем элемент с новыми концами. Запоминаем также, какая пара элементов была склеена - храним список того, какие именно элементы были соединены.
# 4. Повторяем шаг 2 до тех пор, пока это возможно - пока будут находится пары элементов, у которых значение головы первого элемента пары совпадает со значением хвоста второго элемента.
# 5. Когда таких пар не нашлось - список невозможно дальше склеивать, теперь проходим по нему слева направо и восстанавливаем все списки индексов элементов - это лучшая последовательность для сжатия её алгоритмом RLE.
#------------------------------------------------------------
def calcEnds(arr):
repeatBegin = 0
for