Monday 2 June 2008

... mens jernet er varmt

Ikke at jeg har spesielt til smedfingre.

Men dagens pjatt er om modding. Av spill. Mye annet som kan moddes - biler, vær, leiligheter... (Sjekk Været Via Blåtann På Badet! Nyhet!)... skal vi ikke snakke om.

I dag er det spill som får unngjelde. En hamrer på dem til de buler som høygravide hobbiter. Som oftest får de også mange skarpe kanter og pigger, og oser litt svidd. Eller har en skjult alien som krøster seg ut, massakrerer alt ditt harde arbeid og litt til, og får den uheldige spilleren til å skrive fantasifulle dødstrusler på $WEBFORUM.

Baldur's Gate II er et av Biowares mest anerkjente spill. Det er passelig enormt i omfang og har mer bevegelsesfrihet i historien enn de fleste. En skal vel ikke kalle det voldsomt modvennlig, men iherdig omvendt dataformatknørving og involvering fra *nix-entusiaster har gjort det til en levelig situasjon etter hvert.

Hexredigering via script er gøy.

WRITE_SHORT %fxoff% + 0x30 * %fxnum% + 0x00 %opcode%
WRITE_BYTE %fxoff% + 0x30 * %fxnum% + 0x02 1 // target self
WRITE_BYTE %fxoff% + 0x30 * %fxnum% + 0x03 0 // power
WRITE_LONG %fxoff% + 0x30 * %fxnum% + 0x04 %param1%


Spleise inn dialogvalg i et dekompilert dialogtre har sin sjarm.
REPLACE_STATE_TRIGGER banomen 22 ~See(Player1)
CombatCounter(0)
!See([ENEMY])
!StateCheck(Player1,CD_STATE_NOTVALID)
!StateCheck(Myself,CD_STATE_NOTVALID)
Global("BAnomen3","LOCALS",0)~


Spleise inn en få-fienden-til-å-lyse-gusjegrønt-effekt i et våpen via scriptet hexredigering er en smule intrikat, når en skal ta hensyn til at tidligere modder i modstabelen kan ha gjort noe lignende.

Få en beskrivende tekst til å ligne sannheten, med ~50 tidligere modder å ta hensyn til og regexp mest brukbare verktøy... morsomt :)

INNER_PATCH_SAVE newdescstr "%uniddesc%" BEGIN
REPLACE_EVALUATE ~%replacestring%~
BEGIN
SPRINT result ~%insertstring%~
END
~%result%~
END


Scripte en grunnleggende endring som skal gjøres på alle ~3000 brukbare dingser i spillet, og ta hensyn til at ikke alle er like ... kompetente til å lage slikt når de lager en mod, men motoren er snill nok til vanligvis ikke å kræsje tross småfeil og delvis korrupte filer? Vi snakker snart rent underholdende ninjatriks.

I bunnen her har vi et scriptorientert moddeverktøy lagd av en tradisjonell unixgeek. I OCaml. Som holder styr på hvilke modder du legger inn og i hvilken rekkefølge. Og involverer minst tre forskjellige domenespesifikke språk, pluss hexredigering. Andre har så lagd nye makrospråk på toppen av dette igjen. Vi snakker iallfall fire generasjoner av moddere siden spillet kom ut. Første generasjon rakk ikke annet enn å omvendtknørve filformater før de ble drevet til vanvidd av all denne kunnskapen Man Was Not Meant To Know, og oppholdt seg siden mest på Arkham Asylum. Heldigvis ble kludringen på veggene bevart, så neste generasjon beholdt fatningen lenge nok til å få stormannsgalskap. De satte så i gang med dødsforakt, og ga noen år senere fra seg noen sørgelige rester av planene om verdensherredømme før de sjelevandret til neste plan av eksistens.

Etter den tid begynte moroa.

Senere generasjoner har dog fremdeles tilbakefall av galskap. Hvordan ellers kan denne syntaksen ha blitt til?

OUTER_INNER_PATCH_SAVE savevar buffString BEGIN patch list END


Modlista er i dag oppe i 697 oppføringer. Majoriteten av dem er relativt kompatible med hverandre og seg selv tross uhell nå og da. Det begynner å bli folksomt i Athkatla.

Spillmotoren er ganske imponerende, egentlig. Den takler fint å ha noen hundre AI-script på 1MB+, kompilert, kjørende. Til å være lagd i Y2K har den holdt seg godt.

Har sin sjarm å hacke på slik über-gnarly kode. 2600 scriptlinjer and counting i min lille mod for tiden. For ikke å snakke om 789-linjers shellscriptet for å bygge min vanlige multimodinstall...