Page 58 of 60

Re: Offtopic (I/2012)

Posted: Sat Jan 04, 2014 1:09 am
by Jani
Pettis wrote:Ei kenelläkään sattuis olemaan ylimääräistä beta-kutsua Blizzardin Hearthstoneen?
Niitä ei valitettavasti saanut ylimääräistä, ainoastaan yhden per tunnus. 7.1. alkaa seuraava jako niille, jotka ovat ilmoittautuneet betaan.
EDIT:

I stand corrected.


Re: Offtopic (I/2012)

Posted: Mon Jan 06, 2014 5:04 pm
by Pettis
Jani wrote:
Pettis wrote:Ei kenelläkään sattuis olemaan ylimääräistä beta-kutsua Blizzardin Hearthstoneen?
Niitä ei valitettavasti saanut ylimääräistä, ainoastaan yhden per tunnus. 7.1. alkaa seuraava jako niille, jotka ovat ilmoittautuneet betaan.
Eri kampanjoissa jaetut kutsut eivät ole mitenkään sidoksissa tunnuksiin. Vasta oli esim. Korean Blizzardilla kampanja josta sai sähköpostiosoitteella kutsuja, mutta itse myöhästyin muutamalla tunnilla sen päättymisestä, niin ei ole kutsua näkynyt.

EDIT: Eipä mitään enää. On näemmä ilmestynyt peli tuonne battle.net launcheriin.

Re: Offtopic (I/2012)

Posted: Wed Feb 12, 2014 10:15 pm
by MaGetzUb
Tässä tuli taas pitkästäaikaa räplättyä CoolBasicilla enemmän ja "hakkeroitua" sitä. Ei siis ole kyse kräkkeröinnistä. Huomasin että tekstinhän saa helposti laitettua muistipalaan pelkällä Encrypt kutsulla, kunhan vain luo ensiksi muistipalan jonka pituus on tekstinpituus. :D

Code: Select all

str_ = strmem("Hello world!")

Repeat 
    ClearText 
    s$ = ""
    
    //Luetaan muistipalan koko -1 asti, koska viimmeinen tavu muistipalassa osoittaa vain kohdan,
    //missä tekstinluku pitää lopettaa.
    For i = 0 To MEMBlockSize(str_)-1
        s$ = s$ + Chr(PeekByte(str_, i))
    Next i
    SetWindow ""+s$
    AddText s$ 

DrawScreen
Forever 


Function StrMem(s$)
    mem = MakeMEMBlock(Len(s$))
    Encrypt mem,mem, s$
    Return mem
EndFunction 

Re: Offtopic (I/2012)

Posted: Fri Feb 21, 2014 8:23 am
by Jare
MaGetzUb wrote:Tässä tuli taas pitkästäaikaa räplättyä CoolBasicilla enemmän ja "hakkeroitua" sitä. Ei siis ole kyse kräkkeröinnistä. Huomasin että tekstinhän saa helposti laitettua muistipalaan pelkällä Encrypt kutsulla, kunhan vain luo ensiksi muistipalan jonka pituus on tekstinpituus. :D
Mielenkiintoinen havainto. CoolBasic käyttää muutenkin muistipaloja aika laajasti joka puolella. Kirjoitan nyt aika pitkästi, eikä tämä sepustukseni nyt välttämättä liity suoraan mihinkään. Kunhan vain tykkään itsekkin kokeilla erikoisia juttuja CoolBasicissa :).

Jokainen merkkijono itsessään on muistipala. Vähän aikaa sitten koitin hieman räpeltää tyyppien kanssa. Jokainen typin jäsenhän on muistipala, joka sisältää tiedon edeltävästä jäsenestä, seuraavasta jäsenestä, tyyppikokoelmasta johon jäsen kuuluu, jäseneen tallennetut arvot sekä vielä "ylimääräiset" neljä tavua, joiden merkitys ei itselleni auennut. Nuo tavut sijaitsevat jäsenen muistipalan lopussa, ja testeissäni ne olivat aina arvoltaan nollia.

Näissä testeissä havaitsin jäsenen ensimmäisen kentän arvon sijaitsevan positiossa 12. Arvo tulee lukea kentän tyypin mukaisella funktiolla, esimerkiksi kokonaisluvun olessa kyseessä:

Code: Select all

PeekInt(ConvertToInteger(tyypin_jäsen), 12)
Käytännön ongelmaksi muodostuu se, että tietotyyppiä ei saa automaattisesti mistään selville - se täytyy tietää. Itse tyyppikokoelman määritystietoihin en testeissäni päässyt käsiksi. Muuttujien suhteen homma toimii niin, että tyyppijäsenmuuttujat sisältävät suoraan osoittimen jäsenen muistipalaan. Sen sijaan tyyppiekokoelman tunnisteet - joita jopa niitäkin pystyy joissain tapauksissa lukemaan muuttujina - ovat juoksevia numeroita alkaen ykkösestä.

Tällä koodilla saa tyyppikokoelman numeron selville:

Code: Select all

Type HELLO_WORLD
    //Kenttien määritykset tähän....
EndType

Function Blah(type_index)
    MakeError type_index
EndFunction

Blah(HELLO_WORLD)

Voisi kuvitella, että tuosta tulisi syntaksivirheilmoitus. Ei tule. Tyyppikokoelman tunnisteen voi lukea harvoissa tilanteissa, mutta yksi niistä on käyttäminen funktion parametrina.

(Mielenkiintoinen sivuhuomio on se, että tuo juokseva numero vaikuttaa myös objektien juoksevaan numerointiin: jos ohjelmassa ei ole ainuttakaan tyyppikokoelmaa, ensimmäinen objekti saa numerokseen 1, mutta jos tyyppikokoelmia on, ensimmäisen objektin numero ei ole ykkönen, vaan se on riippuvainen tyyppikokoelmien määrästä). Lisäksi ConvertToInteger() ja ConvertToType() ovat varsin kummallisia funktioita. Mihin niitä tarvitaan? Kyseessä on jonkinlainen syntaksitarkistukseen liittyvä kiertotie. Ne eivät varsinaisesti konvertoi tyyppijäsentä millään tavalla. Muistaakseni CoolBasic sallii suoraan tyyppijäsenen asettamisen kokonaislukumuuttujaan ilman ConvertToIntegerin käyttöä. Sen sijaan itse muuttujan tyyppi on tärkeä jos halutaan lukea tai asettaa jäsenen sisältämiä arvoja: kenoviivan käyttö kokonaislukumuuttujan kohdalla ei ole mitenkään mahdollista.

Jäsenen arvojen lukeminen vaatii siis tietoisuuden arvojen tyypeistä. Jos kyseessä on merkkijono, jäsenen muistipalasta löytyy kokonaisluku, joka kertoo osoittimen itse tekstin sisältävään muistipalaan. Tuon muistipalan voi vaikka käydä poistamassa ja asettamassa tilalle toisen muistipalan. Tai voi muokkailla alkuperäistä muistipalaa. Voit vaikka syöttää saman muistipalan osoittimen kaikille tyyppikokoelman jäsenille johonkin kenttään: näin niillä on yhteinen, jaettu merkkijonomuuttuja. En nyt tiedä sitten, mitä järkeä tässä olisi :D.

Näitä jippoja voisi melkein käyttää vaikkapa universaalin tyyppikokoelman tallennusfunktion tekemiseen: funktio kykenisi tallentamaan minkä tahansa tyyppikokoelman kaikki jäsenet. Mutta valitettavasti ei ihan. Periaatteessa jäsenen muistipalan voisi kyllä käydä läpi loopissa ja tallentaa kaikkien kenttien arvot tiedostoon, mutta tekstimuuttujien tunnistaminen ei ikävä kyllä ole mahdollista. Jollain pitäisi saada selville, onko käsiteltävä nelitavuinen tieto osoitin olemassa olevaan muistipalaan vai ei. Kiertotienä voisi käyttää sitä, että funktiolle erikseen kerrotaan, mitkä kentät ovat merkkijonokenttiä.

Tallennusfunktion tekeminen siis kutakuinkin onnistuisi - lataamisfunktiossa taas olisi omat ongelmansa: Koska itse tyyppikokoelman määritykseen ei saa mitään otetta, ei muistipalakomennoilla minun kokemukseni mukaan ole mahdollista vaikuttaa kokoelman First()- ja Last()-arvoihin. Latausfunktio voisi luoda muistipalan, jossa on sama sisältö kuin tallennetulla jäsenellä, mutta sitä ei pystyisi liittämään tyyppikokoelman ensimmäiseksi tai viimeiseksi jäseneksi niin, että CoolBasic sen noteeraisi. Ongelmia seuraisi For Eachia sekä First():a ja Last():a käyttävissä ohjelmissa.

Periaatteessa voisi kuitenkin luopua tyyppikokoelmista järjestettynä listana ja tyytyä luomaan jäseniä ilman listaa. Jäsen saadaan täysin katoamaan tyyppikokoelman listasta jos sen sisältö kopioidaan toiseen muistipalaan (ja sen sisältämät merkkijonot kopioidaan myös ihan uusiin muistipaloihin) ja sen jälkeen poistetaan alkuperäinen jäsen. Jäsenen uuden muistipalan osoitin voidaan asettaa jäsen.TYYPPi-muuttujan arvoksi, jolloin päästään taas suoraan käsiksi jäsenen kenttien arvoihin. Jäsenen voisi jopa syöttää jäseneksi ihan toiseen tyyppikokoelmaan, mutta aiemmin mainittujen ongelmien vuoksi First() ja Last() -funktiot eivät koskaan näkisi kyseistä jäsentä. Myöskään For Each ei osaisi aloittaa lenkkiä uudesta jäsenestä, mutta toki se kävisi tuon uudenkin jäsenen läpi, jos ketjutus on tehty oikein: uuden kokoelman jonkin jäsenen täytyy sisältää tieto siitä että tämä uusi jäsen on sen seuraaja. Tämä on mahdollista toteuttaa, koska kuten aiemmin mainitsin, jokaisen jäsenen muistipala sisältää osoittimen seuraavan jäsenen muistipalaan - ja myös edellisen jäsenen muistipalaan.

Wall of text päättyy. Varmaan jotkut kohdat olivat aika epäselvästi esitettyjä. Jos asia kiinnostaa, juttelen siitä mielelläni lisää. Sähköpostillakin voi ottaa yhteyttä j-jare.fi. Elikkä viiva pitää muuttaa @-merkiksi. En käy täällä nykyään kovin usein, niin tuo meili on parempi vaihtoehto.

Re: Offtopic (I/2012)

Posted: Mon Feb 24, 2014 4:48 pm
by MaGetzUb
Juu tutkiskelin kans Wanhan CoolBasicin tyyppien toimintaa 2012, muutama sivu tätä topikkia taaksepäin.
Voisiko tekstimuistipalan tunnistaa MemblockSize() -komennolla, koska muut tietotyypithän ovat sitten vain 4, 2 tai 1 tavuisia. :)

Re: Offtopic (I/2012)

Posted: Thu Apr 03, 2014 9:35 am
by Konstaduck
Hiljaista on ollut, saapa nähdä milloin Zero saa Classicin valmiiksi :)

Re: Offtopic (I/2012)

Posted: Fri Apr 25, 2014 6:54 pm
by Jani
Onko kukaan muu osallistumassa Ludum Dareen? Itse osallistun Jamiin parin kaverin kanssa. Mitään syytä meillä ei ole edes saada peliä valmiiksi, vaan huvin vuoksihan tähän osallistutaan. Jos joku ei tiedä, mistä on kyse niin tässä vähän selitystä. Ludum Dare Compo/Jam on 48/72h - vastaavasti - pelintekokilpailu. Aihe paljastetaan aamulla kello 4 ja siitä alkaa aika. Lisään tämän viestin loppuun tuotoksemme kun kilpailu on ohi.
Käytämme tälläistä settiä:
  • Kieli: Haxe
  • Pelimoottori: Haxepunk
  • IDE: FlashDevelop
  • Grafiikka: Aseprite / Paint.net
  • Musiikki: FL Studio
  • Ääniefektit: bfxr
Tässä vielä asiaan liittyvä kuva.
Image

EDIT: Aika loppui ja tuotoksemme on tässä: http://www.ludumdare.com/compo/ludum-da ... &uid=34500
Mielipiteitä?

Re: Offtopic (I/2012)

Posted: Sat May 10, 2014 2:27 am
by Jare
Jatkoin CB:n syntaksitarkituksen kanssa leikkimistä.

Ensiksi yksi hieman tylsempi huomio. Muuttujien, funktioiden jne. nimissä ei pitäisi olla sallittuja muut merkit kuin A-Ö,0-9 ja alaviiva. Väärin. Kenoviivan (\) ja pisteen voi myös sijoittaa näihin nimiin - ilman että nimi liittyy mitenkään tyyppeihin - kunhan nimi ei ala pisteellä tai kenoviivalla, tai pääty sellaiseen. Hyötyä tästä ei taida olla, mutta onpahan uusi tapa nimetä vaikka tiettyyn tyyppiin liittyviä vakioita:

Code: Select all

Type Pelaaja
    //Fieldejä tähän....
EndType
Const Pelaaja\Lukumäärä = 5
MakeError Pelaaja\Lukumäärä
CoolBasic tykkää vähän turhan herkästi herjata vääristä tietotyypeistä esimerkiksi perus merkkijonofunktioiden kohdalla: väärän tyyppinen parametri aiheuttaa virheen. Esimerkiksi InStr(oma_funktio(), "haettava") aiheuttaa virheilmoituksen, koska oma_funktio() ei mukamas palauta merkkijonoa. Ratkaisu: lisää funktion nimeen dollarimerkki:

Code: Select all

Function oma_funktio$()
    Return "blaa blaa blaa"
EndFunction
MakeError InStr(oma_funktio(), "haettava")
Samaan tyyliin voit tehdä funktiostasi myös float-tyyppisen (#) tai short-tyyppisen (%). Huomionarvoista on kuitenkin se, että funktion tyyppi ei oikeasti tee funktion paluuarvolle minkäänlaista konversiota: float-tyyppinen funktio palauttaa merkkijonon, jos komennat funktion sisällä Return "abc". Kunhan kusetetaan nipottavaa kääntäjää :).

Jos tykkää lyhyistä funktioiden nimistä, kannattaa vilkaista nämä helmet:

Code: Select all

Function $()
	Return "Dollari"
EndFunction

Function #()
	Return "Risuaita"
EndFunction

Function %()
	Return "Prosentti"
EndFunction

Print $()
Print #()
Print %()
WaitKey
Kuten esimerkistä näkee, noiden kaikkien esittelyt ja kutsut toimivat ilman ongelmia.

Jatketaan. Alan jo tykkäämään näistä kolmesta erikoismerkistä. Oletko koskaan kirjoittanut CoolBasicilla yleiseen käyttöön jotain koodikirjastoa ja toivonut, että sen käyttäjä voisi halutessaan ylikirjoittaa jonkin sinun funktioistasi omalla versiollaan - ilman, että hänen tarvitsisi muokata kirjastosi koodia lainkaan? Näin käyttäjä voisi näppärästi syöttää kirjastollesi pätkän koodia, joka kirjaston tulee ajaa tietyssä tilanteessa.

Yllä mainitut erikoismerkit mahdollistavat ikäänkuin "pohjafunktion" luomisen. Pohjafunktiota kutsutaan silloin, jos toista, ylikirjoittavaa funktioita ei ole määritetty:

Code: Select all

Function funktio#()
	Return "pohjafunktio"
EndFunction

MakeError funktio()
Ei mitään normaalista poikkeavaa tuossa yllä, paitsi että funktion nimeen on lisätty risuaita (voisi olla myös dollari tai prosentti). Huomaa, että kutsuvaiheessa erikoismerkkiä ei käytetä! Sitten koodaaja haluaa ylikirjoittaa pohjafunktion:

Code: Select all

Function funktio#()
	Return "pohjafunktio"
EndFunction

Function funktio()
	Return "ylikirjoittava funktio"
EndFunction

MakeError funktio()
Nyt kun funktio esiintyy kahdella kirjoitustavalla - erikoismerkin kanssa ja ilman sitä - esimerkin kutsu kutsuu nimenomaan sitä funktiota, jossa erikoismerkkiä ei ole. Jos erikoismerkitön funktio puuttuisi, CB osaisi automaattisesti kutsua erikoismerkillistä funktiota. BONUS: Jos haluamme, voimme edelleen kutsua pohjafunktiota, jos lisäämme kutsuun erikoismerkin: MakeError funktio#(), mutta tällöin pohjafunktion esittelyn pitäisi sijaita vasta ylikirjoittavan funktion jälkeen.

Semmosta :)

Re: Offtopic (I/2012)

Posted: Sat May 10, 2014 9:53 pm
by Latexi95
Hoh... Aina sitä CB:stä vaan löytyy uusia ominaisuuksia :D

Re: Offtopic (I/2012)

Posted: Mon May 12, 2014 11:42 am
by koodaaja
Vastaavanlaista kikkaa voi käyttää myös globaalien ja lokaalien muuttujien erotteluun, erikoismerkillä varustettuna muuttuja ei viittaakaan alkuperäiseen:

Code: Select all

Global muuttuja#
muuttuja = 5.0

Function printtaa_globaali()
    Print muuttuja
EndFunction

Function printtaa_lokaali()
    Print muuttuja#
EndFunction

printtaa_globaali()
printtaa_lokaali()

WaitKey
En tiedä voiko sitä mihinkään hyödyksi käyttää mutta tietääpähän välttää ainakaan vahingossa määrittelemästä uudelleen.

Re: Offtopic (I/2012)

Posted: Thu May 15, 2014 5:49 pm
by Jani
Hieno löytö Jonezilta. Tässä vielä pientä täydennystä. Funktiosta voi olla kolme versiota, joista kahta voidaan kutsua erikseen. Näin uskaltaisin sanoa, että %-merkki olisi parempi super-funktio.

Code: Select all

Print f()
WaitKey

Function f#()
    Print f%()
    Return "risuaita"
EndFunction

Function f%()
    Return "prosentti"
EndFunction

Function f()
    Print f%()
    'Print f#() // No thank you
    Return "override"
EndFunction

Re: Offtopic (I/2012)

Posted: Sun Jun 22, 2014 3:06 pm
by atomimalli
Tuli mieleen, että jos kaipaa tänne keskustelua niin kannattaa irkissä vinkata kun ei tänne jaksa opiskelukiireessä muutenvaan vilkasta, vaikka välissä löytyisikin hiukan aikaa. coolbasicilla tai cb2:lla.

Re: Offtopic (I/2012)

Posted: Tue Jun 24, 2014 3:18 am
by Awaclus
Voisin kai sitä tännekin tulla ilmoittamaan, että teen nykyään tällaisia.

https://www.youtube.com/watch?v=eCo4B0YsBI4

Re: Offtopic (I/2012)

Posted: Sun Aug 03, 2014 3:25 pm
by CCE
Hyvää sunnuntai-iltapäivää.

Image

Re: Offtopic (I/2012)

Posted: Mon Aug 04, 2014 1:41 am
by Pettis
MItä tohon nyt sanois... :D

Re: Offtopic (I/2012)

Posted: Mon Aug 04, 2014 8:15 am
by Zero
Haha

Re: Offtopic (I/2012)

Posted: Fri Aug 08, 2014 11:41 pm
by Frozen
Nettikaveri heitti jotain mielenkiintoista :)

Re: Offtopic (I/2012)

Posted: Mon Aug 18, 2014 6:19 am
by MaGetzUb
Kiva nähdä hiljaiseloa CB Classic:sta (Zeron uusia blogipäivityksiä oon lueskellut).. :) Onko tämä nyt ~10vuoden kunniaksi? :D

Re: Offtopic (I/2012)

Posted: Sat Dec 06, 2014 12:27 am
by Mikki0000
Voisiko joku selittää, että miten vaihdetaan käyttäjänimeä?
Lisäksi sen Coolbasic Classikin pitäsi tulla nopeasti tai muuten se on
liian vanhanaikanen kun se julkaistaan joskus vuonna 2060.

Re: Offtopic (I/2012)

Posted: Mon Dec 08, 2014 11:17 am
by valscion
Mikki0000 wrote:Voisiko joku selittää, että miten vaihdetaan käyttäjänimeä?
Laita viestiä vaikka Pettikselle, hänellä on oikeudet vaihtaa käyttäjätunnuksia.