vrijdag 6 december 2013

Duckventures


Hallo fans, hier een update voor de nieuwsgierigen. Allereerst wil ik graag zeggen dat we een awesome wallpaper voor jullie hebben, gemaakt door onze eigen Victor. Vind hem hier.
Zeg, gaat het nou over robots of over explosies?
"Maar wat is R.U.L.E. dan??!", vragen jullie je natuurlijk af. We hebben de game een naam gegeven. Het heet nu officieel Robot Ultimate Laser Explosion (of: R.U.L.E). Waarom deze naam? Omdat je nooit genoeg lasers, explosies en laserexplosies kan hebben. Pew pew pew!

Een naam bedenken stelt in het grotere geheel natuurlijk niet zoveel voor. Gelukkig hebben we ook nog andere voortgang gemaakt. De eerste code is geïmplementeerd, taken zijn verdeeld, mysterieuze krachten roeren zich.



Hierboven zie je een van de eerste development-versies van RULE. Er zitten al gedeeltelijke random level en wave generation, player input, een domme AI en collision in. De rode enemies volgen speler 1 en de blauwe enemies schieten op een willekeurige speler. De spelers zelf zijn niet erg duidelijk te zien doordat ze zwart zijn op een zwarte achtergrond.

En dan nu wat behind-the-scenes. Om te kunnen beginnen aan de gamecode hebben we eerst de klassenstructuur besproken als team. Het design document beschreef hier en daar wel wat er geprogrammeert moest worden, maar dit was niet concreet genoeg om te beginnen.
Programmadesign 101 door Herman McAbstractiepants
Klassenindeling
De makkelijkste indeling leek ons een monolithische gamemaster, met daarin klassen voor allerlei kleinere taken. Zo is er een levelgenerator, wavegenerator, collisionmanager, playerlist, enz. Deze subklassen weten dat ze bij de gamemaster informatie op kunnen halen. Op die manier weet de collisionmanager welke objecten tegen elkaar moeten botsen en de enemies waar ze naartoe moeten lopen en schieten.

De heeft gamemaster ook een ruleset, waarmee verschillende gamemodes gedefinieerd worden. Zo staat in de singleplayer ruleset dat er maar één speler mag zijn en de speler een gelimiteerd aantal levens heeft. In de co-op ruleset staat dat er twee spelers zijn en dat een speler opnieuw kan spawnen als een wave begint.

Met deze kennis in onze eendenkoppen konnen we eindelijk eens gaan programmeren. Vol enthousiasme zijn we met level generation, wave generation, collision detection en adaptive difficulty begonnen.

Level generation
Onze laserexplosion containment areas worden gemaakt door een algoritme dat hier en daar een blob van muren plaatst. Bij het plaatsen van deze blobs wordt er rekening gehouden met waar er al muren staan, zodat er altijd zo'n 5 blokjes tussen alle bouwwerken. Ook zorgt het algoritme ervoor dat alle randen opgevult zijn met muren zodat je niet weg kan rennen, zoals te verwachten valt van human scum. Als laatste wordt het level gecontrolleerd op onbereikbare enkele lege blokjes, die vervolgens opgevuld worden.

Wave generation
Het aantal robots in een wave wordt berekend aan de hand van een aantal wavepoints. Hoe meer wavepoints er zijn, des te meer robots er in een wave passen. Robots worden niet los in waves geplaatst, maar als wave groups. Een groep kan 1 robot zijn, maar ook 5 tegelijk. Een wave group kan zijn carnage loslaten zodra er genoeg plaats is in het level, er is namelijk een limiet aan het aantal robots (wie bedenkt dit, meer robots is beter). De awesomeness van robots in een wave wordt bepaalt door de difficulty en het level van het spel. Hoe hoger, des te sterker de waves!

Collision detection
Met bloed, zweet en tranen is er een collision manager binnen twee dagen de grond uit gestampt. Het hoogtepunt van de collision detection is een SAT systeem. De capaciteit van dit systeem is van zo'n 20 detections tegelijk naar 100+ gegaan. No problemo jongens. Natuurlijk draait R.U.L.E. ook zijn hand voor simpeler zaken als pixel-perfect en rectangle collision detection niet om.

Adaptive difficulty
De adaptive difficulty heeft in een dag of twee een aantal mutaties ondergaan. Hierbij is het aantal benodigde klassen verminderd van 12 naar 5. De implentatie hiervan is op dit moment nog in een zeer vroege stage. Laten we zeggen dat het mogelijk is om statistiek te verzamelen en dat je eventueel deze data kan analyseren om de difficulty dynamisch aan kan passen. Misschien.

AI
Artificieel is het zeker. Intelligent? Niet zozeer. De robots hebben nog een beetje moeite met hun doel ("CRUSH LIFE", voor het geval je dat nog niet begrepen hebt) te bereiken. Ze schieten hier en daar wat en volgen de speler. Om muren heen lopen kunnen ze in ieder geval nog niet.

Code layout
Ook hebben we een aantal afspraken over de layout van de code gemaakt. Het is niet altijd even duidelijk wat iedereen in dit opzicht voor eisen stelt waardoor de indeling, al dan niet naar persoonlijke smaak, soms te wensen laat. Voorlopig is dit de volgorde die we aanhouden:

public class Robot 
{
 /* Public properties */
 public string Taunt { get; }

 // Constructor
 public Robot() 
 {
  taunt = "Y0U AR3 OBSoLETE.";
  version = "1.0.K.I.L.L.E.R.";
 }

 /* Public methods */
 public void UpgradeFirmware() 
 {
  version = "2.0-HUMAN_MANGLER";
 }

 /* Private methods */
 private void DESTROYHuMANS(Human scum) 
 {
  scum.ELiMINATE();
 }

 /* Private variables */
 private string version;
}

We zijn als team erg tevreden over wat we allemaal binnen een week hebben bereikt. Wees gerust, er is meer onderweg. Wat precies houden we zolang nog geheim.

PS: Sinterklaas vieren is voor Frozen Duck Games natuurlijk een must. We hebben succesvol loot weten te verzamelen in het dobbelspel. De luitjes van Bulletproof Games waren er ook en zijn vol trots met de drankspellen vertrokken (ja, er zaten drankspellen tussen als kado's).

Blijdschap

Geen opmerkingen:

Een reactie posten