Tai rekisteröidy jo tänään!
Näytä kirjoitukset
Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.
  Viestit   Aiheet   Liitteet  

Aiheet - Reaktori

Sivuja: [1] 2 3 4
1
Yleinen keskustelu / Apua pelin julkaisemiseen Google Playssa
« : 13. Marraskuu 2017, 20:12 »
Hei hyvät ystävät!
Tahtoisin julkaista GameMaker Studiolla tekemäni pelin (Dream Princess) Googlen Play storessa, mutta kaipaisin ohjeita miten tämä käytännössä tapahtuu. Olen säätänyt tarvittavat kehitysympäristöt omalle koneelleni siihen pisteeseen, että saan pelin pelattavaksi omaan luuriini. Tästä eteenpäin minulla ei kuitenkaan ole tietoa mitä tehdä. Voisiko joku neuvoa miten peli julkaistaan ja miten saa mainoksia näkyviin yms., kun käytössä on GameMaker Studio? Kiitos!

2
Keskeneräiset pelit / Cave Pilots
« : 31. Elokuu 2017, 23:25 »


Kuvaus:
Cave Pilots on yksinkertainen luolalentelypeli, jossa värikkäät kolmi... ei kun siis huipputekniset lentoalukset ottavat rajusti yhteen luolastoissa. Aseina ovat pikse... siis luodit, liekinheittimet ja räjähteet, ja jännitystä lisäämässä on myös vettä, köynnöksiä yms. Pelaajia voi yhdeltä näppäimistöltä tulla maksimissaan kolme, ja tämäkin vain jos näppiksessä on numpad. Pelaaman voi liittyä kuitenkin myös peliohjaimilla (testattu vain ja ainoastaan xbox ohjaimilla), joten teoreettinen pelaajamäärä on siis peräti 15 pelaajaa samanaikaisesti. Saman väriset pelaajat ovat samassa joukkueessa, mutta tämä tarkoittaa käytännössä vain yhteistä pistelaskuria, aseet kun tekevät vahinkoa yhtä lailla vihollisiin kuin omiinkin. Se joukkue, jonka aluksia on viimeisenä jäljellä, saa pisteen.
HUOM! Pelissa on vain ja ainoastaan paikallinen moninpeli, joten varatkaa vähintään yksi kaveri mukaan kun ryhdytte pelaamaan!

Muuta:
Resoluutio: 640 x 360
Pelaajien määrä: 2 - 15(?)  (näppäimistöllä 3 + Xbox-ohjaimilla 4 + muilla kuin xinput ohjaimilla loput)

Kuva:
Spoiler


Koodi, grafiikka ja äänet on kaikki itse tehtyä lukuunottamatta fonttia.

Haluasin erittäin mieluusti kuulla palautetta pelistä, etenkin miten pelaaminen sujuu eri pelaajamäärillä. Kiinnostaisi myös tietää miten peli toimii muilla kuin xbox-ohjaimilla.

Lataa tästä .zip
Lataa tästä .exe!

3
Yleinen keskustelu / Proseduraalisesta sisällöntuotannosta
« : 01. Helmikuu 2017, 09:43 »
Työstän parhaillaan kandidaatintutkielmaa aiheesta "kenttien proseduraalinen sisällöntuotanto videopeleissä" (proseduraalinen sisällöntuotanto (procedural content generation, PCG) on suunnilleen sama kuin sisällön random generointi) ja siihen liittyvän kirjallisuuskartoituksen myötä törmäsin seuraavaan, ilmaiseksi saatavilla olevaan kirjaan: http://pcgbook.com/ . Suosittelen kurkistamaan jos vaikkapa juuri kenttien satunnaisgenerointi kiinnostaa. Kirjassa esitellään hyvin erilaisia menetelmiä ja käyttötarkoituksia proseduraaliselle sisällöntuotannolle.

Edit: Tässä aiheessa voi siis keskustella proseduraalisesta sisällöntuotannosta ihan yleisestikin, ei tarvitse liittyä aloitusviestiin.

4
Pelisuunnittelu / [Unity]Roguelike
« : 14. Tammikuu 2017, 12:37 »
Hei hyvä GameDev Suomen väki!

Olen tässä vähitellen siirtynyt GameMakerista Unityyn ja monenlaisia harjoitusprojekteja on tullut tehtyä, joista ei kuitenkaan ole ollut peleiksi asti. Tein viime vuoden puolella tämän tutoriaalin pohjalta voxelipohjaisen pelimaailman ja sinne huone-käytävä-pohjaisen luolastogeneraattorin tähän tyyliin. Tavoitteenani oli tehdä uudenlainen roguelike täysin tuhottavalla maastolla. Lisäsin mukaan oman systeemin luonnollisten kolmiulotteisten luolien muodostamiseen perlin noisea käyttäen. Tulokset olivat melko hyvät, mutta ongelmaksi muodostui se, että Unityn sisäänrakennettu polunetsintä ei sulata ajonaikaisia muutoksia, eikä sitä siis voinut käyttää. Jouduin siis käyttämään ulkoista polunetsintää tai kirjoittamaan kokonaan oman. Etsin pitkään, mutta tuloksetta sopivaa ilmaista työkalua, joten päädyin kirjoittamaan oman A* implementaation. Tämä takasi sen, että minulla oli täysi kontrolli toteutuksesta. Tämän jälkeen aloin miettiä miten pelaaminen oikeastaan tapahtuu ja päädyin fysiikkapohjaiseen liikkumiseen siten, että pelihahmot ovat ragdolleja ja voimat liikuttelevat niiden raajoja. Käytin apunani tätä tutoriaalia. Omat hahmoni koostuivat yli kymmenestä luusta ja ragdollien animoiminen tuotti valtavasti päänvaivaa. Lopulta sain edes jollain tasolla tyydyttäviä tuloksia, mutta tässä vaiheessa olin jo niin uupunut projektiin, että en jaksanut enää jatkaa.

Olen yrittänyt aloittaa muita peliprojekteja sen jälkeen, mutta jostain syystä palaan aina roguelike-genreen. Niinpä aloin tässä jokin aika sitten tehdä ylhäältä kuvattua local co-op luolastonkoluamispeliä. Oma 3D-mallinnus osaamiseni on melko rajattua ja ajattelin sen takia tehdä 2D pelin pikseligrafiikalla. Siinä on kuitenkin ongelma paitsi Unityn rajallisen pikseligrafiikka toiminnalisuuden, myös valtavan työmäärän kanssa, jos lähtee tekemään varusteita jotka näkyvät hahmojen päällä (esim. rintapanssari) ja haluaisi ne myös animoitavan. Niinpä pitkän painiskelun jälkeen päätin sittenkin tehdä pelin kolmiulotteisena, vaikka sen ulkonäkö varmasti siitä kärsiikin.
Aloin tutkia jos Unityyn saisi helposti cel shading grafiikat, mutta aivan yksinkertaista se ei ollut. Unityn oma toon shading shader kun on hyvin rajoittunut ja halusin mahdollisuuden käyttää esim. normal mappeja ja kiiltävyyttä. Törmäsin etsinnöissäni tähän artikkeliin. Artikkelin ohjeilla cel shadingin sai pienellä työmäärällä ujutettua kaikkialle. Tulokset olivat ihan kivan näköiset joten lähdin työstämään peliä.
Tällä kertaa aloitin pelaajahahmosta. Tein paljon yksinkertaisemman liikkumis- ja hyökkäyssysteemin ja ryhdyin vasta sitten miettimään luolaston generointia. Päädyin luomaan aiemmin tekemästäni voxelipohjaisesta systeemistä sopivan ylhäältä kuvattuun peliin. Myös polunetsintä tuli näin kätevästi mukana. Tällä hetkellä minulla on siis voxelipohjainen (reaaliaikaisesti muokattavissa) luolastogeneraattori jonka luomissa luolissa voi liikuskella.

Pelin lopullisesta päämäärästä ei vielä ole tarkkaa tietoa, mutta päätin kirjoittaa tänne siltä varalta, että jotakuta kiinnostaa vaikka kysyä tarkemmin miten tein jonkin asian.

Tässä pari kuvaa:

Luolasto editorista katsottuna.


Luolaston huone pelissä.


Cel shading tyyli näyttää tällä hetkellä tältä. Outlinet hoidetaan Unityn EdgeDetection-scriptillä.

5



SUBPAR 2K16

Snowstorm: Ultimate Barrage - Pro Arctic Racing

Lataa tästä!

Kaahaa kilpaa kavereidesi kanssa päätä huimaavassa moottorikelkkakilpailussa. Ota vastustajistasi mittaa kolmella eri käsin muovaillulla yksityiskohtaisella radalla.

Pelistä löytyy siis moninpeli (jota voi pelata myös yksin). Moninpeliä varten hostaajan on avattava portti 7777.
Toivotamme tuomarit ja muut kiinnostuneet testaajat tervetulleiksi pelaamaan kanssamme myöhemmin ilmoitettavassa ajankohdassa.
Peli tukee sekä näppäimistöä että peliohjainta.

Järjestämme pelejä lähipäivinä.
Peliseuraa voi etsiä tästä discord-ryhmästä: https://discord.gg/uUqwz.


Pelimoottorina on Unity 3D.
- Reaktori, Riuku & Mayhemoid

6
Valmiit pelit / [Construct 2] Pong
« : 13. Huhtikuu 2016, 22:44 »
Pong
Piti tutustua yliopiston Game Project kurssilla Construct 2 pelintekotyökaluun tekemällä pong-peli noudattaen tätä tutoriaalia: https://www.youtube.com/watch?v=P8ksl7ZcxrE

Construct 2:n käyttö oli todella helppoa joskin hieman rajoittunutta. Erityisesti fysiikoiden lisääminen oli huomattavasti helpompaa kuin GameMakerilla. Minkäänlaista koodaus ominaisuutta en kuitenkaan löytänyt, eli ihan kauhean monimutkaisia pelejä tällä tuskin saa tehtyä. Kuitenkin ihan kelpo softa vasta-alkajille ja kooditaidottomille. Ilmaisversiolla ei voi tuottaa exeä, mutta HTML5 kyllä luonnistuu. Jos joku haluaa niin voin pyynnöstä heittää mukaan myös lähde"koodin".

Lisäsin vähän lisämaustetta peliin muuttamalla mailat pinball-tyylisiksi flippereiksi.

Pelaa tästä selaimessa: https://dl.dropboxusercontent.com/u/63978720/Websites/Pong/index.html

7
Keskeneräiset pelit / Master Cannon Pro
« : 24. Joulukuu 2015, 03:28 »
Master Cannon Pro

Jo ammoin kesken jäänyt projekti jonka vasta viime hetkillä päätin laittaa kisaan. Pelissä ammut tykillä linnakkeissa eleleviä tyyppejä ja keräät mitaleita. Peli tallentuu automaattisesti.

Hiirellä tai WASDilla hallitaan tykkiä ja nuolilla kameraa. Ampua voi myös spacella. Fullscreen tilaan pääsee alt+enter kombolla ja edistymisen voi resetoida kenttävalinnassa R näppäimellä.

Eihän tämä vieläkään mitenkään kauhean valmis ole, mutta hauska alku joka tapauksessa. Musiikki on pelistä Super Mario 64.

http://files.1337upload.net/Master_Cannon_Pro-05a5ad.zip



Ehkäpä peli joskus vielä valmistuu lisää. Palautetta sopii antaa.

8
God of Madness

Päivitys 19.9.2018:
Vuosien tauon jälkeen kehitys on lähtenyt taas rullaamaan eteenpäin! Suurena muutoksena peliin on ängetty satunnainen luolastogeneraattori ja valaistussysteemi. Peli Pyrkii siis surutta kopioiman muita roguelike/lite pelejä, mutta tuo kuitenkin mukaan omat omituisuutensa, kuten veressä liukastelun ja aivan liian monimutkaisen raajasysteemin.

Lataile täältä uusin versio: https://drive.google.com/file/d/19l_Kj-8dx9Jad1FZMffYPb_N_kjRvdIe/view?usp=sharing.

Edelleenkin palautetta toivotaan hartaasti, sillä se on paras motivaattori!


Taustaa
GoM on alunperin Syysmittelöön aloittamani peliprojekti, joka perinteiseen tapaan paisui liian suureksi. Koska arvelin ettei pisteitä juuri satelisi niin kovin keskeneräiselle versiolle, päätin jättää pelin kehitykseen tulevia kisoja varten. Olen kuitenkin jatkanut (ja aion jatkaa jatkossakin) pelin kehitystä kisan jälkeenkin, haaveena mahdollisesti laittaa peli Steamin Greenlightiin jos se joskus alkaa lähestyä valmistumispistettä.

Itse pelistä
Pelissä ideana on laskeutua hulluksi menneen jumalan (saattaa muuttua nyt kun syysmittelö kerran on ohi) luolastoon ja takoa tälle vähän järkeä kalloon (taistelukirveellä). Jokainen kerros koostuu yhdestä huoneesta. Syystä tai toisesta pitää joka kerroksessa aina piestä läjä erilaisia örkkejä ennen kuin voi edetä seuraavan kerrokseen. Kerrosten välissä voi omaa hahmoaan tuunata löydetyillä/silvotuilla ruumiinosilla ja aseilla. Perinteiseen tapaan viholliset käyvät aina vaikeammaksi mitä syvemmälle pääsee. Toisaalta myös niistä saatavat osat ovat parempia. En ole vielä varma tuleeko pelistä loputon vai voiko sen voittaa. Joka tapauksessa kuolema tarkoittaa pelin aloittamista aivan alusta. Peliin saattaa kuitenkin tulla jotain avattavia bonuksia jotka säilyvät pelikerrasta toiseen.

Idea lähti Syysmittelön mielipuolisuus-teemasta. Ensimmäiset peliin liittyvät ajatukset olivat lattian liukastuminen verestä ja ruumiinosien vaihtaminen. Pian päätiin tehdä myös oman liikkumismoottorin tukemaan ajan hidastamista. Lähdin tekemään peliä näiden ideoiden pohjalta ja hyvin nopeasti sain jonkilaisen moottorin kasaan. Tämän moottorin postasinkin foorumeille. Seuraava iso askel oli erilaisten abilityjen mahdollistavan toiminnallisuuden koodaaminen. Tämäkin meni lopulta aika nopeasti ja kivuttomasti. Tähän asti kaikki hahmot kasattiin satunnaisesti ja osien vaihtaminen ei ollut mahdollista. Täytyi siis tehdä jonkilainen osien loottaus-systeemi ja inventory. Päätin samalla että osiin tulee myös erilaisia harvinaisuusasteikoillisia modifiereita. Osien loottauksen sain aikaan nopeasti, mutta inventory tuotti tuskaa. Se ei itseasiassa vielkään toimi ihan täydellisesti, mutta on kuitenkin käytettävissä. Paljon on jo tehty, mutta vielä enemmän on tekemättä.

Mitä pelissä on nyt (vuonna 2015):
  • Custom-fysiikat jotka tukevat ajan hidastamista niin globaalisti kuin lokaalistikin
  • Ruumiinosien vaihtamismekaniikka joka koostuu neljästä osasta: pää, torso, kädet, jalat
  • Kahdenlaisia aseita: Melee-aseet ja ampuma-aseet
  • Kuusi erilaista vahinkotyyppiä: Cut, Crush, Fire, Cold, Shock, Poison
  • 18 erilaista vihollista
  • 4 erityisabilitya
  • Inventory
  • Jollakin tasolla toimiva wave-systeemi
  • Lukko-minipeli
  • Status-effectit
  • Bugeja


Mitä on (oli 2015) suunnitteilla:
  • Äänet
  • Eri biomeja: jää, tuli, viidakko, hautausmaa, aaviikko, joku paikka missä ajankulku vaihtelee, chaos
  • Runsaasti biomikohtaisia huone-layoutteja
  • Paljon, paljon erilaisia vihollisia, aseita ja modifiereita
  • Inventoryn selkeyttäminen
  • Esineiden fuusioiminen tasoa parempaan modifieriin
  • Omien kätyreiden rakentaminen ylijäämäosista
  • Laadukkaammat kuvaukset esineille
  • Pomotaisteluita
  • Placeholder-grafiikan korvaamista
  • Ohjaintuki ja lokaali moninpeli
  • Ehkä joskus hyvin kaukaisessa tulevaisuudessa online-moninpeli
  • Tasapainotusta
  • Bugien nitistämistä
  • PvP taistelu

Kuvia:
Spoiler



Tämän hetkistä versiota on mahdollista testata tästä. Tässä vanha, areenapohjainen versio. Peli saattaa käyttäytyä väillä mystistesti koska sisältöä on liian vähän tiettyjä toimenpiteitä varten.

Kontrollit:
WASD liikku
Hiirellä tähtää
Hiiren vasen lyö (jos on ase)
Hiiren oikea syöksyy jos staminaa (keltainen palkki) on riittävästi
R restarttaa huoneen (et menetä mitään)
Q ja E abilityt jos moisia on
Inventoryssa vasen hiirennappi valitsee ja oikea siirtää (ehkä huonosti selitetty)
Numeronäppäimet 1-4 vaihtaa asetta
Alt+Enter vaihtaa fullscreen moodin päälle/pois, mutta tämä nollaa verisurfacen
Hiiren rullalla voi säädellä aikaa

Pari vinkkiä testaajille:
Scalpel leikkaa todella hyvin osia irti (dismemberment stat on korkea)
Soihtu tekee tulidamagea mikä toimii esimerkiksi limoihin huomattavan paljon paremmin kuin cut tai crush


Koitan tänne päivittää aina välillä pelin edistymistä.
Palautetta ja ideoita otan mieluusti vastaan!

9
Kilpailut / Virallisten kilpailujen arvostelukriteerit
« : 12. Marraskuu 2015, 16:35 »
Hei, nyt kun muistan ja on aikaa niin otanpa esille tärkeän aiheen.

Mielestäni virallisten kilpailujen arvostelukriteerit kaipaavat viilausta. Tällä hetkellä kriteerit suosivat pieniä, bugittomia ja hyvillä grafiikoilla varustettuja pelejä.

Ehdotan että arvosteltavat alueet jaetaan pienempiin osa-alueisiin ja nämä osat tasapainotetaan mahdollisiman järkevästi. Näin on selkeämpää mistä pisteet tulevat ja miksi toinen peli on toista parempi tietyssä osa-alueessa.

En ole varma miten tämä sitten parhaiten toteutettaisiin joten koitetaan keskustella yhdessä ideoista täällä.

Tässä nopea esimerkinomainen ehdotus maksimipisteistä:

Grafiikka
Yhtenäisyys 5p
Animaatiot ja efektit 5p
Itse tehty 5p
Pelin tyyliin sopivuus 5p

Äänet

Yhtenäisyys 5p
Monipuolisuus 5p
Itse tehty 5p
Pelin tyyliin sopivuus 5p

Pelattavuus

Toimivuus 10p (bugittomuus)
Kontrollit 5p (järkevästi sijoiteltu ja toimiva)
Käyttöliittymä 5p
Uudelleenpelattavuusarvo 5p (myös addiktoivuus)

Laajuus
Pelin tarina 10p (juoni, kerronta, toteutus [cutscenet yms.])
Pelattavan määrä 10p ([erilaisten] kenttien määrä, vihollisten monipuolisuus yms.)
Lisäsisältö 10p (menut, tutoriaalit, info)

Idea
Idea on uusi 5p
Idea on hyvin toteutettu pelissä 5p


Ideoita?

10
Valmiit pelit / Glabrnake
« : 02. Marraskuu 2015, 00:41 »
Glabrnake on Tapa Ukkoja -pelin mielipuolinen jatko-osa jossa tarkoituksena on hävittää mahdollisimman suuri määrä viemäreistä kipuavia ukkoja. Hommaa vaikeuttaa alati nälkäinen karhu joka lopettaa pelaajan jahtaamisen ainoastaan hunajan takia. Rasta-ukkojen liiskamisessa on myös omat ongelmansa, sillä näiden henki tulee vainoamaan pelaajaa vielä kuoleman jälkeenkin. Pommi-ukot pyrkivät räjäyttämään itsensä pelaajan läheisyydessä, mutta suorittavat räjähdystoimenpiteet paniikinomaisesti myös joutuessaan kosketuksiin naisen kanssa. Naisia voi houkutella karskeilla iskurepliikeillä (z-näppäin) luokseen ja jos on oikein ovela myös pommi-ukkoja päin.

Kun auto ei enää kulje, voi pisteet uploadata netti-listoille.

Kaikki grafiikat ja äänet(!) on itsetehtyjä.

Lataa kisaversiosta korjattu versio:
http://files.1337upload.net/Glabrnake_game-313a9f.zip


Tarkastele Highscore-listoja suoraan selaimessa!

Kuva:
Spoiler


Alkuperäinen Tapa Ukkoja löytyy Reaktorin pelikokoelmasta vuodelta 2011

Palautteen antaminen on suotavaa.

Bonuksena vielä toinen mestarillinen musiikkiraita joka noudattelee enemmän ykkösosan tunnelmaa: http://files.1337upload.net/musiikki-e7f54f.wav

11
Testatkaa varhaista versiosta ja kommentoikaa:
http://files.1337upload.net/God_of_Madness_0141-4b339c.exe

Voitte ihastella (satunnaista) hahmonluontisysteemiä, custom fysiikoita ja veressä liukastelua.



Kontrollit:
WASD liikku
Hiirellä tähtää
Hiiren vasen lyö (jos on ase)
R restarttaa
Shift + enter säätää pelin nopeuden

Lisää tietoa tulossa!

12
Olen vuosien saatossa haaveillut moneen otteeseen kunnollisen roguelike-pelin väsäämisestä ja satunnainen ympäristö on tässä olennainen osa. Siispä olen useita kertoja yrittänyt koodata satunnaista luolageneraatiota, siinä kuitenkaan onnistumatta.

Puolisen vuotta sitten löysin cellular automata algoritmin ja toteutin sen GML:llä. Sillä ei kuitenkaan voi luoda huonepohjaista luolastoa.

Sain nyt viikonloppuna yhtäkkisen inspiraation koodata random-luolastogeneraattorin ja tartuin tuumasta toimeen.

Näin syntyi spagetti-algoritmi.

Koska tuskin koskaan jaksan siistiä näitä kahta algoritmia sen parempaan muotoon, jaan ne nyt vain hieman kommentoituna.

sGenerateDungeonCellularAutomata(width,height,fill,iterations, border, ratio)  Toimii sellaisenaan.
Spoiler
///sGenerateDungeonCellularAutomata(width,height,fill,iterations, border, ratio)
// Muodostaa luolaston cellular automata -menetelmällä ja palauttaa sen ds_gridinä. 1 on seinää, 0 on tyhjää.
width = argument0; // Leveys soluissa
height = argument1; // Korkeus soluissa
iterations = argument3; // Iteraatioiden määrä, 3 tuntuu aika hyvältä
size = width * height;
fill = size * argument2; // Kuinka paljon reikiä puhkotaan, 55 on hyvä
border = argument4; // Paljonko tyhjää jätetään laidalle, vaikkapa 8
ratio = argument5; // Käytä numeroa 5
width += border*2;
height += border*2;

// Luodaan oikean kokoinen ds_grid
map = ds_grid_create(width, height);
ds_grid_clear(map, 1);

// Luodaan satunnaiset tyhjät
added = 0;
while( added < fill )
{
    xRand = irandom_range(border, width-border);
    yRand = irandom_range(border, height-border);
   
    if (ds_grid_get(map, xRand, yRand) == 1)
    {
        ds_grid_set(map, xRand, yRand, 0);
        added++;
    }
}

repeat(iterations)
{
    // Otetaan kopio kartasta jota tutkitaan
    oldMap = ds_grid_create(width, height);
    ds_grid_copy(oldMap,map);
   
    // Käydään läpi jokainen ruutu vanhassa kartassa ja muokataan nykyistä sen mukaan
    w = 0;
    repeat(ds_grid_width(map))
    {
        h = 0;
        repeat(ds_grid_height(map))
        {
           
            // Jos solun ympärillä oleva 3x3 alueella seinää on ratio (5) tai enemmän, solu on seinää
            if (ds_grid_get_sum(oldMap, w-1,h-1,w+1,h+1) >= ratio)
            {
                ds_grid_set(map, w, h, 1);
            }
            else
            {
                // Muuten solu on avoin
                ds_grid_set(map, w, h, 0);
            }
            h++;
        }
        w++;
    }
    // Poistetaan vanha kartta muistista
    ds_grid_destroy(oldMap); 
}

// Palautetaan luotu kartta
return map;


Spagetti-algoritmissa on useampi vaadittava scripti:

sGenerateDungeonSpaghetti()
Spoiler
///sGenerateDungeonSpaghetti(width, height, amount, minSize, maxSize, roomSpacing, complexity, minDoors, maxDoors, roomList)
width = argument0; // Leveys soluina
height = argument1; // Korkeus soluina
amount = argument2; // Montako huonetta koitetaan sijoittaa
minSize = argument3; // Huoneen minimikoko
maxSize = argument4; // Huoneen maksimikoko
spacing = argument5; // Huoneiden väli
complexity = argument6; // Pakottaa polut kulkemaan spagettisesti
minDoors = argument7; // Ovien minimimäärä
maxDoors = argument8; // Ovien maksimimäärä
roomList = argument9; // Lista johon luodut huoneet asetetaan jos haluaa ottaa ne talteen. Huoneet ovat ds_mappeja joilla on avaimet "x", "y", "w" ja "h".

map = ds_grid_create(width, height);
// Täytetään seinällä (1)
ds_grid_set_region(map, 0, 0, width, height, 1);

// Koitetaan asettaa amount huonetta
repeat(amount)
{
    w = irandom_range(minSize, maxSize);
    h = irandom_range(minSize, maxSize);
    xx = irandom_range(8, width - w - 8);
    yy = irandom_range(8, height - h - 8);
    // Onko vapaana?
    if (ds_grid_get_min(map, xx-spacing, yy-spacing, xx + w+spacing, yy + h+spacing) == 1)
    {
        // Asetetaan alue lattiaksi (0)
        ds_grid_set_region(map, xx, yy, xx + w, yy + h, 0);
        roomMap = ds_map_create();
        ds_map_add(roomMap, "x", xx);
        ds_map_add(roomMap, "y", yy);
        ds_map_add(roomMap, "w", w);
        ds_map_add(roomMap, "h", h);
       
        // Talletetaan listaan
        ds_list_add(roomList, roomMap);
    }
   
}
// Luodaan spagetti

// Aloitetaan luomalla mp_grid pathfindingia varten
mpGrid = mp_grid_create(0,0,width, height, 1, 1);
sMpEmptyToWall(mpGrid, map, roomList, minDoors, maxDoors);
/*
// Tuotetaan huoneet mp_gridiin, sisältä tyhjiä
for (i = 0; i < ds_list_size(roomList); i++)
{
    roomMap = roomList[| i];
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"]-1, roomMap[? "x"] + - 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"]-1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + - 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"] + roomMap[? "w"] + 1, roomMap[? "y"]-1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"] + roomMap[? "h"] + 1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
}*/

// Sujautetaan randomoinnit
randomQueue = ds_queue_create();
repeat (complexity)
{
    xx = irandom(width);
    yy = irandom(height);
    // Onko alue sallittu?
    if (sMpIsWalled(xx, yy, mpGrid, map))
    {
        ds_queue_enqueue(randomQueue, xx, yy );
    }
}
// Puretaan jono
i = 0;
while(ds_queue_size(randomQueue) > 0)
{
    xx = ds_queue_dequeue(randomQueue);
    yy = ds_queue_dequeue(randomQueue);
    mp_grid_add_cell(mpGrid, xx, yy);
    //map[# xx , yy ] = 4;
    i++;
}
ds_queue_destroy(randomQueue);

roomsLeftList = ds_list_create();
ds_list_copy(roomsLeftList, roomList);
// Aletaan luomaan reitteja

// Kaikille huoneille
while(ds_list_size(roomsLeftList) > 1)
{
    room1 = roomsLeftList[| 0];
    ds_list_delete(roomsLeftList, 0);
    room2 = roomsLeftList[| 0];
    // Luodaan pathi   
    path = path_add();
    x1 = room1[? "x"] + irandom(room1[? "w"]);
    y1 = room1[? "y"] + irandom(room1[? "h"]);
    x2 = room2[? "x"] + irandom(room2[? "w"]);
    y2 = room2[? "y"] + irandom(room2[? "h"]);
   
    if (mp_grid_path(mpGrid, path, x1, y1, x2, y2, false))
    {
        sPathToFloor(map, path);    }
    else
    {
        // Huoneeseen ei pääse
        //show_message("Pathing failed!");
    }
    path_delete(path);
}
mp_grid_destroy(mpGrid);
ds_list_destroy(roomsLeftList);
return map;


Spagetin käyttämä sMpEmptyToWall() joka (kai) tekee oven:
Spoiler
///sMpEmptyToWall(grid, map, roomList, minDoors, maxDoors)
mpGrid = argument0;
map = argument1;
roomList = argument2;
minDoors = argument3;
maxDoors = argument4;
// Tuotetaan huoneet mp_gridiin, sisältä tyhjiä
for (i = 0; i < ds_list_size(roomList); i++)
{
    roomMap = roomList[| i];
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"]-1, roomMap[? "x"] + - 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"]-1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + - 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"] + roomMap[? "w"] + 1, roomMap[? "y"]-1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
    mp_grid_add_rectangle(mpGrid, roomMap[? "x"]-1, roomMap[? "y"] + roomMap[? "h"] + 1, roomMap[? "x"] + roomMap[? "w"] + 1 , roomMap[? "y"] + roomMap[? "h"] + 1 );
   
    // Ovet satunnaisesti
    repeat(irandom_range(minDoors, maxDoors))
    {
        switch(irandom(3))
        {
            case 0: mp_grid_clear_cell(mpGrid, roomMap[? "x"] + irandom(roomMap[? "w"]), roomMap[? "y"] + roomMap[? "h"] + 1);
                break;
            case 1: mp_grid_clear_cell(mpGrid, roomMap[? "x"] + irandom(roomMap[? "w"]), roomMap[? "y"]-1);
                break;
            case 2: mp_grid_clear_cell(mpGrid, roomMap[? "x"] -1, roomMap[? "y"] + irandom(roomMap[? "h"]));
                break;
            case 3: mp_grid_clear_cell(mpGrid, roomMap[? "x"] + roomMap[? "w"] + 1, roomMap[? "y"] + irandom(roomMap[? "h"]));
                break;
        }
    }
}



sMpIsWalled()

Spoiler
///sMpIsWalled(x,y, mpGrid, map)
xx = argument0;
yy = argument1;
mpGrid = argument2;

if (argument3[# xx, yy] == 0)
{
    return false;
}

total = mp_grid_get_cell(mpGrid, xx -1, yy -1) + mp_grid_get_cell(mpGrid, xx, yy -1) + mp_grid_get_cell(mpGrid, xx +1, yy -1) +
mp_grid_get_cell(mpGrid, xx -1, yy) + mp_grid_get_cell(mpGrid, xx, yy) + mp_grid_get_cell(mpGrid, xx + 1, yy) +
mp_grid_get_cell(mpGrid, xx -1, yy +1) + mp_grid_get_cell(mpGrid, xx, yy +1) + mp_grid_get_cell(mpGrid, xx +1, yy +1);
//show_message("Total: " + string(total));


return total > -2;



sPathToFloor() jyystää pahtista lattiaa.
Spoiler
///sPathToFloor(map, path)
map = argument0;
path = argument1;
i = 0;
len = path_get_length(path);
//show_message("Path length: " + string(len));
repeat(len)
{
    //show_message("Carving to: " + string(path_get_x(path, i/len)) + ", " + string());
    map[# path_get_x(path, i/len), path_get_y(path, i/len)] = 0;
    i++;
}





Molempien kanssa voi käyttää esimerkiksi tätä sAutoTile() autotiletystä.

Tilesetin ylin rivi on lattioita ja toinen rivi seiniä. (Tile valitaan satunnaisesti riviltä).
GRIDSIZE on yhden solun koko, esim. 32 pikseliä.
Spoiler
///sAutoTile(ds_grid, tileset)
var map = argument0;
var tileset = argument1;
var width = floor(background_get_width(tileset)/GRIDSIZE)-1;
w = 0;
repeat(ds_grid_width(map))
{
    h = 0;
    repeat(ds_grid_height(map))
    {
        if (ds_grid_get(map, w, h) == charWall)
        {
            tile_add(tileset,irandom(width)*GRIDSIZE,GRIDSIZE,GRIDSIZE,GRIDSIZE,w*GRIDSIZE,h*GRIDSIZE,WALLLAYER);
        }
        else if (ds_grid_get(map, w, h) == charFloor)
        {
            tile_add(tileset,irandom(width)*GRIDSIZE,0,GRIDSIZE,GRIDSIZE,w*GRIDSIZE,h*GRIDSIZE,FLOORLAYER);
        }
        h++;
    }
    w++;
}



Kuvia ja käyttöesimerkkejä:
Spoiler
Maagisella spagettialgoritmilla:
randomize();
widthV = 128;
heightV = 128;
fillV = 500;
iterationsV = 3;
maxSize = 21;
minSize = 5;
spacing = 1;
complexity = 5000;
minDoors = 1;
maxDoors = 6;
roomList = ds_list_create();

map = sGenerateDungeonSpaghetti(widthV, heightV, fillV, minSize, maxSize, spacing, complexity, minDoors, maxDoors, roomList);

startRoom = roomList[| 1];
instance_create((startRoom[? "x"] + startRoom[? "w"]/2) * GRIDSIZE, (startRoom[? "y"]+startRoom[? "h"]/2) * GRIDSIZE, oTestCharacter2D);
sAutoTile(map, tsTest)




Cellular Automata:
randomize();
widthV = 96;
heightV = 96;
fillV = 55;
iterationsV = 3;
/*maxSize = 21;
minSize = 5;
spacing = 1;
complexity = 5000;
minDoors = 1;
maxDoors = 6;
roomList = ds_list_create();*/

//map = sGenerateDungeonSpaghetti(widthV, heightV, fillV, minSize, maxSize, spacing, complexity, minDoors, maxDoors, roomList);

map = sGenerateDungeonCellularAutomata(widthV, heightV, fillV/100, iterationsV, 8, 5);
//sGenerateWall(map);
sAutoTile(map, tsTest)




Pahoittelen tosiaan sekavuutta ja sotkuisuutta, mutta pelkään että en koskaan saa näitä julkaistuksi jos en nyt tee sitä.

Toivottavasti näistä on jotain iloa! Saa kysyä jos on kysyttävää.

13
Valmiit pelit / Napoleonic Ukko Wars - The Battle of Waterloo
« : 18. Toukokuu 2015, 12:52 »
Napoleonic Ukko Wars - The Battle of Waterloo

Peli keskittyy vuonna 1815 käytyyn Waterloon taisteluun, jossa Napoleon vihdoin lyötiin.
Voit valita pelaatko briteillä vai ranskalaisilla.

Perinteiseen Ukko Wars tyyliin, pelaaja on yksi sotilas muiden joukossa. Tekoäly(ttömyys) paimentaa ukkoja sotimaan ja verta syntyy.
Pelissä tiimit koittavat valloittaa lippuja, jotka lisäävät erikoisyksiköiden spawnausta.

Kontrollit:
Hiiren vasen ampuu
Hiiren oikea käyttää pistina
WASD liikkuu
Control polvistuu
R lataa, vain polvistuneena

Hiiren keskinäppäin ottaa kursorin osoittaman ukon hallintaan.

Teemat:
Napoleon
Paljon verta
1800-luku

Lataa tästä!

Kuvia:
Spoiler


14
Valmiit pelit / Operation Hurgunbundur
« : 02. Toukokuu 2015, 01:29 »
Operation Hurgunbundur

Operation Hurgunbundurissa John Rambo palaa eläkkeeltä pelastamaan Hurgunbundurin pahan diktaattorin kaappamia vankeja. Vastassa on löysän puoleisia sotilaita jotka eivät liiemmin pistä vastaan. Tässä pelissä ei verta säästellä.

Pelissä tarkoitus on ajaa rata riittävän nopeasti läpi. Tämä onnistuu parhaiten tulittamalla turhat esteet tieltä pois ja käyttämällä boostia taidokkaasti.
Oranssi mittari ylhäällä ilmaisee boostin määrän (latautuu täysiin neljässä sekunnissa). Mitä täydempi mittari sitä enemmän voimaa boostissa.
Kun radan läpäisee vaikeusaste kovenee.
Maassa lojuu siellä täällä myös räjähdetynnyreitä joista saatta välillä olla hyötyä.

Kontrollit:
W kaasu
S pakki
A ja D auton maaginen kääntäminen
Space boosti
Hiiri tulitus

Peli jäi hyvin keskeneräiseksi ja totta puhuen suurin osa työstä tehtiin muutamaa tuntia ennen kisan päättymistä.
Peli on kuitenkin yllättävän viihdyttävä kiitos mehukkaiden efektien ja toimivan idean.
Välttämättä ei ole mahdotonta että peliä joskus jatkaisin.

http://files.1337upload.net/Operation_Hurgunbundur-65f5db.exe





Kiitokset Riukulle maastogeneraattorista!

Kommenttia kiitos.

15
Valmiit pelit / Konnan Kosto - RPG
« : 20. Marraskuu 2014, 12:51 »
Tutkiskelin vanhan kovalevyn sisältöä ja löysin vanhan RPG Maker 2003:n. Projektit kansiosta löytyi useampikin peliprojekti aikaväliltä 2006-2008 ja kävin läpi jokaisen. Yksi niistä oli ylitse muiden: Konnan Kosto, eeppinen tarina Konnasta joka öö tekee asioita. Kannattaa kokeilla!
http://files.1337upload.net/Konnan_Kosto-5cb710.zip

Kertokaa saatteko toimimaan. Odotan innolla palautetta!
Ainiin, kauppoja käytetään painamalla spacea oviaukon kohdalla seisoessa :D. Pelissä on paljon tahallisia ja tahattomia salaisuuksia. Laivasta pääsee ulos menemällä puolikkaan sängyn alapuoliseen ruutuun.



Edit: Pelissä on käytetty erinomaisesti yhdys sanoja.

Edit2: Okei, ilmeisesti vaatii toimiakseen RPG Maker 2003:n Run Time Packagen. Jos uskaltaa voi sen tätä linkkiä hyödyntäen asentaa: http://jiggmin.com/threads/62057-How-To-Install-RPG-Maker-2003.

Sivuja: [1] 2 3 4
Powered by SMF 2.0.11 | SMF © 2006–2009, Simple Machines LLC