Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (581)
Games in Android Showcase (162)
games submitted by our members
Games in WIP (632)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
   Home   Help   Search   Login   Register   
  Show Posts
Pages: [1] 2 3 ... 34
1  Java Game APIs & Engines / Engines, Libraries and Tools / Re: Read Slick2D image as a pixel array? on: 2015-05-11 08:12:30
Word of warning if you use .getColor() in a forloop for more than a dozen or so executions you'll need to (should) run .flushPixelData() or you'll quickly find yourself running out of memory.
2  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-14 12:21:22
I feel as if I need some sort of additions to the game wrt. attacking/defending. Like soldiers and barracks or something.

Cas Smiley

That's actually what I'm working on right now. Cheesy

I'm adding heroes to the game (Automated little villagers who can't work, but defend the village), and the influence tab that will allow you to try to nudge your little guys to do things you want. But by design, it won't always work.

Also going to be adding barracks and basic fighters too, although I'm not sure if they'll make it into this next update.
3  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-14 09:14:56
Greetings everyone,

For 7 days I will be giving out copies of Retro-Pixel Castles on Twitter. Winners will be announced at the end of each day! Already own a copy? Gift it to a friend!

To enter, simply follow @RaymondDoerr and retweet the current active tweet for that day. This post will be updated daily with latest active tweet, and a list of previous winners. Anyone can enter, names will be collected from the retweet list on twitter, thrown into a (figurative) hat and one name will be picked randomly!

Even if you win, you can even retweet the future active tweets to try your luck for a another copy!

Bonus: Winners Twitter accounts will be listed below, giving your account some free exposure! Smiley

Winner be announced early on the 16th just prior to the next tweet!

TUESDAY, April 14th - Jon Hearn (@ZenDarklighter)

Upcoming tweets:
THURSDAY, April 16th.
FRIDAY, April 17th.
SATURDAY, April 18th.
SUNDAY, April 19th.
MONDAY, April 20th.
4  Discussions / Business and Project Management Discussions / Re: [PAID] Looking for Java consultant on: 2015-04-09 07:28:52
Depending on your questions, we have many experts and semi-experts here, we might be able to answer your questions or give code suggestions simply via the forums.

Before offering to pay us, I say just ask the question(s) needed and see what feedback you get! Smiley
5  Games Center / WIP games, tools & toy projects / Re: RFLEX - A simple, rage-inducing arcade game by Radirius on: 2015-04-07 22:43:06
Like how you have 6 medals already, but zero replies. Tongue

Also, why isn't this on greenlight yet?
6  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 22:37:46
Today, I actually had a good sit down this evening and played Retro Pixel Castles for the first time Smiley Can't figure out how to make food! Gah.
While I was playing I had the good sense to profile it, and here is what it produced:

Note here and there the total lack of any pathfinding code contributing to the CPU usage. In fact notice the total lack of CPU usage. You spend 98% of your time in native code! And half of it is nglGetFloatv, which I can't for the life of me think why you would ever call it.

Cas Smiley

The old pathfinding system is actually pretty solid, it can process 10-15 paths at once in about 15ms, so it's even faster than the new system. It just doesn't understand terrain movement costs (It's similar to a Breadth First Search system). As for nglGetFloatv, I honestly have no idea. I don't call it anywhere in my code, so I'm guessing it's being called under the hood inside Slick2D somewhere. I'll have to hunt it down, because that has me curious. Smiley
7  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 21:49:40
@ Riven - PriorityQueue took a full complex path across the entire map from 55-57ms down to 10-11ms. Awesome! Smiley

I think this is where I take Cas' advice and consider it fast enough to get the job done. ;P
8  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 21:34:16
I might slap the tail from this thread on the RPC game thread later.

Probably wise, we're way off topic. Smiley

Having said that, binary search is cache trashing galore. Given your access patterns, it might be faster to do a linear search from the tail of the array, or a binary search on the last X elements, if that fails, a binary search on the range before it. In the end memory bandwidth (and cache trashing) is probably your bottleneck, making these quirky, hackish tricks worthwhile.

Everybody knows binary search scales O(log n), but given the characteristics of modern CPUs, it at one point takes a nose dive, once the working set doesn't fit into cache anymore, and nearly every memory access is a cache miss.

Now, ocourse, this all is meaningless without your current performance numbers, your data models and the characteristics of your maps... which means we're mostly making bad assumptions about whatever it is your dealing with.

On that note, if you find out PriorityQueue is a poor fit, and BinaryHeaps seem tempting... keep in mind d-ary heaps (which are like binary heaps, but have d children, where d is a constant, >= 2) which are theoretically slower, but due to better memory management (less cache misses) outperform BinaryHeaps in almost every case... or so they say.

yeah, without everyone fulling understanding the system it's hard to offer advice, and it's definitely not a standard system. I think PriorityQueue may be the way to go, since it natively functions the same way I've Jerry-rigged my current ArrayList. Smiley

Have you consided mipmapping your graph?

Generally the most effective optimisation strategy is discarding the majority of your data persecutioncomplex

Yep, I've tried to trim out as much as humanly possible, and only (pre)calculated what was absolutely necessary. Smiley

... or not doing any optimisation at all, if it's actually fast enough and there's other things to be doing instead Wink

Cas Smiley

Normally I'd agree, but in this case pathfinding is probably a stress spot in my entire program. Cheesy
9  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 20:24:38

yeah, I looked into JPS quite a lot a few weeks ago, the problem is my maps don't actually have any "Blocked" tiles, making JPS not quite work the way it's intended since it's designed to find blocked areas quickly and eliminate bad paths while shooting in the directions of good ones. (and thus, also removing a ton of open tiles by quickly filling large areas on the map). I'm not sure what'll do in my situation, I think it may actually slow down my performance by opening tons of high-cost nodes very quickly (That would be blocked in a normal map/game) that might not of been touched at all with regular A*, as my A* implementation is fairly good at making straight lines out of those large rooms.

The big problem in my game is that without blocked tiles all mountains and trees end up open nodes instead of closed off/blocked nodes, since they have a terrain cost they need to be part of the Queue, and if I use JPS it may more frequently fill up the queue with those tiles (and leaving them open, slowing down the overall loop).

It's a complicated problem, because those tiles need to stay open so they can slowly work there way through (in the same way you would figure the cost of moving through tar/mud), so that if pathing fails without going through the mountains or trees it'll already be on it's way to build the shortest path that may involve hacking away at the topography to force it's way to the target.

But, with my current implementation of binarySearch() (or with PriorityQueue/BinaryHeap if Riven and Cas's suggestions work out) I don't think the actual size of the node's collection/list will actually impact performance nearly as much as I expected it to when I first looked into JPS. I now sort the ArrayList in descending order with binarySearch() and a custom comparator (lowest on bottom) so the extremely high cost nodes are mostly untouched when a new node is inserted since it'll only push the (usually minimal or non existent) values lower than it to the right. JPS might help out greatly since it won't matter nearly as much how large the ArrayList is anymore.

So, tl;dr, I might give it a shot again and see what happens. Cheesy
10  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 19:41:37
@Rayvolution: use a PriorityQueue for the open list. It is much faster than inserting values into a sorted array.
Better still, a BinaryHeap. (Source in RotT originally courtesy of pjt33 - still coming in useful to this day!)

Cas Smiley

I'll give both a shot and see what happens. Smiley

Any little tiny microsecond of performance I can squeeze out of my pathing is critical, since I have monsters and villagers all over the map (hundreds at a time sometimes) wandering all over the place constantly, and due to game mechanic design/requirements I can't "put them to sleep" in inactive areas like most games would. Smiley
11  Games Center / Featured Games / Re: [Slick2d] Retro-Pixel Castles > Now on Steam! < on: 2015-04-07 16:04:44
Finally got my new revamped path finding system working, that uses terrain costs and no blocked tiles. Making things that used to be "blocked" like mountains passable, but only when no logical path is found.

It's going to be used in a new system that will allow monsters to start tearing down the map if they can't figure out how to get to your villagers. It was quite a challenge because in A* a lot of the speed comes from ignoring blocked nodes and thus limiting the amount of open nodes to check (The heuristics that slowly guide A* in the right direction being the other major part), but without actual blocked nodes it took some trickery to get the system fast enough to be usable since all the nodes that would of previously been considered blocked, were now open instead just with extremely high movement costs.

Also some thanks to ra4king (for help that shortly after my above post) pointing me to using Collections.binarySearch() to inject new open nodes instead of .sort(), speeding up the main while loop. Wink


12  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-04-07 06:32:36
What I did today was I lerned 2 forloop.

* Rayvolution screams at Eclipse
<Rayvolution> ^ whats wrong?!
<Rayvolution> I search the list in reverse, and as soon as I find a value in the list thats >= to what im checking, stick it right before it
<Rayvolution> right?!
<Rayvolution> (sidenote: it almost seems like the if statement is ALWAYS false)
<@ra4king> Rayvolution: pssst
<@ra4king> IntelliJ
<@ra4king> Rayvolution: you are checking for LESS THAN 0
<@ra4king> hahahahaha
<@ra4king> Rayvolution: that should be n >= 0
<Rayvolution> o god.
* Rayvolution sighs
* @ra4king slaps Rayvolution
<@ra4king> go to sleep man
* Rayvolution takes slap, deserves it
13  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-04-03 07:56:23
I've been reworking my path finding to give all terrain movement costs (no more blocked tiles) so in the future monsters can plow through terrain if they can't find a clear path. I had to basically completely rewrite my path finding algo to use true A* pathfinding to do it correctly.

Here's a gfycat of the new algorithm in action (still not complete). The terrain cost on the rocks are a bit low for testing. The final idea/plan is generally, a monster will look for a path with no trees, rocks or other terrain. (These terrains will have an extremely high movement cost) If that path is not found (IE: You blocked in your whole village), it'll start tearing through the high movement cost tiles to get to you. Cheesy
14  Discussions / General Discussions / Re: Looking for a developer on: 2015-04-02 08:29:19
Well I am just looking for a little help. I have a tiny skill in programming and can help with that but also have the developers license and admob account. I can take care of the manaent and promotion of the app.

But thanks for trying to not make it fall through

So basically, you have an idea, and you want to manage a team to make it happen then?
15  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-31 21:14:55
Crystal Motivator coming along nicely. Cheesy

Click to Play
16  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-30 08:50:53
Finally finished my new in-line string colors.. here's a bunch of pages that now use it. Cheesy

In the first two screenshot here's the only method calls I have to do to draw the messages on-screen.
It will be nightmare for third screenshot)

it will be good to remove text and position GUI from code
(also after some time it will be nightmare to change someting)
+easy to add in game gui editor)

     font.drawString(x, y+86, "§YEL1Seriously are"
            + "\nyou §RED1ABSOLUTELY sure?"
            + "\n§WHI0THE OLD GAME WILL BE DELETED", 2, true);
      buttonReally.render(g, mouse, x-43, y+165, debug, false);

will be good use relative position not absolute position to everything

It actually both, you're just not seeing the rest of the code. Smiley

The smaller parts of the GUI that's positions should be absolute to each other are loaded in small groups, and then positioned on the screen with relative values. For example..

     warningMessage.render(screenWidth/2, screenHeight/2); //Center of the screen at all times, basically.

inside warningMessage:
render(float x, float y){
     someElement1(x+15, y+50);
     someElement2(x+132, y+150);
     someElement2(x+126, y+266);

The real code is a lot more complicated, but that's the general idea. So basically everything inside the element is positioned with absolute values, but where the element is rendered is relative. I also have no intention on ever adding a GUI editor. Feature creep and what not. Smiley

(EDIT: Where did the post I replied to go? Shocked )
17  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-30 02:24:07
ASCII alt-codes aren't cross-platform.

I honestly did not know this, guess that explains why other java games (like minecraft) use characters like the &.

Any suggestions for a clean single character to use, that's cross platform and never really expected to be displayed on screen?
18  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-30 01:21:25
Finally finished my new in-line string colors.. here's a bunch of pages that now use it. Cheesy

Surely there's a better escape sequence than '§'.

It was just the only thing I could think of off-hand that absolutely would never need to actually be displayed on the screen and had a fairly easy to remember ASCII code (ALT+21) Smiley
19  Game Development / Newbie & Debugging Questions / Re: How to detec Collisions in open world games? on: 2015-03-29 19:28:04
Since you obviously shouldn't check your collision box(es) with every other collision box in the entire game, I would consider something like this:

1. Build all your collision boxes in the game (however you do it)
2. Have a range detection like this that goes through all your collision boxes that are loaded:
if ((Math.abs(youX-objectsX) < distanceX) && (Math.abs(youY-objectsY) < distanceY) && (Math.abs(youZ-objectsZ) < distanceZ))

3. Stick whatever objects pass the statement into an ArrayList<Object>;
4. Now, you can just loop through the arraylist you collected and only check for collisions nearby instead of map-wide.

Pseudocode for 3D checks, remove
 && (Math.abs(youZ-objectsZ) < distanceZ)
if this is for 2D:
// distanceX, Y and Z are the distance you want to check around the player.
// objectArray is the assumed collections you keep all this in.
// youX and objectX are the positions of you and the objects being checked.

//Create a new array list to store things in.
ArrayList<Objects> tempObjectArray = new ArrayList<Objects>();

//Loop through whatever collections you have for all the game objects loaded.
for (int i = 0; i < objectArray.size(); i++){
     Object object = objectArray.get(i);
     if ((Math.abs(youX-object.getObjectsX()) < distanceX)
        && (Math.abs(youY-object.getObjectsY()) < distanceY)
        && (Math.abs(youZ-object.getObjectsZ()) < distanceZ)){

//Now check collision only with the objects in the tempObjectArray
for (int i = 0; i < tempObjectArray.size(); i++){

It's just a concept, I use it often in RPC but mainly for range detection. RPC doesn't actually have any collision detection, but the concept should work just as well unless you have absolutely massive amounts of collision objects loaded. If you do, I would suggest a chunking system where you only fetch certain areas. Like breakup the map into smaller pieces and detect what piece the player is in, then do the above only in that area to narrow it down to around the player.

there's a bazillion ways to do this, but this way seems to be the most straightforward if you just want to fetch everything around the player and only check against them instead.
20  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-29 07:24:19
Finally finished my new in-line string colors.. here's a bunch of pages that now use it. Cheesy

In the first two screenshot here's the only method calls I have to do to draw the messages on-screen.

   font.drawString(x, y+70, "§ORA1Are you sure?!", 2, true);

   if (confirmation){
      font.drawString(x, y+86, "§YEL1Seriously are"
            + "\nyou §RED1ABSOLUTELY sure?"
            + "\n§WHI0THE OLD GAME WILL BE DELETED", 2, true);
      buttonReally.render(g, mouse, x-43, y+165, debug, false);
      buttonYes.render(g, mouse, x+12, y+130, debug, true);
      font.drawString(x, y+86, "You already have an active "+gameMode
            + "\ngame. Are you sure you want to restart"
            + "\n§GRE1"+mapName+"?", 1, true);
      buttonYes.render(g, mouse, x+12, y+130, debug, false);

21  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-27 07:38:38
Whatever you do, don't get tempted into feature-creeping your way into something that resembles HTML or UBB code... it's good as it is, I tell ya.

^ Wink

in-line color is probably as far as it'll go, it only happened because it seemed the best solution for my multicolored console output so I went ahead and just rewrote my font class to use the tags everywhere. The original system was basically
drawString(x, y, "Green font!", Color.GREEN, fontSize);
, so each string could only be one solid color. Now I can go this;
drawString(x, y,"§GREGreen font and §BLUBlue font!", fontSize)
and my font class just cuts it all up and formats it accordingly. I could of used my old system anyway, but the code to print out things on the console probably would of been a hacky mess.

Output example:
"Small Farm has been completed."
"Bilbo Bagginz has leveled up!"
"Bob Bobby was killed by a Zombie"

22  Game Development / Newbie & Debugging Questions / Re: OSX 10.10 seems to have broken my games on: 2015-03-27 07:32:42
A lack of crash reports is rather ambiguous as a statistic  Pointing  Kiss

Dunno, my mac users throw a hissy fit the nanosecond something isn't exactly perfect. Tongue

<insert joke about picky Mac fanboys>
23  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-26 15:16:57
I've been working on some in-line string color formatting, so I can do things like this with a single drawString call:

"§GREI am green and §BLUI am blue!"
"I am green and I am blue!"

.. still a bit buggy though;

24  Game Development / Newbie & Debugging Questions / Re: OSX 10.10 seems to have broken my games on: 2015-03-26 15:13:43
If it helps, Retro-Pixel Castles is running LWJGL 2.9.3 and I've gotten no crash reports from any of my mac users, but I haven't been bothered to update my dusty Mac Mini and check it myself yet. Smiley
25  Games Center / Showcase / Re: Paper Pacman on: 2015-03-22 23:37:32
Cool little concept.

Some suggestions for polish:
- I assume the ruler on the side is a hint it was drawn with a ruler, to explain the straight lines. But for some artistic edge, I would make those lines overdraw a bit here and there (like he went too far as he was lifting his pen, so there's some stray marks)
- Make the lines fade in and out a little, like the pen was drawn at various pressures and angles.
- Reanimate all the characters to look hand drawn
- Make all the dots slightly offset of each other (2 or 3 pixels) randomly, then make 5 or 6 different dot artworks, so it looks more natural.
- Make some errors, or scribbles/doodles in the unused areas of the paper, maybe some very slight discolorations/stains in the paper.

Overall, cool idea. Just my nitpicky polish ideas to improve the visuals more. Wink
26  Discussions / General Discussions / Re: Looking for some guys to make a 2D RPG on: 2015-03-20 19:33:01
We need proof you yourself have all the required skills to do this entire job on your own, with proven examples of completed (or impressive) games or other projects that will get our attention.

If you don't do that, you're just going to look like another guy in the tens of thousands who want to make a "kewl game" that do not have what it takes, or are too lazy to do the work themselves. You have to wow us. There's tons of these team requests, so you need to do more than just ask people to work with you. You could start with showing us what your engine can do, maybe some screenshots/videos of it in action.
27  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-03-18 05:12:21
Today I tried to compile Intel's own Adaptive Order-Independent Transparency algorithm on an Intel graphics card and immediately regretted my decision when the entire driver crashed during shader linking. I think this is pretty much the ultimate proof of what kind of state Intel drivers are in.

What I Did Today Since RPC Launched:

Troubleshot many, many Intel HD Graphics systems. It always seems like if RPC has a problem initializing LWJGL/OpenGL, the user is on Intel Graphics. Completely hit and miss too, because I have 3 laptops and a Mac Mini all with different generations of Intel HD chipsets and they all work just fine. :/
28  Discussions / Community & Volunteer Projects / Re: Starting a team (Music Composer, Developer, 3d designer, and writer needed) on: 2015-03-17 16:28:42
Calling me lazy is just straight up insulting me. How do I come off as lazy ? If you noticed I didn't ask for a programmer.. Only a graphics designer (Just because I want my game assets to look good doesn't mean I'm lazy), Assets don't put themselves together you know? I'm gonna be loading them in my engine, I'm going to be working on the game mechanics, I already stated that; A game is a collaborative effort, Not a one man job.
But I don't get why you see that as lazy.. Honestly I don't care, But this is the problem with "programming" "communities", They're hardly a community, It's mostly people stealing from each other, And if they can't find something to steal they hate.. In the end it was wrong of me to ask on such a forum, The result was pretty obvious, People are gonna try to sound like smart asses.. geez..

And @everyoneelse Making a demo would kill the purpose of a demo, I don't have good enough assets to put in the engine and show a good demo.. But here's a preview..

Geez people in here are so dumb..

I said I had a gut feeling based on past experience, and I still have that gut feeling. Remember, most of the time even you won't realize that's what you're doing.

Also, that's why I tossed this in there, in case I am wrong, because it's possible I just took your post out of context;
If that isn't the OP'ers intent, I mean no offense.

But, the fact you snapped at me the way you did sort of proves my point. You're falling right in-line with the personalities I was referencing. Smiley

Either way, I would highly recommend getting more meat to show people before trying to put together a whole team. That, or learn the required skills yourself and don't have a team at all.
29  Discussions / Community & Volunteer Projects / Re: Starting a team (Music Composer, Developer, 3d designer, and writer needed) on: 2015-03-17 07:24:35
This seems to be a another "bash anyone who asks for people to join their project" thread! What a fun and encouraging community there is here.  

I wouldn't call it bashing, so much as educating people with firm words not to try to use people because they're too lazy to do their own work.

Is that what the OP is doing? No idea. My gut says yes, even if the OP'er is unaware. But this is based off years of seeing internet "teams" come and go (In all walks, not just programming) where the leader just wants to sit on his throne and bark orders and never actually do anything. It's not just a game dev problem, it's human nature. Lots of people want to have the title of "leader" and don't actually want to do anything.

If that isn't the OP'ers intent, I mean no offense.
30  Discussions / Community & Volunteer Projects / Re: Starting a team (Music Composer, Developer, 3d designer, and writer needed) on: 2015-03-17 01:09:40
I'm not saying definitively one way or the other (I don't know where you picked up that vibe at all in this topic). I'm just saying that people generalize teens as having bad work ethic.

That's because generally it's true. Wink

Not all kids are unable to stick to a project for more than a week, but I'd never hire random kids, if I was going to pickup a less-than-18 (Hell, less-than-25) year old he's going to be someone I already know, proven to have the maturity to be dedicated to the project without getting bored and running off.

Sorry, but almost all kids think a month is "a long time" for a single project, and that's pretty much a drop in the bucket to how much time is actually required.

Not to mention all the other issues, like the ability to work in a team and not run off doing "whatever". Smiley
Pages: [1] 2 3 ... 34
MrMapcom (9 views)
2015-05-23 20:26:16

MrMapcom (8 views)
2015-05-23 20:23:34

Waterwolf (28 views)
2015-05-20 15:01:45

chrislo27 (34 views)
2015-05-20 03:42:21

BurntPizza (69 views)
2015-05-10 15:53:18

FrozenShade (54 views)
2015-05-07 09:11:21

TheLopais (216 views)
2015-05-06 13:36:48

TheLopais (200 views)
2015-05-06 13:35:14

TheLopais (206 views)
2015-05-06 13:33:39

TheLopais (226 views)
2015-05-06 13:32:48
List of Learning Resources
by SilverTiger
2015-05-05 10:20:32

How to: JGO Wiki
by Mac70
2015-02-17 20:56:16

2D Dynamic Lighting
by ThePixelPony
2015-01-01 20:25:42

How do I start Java Game Development?
by gouessej
2014-12-27 19:41:21

Resources for WIP games
by kpars
2014-12-18 10:26:14

Understanding relations between setOrigin, setScale and setPosition in libGdx
by mbabuskov
2014-10-09 22:35:00

Definite guide to supporting multiple device resolutions on Android (2014)
by mbabuskov
2014-10-02 22:36:02

List of Learning Resources
by Longor1996
2014-08-16 10:40:00 is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!