The Dungeon, Gameplay!

This is my first live game play video, it includes lots of awkward talking!

It is about a dungeon-crawler I made for 7drl in 2015. The Dungeon is a dungeon crawler that you control the dungeon itself instead of an adventurer. And your objective is killing the adventurer.

Enjoy!

Bloodworks

Bloodworks is an indie game that I am working on for last few months. It is an open-source (GPL-3.0) game and it will be completely free once it is released. Here is a gameplay video.

It is a top-down shooter/survival game. Main objective of game is achieving a high score, which is only possible by surviving more. Game gets harder and harder as it goes so I assume it will be impossible at some point.

There are various power-ups, weapons and bonuses that help players. It also has a leveling system that gives permanent perks to player.

I programmed the engine in C++ and gameplay in Lua. Engine is highly modified (and simplified version) of my previous work, bifrost, it uses OpenGL to render stuff, SDL to make things cross-platform, soloud for sounds. I also coded some lower level gameplay code in C++ to increase program performance.

Gameplay is programmed in Lua. Weapons, perks, monsters, bonuses etc all programmed in Lua side. Even missions are programmed in Lua. Currently only mission is Survival, which spawns stronger enemies as game progresses but it will be possible to add new modes in future. This makes the development process much faster. I am using sol2 for C++ and Lua interaction. It is an amazing library that handles communication between those two in a very easy way.

My main objective was making it very easy to mod the game. In future I will add a mod system that can upload, search or download various mods that other players develop.

It is (highly) inspired by Crimsonland. I am planning to add more content as the game grows, and hopefully make the gameplay more distinct than Crimsonland.

Crypto – NES game

So I haven’t written anything for a long time. I decided to fill my blog more with my personal projects and cool things I learned about programming. I will start writing one of the most satisfactory projects I did.

It is Crypto, it is a NES game me and my other 3 friends developed for NES platform (Yes, that NES platform) in GGJ 2016. I had prior NES programming experience and some tools ready before GGJ but whole programming took 2 days to complete. So here is a gameplay video.

This video is one of the older versions, some of the textures are changed but it is pretty much final other than that. We bringed a CRT TV and a famiclone to GGJ event, which made it even cooler!

Gameplay is coop. There are four magical objects (Potion, scroll, book and hourglass) scattered around a maze and objective of players are carrying them all to center of the maze. Subject of GGJ was “Ritual”, so players carries objects, make a ritual and escape the maze.

There are also enemies though, so gameplay is usually one player carrying the object and other one is defending him. However it is much slower when only single player holds an object. Second play can decide to help in carrying but this time it is much harder to control. To move down, both player must hit down at the same time. This makes it both annoying and fun at the same time! Once all objects are connected, players advance the level which makes the enemies stronger.

The coolest part was after the jam, we posted the game on Reddit and it got kinda popular. We sold some games on itch.io, made a deal with stoneagegamer which bundled our game in the cartridges they sold (for all we know, Crypto is the best selling NES game on 2016) and even made it into a indie game bundle!

The Dungeon

7drl için yaptığım bir rogue like. Diğer roguelike lardan farklı olarak adventurer ı kontrol etmiyoruz, onun yerine adventurer ı durdurmaya çalışan zindanız.
ss

Screenshot baya bir kaotik oldu. @ işareti adventurer, g ler goblin b ler ise butterfly. Kelebeklerler adventurer tarafından ‘Summon butterflies’ scroll u ile yaratıldı. Adventurer etrafındaki tehditlere göre item ya da skill kullanmaya çalışıyor. Çok kalabalık olduğu için önce charm scroll unu kullandı ve goblinlerden birini geçici olarak ally yaptı, sonrada butterfly çağırararak dikkat dağıtmaya çalıştı. Goblinler kelebeklere saldırırken o da onları kesiyor. HP si azalınca muhtemelen potion içmeye başlayacak. Savaş raporu şöyle bir şey:

ssfight

Zindan olarak ben de geçici olarak Goblin Priest#29 u kontrolüm altına aldım, henüz goblinler level 1 olduğu için pek bir skillleri yok, elimde olan heal skill i ile goblinlerden birini healladım. Genel olarak oynanış bu şekilde olacak, adventurer masum goblinlerimizi keserken biz de onu durdurmaya çalışıyoruz.

Bir hafta gibi bir süre limiti olduğundan oynanabirlik adına pek bir şey ekleyemedim. Zindan olarak yapabildiklerimizi yaratık yaratma ve kontrol etmeden ibaret. Daha çok kendi kendine oynayabilen bir roguelike oldu. Adventurer (ve istenirse minionlarımız) savaşıyor, büyü atıyor, item kullanıyor, eqipment kullanabiliyor vs vs. Ortalama bir roguelike da ne varsa basit te olsa implement etmeye çalıştım.

Link: http://enginmercan.com/TheDungeon.exe
Github: https://github.com/shultays/crawler/

Visual Studio 2013 runtime dll leri yoksa o da lazım (http://www.microsoft.com/en-us/download/details.aspx?id=40784)

Muhtemelen devam etmeyeceğim projeye, eğlenceli ama çok fazla zaman istiyor. Beklemede olan bi yığın şey var zaten 🙂

Tao of Programming

The Master was explaining the nature of Tao to one of his novices.
“The Tao is embodied in all software — regardless of how insignificant,” said the Master.
“Is the Tao in a hand-held calculator?” asked the novice.
“It is,” came the reply.
“Is the Tao in a video game?” asked the novice.
“It is even in a video game,” said the Master.
“Is the Tao in the DOS for a personal computer?” asked the novice.
The Master coughed and shifted his position slightly. “The lesson is over for today,” he said.

http://www.mit.edu/~xela/tao.html

Ingenue

Evet, askerliktir şudur budur çok zaman oldu. Askerde excel dışında kendimi pek geliştiremedim, o dönemi bu kadar kısa bir özetle geçiştireyim 🙂

Ingenue nedir derseniz, tiyatro vb. de olan saf kız karakterlerine verilen isimmiş.

Aynı zamanda yeni (ve çok eski) projemin şu anki kod adı olarak seçtim, neden derseniz az önce Atoms For Peace – Ingenue dinlemekte idim ve projenin gelişme stili de oradaki dansa benzemekte.

Kendisi bir programlama dili olmakta. Dynamic typing bir dil ve şu anda bir interpreter üzerinden çalışmakta. Syntax olarak C ye baya bir benzer. “E neden yazıyorsun” derseniz çoğunlukla eğlence için. Ama dile yeni özelliklerde getirmek istiyorum.

Dediğim gibi, dil dynamic typing olmakta. Tüm değişkenler operatörlere göre tiplerini değiştirebiliyor. mesele a = b + c; gibi bir kodda a nın tip i b ve c ye göre belirleniyor. Şu anlık 3 tip var, integer, float ve string. Ve bunların baskınlık sırasıda integera = b * 2; gibi bir programın sonraki bir aşamasında bu 2 değeri 3 olabilecek. Daha ilginç bir örnek vermek gerekirse yine aynı kodda * operatörü değişebilecek ya da assignment operatörünün hedefi a değil de c olabilecek. Bir nevi hot swapping gibi. Böyle bir şeye izin veren diller var mı bilmiyorum ama fikir ilk kaynak kodunu değiştirmeye izin veren brainfuck interpreterları olduğunu öğrendiğimde aklıma gelmişti.

Ne işe yarayacak derseniz emin değilim 🙂 ama farklı bir programlama stili olacak diye umuyorum.

Nasıl çalışmakta derseniz şu anda 2 aşamadan oluşuyor. Lexer/parser kısmı ve interpreter kısmı. Parsing aşamasında kaynak kodunu alıyorum ve token larına ayırıyorum, bu tokenlarda interpreter tarafından yorumlanıyor ve kod çalışıyor. Mesela

a = 5;
b = 3.0;
c = a + b; 
d = a++; 
if(a > 0) { 
    d = a + b; 
} else d = 0;

gibi bir kod olsun. Parser bunu şöyle bir şeye çeviriyor.

program
    statement
        value
            assignment
                variable a
                value
                    integer 5
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable b
                value
                    float 3.0
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable c
                value
                    variable a
                    operator +
                    variable b
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable d
                value
                    variable_withpost
                        variable a
                        singleoperator ++
                    /variable_withpost
                /value
            /assignment
        /value
    /statement
    statement
        ifcond
            value
                variable a
                operator >
                integer 0
            /value
            statement
                statement
                    value
                        assignment
                            variable d
                            value
                                variable a
                                operator +
                                variable b
                            /value
                        /assignment
                    /value
                /statement
            /statement
            else
            /else
            statement
                value
                    assignment
                        variable d
                        value
                            integer 0
                        /value
                    /assignment
                /value
            /statement
        /ifcond
    /statement
/program

Kodun parse edilmiş hali de interpreter tarafından input olarak alınıyor ve program oluşturuluyor. Interpreter burada biraz tokenların yerlerini ve tree yapısını kendisi için düzenliyor. Interpreter ın yukarıdaki input tan oluşturduğu program şu şekilde.

 0 program
 1   statement
 2     value
 3       assignment
 4         variable a
 5         value
 6           integer 5
 7   statement
 8     value
 9       assignment
10         variable b
11         value
12           float 3.000000
13   statement
14     value
15       assignment
16         variable c
17         value
18           variable a
19           variable b
20           operator +
21   statement
22     value
23       assignment
24         variable d
25         value
26           variable a
27           operator post++
28   statement
29     ifcond
30       value
31         variable a
32         integer 0
33         operator >
34       statement
35         statement
36           value
37             assignment
38               variable d
39               value
40                 variable a
41                 variable b
42                 operator +
43       statement
44         value
45           assignment
46             variable d
47             value
48               integer 0

Buradaki en bariz değişiklik matematik işlemlerinin postfix e çevrilmesi.

İleride daha ayrıntılı olarak anlatmayı planlıyorum, şimdilik github linkini atmakla bırakacağım.

Sol

Uzun bir aradan sonra uzay projeme döndüm ve güneş sistemi özelliğini getirdim. Şimdilik çok tırt, farklı boyda gezegenler çizmeyi desteklemediğim için böyle tırt duruyor. Güneşin boyunu gezegenlere göre daha büyük yaparsam kim kimin etrafında dönüyor daha iyi anlaşılacaktır. Ayrıca gezegenlere orbit te eklemek istiyorum. O zaman hepten güzel olacaktır. Bir sonraki adım da uzayda ilerledikçe random güneş sistemleri üretmek olacak.

Ayrıca bütün gezegenlere hafif birer renk verdim. Çok belli olmuyor ama normalde de böyle herhalde 🙂 Gerçeğini yapıyor olsam daha renkli yapardım.

p2

Ayrıca quote’nin sahibinin sitesinden bir parça, ilginç bir insan.

Brainfuck Tutorial – part 3 (for expertes only!)

Ok, now let’s move into even more advanced stuff.

In this tutorial I will talk about conditions and booleans.

For making conditional statements, we need []. Let’s say you want to run a code only if a cell is ‘true’ (non zero). This one is the easiest!

[ [-] your code ]

“your code” only runs if the initial cell is non zero. After entering the first loop it clears the cell so it won’t repeat ‘your code’ again and again.

Let’s say you want to run a code if a cell is not true. Our structure is like this

..ab..
..^

And here is the code. I put some comments (numbers) into code so hopefully it will be easier to understand.

1>+< 2[[-]>-<] >[ - your code ]<

We need a temporary cell for this stuff. In this example a is the test value and 'your code' will only run if it is 0. b is the temporary cell.

First (1) it sets b to 1. After that (2) it returns to a and sets be to zero again if a is non zero. In next step (3) it goes back to b and run your code only if b is non zero.

Basically we are holding !a in another cell. If a is zero, b remains 1 and code will be executed. If a is non-zero, b will be cleared so 'your code' won't run.

After those simple booleans, on next tutorial, I will talk about == and !=. It is actually quite easy, see ya!

Mutlu yıllar!

             +
            +++
           +++++
          +[->+>+
         ++>++++<<
        <]>>++>++>,
       >++++++++[-<-
      ----->]<[->+>+>
     +<<<]>>>>>+<<<[->
   [->+<<<<<<.>>>>>]>-[
  -<+>]>[->+<<<<<<<.>>>>
 >>]>++[-<+>]<<<<<<<<<.>>
>>>]<[-<<<.>>>]<<.>>++<->>
             +

( = girince tam oturuyor)