2011. március 26., szombat

Crysis 2

(IGN: 90%, Metacritic 88%)

Kb. 12 óra játékidő után végre ismét elégedett vagyok: megérte megvenni, és megéri még egyszer végigjátszani.

Bár PCs játék, és a fejlesztése 3 platformon egyszerre zajlott, hála a már annyiszor látott fejlesztő eszközüknek, mégis sokan túlzott konzol beütésre panaszkodnak. Mivel én amúgy sem vagyok nagy konfigurálgató, nálam a beállítási lehetőségek elegendőek voltak.

A 250GTS-emen High beállítással teljesen élvezhető és játszható volt, annak ellenére, hogy a C2D 6600 2.4GHz ma már nagyon kevés. A textúrák rendben voltak, (bár mivel manapság csak az tűnik fel, ha valahol spóroltak) lassulást csak akkor tapasztaltam, ha hirtelen fordultam.

Az irányítás jó volt, bár egy kicsit az elején szokatlannak hatott az Assassin's Creed Brotherhood lomhasága után, de később kellemesen osztogattam a kapáslövéseket.

A történet jó, bár gyakran néz az ember, hogy WTF? Ez nem lett megmagyarázva! Sebaj, majd a kiegészítőkben és pályacsomagokban hátha.

Az új ruha(funkciók) is sokkal értelmesebbek, bár az elején még a régi rendszert vártam. Az erő és sebesség összevonása jó húzás volt, és tényleg a használathoz illően lehet aktiválni futással vagy ugrással. Az WASD-hez szokott kezemnek jól jött, hogy a Q, E és Shift kellett a különféle módok aktiválásához. A healthbar viszont kikerült, és helyét az 'Oh! Bloody screen!' vette át. Az armor mód már nem alapértelmezett, cserébe kikapcsolva is többet elbír, mint az első részben. Bekapcsolva pedig kellemesen ellenálló: sokkal jobb, mint az első részben, ahol is három találatnál már lement nullára, és utána a puszta testeddel védekeztél.

A fegyverek talán egy picit egysíkúak: van ugyan a SCAR, de nem lehet annyira konfigurálni, mint az első részben, ehelyett több variánsra bontották. Pl. az egyik alá lehet taktikai kiegészítőt rakni, a másikra meg nem, helyette lehet mesterlövész távcsövet használni.

Nagy előrelépésnek tartom, hogy végre a mesterlövész puskára is lehet hangtompítót szerelni! Sajnos többször előfordult, hogy kifutottam a lőszerből, s ilyenkor vicces-armor módon rohangásztam ide-oda, és melee-ztem az ellent. A fent említett konfigurációs korlátok miatt gyakran nem is érdemes elvenni a fegyvert az ellentől, mert nem szívesen adja fel az ember a scope-os SCAR-ját. További pozitívum, hogy a 50 kaliberes géppuskát le lehet akasztani, és cipelgetni ide-oda. Jó móka! Sajnos a használata ütközik néhány játékfunkcióval, mivel az F megnyomására eldobja, s csak ezután lehet aktiválni dolgokat, illetve a látványra figyelni; pl. a lift indításához kellett eldobnom, de ilyenkor nagyon ügyesen átdobta a lift oldalfalán, nehogy utána fel tudjam ismét venni.

A zene nem olyan különleges, az első rész 'Village driving' hangulatát nemigen hozza. A hangok rendben vannak, bár néha volt tumultus, és ilyenkor pl. a saját fegyverem hangja nem is hallatszott. Az NPC-k hangja átlagos, talán gyengébb az első részhez képest. A Crysis 2 egyfajta fordított Dragon Age 2. Míg utóbbiban a főhős a második részre beszédes lett, addig a Crysis 2-ben épp fordítva: a nagydumás Nomad helyett a kuka Alcatrazt kapjuk. Gondolom, a történetvezetés mellékhatása, mert (spoiler!) az első 3-4 pályán még azt hiszik, hogy Prophet van a ruci alatt. Ejnye-ejnye.

Ami kicsit bosszantó, az a világpremier hiánya. Hétfőn vettem meg, de a másolásvédelem csütörtök estéig nem engedett játszani, akárcsak a DA2, Bulletstorm, stb. Nem hiszek azoknak a kifogásoknak, hogy a polcokra kell érnie a DVD-nek, hiszen az elektronikus letöltésnél nincs ilyen fizikai-logisztikai akadály! Vagy az amcsik nem hajlandók várni? És még mi, Európában jól jártunk, mert pl. Ausztráliában akár egy hónap is eltelhet a megjelenéstől!

Összkép: 85%. Alapos iparosmunka. Várjuk a DLC-ket.

2011. március 15., kedd

Battle: Los Angeles

Megnéztem, kijátszottam.

A film

A film maga viszonylag középszerű volt. Az idegenek ennyire nem tudnak célozni?! A vicces az volt, amikor a tudós bejelentette: "ezek az erőforrásaink miatt jöttek, ki akarnak irtani" - mire én: "ja, akárcsak az amcsik, ha olajról van szó". Földönkívüli terrorizmus és idegengyűlölet. Uploading virus. Ha ha ha ha.

Sajnos a haditechnika felvonultatástól sem voltam elragadtatva, egy COD:MW2 szintű hadviselés UAV-kkal, AC130-Gunshippel, Javelinnel, SCAR-ral. De legalább az az egyetlen Striker harcjármű lett volna felszerelve Quick-kill vagy Throphy-szerű aktív védelemmel. Gondolom, ezeknek a CGI-jeire nem tellett. De legalább nem annyira vicces, mint a Skyline, amit így lehetne összefoglalni: "Ha a pilóta nélküli gépek elbuknak, küldd be a tengerészgyalogosokat."

Másik érdekes dolog Michelle Rodriguez felbukkanása. Úgy néz ki, ő lett az egyik standard női katona/zsoldos/rendőr mostanában.

Értékelés: 55%. Tucat sci-fi elcsépelt élien-támadással, semmi érdemleges felhozatal.

A játék

Hozzá vettem a játékot. Igazi 1C gyártmány, de ők mostanában azért egyre jobb és jobb FPS-eket készítenek. Jó volt látni a legtöbb filmbeli helyszínt.

Az irányítás tipikusan lomhának mondanám. A szélesvásznú nézet zavart, a lassú célra vétel, valamint a pár másodperces sprintelés picit kellemetlen. Ennyit bír egy kiképzett baka?

A játék leírásban "minden modern amerikai fegyver"-t emlegetnek; hát volt a standard M4-szerű géppisztoly, AT-4 és 50-es kaliber. Ja és valami mesterlövész puska 5 tölténnyel és kézi töltővel - ami élvezetes be-és-kizoomolást csinált. Hol van az a jó kis Berrett M82? Nem tellett rá.

A helyszínek viszont szépek voltak, s a szkriptelt robbantások és összedőlések is hihetőre sikerültek. Úgy érzem, jó motort tettek alá, és sokkal-sokkal többet is ki lehetett volna hozni az adottságaiból. De legalább is hosszabb játékmenetet.

2011. március 12., szombat

Dragon Age 2

(Metacritic: 84)

Végre egy jó RPG játék. Bár annyira nem volt EPIC, mint vártam. A történet jó, az arc animációk még mindig késnek 0.1 másodpercet. Lássunk egy kis összefoglaló listát.

Negatívumok:
- Rengeteg ismétlődő alapterületű helyszín
- Játék alatt nem elérhető az Achievements
- Az Inventory, Character, Journal és Map között nincs átjárás gomb
- A gyűjtögetős küldetésekben nehéz követni a darabszámot
- A signature edition DLC-ket nem telepítette automatikusan, kézzel kellett letölteni
- Néha nem jelentkezett be az EA accountba

Semleges:
o Az a rengeteg motion capture visszaköszön a Mass Effect 2-ből
o Úgy viszonyul a DA2 a DA:O-hoz mint a Fallout: New Vegas a Fallout 3-hoz
o Most sincs elég pénz

Pozitívum:
+ könnyű megtalálni a küldetések célpontjait
+ szép grafika
+ válasz-kerék kényelmes
+ jó történet
+ a hős végre beszél!

Ár/érték arányban egy remek vétel, még a Signature Edition is. Főleg, hogy a CD Galaxisban ajándék 1600 Bioware pontot is adtak, legalább lesz mit elkölteni a közelgő Mass Effect 2 DLC-re.

Az irányítás rendben van, bár a TAB+W+Jobb egérgomb nálam végig nyomva volt, mivel szinte állandóan 'FPS' módban mászkáltam. Így kényelmesebb körbenézni, mint forogni az A és D billentyűkkel. Talán a következő részben lehetne ez alapbeállítás. Ja és a TAB pedig kijelöli a használható tárgyakat, kár hogy nem lehet állandóra bekapcsolni.

Mivel friss, ezért elég nehéz információt találni a játékról. A Dragon Age Wikia e sorok írásakor még igencsak hiányos. Van néhány egyszerűbb végigjátszás, de kellően részletes nincs.

A játék meglepően jó minőségű, csak három bugos küldetéssel találkoztam, szerencsére nem jelentősek (a New Vegasban a 2. patch-ig kb 30 db ilyen volt). Általában nem záródik le a küldetés vagy ottmarad az illetőn a nyilacska.

Mivel Mass Effect-es beszédgyűrű van, általában a felső "Paragon" válaszokat használtam. Látok némi esélyt arra, hogy pár hónapon belül végigjátszom újra, ezúttal "Renegade" módban - amint egy valamire való DLC kijön hozzá. A beszédgyűrű ikonok jók, de a könyvecske elolvasása nélkül nem mindig világos. Az eleje felé igazán kiírhatták volna a játékon belül is szövegesen, mit is jelent.

Hiányoltam a fegyverváltás lehetőségét. Rogue karakterként jó lett volna néha váltani az íj és a dupla tőr között, főleg hogy igen ütős tőröket kap gyakran az ember. Sajnos fegyvereket nem lehet az alsó sávra húzni, vagy legalább is nekem nem sikerült.

Kirkwall annyira nem unalmas, mint az egyes értékelések említik, bár az egy kicsit zavaró volt, hogy egy-egy régióba való érkezésnél szinte tuti, hogy a célterülettől legtávolabb eső bejáratnál tesz le - igazán lehetett volna egy kapuválasztó is a térképen. Üdvözletes, és egyúttal vicces, hogy a küldetés lezárása után mindig van egy kijárat kéznél - akár jöhettünk volna arra is - nincs backgracking.

Hogy mennyire is volt EPIC, kb. annyira, mint a Modern Warfare 2 után a Black Ops. 30-35 óra játékidő van benne, bár egész biztos nem találtam meg az összes mellékküldetést. Az elérhető achievementek kb 70%-át szereztem meg. Én a következő Bioware játékban bevezném az Önmegtartóztató achievementet: úgy végigvinni a játékot, hogy semmilyen flört vagy románc nem volt benne :)

Összkép: 84%. Csak nehogy a Witcher 2 lekörözze. Azaz hogy az nekünk, játékosoknak csak jó nem?

2011. március 10., csütörtök

Web service Co- and Contravariance

Working on the ADVANCE Flow Engine for the ADVANCE 7th Framework EU project we came across the need to have type comparison between XML schemas.

One reason is to allow the user to wire different but co- and contravariant input and output types instead of the classic type invariant approach. This co- and contravariance is a common property of most modern programming languages (e.g., Java 5+, C# 4.0+). Because the blocks communicate via XML, and the type of XML is described via XSD, we need a way to compare two XSDs: are they equal? Does A.XSD extend B.XSD?

The second reason is that we need to communicate with external web services and ourselves need to provide web service entry points. Having a co- and contravariant type defined instead of a classical fixed XSD should be a benefitial in the long term.

Therfore, our small group at SZTAKI has figured out a way to think about and compare types described in XSD. See a prototype implementation at the SourceForge site of the ADVANCE project.

I'll try to describe the idea for the schema comparison. Note that XSD has some support for restrictions and extensions on complexContent elements, but our approach does not rely on this kind of functionality, as many XSD type definitions are somewhat independently written. Our approach is based on the actual element-attribute-content structure of the schemas to be compared.

Relations

In order to compare two things, we need a comparison method which may return the following results (see XRelation enum):
  • NONE: the two things are not related
  • EQUAL: the two things are the same
  • EXTENDS: the first thing extends the second thing
  • SUPER: the first thing is a super(class) of the second thing, or in other direction, the second thing extends the first thing (opposite as EXTENDS).

We will use these cases and count them at various levels to decide if a complicated type or capability (described later) corresponds to which relation after all.

Type is a set of Capabilities

The first abstraction we take is that we define an XML type (XType class) as a set of capabilities (XCapability class).

We should think about the XML elements, attributes and sometimes the content as a capabilities. This way, an element's type is the set of its attributes, child elements and content.

Capabilities

Capabilities, like fields in a Java class can have name and a type, where type can be a simple type (int, string, etc.) or another complex type (and type are just a set of capabilities).

In addition, XML has the notion for cardinality, e.g. an element may occur in several forms (zero or once, once, zero or many times, once or many times, zero times), which property is also appended to the capability. Therefore, each capability is potentially a List of a simple or complex type: a monad (?!).

XSD to XType

The XSchema utility class features a simple XSD parser which turns the schema into an object graph of XType and XCapability objects. Of course, the XSD definition is very complicated and we are sure the simple parser does not cover all of its aspects in terms of where and how things can be described in XSD (in place, as a global type, a type among the node parents, etc.). Our parser currently expects schemas which descibe such XMLs, where an element may have attributes, a string-like content XOR other elements (e.g., mixed content is not handled).

Such XSD may be as follows:
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name="class1">
<xs:complexType>
<xs:sequence>
<xs:element name="field1" type="xs:string"/>
<xs:element name="field2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Comparing types

We can define the type comparisons as basically a set theoretic contains-relation (with some special cases).

Type A extends Type B if
  • Type B's capabilities are all present within in Type A's capabilities and
  • each of those capability pairs, CA and CB, CA extends CB
If any of the capabilities has a SUPER relation, the two types are automatically considered not-correlated.

The super direction is just the test for Type B extends Type A.

The XType.compareTo(XType) method returns the relations above.

Comparing capabilities

How can we compare capabilities against each other? How do we now a capability CA is present in Type B?

The simplistic approach to compare the names of the capabilities (like field names), then compare their simple or complex types (recursively).

However, sometimes what we would think as capabilities are named differently in different locations: Just look at Java's size naming: array.length, String.length(), Collection.size(), getLength(), getSize(), size(), count() etc.

We can somewhat solve this problem by introducing aliases. If you look at the XName class, you'll find a name and a set of Strings which may be other aliases for the very same capability. If you are writing one of the XSDs, you may attach an <annotation> tag with a custom content which lists these aliases:

<element name='size' type='int'>
<annotation><advance:capability-aliases
xmlns:advance='http://www.advance-project.eu/schemas/xmltypesystem'>
length, count</advance:capability-aliases></annotation>
</element>
(As of writing this post, the XSchema parser does not look for such kind of additional data.)

However, the second problem rising is that capabilities named the same actually mean a different thing. Therefore, a secondary type dimension is attached to the XName construct dubbed Semantic Token (represented by an XSemantics class and a similar extra annotation).

Even if two names look like the same, their associated semantics might be incompatible, or one's semantics is actually an extension to the other's. Using the same comparison mechanism for types, capabilities and naming, this kind of extra information should help to determine the relations.

Of course, if your XSD types name similar things similarly, you don't need these optional annotations.

XSchema parser and test program

The XSD parser and test program XSchema gives a simple sample how to use this new XML-based type system.

The example has two types, where type2.xsd has an extra field defined for its class1 element.

Root element trouble

You may recognize, that the parser returns a type, which is basically a virtual outer type, which has a single capability named as the root node and describing its complex type.

This may be problematic in cases where the root node can be named as anything, and only ITS content should matter when comparing.

I think there is no problem, because you may start the A.compareTo(B) at this single capability's complexType node:

A.capabilities.get(0).complexType.compareTo(B.capabilities.get(0).complexType)

The second smaller issue is with a root element which is only a simple type. In this case, you need to compare the valueType fields of the first capabilities.

We may later on specify convenience methods to do these things.

Is this type-thingy new?

We hope so.

We applied the category theoretic approaches of duality and monads to develop this solution, which approaches themselves descend from last century mathematics and are used in programming language type systems.

Our opinion is that yes, this is can be considered as (computer) scientifically new.

But you might know better...

Böngésző teljesítmény összehasonlítás

Na nézzük, hogy is állnak a böngészők. Tesztkonfiguráció: Core i7 2.6GHz, 4 GB 1333MHz DDR3, Windows 7 x86.

BöngészőSunspider (kisebb a jobb)V8 (nagyobb a jobb)HTML5 Speed Reading (kisebb a jobb)Kraken (kisebb a jobb)
Chrome 11.0.696.0251ms875718s6650ms
Firefox RC1247ms4161378s6162ms
Explorer 9 RC1212ms26817s13884ms


Úgy tűnik, a Chrome kicsit le van maradva JavaScript szinten a többiektől, de grafikailag egész megközelítette az IE9-et.

2011. március 2., szerda

Android Development, pitfalls so far

The Android platform is now the fancy development target for Java programmers. Therefore, I started to learn it and as expected, I fell right into some of its pitfalls. Things that should nicely work according to the various tutorials, but there are things that you will only get working after searching through dozens of forums and forum mirrors.

For fun, I tried to move some of the bits of my Open Imperium Galactica project and spent hours to resolve the most simplistic problems.

So lets see the problems step by step.

Device size limits

By default, most pre 2.2 applications are limited to 24MB of application size. In reality, you'll start to get error messages after 12MB. After 2.2, you can specify your application is willing to run from the device's SD card:

Set android:installLocation="preferExternal" in AndroidManifest.xml

(see this, this).

You can create a custom device with more Java heap and you can set a debug option in Eclipse for the emulator: -partition-size 1024

Assets vs Res

The main difference is that for things in res/ directory, you get a special class R where you can easily reference them by name in your code. Most utility classes can use this kind of referencing. However, you have more freedom with the assets/ directory contents.

The trouble with both directories is that the package builder can take extremely long time to build your project. Autobuild can cause headaches too after a simple save.

One option is to simply remove the file extension from the resource files. But this may get you into trouble with the MediaPlayer.

The second trouble is with the assets directory itself. It seems that
referencing resources in this directory does not work. The workaround is to place the resources under a subdirectory of assets: assets/media and reference them via media/sound1.wav.

MediaPlayer with assets

There are several caveats with the MediaPlayer.

First, media player takes the media format primarily from the file name. If you renamed your resources, you are have to rename them back.

The second thing is that you need to pass in the start and size of the referenced asset along with its FileDescriptor:


AssetFileDescriptor afd = getAssets().openFD("media/sound1.wav");
MediaPlayer mp = new MediaPlayer();

mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());

mp.prepare();
mp.start();


Rendering Open-IG videos fast

Next time, once I figure out how to speed up, I will talk about how to render a series of bitmaps.