Jump to content
  • Advertisement
  • You can syndicate your blog to the GameDev.net community.
    Learn how here.

Blogs

 Neon Tail - Devlog 47

Vidio Hi, I've added a lot of new things in my project Neon Tail , although most aren't easy to show in a video. So this week's #screenshotsaturday I'll just post a little peek of the mobile main menu, that can be relocated and readjusted with custom camera angles and character's animations.
As a quick list of what's been done, I added new NPC animations, added license badges, event unlocks and rewards, Anti Aliasing, Depth of Field and Motion Blur now checks your hardware for default value, NPC relationship changes on job performance, new jobs unlocks on relationship, and as usual, lots of debug.
Have a nice week end! 

rocketjuicegames

rocketjuicegames

Devils Path - Speed Level Design | Environment Design

Let´s make a level were enemies spawn whose strength or level depends on daytime. Welcome to the level design of "Devils Path". The basic idea is simple: at night shall stronger enemies spawn than during the sunny day. But how can we communicate this to the player? (Besides obvious, yet less smart solutions like text or spoken word). Firstly, the level have to prompt positive feeling while the sun shines brightly and negative emotions during night.  This is pretty obvious, I know, since the night is dark and therefor likely to cause feelings of horror. But let´s step further into this. Which environment might possibly increase this effect further? Scenario: When are you more scared during darkness? When you crouch in your small wardrobe or in a huge room where dangers could be in every corner? Right, the darkness is much more scary in wide, open rooms. We suffer a feeling of loosing control. (Think about the feeling, when the fellowship of the ring approached the mines of Moria and steps in these huge abandoned caves, which nothing than a small light.) This means that our level have to offer a wide space to make the darkness more fearsome which also has a nice sideeffect: wide view distance during day - control, savety, positive feelings. That´s how I came up with the idea of a path on one side of a mountain. We do have our huge viewing distance and a wide, open space. During day, it´s all fine. We know that it could be dangerous of we take the wrong step but the huge viewing distance gives us control. to our left side I decided to create a rift. The player could possibly fall and die - more fear. Even if the player have only approached this level during day, he wil intuitively understand that this is not a good place to go during night. The level warned him, that during night there is all worse. Therefor stronger enemies will not be a huge surprise. Watch the night-day comparision in my video! What do you think? Will this approach be understood by players, no matter if conscious or unconscious? Feel free to comment!  

NekrosArts

NekrosArts

 

Interview with GRAVIBEAT

Your name: Joakim Hedström  Twitter Handle/ Other Social Media: @JoakimOnline  One interesting and random fact about you that people would not necessarily guess: I spent one year as an exchange student in a Japanese high school when I was 17. It was a very formative experience for me.  What country you live/work in: Sweden  The video game company producing the project: FRAME BREAK (We’re not formally a company yet, so for now I suppose it’s just a team name)  The name of the project: GRAVIBEAT  Estimated release date: As soon as google finishes processing the public release (any day now). Until then, a previous version is available as early access.  link to website/blog/steam page/Youtube/other: https://play.google.com/store/apps/details?id=com.FRAMEBREAK.gravibeat Gravibeat.com  How did you get into making video games? I’ve been interested in games ever since christmas 1998, when my uncle gifted me and my brother a Playstation along with Crash Bandicoot (sans memory card, as nobody knew they were necessary. I had to try and beat the game in one sitting every time, never succeeded).  I think the first time I tried my hand at making video games (besides daydreaming about it) was in making custom maps in Warcraft III. I recall making my own version of a Hero Survival map with completely busted heroes and abilities. At that point it was mostly wish fulfilment and I didn’t really try to make the game appealing for anyone but myself.  Later on I dabbled a bit in making board games with some friends. This time actually trying to test the games and reiterate the rules in order to create a semblance of balance. Unfortunately those projects kind of fizzled out after a couple of playtest sessions, long before we could finalize the design.  My decision to pursue game development as an adult happened after taking a year off of university studies. My chosen line of education hadn’t been what I expected and I was wondering what to do with myself. Then I discovered that the University of Skövde had a game development program with a narrative focus. It seemed perfectly aligned with my interests and I decided to apply to see if I could turn my passion into a profession.  What is your background in? I just earned my bachelor’s degree in Media, Aesthetics, and Storytelling this summer, having studied Game Writing at the University of Skövde. Before then I studied teaching for two years, which has been surprisingly helpful for game design.  Blurb about game: In GRAVIBEAT, all enemies are drawn to you by gravity – use this to manipulate them into colliding with one another to make them explode spectacularly!  What inspired this game? In 7th grade, a friend of mine with a GameMaker license made a simplistic game that we’d affectionately describe as “A rock in the desert being chased by meatballs” using simulated gravity to create a fun survival minigame. It was incredibly unbalanced as enemies could build up momentum outside of the screen and come zooming in at undodgeable speeds (infuriating for the player, hilarious for us onlookers).  Last year, when I got the group that would become FRAME BREAK together for the first time, we wanted to try our hand at a simple game idea just to practice working together. I remembered my friend’s meatball game and suggested we try making a game based on its “homing enemies” mechanic. Once we got our first prototype running we found ourselves playing it over and over. It was simply addicting.  So we decided to explore the concept as thoroughly as possible and began working on the project in earnest. It’s been almost a year since then.  What makes it unique? Mainly the gravity mechanic. Swinging enemies around and making them collide is just so satisfying.  What will make it a success? The gravity mechanic provides that “just one more go” simplistic gameplay that characterises games like Tetris and Super Hexagon. To make it even more satisfying we’ve worked hard on the music and the visuals to let the player immerse themselves into the gameplay and enter “the zone”. Once someone gets their hands on the game, they won’t be able to put it down.  Who do you think it will appeal to? The game is simple enough that just about anyone could play and enjoy it. But if you’re the kind of person who will sink hours into making it as far as possible in Tetris or Super Hexagon, GRAVIBEAT will feel like home.  Number of people working on the project and skillsets: Four people, all recent game development graduates from University of Skövde. As mentioned earlier, I studied writing but my role on GRAVIBEAT has been a mix of project management, design, and graphics.  Cornelis is another graduate from the same program. He’s been working on graphics and UI design.  William studied programming and has unsurprisingly worked on programming.  Finally, Jack studied sound design but also has a knack for code. He’s been responsible for sound, music, and programming.  How are you handling art? As none of us have formal art education, we’ve settled on a design using basic shapes and lots of colour. While we couldn’t draw to save our lives, I think we’ve managed to make GRAVIBEAT very aesthetically pleasing. A bit like looking into a kaleidoscope.  What tech/stack do you use? The game is made in Unity, using FMOD for sound and music integration.  Are you full-time? If so how did you make the switch to working full-time in game development? While we had a stretch over the summer post-graduation where we were able to work full-time to finish up the game, we’re now figuring out how to scale down our pace to allow people to pursue work and further education.  Is this your first game? If not how many and what other sorts of projects have you worked on? Discounting all the various half-finished hobby projects I did on my own, and the numerous projects created at the university, I would say GRAVIBEAT is the first game I’ve worked on in a professional capacity. However, I want to mention Cosette’s Cassettes, an 18-student university project the four of us worked on during our second year. I served as the project manager then as well and while it’s a quirky, buggy little game I’m very proud of what our group managed to achieve in the 10-week project period.  What’s been the hardest thing about making this game? Partway through development we realised that adding a story mode was antithetical to the gameplay and scrapped all our plans for a narrative so we could work on other aspects that would better serve the gameplay. As two of us are mainly writers it’s been tough to work outside of our expertise, but also very educational.  I’m sure there’s some form of narrative that would mesh with and uplift the gameplay but we didn’t have the time and leisure to explore all options and find it. I’m sure one day it’ll hit me and I’ll be like “Ah, dammit!”  Anything else you would like people to know about you or the game? William worked hard to create an online global leaderboard for GRAVIBEAT. It would mean the world to us if you’d submit your high score and let us watch the list fill up. 
The post Interview with GRAVIBEAT appeared first on Gilded Octopus.
View the full article
 

Hey

Wow. Been a while. Must be years since I last updated this. So I'm still alive and I'm working on a toy version of LLVM purely for my own amusement.

Pv is a virtual machine executable that executes a fairly small virtual instruction set: enum class Reg : std::uint8_t { Pc, Bp, Sp, Dx, Invalid }; const char *toString(Reg v); enum class Op : std::uint8_t { End, SetRI, SubRI, AddRI, CopyRR, CopyRA, CopyAR, CopyAI, CopyAA, PushR, PopR, Call, Ret, JmpZ, Add, Sub, Mul, Div, Mod, Not, Neg, Lt, LtEq, Conv, Alloc, Free, Service, Invalid }; Nothing very fancy.

Pi (Paul's Intermediate language) is a typeless language in the sense that variables only have sizes. It is designed to be translated line by line by Pi.exe into bytecode for Pv.

Pc is the higher level language. I appreciate I am not explaining this well but there are quite a few features now. Today I added the facility to overload operator<< to allow myself to create a std.ostream functionality. Assume stdlib.ph provides std.print functions for std.ints and for ptr std.char (pointer to char):
  include("stdios.ph"); class Age { func new(v:std.int) ... v(v) { } var v:std.int; } func operator<<(o:ref std.ostream, a:ref Age):ref std.ostream { return o << a.v; } class Person { func new(n:ptr std.char, a:Age) ... n(n), a(a) { } func name():ptr std.char { return n; } func age():Age { return a; } var n:ptr std.char; var a:Age; } func operator<<(o:ref std.ostream, a:ref Person):ref std.ostream { return o << a.name() << " is " << a.age() << " years old"; } func main() { std.out() << Person("Paul", Age(44)) << ".\n"; } Where stdios.ph looks like this: namespace std { class ostream { } func operator<<(:ref ostream, :std.int):ref ostream; func operator<<(:ref ostream, :std.bool):ref ostream; func operator<<(:ref ostream, :ptr std.char):ref ostream; func out():ref ostream; } And is implemented like this: include("stdios.ph"); include("stdlib.ph"); func std.operator<<(o:ref std.ostream, v:std.int):ref std.ostream { std.print(v); return o; } func std.operator<<(o:ref std.ostream, v:std.bool):ref std.ostream { std.print(v); return o; } func std.operator<<(o:ref std.ostream, v:ptr std.char):ref std.ostream { std.print(v); return o; } var instance:std.ostream; func std.out():ref std.ostream { return instance; } So Pc.exe transforms each translation unit into a .pi file. For script.pc above, the produced .pi looks like this: var "#global.script.pc1":11 = string(" years old"), char(0); var "#global.script.pc3":3 = string(".\n"), char(0); var "#global.script.pc2":5 = string("Paul"), char(0); var "#global.script.pc0":5 = string(" is "), char(0); func[autogen] "std.ostream.new(ref ptr std.ostream):std.null <method>":0 { arg "std.ostream.new.this":8; var "@rf":1; clrf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_std.ostream.new.#scope0"; jmp "#end_function"; "#no_return_exit_std.ostream.new.#scope0": "#end_function": } func[autogen] "std.ostream.new(ref ptr std.ostream,ref ptr std.ostream):std.null <method>":0 { arg "std.ostream.new.this":8; arg "std.ostream.new.#tempcopy":8; var "@rf":1; clrf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_std.ostream.new.#scope1"; jmp "#end_function"; "#no_return_exit_std.ostream.new.#scope1": "#end_function": } func[autogen] "std.ostream.delete(ref ptr std.ostream):std.null <method>":0 { arg "std.ostream.delete.this":8; var "@rf":1; clrf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_std.ostream.delete.#scope2"; jmp "#end_function"; "#no_return_exit_std.ostream.delete.#scope2": "#end_function": } func[autogen] "std.ostream.operator=(ref ptr std.ostream,ref ptr std.ostream):ref ptr std.ostream <method>":8 { arg "std.ostream.operator=.this":8; arg "std.ostream.operator=.#tempcopy":8; var "@rf":1; clrf "@rf"; push "std.ostream.operator=.this"; push &"@ret"; store 8; pop 8; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_std.ostream.operator=.#scope3"; jmp "#end_function"; "#no_return_exit_std.ostream.operator=.#scope3": "#end_function": } func "Age.new(ref ptr Age,std.int):std.null <method>":0 { arg "Age.new.this":8; arg "Age.new.v":4; var "@rf":1; clrf "@rf"; push "Age.new.v"; push "Age.new.this"; push size(0); add size; store 4; pop 4; push &"@rf"; load 1; jmp ifz "#no_return_exit_Age.new.#scope4"; jmp "#end_function"; "#no_return_exit_Age.new.#scope4": "#end_function": } func[autogen] "Age.new(ref ptr Age,ref ptr Age):std.null <method>":0 { arg "Age.new.this":8; arg "Age.new.#tempcopy":8; var "@rf":1; clrf "@rf"; push "Age.new.#tempcopy"; push size(0); add size; load 4; push "Age.new.this"; push size(0); add size; store 4; pop 4; push &"@rf"; load 1; jmp ifz "#no_return_exit_Age.new.#scope5"; jmp "#end_function"; "#no_return_exit_Age.new.#scope5": "#end_function": } func[autogen] "Age.delete(ref ptr Age):std.null <method>":0 { arg "Age.delete.this":8; var "@rf":1; clrf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Age.delete.#scope6"; jmp "#end_function"; "#no_return_exit_Age.delete.#scope6": "#end_function": } func[autogen] "Age.operator=(ref ptr Age,ref ptr Age):ref ptr Age <method>":8 { arg "Age.operator=.this":8; arg "Age.operator=.#tempcopy":8; var "@rf":1; clrf "@rf"; push "Age.operator=.#tempcopy"; push size(0); add size; load 4; push "Age.operator=.this"; push size(0); add size; store 4; pop 4; push "Age.operator=.this"; push &"@ret"; store 8; pop 8; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Age.operator=.#scope7"; jmp "#end_function"; "#no_return_exit_Age.operator=.#scope7": "#end_function": } func "operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream":8 { arg "operator<<.o":8; arg "operator<<.a":8; var "@rf":1; clrf "@rf"; allocs 8; push "operator<<.o"; push "operator<<.a"; push size(0); add size; load 4; push &"std.operator<<(ref ptr std.ostream,std.int):ref ptr std.ostream"; call; push &"@ret"; store 8; pop 8; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_operator<<.#scope0"; jmp "#end_function"; "#no_return_exit_operator<<.#scope0": "#end_function": } func "Person.new(ref ptr Person,ptr std.char,Age):std.null <method>":0 { arg "Person.new.this":8; arg "Person.new.n":8; arg "Person.new.a":4; var "@rf":1; clrf "@rf"; push "Person.new.n"; push "Person.new.this"; push size(0); add size; store 8; pop 8; push "Person.new.this"; push size(8); add size; push &"Person.new.a"; push &"Age.new(ref ptr Age,ref ptr Age):std.null <method>"; call; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.new.#scope1"; jmp "#end_function"; "#no_return_exit_Person.new.#scope1": "#end_function": push &"Person.new.a"; push &"Age.delete(ref ptr Age):std.null <method>"; call; } func "Person.name(ref ptr Person):ptr std.char <method>":8 { arg "Person.name.this":8; var "@rf":1; clrf "@rf"; push "Person.name.this"; push size(0); add size; load 8; push &"@ret"; store 8; pop 8; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.name.#scope2"; jmp "#end_function"; "#no_return_exit_Person.name.#scope2": "#end_function": } func "Person.age(ref ptr Person):Age <method>":4 { arg "Person.age.this":8; var "@rf":1; clrf "@rf"; push &"@ret"; load 8; push "Person.age.this"; push size(8); add size; push &"Age.new(ref ptr Age,ref ptr Age):std.null <method>"; call; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.age.#scope3"; jmp "#end_function"; "#no_return_exit_Person.age.#scope3": "#end_function": } func[autogen] "Person.new(ref ptr Person,ref ptr Person):std.null <method>":0 { arg "Person.new.this":8; arg "Person.new.#tempcopy":8; var "@rf":1; clrf "@rf"; push "Person.new.#tempcopy"; push size(0); add size; load 8; push "Person.new.this"; push size(0); add size; store 8; pop 8; push "Person.new.this"; push size(8); add size; push "Person.new.#tempcopy"; push size(8); add size; push &"Age.new(ref ptr Age,ref ptr Age):std.null <method>"; call; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.new.#scope4"; jmp "#end_function"; "#no_return_exit_Person.new.#scope4": "#end_function": } func[autogen] "Person.delete(ref ptr Person):std.null <method>":0 { arg "Person.delete.this":8; var "@rf":1; clrf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.delete.#scope5"; jmp "#end_function"; "#no_return_exit_Person.delete.#scope5": "#end_function": push "Person.delete.this"; push size(8); add size; push &"Age.delete(ref ptr Age):std.null <method>"; call; } func[autogen] "Person.operator=(ref ptr Person,ref ptr Person):ref ptr Person <method>":8 { arg "Person.operator=.this":8; arg "Person.operator=.#tempcopy":8; var "@rf":1; clrf "@rf"; push "Person.operator=.#tempcopy"; push size(0); add size; load 8; push "Person.operator=.this"; push size(0); add size; store 8; pop 8; allocs 8; push "Person.operator=.this"; push size(8); add size; push "Person.operator=.#tempcopy"; push size(8); add size; push &"Age.operator=(ref ptr Age,ref ptr Age):ref ptr Age <method>"; call; load 4; pop 4; push "Person.operator=.this"; push &"@ret"; store 8; pop 8; setf "@rf"; push &"@rf"; load 1; jmp ifz "#no_return_exit_Person.operator=.#scope6"; jmp "#end_function"; "#no_return_exit_Person.operator=.#scope6": "#end_function": } func "operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream":8 { arg "operator<<.o":8; arg "operator<<.a":8; var "@rf":1; var "#tempreturn_Age6":4; clrf "@rf"; allocs 8; allocs 8; allocs 8; allocs 8; push "operator<<.o"; allocs 8; push "operator<<.a"; push &"Person.name(ref ptr Person):ptr std.char <method>"; call; push &"std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream"; call; push &"#global.script.pc0"; push &"std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream"; call; push &"#tempreturn_Age6"; push "operator<<.a"; push &"Person.age(ref ptr Person):Age <method>"; call; push &"operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream"; call; push &"#global.script.pc1"; push &"std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream"; call; push &"@ret"; store 8; pop 8; setf "@rf"; push &"#tempreturn_Age6"; push &"Age.delete(ref ptr Age):std.null <method>"; call; push &"@rf"; load 1; jmp ifz "#no_return_exit_operator<<.#scope0"; jmp "#end_function"; "#no_return_exit_operator<<.#scope0": "#end_function": } func "main():std.null":0 { var "@rf":1; var "#temp_Age7":4; var "#temp_Person8":12; clrf "@rf"; allocs 8; allocs 8; allocs 8; push &"std.out():ref ptr std.ostream"; call; push &"#temp_Person8"; push &"#global.script.pc2"; allocs 4; push sp; push &"#temp_Age7"; push int(44); push &"Age.new(ref ptr Age,std.int):std.null <method>"; call; push &"#temp_Age7"; push &"Age.new(ref ptr Age,ref ptr Age):std.null <method>"; call; push &"Person.new(ref ptr Person,ptr std.char,Age):std.null <method>"; call; push &"#temp_Person8"; push &"operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream"; call; push &"#global.script.pc3"; push &"std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream"; call; load 0; push &"#temp_Age7"; push &"Age.delete(ref ptr Age):std.null <method>"; call; push &"#temp_Person8"; push &"Person.delete(ref ptr Person):std.null <method>"; call; push &"@rf"; load 1; jmp ifz "#no_return_exit_main.#scope0"; jmp "#end_function"; "#no_return_exit_main.#scope0": "#end_function": } pi.exe then turns this file into a binary .po which is the bytecode for Pv with some additional linker information.

pl.exe is the linker. You feed it a bunch of .po files and it produces a .px file which Pv can run. The linker makes sure that functions or globals that are not used by the program are not included.

Working with all this is handled by pb.exe which is a sort of custom batch processor which can also run unit tests. In this case, this is the current .bat that is run by Pb when I'm doing a full test: #echo off test ../unittests echo on pc -I=../lib script.pc script.pi pi script.pi script.po pl -trim out.px script.po ../lib/stdlib.po ../lib/stdios.po pd out.px pv out.px pd.exe is the disassembler. Disassembling the out.px from this example produces this monstrosity (in Pv bytecode): == disassemble out.px ================================================================================================== prologue { -- program prologue ---------------------------------------------------------------------------------------------------- 0: setri dx 122,10,0,0,0,0,0,0 10: call dx -- terminate ----------------------------------------------------------------------------------------------------------- 12: end -- end ----------------------------------------------------------------------------------------------------------------- } == #global.script.pc1 ================================================================================================== var #global.script.pc1:11 13: 32,121,101,97,114,115,32,111,108,100,0 == #global.script.pc3 ================================================================================================== var #global.script.pc3:3 24: 46,10,0 == #global.script.pc2 ================================================================================================== var #global.script.pc2:5 27: 80,97,117,108,0 == #global.script.pc0 ================================================================================================== var #global.script.pc0:5 32: 32,105,115,32,0 == instance ============================================================================================================ var instance:0 37: == Age.new(ref ptr Age,std.int):std.null <method> ====================================================================== func Age.new(ref ptr Age,std.int):std.null <method>:0 { -- function prologue --------------------------------------------------------------------------------------------------- 37: pushr bp 39: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 42: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 52: copyrr bp dx 55: subri dx 1 65: copyai dx 1 0 -- push Age.new.v ------------------------------------------------------------------------------------------------------ 76: copyrr bp dx 79: addri dx 16 89: subri sp 4 99: copyaa dx sp 4 -- push Age.new.this --------------------------------------------------------------------------------------------------- 110: copyrr bp dx 113: addri dx 20 123: subri sp 8 133: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 144: subri sp 8 154: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 172: add size -- store 4 ------------------------------------------------------------------------------------------------------------- 174: popr dx 176: copyaa sp dx 4 -- pop 4 --------------------------------------------------------------------------------------------------------------- 187: addri sp 4 -- push &@rf ----------------------------------------------------------------------------------------------------------- 197: copyrr bp dx 200: subri dx 1 210: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 212: popr dx 214: subri sp 1 224: copyaa dx sp 1 -- jmp ifz #no_return_exit_Age.new.#scope4 ----------------------------------------------------------------------------- 235: jmpz 10 244: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 254: addri pc 0 -- label #no_return_exit_Age.new.#scope4 ------------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 264: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 274: popr bp 276: ret 12 -- end func Age.new(ref ptr Age,std.int):std.null <method> ------------------------------------------------------------- } == Age.new(ref ptr Age,ref ptr Age):std.null <method> ================================================================== func Age.new(ref ptr Age,ref ptr Age):std.null <method>:0 { -- function prologue --------------------------------------------------------------------------------------------------- 285: pushr bp 287: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 290: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 300: copyrr bp dx 303: subri dx 1 313: copyai dx 1 0 -- push Age.new.#tempcopy ---------------------------------------------------------------------------------------------- 324: copyrr bp dx 327: addri dx 16 337: subri sp 8 347: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 358: subri sp 8 368: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 386: add size -- load 4 -------------------------------------------------------------------------------------------------------------- 388: popr dx 390: subri sp 4 400: copyaa dx sp 4 -- push Age.new.this --------------------------------------------------------------------------------------------------- 411: copyrr bp dx 414: addri dx 24 424: subri sp 8 434: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 445: subri sp 8 455: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 473: add size -- store 4 ------------------------------------------------------------------------------------------------------------- 475: popr dx 477: copyaa sp dx 4 -- pop 4 --------------------------------------------------------------------------------------------------------------- 488: addri sp 4 -- push &@rf ----------------------------------------------------------------------------------------------------------- 498: copyrr bp dx 501: subri dx 1 511: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 513: popr dx 515: subri sp 1 525: copyaa dx sp 1 -- jmp ifz #no_return_exit_Age.new.#scope5 ----------------------------------------------------------------------------- 536: jmpz 10 545: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 555: addri pc 0 -- label #no_return_exit_Age.new.#scope5 ------------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 565: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 575: popr bp 577: ret 16 -- end func Age.new(ref ptr Age,ref ptr Age):std.null <method> --------------------------------------------------------- } == Age.delete(ref ptr Age):std.null <method> =========================================================================== func Age.delete(ref ptr Age):std.null <method>:0 { -- function prologue --------------------------------------------------------------------------------------------------- 586: pushr bp 588: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 591: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 601: copyrr bp dx 604: subri dx 1 614: copyai dx 1 0 -- push &@rf ----------------------------------------------------------------------------------------------------------- 625: copyrr bp dx 628: subri dx 1 638: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 640: popr dx 642: subri sp 1 652: copyaa dx sp 1 -- jmp ifz #no_return_exit_Age.delete.#scope6 -------------------------------------------------------------------------- 663: jmpz 10 672: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 682: addri pc 0 -- label #no_return_exit_Age.delete.#scope6 ---------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 692: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 702: popr bp 704: ret 8 -- end func Age.delete(ref ptr Age):std.null <method> ------------------------------------------------------------------ } == operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream ===================================================== func operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream:8 { -- function prologue --------------------------------------------------------------------------------------------------- 713: pushr bp 715: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 718: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 728: copyrr bp dx 731: subri dx 1 741: copyai dx 1 0 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 752: subri sp 8 -- push operator<<.o --------------------------------------------------------------------------------------------------- 762: copyrr bp dx 765: addri dx 24 775: subri sp 8 785: copyaa dx sp 8 -- push operator<<.a --------------------------------------------------------------------------------------------------- 796: copyrr bp dx 799: addri dx 16 809: subri sp 8 819: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 830: subri sp 8 840: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 858: add size -- load 4 -------------------------------------------------------------------------------------------------------------- 860: popr dx 862: subri sp 4 872: copyaa dx sp 4 -- push &std.operator<<(ref ptr std.ostream,std.int):ref ptr std.ostream ----------------------------------------------- 883: setri dx -18,12,0,0,0,0,0,0 893: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 895: popr dx 897: call dx -- push &@ret ---------------------------------------------------------------------------------------------------------- 899: copyrr bp dx 902: addri dx 32 912: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 914: popr dx 916: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 927: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 937: copyrr bp dx 940: subri dx 1 950: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 961: copyrr bp dx 964: subri dx 1 974: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 976: popr dx 978: subri sp 1 988: copyaa dx sp 1 -- jmp ifz #no_return_exit_operator<<.#scope0 -------------------------------------------------------------------------- 999: jmpz 10 1008: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 1018: addri pc 0 -- label #no_return_exit_operator<<.#scope0 ---------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 1028: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 1038: popr bp 1040: ret 16 -- end func operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream -------------------------------------------- } == Person.new(ref ptr Person,ptr std.char,Age):std.null <method> ======================================================= func Person.new(ref ptr Person,ptr std.char,Age):std.null <method>:0 { -- function prologue --------------------------------------------------------------------------------------------------- 1049: pushr bp 1051: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 1054: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 1064: copyrr bp dx 1067: subri dx 1 1077: copyai dx 1 0 -- push Person.new.n --------------------------------------------------------------------------------------------------- 1088: copyrr bp dx 1091: addri dx 20 1101: subri sp 8 1111: copyaa dx sp 8 -- push Person.new.this ------------------------------------------------------------------------------------------------ 1122: copyrr bp dx 1125: addri dx 28 1135: subri sp 8 1145: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 1156: subri sp 8 1166: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 1184: add size -- store 8 ------------------------------------------------------------------------------------------------------------- 1186: popr dx 1188: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 1199: addri sp 8 -- push Person.new.this ------------------------------------------------------------------------------------------------ 1209: copyrr bp dx 1212: addri dx 28 1222: subri sp 8 1232: copyaa dx sp 8 -- push size(8) -------------------------------------------------------------------------------------------------------- 1243: subri sp 8 1253: copyai sp 8 8,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 1271: add size -- push &Person.new.a -------------------------------------------------------------------------------------------------- 1273: copyrr bp dx 1276: addri dx 16 1286: pushr dx -- push &Age.new(ref ptr Age,ref ptr Age):std.null <method> ------------------------------------------------------------ 1288: setri dx 29,1,0,0,0,0,0,0 1298: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 1300: popr dx 1302: call dx -- push &@rf ----------------------------------------------------------------------------------------------------------- 1304: copyrr bp dx 1307: subri dx 1 1317: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 1319: popr dx 1321: subri sp 1 1331: copyaa dx sp 1 -- jmp ifz #no_return_exit_Person.new.#scope1 -------------------------------------------------------------------------- 1342: jmpz 10 1351: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 1361: addri pc 0 -- label #no_return_exit_Person.new.#scope1 ---------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- push &Person.new.a -------------------------------------------------------------------------------------------------- 1371: copyrr bp dx 1374: addri dx 16 1384: pushr dx -- push &Age.delete(ref ptr Age):std.null <method> --------------------------------------------------------------------- 1386: setri dx 74,2,0,0,0,0,0,0 1396: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 1398: popr dx 1400: call dx -- free locals --------------------------------------------------------------------------------------------------------- 1402: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 1412: popr bp 1414: ret 20 -- end func Person.new(ref ptr Person,ptr std.char,Age):std.null <method> ---------------------------------------------- } == Person.name(ref ptr Person):ptr std.char <method> =================================================================== func Person.name(ref ptr Person):ptr std.char <method>:8 { -- function prologue --------------------------------------------------------------------------------------------------- 1423: pushr bp 1425: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 1428: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 1438: copyrr bp dx 1441: subri dx 1 1451: copyai dx 1 0 -- push Person.name.this ----------------------------------------------------------------------------------------------- 1462: copyrr bp dx 1465: addri dx 16 1475: subri sp 8 1485: copyaa dx sp 8 -- push size(0) -------------------------------------------------------------------------------------------------------- 1496: subri sp 8 1506: copyai sp 8 0,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 1524: add size -- load 8 -------------------------------------------------------------------------------------------------------------- 1526: popr dx 1528: subri sp 8 1538: copyaa dx sp 8 -- push &@ret ---------------------------------------------------------------------------------------------------------- 1549: copyrr bp dx 1552: addri dx 24 1562: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 1564: popr dx 1566: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 1577: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 1587: copyrr bp dx 1590: subri dx 1 1600: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 1611: copyrr bp dx 1614: subri dx 1 1624: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 1626: popr dx 1628: subri sp 1 1638: copyaa dx sp 1 -- jmp ifz #no_return_exit_Person.name.#scope2 ------------------------------------------------------------------------- 1649: jmpz 10 1658: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 1668: addri pc 0 -- label #no_return_exit_Person.name.#scope2 --------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 1678: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 1688: popr bp 1690: ret 8 -- end func Person.name(ref ptr Person):ptr std.char <method> ---------------------------------------------------------- } == Person.age(ref ptr Person):Age <method> ============================================================================= func Person.age(ref ptr Person):Age <method>:4 { -- function prologue --------------------------------------------------------------------------------------------------- 1699: pushr bp 1701: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 1704: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 1714: copyrr bp dx 1717: subri dx 1 1727: copyai dx 1 0 -- push &@ret ---------------------------------------------------------------------------------------------------------- 1738: copyrr bp dx 1741: addri dx 24 1751: pushr dx -- load 8 -------------------------------------------------------------------------------------------------------------- 1753: popr dx 1755: subri sp 8 1765: copyaa dx sp 8 -- push Person.age.this ------------------------------------------------------------------------------------------------ 1776: copyrr bp dx 1779: addri dx 16 1789: subri sp 8 1799: copyaa dx sp 8 -- push size(8) -------------------------------------------------------------------------------------------------------- 1810: subri sp 8 1820: copyai sp 8 8,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 1838: add size -- push &Age.new(ref ptr Age,ref ptr Age):std.null <method> ------------------------------------------------------------ 1840: setri dx 29,1,0,0,0,0,0,0 1850: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 1852: popr dx 1854: call dx -- setf @rf ------------------------------------------------------------------------------------------------------------ 1856: copyrr bp dx 1859: subri dx 1 1869: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 1880: copyrr bp dx 1883: subri dx 1 1893: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 1895: popr dx 1897: subri sp 1 1907: copyaa dx sp 1 -- jmp ifz #no_return_exit_Person.age.#scope3 -------------------------------------------------------------------------- 1918: jmpz 10 1927: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 1937: addri pc 0 -- label #no_return_exit_Person.age.#scope3 ---------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 1947: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 1957: popr bp 1959: ret 8 -- end func Person.age(ref ptr Person):Age <method> -------------------------------------------------------------------- } == Person.delete(ref ptr Person):std.null <method> ===================================================================== func Person.delete(ref ptr Person):std.null <method>:0 { -- function prologue --------------------------------------------------------------------------------------------------- 1968: pushr bp 1970: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 1973: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 1983: copyrr bp dx 1986: subri dx 1 1996: copyai dx 1 0 -- push &@rf ----------------------------------------------------------------------------------------------------------- 2007: copyrr bp dx 2010: subri dx 1 2020: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 2022: popr dx 2024: subri sp 1 2034: copyaa dx sp 1 -- jmp ifz #no_return_exit_Person.delete.#scope5 ----------------------------------------------------------------------- 2045: jmpz 10 2054: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 2064: addri pc 0 -- label #no_return_exit_Person.delete.#scope5 ------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- push Person.delete.this --------------------------------------------------------------------------------------------- 2074: copyrr bp dx 2077: addri dx 16 2087: subri sp 8 2097: copyaa dx sp 8 -- push size(8) -------------------------------------------------------------------------------------------------------- 2108: subri sp 8 2118: copyai sp 8 8,0,0,0,0,0,0,0 -- add size ------------------------------------------------------------------------------------------------------------ 2136: add size -- push &Age.delete(ref ptr Age):std.null <method> --------------------------------------------------------------------- 2138: setri dx 74,2,0,0,0,0,0,0 2148: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2150: popr dx 2152: call dx -- free locals --------------------------------------------------------------------------------------------------------- 2154: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 2164: popr bp 2166: ret 8 -- end func Person.delete(ref ptr Person):std.null <method> ------------------------------------------------------------ } == operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream ================================================== func operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream:8 { -- function prologue --------------------------------------------------------------------------------------------------- 2175: pushr bp 2177: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 2180: subri sp 5 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 2190: copyrr bp dx 2193: subri dx 1 2203: copyai dx 1 0 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2214: subri sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2224: subri sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2234: subri sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2244: subri sp 8 -- push operator<<.o --------------------------------------------------------------------------------------------------- 2254: copyrr bp dx 2257: addri dx 24 2267: subri sp 8 2277: copyaa dx sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2288: subri sp 8 -- push operator<<.a --------------------------------------------------------------------------------------------------- 2298: copyrr bp dx 2301: addri dx 16 2311: subri sp 8 2321: copyaa dx sp 8 -- push &Person.name(ref ptr Person):ptr std.char <method> ------------------------------------------------------------- 2332: setri dx -113,5,0,0,0,0,0,0 2342: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2344: popr dx 2346: call dx -- push &std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream ------------------------------------------ 2348: setri dx -1,13,0,0,0,0,0,0 2358: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2360: popr dx 2362: call dx -- push &#global.script.pc0 -------------------------------------------------------------------------------------------- 2364: setri dx 32,0,0,0,0,0,0,0 2374: pushr dx -- push &std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream ------------------------------------------ 2376: setri dx -1,13,0,0,0,0,0,0 2386: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2388: popr dx 2390: call dx -- push &#tempreturn_Age6 ---------------------------------------------------------------------------------------------- 2392: copyrr bp dx 2395: subri dx 5 2405: pushr dx -- push operator<<.a --------------------------------------------------------------------------------------------------- 2407: copyrr bp dx 2410: addri dx 16 2420: subri sp 8 2430: copyaa dx sp 8 -- push &Person.age(ref ptr Person):Age <method> ----------------------------------------------------------------------- 2441: setri dx -93,6,0,0,0,0,0,0 2451: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2453: popr dx 2455: call dx -- push &operator<<(ref ptr std.ostream,ref ptr Age):ref ptr std.ostream ----------------------------------------------- 2457: setri dx -55,2,0,0,0,0,0,0 2467: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2469: popr dx 2471: call dx -- push &#global.script.pc1 -------------------------------------------------------------------------------------------- 2473: setri dx 13,0,0,0,0,0,0,0 2483: pushr dx -- push &std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream ------------------------------------------ 2485: setri dx -1,13,0,0,0,0,0,0 2495: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2497: popr dx 2499: call dx -- push &@ret ---------------------------------------------------------------------------------------------------------- 2501: copyrr bp dx 2504: addri dx 32 2514: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 2516: popr dx 2518: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 2529: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 2539: copyrr bp dx 2542: subri dx 1 2552: copyai dx 1 1 -- push &#tempreturn_Age6 ---------------------------------------------------------------------------------------------- 2563: copyrr bp dx 2566: subri dx 5 2576: pushr dx -- push &Age.delete(ref ptr Age):std.null <method> --------------------------------------------------------------------- 2578: setri dx 74,2,0,0,0,0,0,0 2588: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2590: popr dx 2592: call dx -- push &@rf ----------------------------------------------------------------------------------------------------------- 2594: copyrr bp dx 2597: subri dx 1 2607: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 2609: popr dx 2611: subri sp 1 2621: copyaa dx sp 1 -- jmp ifz #no_return_exit_operator<<.#scope0 -------------------------------------------------------------------------- 2632: jmpz 10 2641: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 2651: addri pc 0 -- label #no_return_exit_operator<<.#scope0 ---------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 2661: addri sp 5 -- function epilogue --------------------------------------------------------------------------------------------------- 2671: popr bp 2673: ret 16 -- end func operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream ----------------------------------------- } == main():std.null ===================================================================================================== func main():std.null:0 { -- function prologue --------------------------------------------------------------------------------------------------- 2682: pushr bp 2684: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 2687: subri sp 17 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 2697: copyrr bp dx 2700: subri dx 1 2710: copyai dx 1 0 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2721: subri sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2731: subri sp 8 -- allocs 8 ------------------------------------------------------------------------------------------------------------ 2741: subri sp 8 -- push &std.out():ref ptr std.ostream --------------------------------------------------------------------------------- 2751: setri dx 16,15,0,0,0,0,0,0 2761: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2763: popr dx 2765: call dx -- push &#temp_Person8 ------------------------------------------------------------------------------------------------- 2767: copyrr bp dx 2770: subri dx 17 2780: pushr dx -- push &#global.script.pc2 -------------------------------------------------------------------------------------------- 2782: setri dx 27,0,0,0,0,0,0,0 2792: pushr dx -- allocs 4 ------------------------------------------------------------------------------------------------------------ 2794: subri sp 4 -- push sp ------------------------------------------------------------------------------------------------------------- 2804: pushr sp -- push &#temp_Age7 ---------------------------------------------------------------------------------------------------- 2806: copyrr bp dx 2809: subri dx 5 2819: pushr dx -- push int(44) -------------------------------------------------------------------------------------------------------- 2821: subri sp 4 2831: copyai sp 4 44,0,0,0 -- push &Age.new(ref ptr Age,std.int):std.null <method> ---------------------------------------------------------------- 2845: setri dx 37,0,0,0,0,0,0,0 2855: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2857: popr dx 2859: call dx -- push &#temp_Age7 ---------------------------------------------------------------------------------------------------- 2861: copyrr bp dx 2864: subri dx 5 2874: pushr dx -- push &Age.new(ref ptr Age,ref ptr Age):std.null <method> ------------------------------------------------------------ 2876: setri dx 29,1,0,0,0,0,0,0 2886: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2888: popr dx 2890: call dx -- push &Person.new(ref ptr Person,ptr std.char,Age):std.null <method> ------------------------------------------------- 2892: setri dx 25,4,0,0,0,0,0,0 2902: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2904: popr dx 2906: call dx -- push &#temp_Person8 ------------------------------------------------------------------------------------------------- 2908: copyrr bp dx 2911: subri dx 17 2921: pushr dx -- push &operator<<(ref ptr std.ostream,ref ptr Person):ref ptr std.ostream -------------------------------------------- 2923: setri dx 127,8,0,0,0,0,0,0 2933: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2935: popr dx 2937: call dx -- push &#global.script.pc3 -------------------------------------------------------------------------------------------- 2939: setri dx 24,0,0,0,0,0,0,0 2949: pushr dx -- push &std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream ------------------------------------------ 2951: setri dx -1,13,0,0,0,0,0,0 2961: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 2963: popr dx 2965: call dx -- load 0 -------------------------------------------------------------------------------------------------------------- 2967: popr dx 2969: subri sp 0 2979: copyaa dx sp 0 -- push &#temp_Age7 ---------------------------------------------------------------------------------------------------- 2990: copyrr bp dx 2993: subri dx 5 3003: pushr dx -- push &Age.delete(ref ptr Age):std.null <method> --------------------------------------------------------------------- 3005: setri dx 74,2,0,0,0,0,0,0 3015: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 3017: popr dx 3019: call dx -- push &#temp_Person8 ------------------------------------------------------------------------------------------------- 3021: copyrr bp dx 3024: subri dx 17 3034: pushr dx -- push &Person.delete(ref ptr Person):std.null <method> --------------------------------------------------------------- 3036: setri dx -80,7,0,0,0,0,0,0 3046: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 3048: popr dx 3050: call dx -- push &@rf ----------------------------------------------------------------------------------------------------------- 3052: copyrr bp dx 3055: subri dx 1 3065: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 3067: popr dx 3069: subri sp 1 3079: copyaa dx sp 1 -- jmp ifz #no_return_exit_main.#scope0 -------------------------------------------------------------------------------- 3090: jmpz 10 3099: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 3109: addri pc 0 -- label #no_return_exit_main.#scope0 ---------------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 3119: addri sp 17 -- function epilogue --------------------------------------------------------------------------------------------------- 3129: popr bp 3131: ret 0 -- end func main():std.null -------------------------------------------------------------------------------------------- } == std.print(std.int):std.null ========================================================================================= func std.print(std.int):std.null:0 { -- function prologue --------------------------------------------------------------------------------------------------- 3140: pushr bp 3142: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 3145: subri sp 0 -- push std.print.i ---------------------------------------------------------------------------------------------------- 3155: copyrr bp dx 3158: addri dx 16 3168: subri sp 4 3178: copyaa dx sp 4 -- svc 1 --------------------------------------------------------------------------------------------------------------- 3189: service 1 -- pop 4 --------------------------------------------------------------------------------------------------------------- 3194: addri sp 4 -- free locals --------------------------------------------------------------------------------------------------------- 3204: addri sp 0 -- function epilogue --------------------------------------------------------------------------------------------------- 3214: popr bp 3216: ret 4 -- end func std.print(std.int):std.null -------------------------------------------------------------------------------- } == std.print(ptr std.char):std.null ==================================================================================== func std.print(ptr std.char):std.null:0 { -- function prologue --------------------------------------------------------------------------------------------------- 3225: pushr bp 3227: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 3230: subri sp 0 -- push std.print.i ---------------------------------------------------------------------------------------------------- 3240: copyrr bp dx 3243: addri dx 16 3253: subri sp 8 3263: copyaa dx sp 8 -- svc 3 --------------------------------------------------------------------------------------------------------------- 3274: service 3 -- pop 8 --------------------------------------------------------------------------------------------------------------- 3279: addri sp 8 -- free locals --------------------------------------------------------------------------------------------------------- 3289: addri sp 0 -- function epilogue --------------------------------------------------------------------------------------------------- 3299: popr bp 3301: ret 8 -- end func std.print(ptr std.char):std.null --------------------------------------------------------------------------- } == std.operator<<(ref ptr std.ostream,std.int):ref ptr std.ostream ===================================================== func std.operator<<(ref ptr std.ostream,std.int):ref ptr std.ostream:8 { -- function prologue --------------------------------------------------------------------------------------------------- 3310: pushr bp 3312: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 3315: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 3325: copyrr bp dx 3328: subri dx 1 3338: copyai dx 1 0 -- push std.operator<<.v ----------------------------------------------------------------------------------------------- 3349: copyrr bp dx 3352: addri dx 16 3362: subri sp 4 3372: copyaa dx sp 4 -- push &std.print(std.int):std.null ----------------------------------------------------------------------------------- 3383: setri dx 68,12,0,0,0,0,0,0 3393: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 3395: popr dx 3397: call dx -- push std.operator<<.o ----------------------------------------------------------------------------------------------- 3399: copyrr bp dx 3402: addri dx 20 3412: subri sp 8 3422: copyaa dx sp 8 -- push &@ret ---------------------------------------------------------------------------------------------------------- 3433: copyrr bp dx 3436: addri dx 28 3446: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 3448: popr dx 3450: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 3461: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 3471: copyrr bp dx 3474: subri dx 1 3484: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 3495: copyrr bp dx 3498: subri dx 1 3508: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 3510: popr dx 3512: subri sp 1 3522: copyaa dx sp 1 -- jmp ifz #no_return_exit_std.operator<<.#scope0 ---------------------------------------------------------------------- 3533: jmpz 10 3542: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 3552: addri pc 0 -- label #no_return_exit_std.operator<<.#scope0 ------------------------------------------------------------------------ -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 3562: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 3572: popr bp 3574: ret 12 -- end func std.operator<<(ref ptr std.ostream,std.int):ref ptr std.ostream -------------------------------------------- } == std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream ================================================ func std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream:8 { -- function prologue --------------------------------------------------------------------------------------------------- 3583: pushr bp 3585: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 3588: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 3598: copyrr bp dx 3601: subri dx 1 3611: copyai dx 1 0 -- push std.operator<<.v ----------------------------------------------------------------------------------------------- 3622: copyrr bp dx 3625: addri dx 16 3635: subri sp 8 3645: copyaa dx sp 8 -- push &std.print(ptr std.char):std.null ------------------------------------------------------------------------------ 3656: setri dx -103,12,0,0,0,0,0,0 3666: pushr dx -- call ---------------------------------------------------------------------------------------------------------------- 3668: popr dx 3670: call dx -- push std.operator<<.o ----------------------------------------------------------------------------------------------- 3672: copyrr bp dx 3675: addri dx 24 3685: subri sp 8 3695: copyaa dx sp 8 -- push &@ret ---------------------------------------------------------------------------------------------------------- 3706: copyrr bp dx 3709: addri dx 32 3719: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 3721: popr dx 3723: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 3734: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 3744: copyrr bp dx 3747: subri dx 1 3757: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 3768: copyrr bp dx 3771: subri dx 1 3781: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 3783: popr dx 3785: subri sp 1 3795: copyaa dx sp 1 -- jmp ifz #no_return_exit_std.operator<<.#scope0 ---------------------------------------------------------------------- 3806: jmpz 10 3815: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 3825: addri pc 0 -- label #no_return_exit_std.operator<<.#scope0 ------------------------------------------------------------------------ -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 3835: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 3845: popr bp 3847: ret 16 -- end func std.operator<<(ref ptr std.ostream,ptr std.char):ref ptr std.ostream --------------------------------------- } == std.out():ref ptr std.ostream ======================================================================================= func std.out():ref ptr std.ostream:8 { -- function prologue --------------------------------------------------------------------------------------------------- 3856: pushr bp 3858: copyrr sp bp -- allocate locals ----------------------------------------------------------------------------------------------------- 3861: subri sp 1 -- clrf @rf ------------------------------------------------------------------------------------------------------------ 3871: copyrr bp dx 3874: subri dx 1 3884: copyai dx 1 0 -- push &instance ------------------------------------------------------------------------------------------------------ 3895: setri dx 37,0,0,0,0,0,0,0 3905: pushr dx -- push &@ret ---------------------------------------------------------------------------------------------------------- 3907: copyrr bp dx 3910: addri dx 16 3920: pushr dx -- store 8 ------------------------------------------------------------------------------------------------------------- 3922: popr dx 3924: copyaa sp dx 8 -- pop 8 --------------------------------------------------------------------------------------------------------------- 3935: addri sp 8 -- setf @rf ------------------------------------------------------------------------------------------------------------ 3945: copyrr bp dx 3948: subri dx 1 3958: copyai dx 1 1 -- push &@rf ----------------------------------------------------------------------------------------------------------- 3969: copyrr bp dx 3972: subri dx 1 3982: pushr dx -- load 1 -------------------------------------------------------------------------------------------------------------- 3984: popr dx 3986: subri sp 1 3996: copyaa dx sp 1 -- jmp ifz #no_return_exit_std.out.#scope0 ----------------------------------------------------------------------------- 4007: jmpz 10 4016: addri pc 10 -- jmp #end_function --------------------------------------------------------------------------------------------------- 4026: addri pc 0 -- label #no_return_exit_std.out.#scope0 ------------------------------------------------------------------------------- -- label #end_function ------------------------------------------------------------------------------------------------- -- free locals --------------------------------------------------------------------------------------------------------- 4036: addri sp 1 -- function epilogue --------------------------------------------------------------------------------------------------- 4046: popr bp 4048: ret 0 -- end func std.out():ref ptr std.ostream ------------------------------------------------------------------------------ } Pahahaha. I'm sure you followed all of that

Crappy explanation but I'd like to start blogging about this project again.

Hope you are all well. I'll try to catch up on JournalLand (remember when it was called that, eh?) when I can.

Aardvajk

Aardvajk

Python Mock for "cube_add" Blender API

Mock-objects are useful if you use external editor like VSCode or IDE like PyCharm, Eclipse and so on, because you can use DI (Dependency Injection) and you can debug your code logic with breakpoints. For example, we want to add a cube on a scene: bpy.ops.mesh.primitive_cube_add() You can read about this API function in the documentation: primitive_cube_add Create a work folder with the name: mock-object-for-primitive_cube_add-api Open Blender and safe project in the work folder Open "Scripting" tab in Blender from the top menu Open your favourite Python editor. I use VSCode. You can read about how to use VSCode with Python here Python in Visual Studio Code Create a file with the name "main.py" in you favourite Python editor. This file must be placed in the "mock-object-for-primitive_cube_add-api" folder Write in the "main.py": print("hello from blender") You can run this code from command line terminal or from VSCode internal terminal. Press in VSCode "Ctrl+`" and enter command:
  python main.py You will see in the console terminal this message: If you opened "Scripting" tab in Blender you will see an ability to open Python script in Blender. Click on the "Open" Button in Blender Script editor inside Blender Choose the "main.py" file and click the "Open Text Block" button Open the Blender console terminal. For this you need to select in the main menu of Blender "Window" and select "Toggle System Console" Run the "main.py" script from Blender. For this you need to place your mouse pointer on text area and press "Alt+P" button You will see this message in the Blender console terminal:
If you will change a code in an external editor like VSCode you need to reload in the Blender text editor. For this you need to press the "Alt+R+R" button You need to add only one file: "main.py" to the Blender text editor. Another files you need place in the work directory: "mock-object-for-primitive_cube_add-api" Copy this code to the "main.py" file: main.py import bpy import sys import os   # Get a path to the directory with .blend file # There are the scripts in this directory dir = os.path.dirname(bpy.data.filepath)   # Is the directory in the list with included # directories? If no, include the directory if not dir in sys.path:     sys.path.append(dir)   import object3d_service   # Reload module. It is necessary if you use # external editor like VSCode # For reloading module you need to press in # Blender: Alt + R + R import importlib importlib.reload(object3d_service)   # Note. You do not need to open all scripts in Blender, # you need only this script   from object3d_service import Object3DService   def main():     objectService = Object3DService()     objectService.create_cube()   if __name__ == "__main__":     main() This is another files that you need to copy to the work directory: test_blender_service.py import unittest from unittest.mock import MagicMock   from object3d_service import Object3DService   class BlenderServiceTest(unittest.TestCase):       def test_myTest(self):         # Arrange         object3DService = Object3DService()         object3DService.blender_api.create_cube = MagicMock("create_cube")                  # Act         object3DService.create_cube()           # Assert         object3DService.blender_api.create_cube.assert_called_once() object3d_service.py from blender_api import BlenderAPI   class Object3DService:       def __init__(self):         self.blender_api = BlenderAPI()       def create_cube(self):         self.blender_api.create_cube() blender_api.py import bpy   class BlenderAPI:       def create_cube(self):         bpy.ops.mesh.primitive_cube_add() Delete a default cube from the scene. Now you can reload Blender code editor ("Alt+R+R") and run the code ("Alt + P"). You will see that a new code will be created: You can set breakpoints in "main.py" because there are mock-object for Blender API. And you can run unit tests using this command:
  python -m unittest
You will see that unit test are passed.

8Observer8

8Observer8

🎮 Indie Game Devlog #0 🎮 | Introduction

Hello and welcome to my first ever devlog! This week I am going to introduce the new game I will be developing, and while I don’t have a name for it yet, I have the majority of the game-play and story-line figured out. The idea is to create a unique, 3rd-person, looter-shooter, mobile game, with controls and game mechanics that make use of features mobile devices offer. The player will move rotating around a pivot point at the center of each level using the accelerometer in their phone. The main objective for each level will be to destroy the object at the center - something guarded by enemies! The object and enemies are however there by no coincidence, and I wanted to build the story from something that actually happened not too long ago... Go grab some popcorn, and let me tell you a story... In 1974, the Arecibo observatory, located in the middle of the Puerto Rican rain forest, celebrated the remodeling of their telescope by broadcasting a signal into outer space. By reordering the 1,679 bits sent into a grid of 73 rows and 23 columns, the following image would form. This was an attempt to reach out to extraterrestrial intelligence and carried the basic information about humanity - the perfect starting point for my game! The interstellar radio message was however aimed at the M13 globular star cluster - a whopping 25,000 light years away… so this is I start to use my imagination. While it was aimed at the cluster, the signal varied slightly off course, and was intercepted by an alien race on the exoplanet, Lalande 21185 b, only 8.3 light-years away from Earth! Unfortunately, these recipients weren’t as friendly as we had initially hoped, and after quickly deciphering the Arecibo message, the planet’s rulers decided that Earth, having a clear abundance of natural resources, would be their next victim. So, they sent a message back, threatening us to leave, as they were coming to take over. After we received this message 8.3 years later, those wealthy enough abandoned Earth to travel to Proxima Centauri B, and the rest were left... hopeless. After 10 years the aliens finally arrived, but not as you would expect. Large ovoidal objects crashed into Earth’s surface, and after the dust had settled, small creatures started to emerge from them. These objects weren’t spaceships, but nests, and now have to be destroyed as soon as possible.\ So that’s where the game takes off from! I hope you’re as excited about this as I am, and if you have any suggestions, please feel free to leave them in the comment section below! I’ll be posting every Sunday, logging the progress of the game, so follow on itch.io or subscribe on YouTube to be notified of the next one! Thanks, and I’ll see you in the next one!

Daniel Lochner

Daniel Lochner

 

Connective Threads in the Rank: Warmaster Soundtrack

My friend James Yuhas and I were talking about video games one day, and he mentioned that some video games use the same thematic material throughout the entire game, like Koji Kondo’s soundtrack to Super Mario World. I knew films and games use certain themes for certain characters, but I never thought about using the same material for an entire game! I realized that I should have some threads of connections between individual songs in the Rank: Warmaster soundtrack, so I decided to use a melodic figure in the Horns as one of the threads. Here is a clip of the first song you will hear in the game.    https://soundcloud.com/christopher-a-kaminski/rwm-peace-clip/s-fCaZb Original post blogged on Rank: Warmaster Dev Blog.
View the full article

LordArt

LordArt

 

This Week in GameGuru - 09/04/2019

This article represents solely the opinion of the author and does not reflect the opinions or views of r The Game Creators, it's employees, or subordinates.  It likewise does not reflect the views or opinions of www.tgcstore.net and it's staff.  The author receives no compensation for this work and it is done solely as a service for the GameGuru community at large.
I wish I could describe the absolute chaos of my life right now.  It is impressive, in a biblical sense.  This unfortunately has impacted my ability to do these updates.  I will continue to attempt to get these out in a reasonably timely fashion.

As such, this week the work almost didn't get done.  I have a lot of ground to cover and a limited amount of time to dedicate to this so let's get to it.

GameGuru News
Let's just say some interesting things are going on behind the scenes.  I am not at liberty yet to discuss but I think many of you will be pleased with the end result of it.

Cybernessence has continued his excellent modifications to the engine which I still eagerly anticipate seeing added to the main engine branch.  Some of the changes he's made are monumental in effect.  One big update is a draw call optimizer that he's used by Preben that seems to make enormous impact on the engine's ability to batch draw calls and improve speed.

Currently a great number of big items are in the pipeline or implemented:

Draw Call Optimizer Convex hull shapes FBX importer Makehuman pipelining Trial version of GG Other known/discernable updates (If you check github it's clear there's a VR/Multiplayer angle being worked in the background just by gleaning little bits and pieces).  There's also more beyond that I'm aware of but not at liberty to discuss.

What's Good in the Store
Unfortunately can't do this this week.  This is far and away the most time consuming part of my weekly updates and as such I cannot afford the time for it at the moment.  I hope to get back on the train for this next week. This week it was 'do this and delay until monday or don't do this and get it out this week late'.  I chose the latter.

Free Stuff
Belidos posted some free medieval characters (always nice to get characters!): https://forum.game-guru.com/thread/221044

A track I accidentally  overlooked was added for free by tarkus1971: https://forum.game-guru.com/thread/213190?page=5#msg2619604

Third Party Tips and Tutorials
TGC keeps posting more tutorials, now in a second more detailed series:  https://www.youtube.com/watch?v=3oHsxCMoD9g

Random Acts Of Creativity (WIPs)
In by far the largest component of this, I have a huge amount of updates to cover.

Bonesy is continuing work on his Cyberfi game, now including some of the assets available to purchasers of my book.  Nice to see this stuff finally filtering down.  I'm still working on getting it on the store but if you have purchased it and want the assets early, please let me know.


Teabone posted a beautiful forest screenshot in which he's tuned and optimized his forest using many of the techniques I outline in my book to get a smooth 58-60 FPS with many trees:


Synchromesh has evolved his Protascope game to include Dagored's excellent drone entity from his sci-fi set (I own it myself and love it).



Also newcomer Maverick put together an awesome looking airship out of what looks to be a mishmash of EBE and free assets. Nice work!



Maverick also made this great looking waterfall and used a clever solution to do it - an inverted smoke decal! 

Peri32 made a fantastic video literally as I was typing this of his walkcycle for a Taxi-Driver inspired game based I assume on the movie from the 70's.

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

The environment is top notch and it's a great use of GG's abilities near as I can tell.


In My Own Works
Well, the publisher posted the files online... then removed them.  So now I have to get them to add them back in.  *shakes head*.  Like I said, my life is pretty chaotic right now.  I have final touches being done to the art for the 'Cyber Noir' pack that is free for book purchasers.

A teaser of what to expect for assets:

And some weapons too:





So keep your eyes peeled and make sure you keep some info on your purchase so I can validate it to give you a code :)

Lastly, I'm working out the final details with TGC on my book giveaway contest.  There will be some minor stipulations but three copies will be up for grabs.  I should have this finalized for next weeks report!

Thanks again to everyone who purchased a copy of my book.  I deeply appreciate your support on this labor of love. I've recently started getting pictures from purchasers:


This to me is the coolest part of this whole process - seeing an actual copy in hand for purchasers!



View the full article

Human male model in the game

Here's a very short update. The human models are in the game. Here is the male model, with no gear on and all the same predefined features, like skin color, face and hair. The server is sending the same definitions for every model as it is, and the next step is to allow to change these values in the NPC definition editor and eventually a character creation screen. On the next update I will show the female model in the game too. You can also follow the video devlog at https://www.youtube.com/channel/UCyOt8sPTqNxRseUzpzUEQQg See you next time!

ricvalerio

ricvalerio

 

List of Interviews with Game Developers

I’ve been doing a series of interviews with game developers. Here is a full list. Check them out! https://gildedoctopusstudios.com/interview-with-porble-games/ https://gildedoctopusstudios.com/pop-the-line/ https://gildedoctopusstudios.com/shores-unknown/ https://gildedoctopusstudios.com/interview-with-a-quantum-mechanics-researcher-who-is-also-a-gamedev/ https://gildedoctopusstudios.com/interview-with-the-developers-behind-healing-bullet-games/ https://gildedoctopusstudios.com/interview-with-the-developer-behind-sekishu-no-koe/ https://gildedoctopusstudios.com/former-valedictorian-makes-video-game/ https://gildedoctopusstudios.com/interview-with-the-gamedev-behind-the-new-trading-game-where-your-camels-can-die/ https://gildedoctopusstudios.com/harpoon-harry/ So if you would like to participate you can find the original list of questions at https://gildedoctopusstudios.com/interview-with-a-game-developer/
 

Full list of Game Developer Interviews

I’ve been doing a series of interviews with game developers. Here is a full list. Check them out! So if you would like to participate you can find the original list of questions at https://gildedoctopusstudios.com/interview-with-a-game-developer/ The post Full list of Game Developer Interviews appeared first on Gilded Octopus.
View the full article
 

Interview with Porble Games!

Your name: Benjamin Wendt Twitter Handle/ Other Social Media: Tweets by PorbleG One interesting and random fact about you that people would not necessarily guess: I love world history and geography.  I used to be able to draw the globe and all the countries on it on a blank piece of paper.  What country you live/work in: Chicago, USA The video game company producing the project: I call it Porble Games, but its just me in my living room. The name of the project: Wark and Wimble Estimated release date: March 2020 link to website/blog/steam page/Youtube/other: Steam page -coming soon Youtube channel – https://www.youtube.com/channel/UCtmx72AKtShCE_qx54jRYBw Soundcloud – https://soundcloud.com/user-394410536 How did you get into making video games? I wanted to work in video games after college but couldn’t land a job.  I ended up doing general software development.  I had some hobby projects many years ago which were all really bad.  When my second child was on the way, I decided it was now or never and have spent most of my free time working on Wark and Wimble. What is your background in? I do software and UI development for a financial firm.  Blurb about game: Wark and Wimble is a block pushing puzzle game, very reminiscent of The Adventure’s of Lolo and Chip’s Challenge.  In most levels, you must move a stranded egg back to its nest, then feed the baby that hatches by puking food into its mouth.  Its cute and a bit gross! What inspired this game? They say to make the kind of game you want to play.  I don’t have much time for console or PC gaming these days, instead I game on my phone.  But I am very frustrated with the state of mobile gaming.  They have pointless economies and daily log in bonuses and pay-to-win mechanics.  They want me to watch ads to respawn. They have long, mandatory tutorials.  Mobile games have a lot of great talent for assets but the final product is often just a miserable time waster. So I wanted to make a game that you played simply because it was fun, not one that you keep opening because you feel obligated to claim some bonus. What makes it unique? For being such a simple puzzle game, I think it brings a lot of character.  I’ve spent a lot of time making art and animations to bring these cute critters to life.  I want the failures and successes of your character to evoke empathy and humor. What will make it a success? If the game makes it to Android and iOS without being a disaster, I consider that a success.  I don’t expect to make any money on this project.  If I can get it on Switch, I will be ecstatic! Who do you think it will appeal to? Probably retro gamers first.  The game draws considerably from The Adventures of Lolo and Chip’s Challenge, and I wanted to make a game that resembles those classics but with some modern design principles.  The art brings in a wide variety of casual players, including children who may find its puzzles too difficult Number of people working on the project and skillsets: Its just me!  I am coding and doing the art.  I am learning to compose and mix music just for this project.  I did some of my own sound foley as well. How are you handling art? I have kept a sketch diary for many years specifically for this project.  I sketch a particular thing dozens of times. Once the sketch is solid, I do it in Adobe Illustrator.  What tech/stack do you use? I’m using the Monogame framework.  I wanted to make as much of the game myself as I reasonably could, so I made most of the tools myself rather than using middleware.  I have created my own level editor, my own animation and particle engines and my own resource packaging tools.  I’m using FMod for my sound engine.  They have a very generous indie game license! Embarrassingly, I’m not using git or any other code management tools.  I just do back ups on google drive and a spare hard disk. Are you full-time? If so how did you make the switch to working full-time in game development? No I am a hobbyist only. Is this your first game? If not how many and what other sorts of projects have you worked on? I consider it my first REAL game.  My previous efforts were more than 10 years ago and were embarrassing even at the time. What’s been the hardest thing about making this game? The music!  It took a long time to compose anything that I felt was worthwhile.  The difficulty in mixing and balancing music took me completely by surprise.  Its very challenging and I have a lot of new respect for sound and music artists. Anything else you would like people to know about you or the game? Making games is hard.  Making games when you have a 2 and 4 year old is even harder!  But its very rewarding.  Thanks for reading and please follow along athttps://twitter.com/PorbleG The post Interview with Porble Games! appeared first on Gilded Octopus.
View the full article
 

Weekly Recap #special: Back from Gamescom

Hello Fox Riders, 

We're back from Gamescom! 

Gamescom was pure madness. It was exhausting, but we regret nothing! We had the opportunity to make people play the demo of Nanotale. Some of them were returning Fox Riders from Epistory, while other didn't know about our games but both loved it. It was so rewarding. 



We took the picture above with the wonderful people from Onanagro Studio who helped us a lot on the booth and borrowed us their holographic display to showcase some art from Nanotale. Below, a hologram of the Green Jasper. 









At some moment the booth was so crowded that it was hard to manage who's the next player, so one of our Game Designer decided to create a path to follow on the floor and it did work. 


  Closed BETA
Before finishing that update, I'd like to give you some quick news about the Closed BETA. 

We are currently finishing a few stuff to make sure that the part of the game that we want you to test is working well. So, you should expect the Closed BETA to start around mid-September. 

That's it for today's recap! Thank you for reading and for your patience. 

Cheers,
-VirginRedemption

FishingCactus

FishingCactus

 

Unity Tilemap White Line Issue

One of the issues we ran into is this fairly well documented Unity Tilemap white line issue. When you have a tilemap in unity, with really a large repeating area you''ll usually end up with a pretty glaring issue coming from the tilemap. You'll notice long, weirdly colored lines appearing vertically (as I've seen it) on your tilemap. According to what I've been able to tell this comes from your camera not snapping to a whole number pixel count, which seems to be the issue in my case. My camera follows the character in a pretty slow way, approaching the character quickly than slowing down the closer it gets. There's basically two solutions that I've found to fix this issue and they're both pretty straight forward. The first fix is the fastest, and usually works, you simply find your container grid for your tilemap and give the cell gap a bit of a negative offset, in this case -.01: This is the fastest way to solve this problem, but I've noticed that it doesn't always work. If the above solution isn't working you're going to need to get dirty and add a 1px padding to all of your tilesets that show this problem. Since it would be a massive effort to redo all of your tilesets, I'd recommend finding the offending tile and testing if something like this works. Take the tile that's causing the issue, and surround it with copies of itself like so: Simply apply that center tile to the whole map you're trying to test and you'll be able to tell if this is the issue and dedicate more of your time to getting each one of your offending tiles that 1px buffer. In my case, there needed to be BOTH of these solutions in order for the tilemap to look correct. Overall this is going to be one of those problems that you poke and prod at until you find something that works for you, just make sure you run around your map and make that camera move in weird directions to see if you can get your issue to reproduce!  

DOOM: Multi Level BVHs

One of the major challenges in real time ray tracing are dynamic scenes. It is not hard to pre-compute BVHs and then just render the scene, but working with dynamic objects and geometry is challenging. To handle such scenario I've implemented multi-level BVHs where top-level BVH is rebuilt every single frame, additionally for fully dynamic geometry I've added HLBVH (which is extremely fast to build). The first test I have (which you can try) is a Sponza atrium, which creates each single object in it as node within multi-level BVH. Each node has high quality SAH BVH pre-computed on start, and then a top-level BVH is built every single frame. Additionally it immediately supports instancing, which is a great feature! Geometry also have material (with diffuse map) assigned.   To run demo, OpenCL 1.2 compatible hardware is required (I've tested this on AMD Rx 380, AMD Rx 590, NVidia 1070 and Intel HD Graphics 620 - where it runs quite slow, but still - runs) Raytracer Test No. 1     I don't like to promise future features, but if everything goes well - I'd like to have some skeletal animated model in soon along with finally some models that I'm working on for the actual game!

Vilem Otte

Vilem Otte

The Closed Beta is over... So what comes next?

On August 8th the Closed Beta of Causa, Voices of the Dusk finally ended. So, after a demo that lasted for over 2 months, the question is: what does the future hold for this new indie CCG?  First of all, we'd like to thank everyone participated in this beta period. We reached +6.000 subscribers, and gained a lot of extremely valuable feedback, which has allowed us to keep improving the game, as well as develop the remaining features and content. Alongside this, we truly appreciate all the interest and enthusiasm of the amazing content creators and streamers who recorded videos and streamed the game on their channels. This meant a HUGE boost of motivation for us. As a token of our appreciation, we prepared a video with a few clips we were able to collect. You may check out this video here. Special thanks to Dragonrider, Igua, laruchan, Arreador, Sopa de Murloc (Souji), Vizion, Wildspeaker, Eolis, MCN_Mike, Mercurio Blue, 9spark, zerhkz, sebasxkhan, ThatResolves, CHARM3R, Juegos Indies, Izana, sudsywolf, topopablo11hs, Mattyocre, Shank, OnlyRex, WorldOfPirinolas and Auulox! On other news, we're very glad to announce that Dawn aka “Dragonrider”, an experienced card game player, as well as one of the streamers who participated on out Closed Beta, just released a podcast about Causa! This content is perfect for anyone who'd like to learn more about the game, and get some exclusive insights about its development. It's called Causi Love It: A Causa Podcast, and its episodes will be released periodically with analysis, interviews to the dev team, and more surprises! With such a nice and light-hearted host, we're sure you'll enjoy the show. Thank you so much, Dawn! You may check it out here. So, what comes next? At the moment we are working very hard on the final phase of development of PC version of Causa. During this period,  we'll keep sharing info and sneek-peaks into the developing process, and hope to have news about the upcoming demos soon! We really look forward to keeping you involved, as your feedback has been amazing. Here's some of our plans: We’ll keep streaming in our official Twitch channel every Thursday at 3 PM (ET). We’ll have a chat, share details about the game, and updates about our progress. We’ll upload videos on our Youtube channel, focusing on the streams as well as new content about the game. Facebook, Twitter and Instagram will be active every day to show you updates and more details of Causa. Keep an eye on this social channels because we’ll announce limited timed-demos and other special events.  We’ll keep in touch with our emerging community on Reddit and Discord, so please join us and share all your suggestions and comments about the game. Also, remember to subscribe to our newsletter to stay up-to-date and be the first to receive the most important announcements and invitations for the coming demos.  Thanks all for this incredible experience, it was amazing to have you onboard during our Closed Beta. We are as excited and eager as you, so we'll keep working hard to complete the game! 
 

August Update

Recap For August I wanted to finish up with transactions, building a UI that could execute the system I built in July. Results Again I did okay. With a little tip from one of the UI engineers at work I was able to get my widgets working for a UI that can display and trigger a transaction. The part I didn't get to was the actual execution of the transaction to change the state of my game. Here you can see the new button (on the left) I added for accessing the "Marketplace" and the UI element (on the right) I added to show the current resource counts available to the player. Here's the screen for the Marketplace. I went for transactions that would create new ships instead of resource exchanges. You can even see the last transaction is a project that requires a duration to complete. The unreadable little box is the tool tip for the button to activate the transaction. And the final screen has the debug text that I currently have showing up when the button is clicked. The name of the transaction is included in the string as "proof" that the all the relevant data is being routed to the right places for eventual activation. I also addressed a couple technical debt issues: I removed a few direct dependencies between the system that deal with the tile location of the cursor, the system that tracks the current selection, the system that deals with targeting and the system that deals with the turn order. Instead those functions route through my custom event manager. Added some validation to my event manager events so that the manager can handle invalid events systemically and not pass those events on to the systems listening for those events. New Design Spec I also wanted to get out in front of a design problem that I know I'm going to have. I currently expect to have some limited number of spots per mission for ships to send on a mission, but I don't really want it to devolve to "take my X-biggest ships" every time. What I've more or less settled on is a two-fold system for limiting ship deployments. The first is a limiter based on ship sizes, I'm calling it "tonnage" for now. Each ship will have a tonnage ranking (based mostly on size) and the total for all the ships taken on the mission must be below the tonnage limit for the mission. Hopefully this will encourage including a few smaller ships on missions instead of just a couple big ships. There will probably be a few ways to upgrade this limit, but they will be very few and it will vary primarily on the mission type/location. The second limiter would be a more traditional unit count limit. This limiter is meant to represent command and control systems and the effectiveness of actually controlling lots of ships. This limit will be more constant, usually the same for most missions, but will have ways to upgrade it globally or even based on the equipment of the ships taken on the mission. I'll keep thinking about it for a while, I've got a couple more parts to add to tactical before I start working on an implementation. I'm happy to hear any thoughts or comments that might make this better. September Goals The next step is finishing up the wiring of the UI to my other systems so that pressing the buttons actually does something (other than printing to the screen). I'll also need a new UI element that shows the active projects created through a transaction screen. I'll also continue to address small tasks from my technical debt list. Games I'm Playing Picked up the new Fire Emblem at the end of July and have spent a good chunk of time playing (the save says ~120hrs ). Finished one of the 4 story lines (Blue Lions) and have started up my second playthrough (Golden Deer this time). Should be faster, they've got an interesting NewGame+ system that lets you pull progress from previous playthroughs. It's a pretty good game and I highly recommend it. My only real complaints are the class system can be a little bit unbalanced and the way they've shifted the weapon triangle into skills feels really off.

MagForceSeven

MagForceSeven

 

Total Doom

I have decided to try this challenge, which should be fun. But since I will developping on a rather low end laptop, I have chosen to prototype the game using THREE.js, and might use Unity later on.I personally do not like Javascript, because it is easy to make mistakes and not know where they are, and also that you have to depend on a gazillion other modules to have a working program. But I will not complain since the dev environment I am in does not give me much choice. The story: Necromancers from another dimension have invaded Earth to gather and manipulate Terran (human) souls to help them gain enough power to conquer their known universe. You as agent K. Kryss, a cybermage working for the V.I.P.E.R. (Very Intelligent Powerful Empyrean Rulers) agency, must infiltrate necromancer infested locations, and assassinate their commanders, to restore peace on Earth. The game is, of course, going to have DOOM gameplay elements such as keys to open doors, armor, health packs etc. Implementing Movement The first thing I wanted to implement was the particular DOOM movement, which has an up and down head motion. I simply used a sine function to emulate this motion and the result was close enough. To make it move fast enough I multiplied the phase by a scalar (10). moveForward(elapsedTime) { var dir = new THREE.Vector3(0,0,0); this.camera.getWorldDirection(dir); var newVelocity = new THREE.Vector3(dir.x*this.axisSpeed,0,dir.z*this.axisSpeed); var deltaHeight; deltaHeight = Math.sin(10*elapsedTime); // head motion runningTime += elapsedTime; this.position.set(this.position.x + newVelocity.x, 0, this.position.z + newVelocity.z); this.camera.position.set(this.position.x, this.position.y+deltaHeight, this.position.z); }   The rest is easy enough to code, simply move along the x and z axis according to where the player is facing. Map Editing Since I do not use an engine (for now) and this is my first time using THREE.js, I do not have a map editor. So basically the map is a collection of cubic walls and tiles that are stored by a coded number inside a 2d array. There is a number code for keys, health packs, armor, enemies etc as well.  Time to make the sprites now. Since this is my first try at pixel art, things are going to be tougher from now on. 

Hermetix

Hermetix

 

Snake - Story mode design, and Json parser woes

I started up a wiki over on my GitHub account describing the story mode design for The Garden of Eating.  I'm looking forward to implementing all of that, but the first step in getting there is dealing with the file system and JSON parsing. I was originally thinking I'd just have a "campaigns" folder, where each sub-folder would represent a campaign that the player would pick somewhere on the menu.  I quickly realized that C++ is still rough around the edges in supporting certain file system operations -- like enumerating the list of files or folders at some given path: I was hesitant to use the new std::filesystem.  So far, my project is C++11 compliant; this namespace was added in C++17. I was hesitant to use this Boost library I'm reading so much about.  It's another thing to learn, and to try to build or integrate into my project.  Maybe next time... I don't want to use operating-specific calls.  I still have the thought that it would be nice to be able to take all my code and build it for a Mac or Linux machine. So instead of enumerating the sub-folders, I'm just going to require that there be a "campaigns-list.json" file found in the "campaigns" folder.  This file must be a JSON array of strings, listing the folder names.  It seemed like a small price to pay, in order to keep my dependencies to a minimum, and to keep my build environment flexible. And then I started trying out some of the various free / open source C++ Json libraries out there... Nlohmann JSON for Modern C++ I first tried the latest version of Nlohmann JSON for Modern C++.  At a glance, it seemed like the simplest library to get going.  It has a single header file you can include in your project, and away you go.  Unfortunately, I struggled to get it to parse a JSON file, and felt the need to try a different library.  This stackoverflow question didn't solve my issue either.  The library's approach for parsing JSON from a file has been deprecated and changed multiple times over the library's short lifespan, and trying to use this static "parse" method with the 3.7 version in VS 2019 was just not compiling.  Maybe I'm just a dumb-dumb, but if I can't get something like this to work within a half-hour, it's time to move on. The main readme for the library still shows parsing from a file using the 1.X version approach.  If this could be updated with whatever the 3.7 version is using, I presumably wouldn't have had an issue, and my JSON library evaluation would have ended there.  Unless the 3.7 version is indeed using the static "parse" function, in which case I'd have to be of the belief that not a single person is successfully using this library because I'm always right when I code things. 🤣 // read a JSON file std::ifstream i("file.json"); json j; i >> j; // My note: this was deprecated a long time ago! RapidJSON Next I tried RapidJSON.  I was able to get this to work, but there were a few red flags that pushed me away from it: As of today, the Build Status on their front page is failing for both Linux and Windows.  This didn't instill me with confidence. The licence file mentions the MIT, BSD, and JSON licences.  On further reading, this wouldn't have been an issue, as I wouldn't be including the portion that is under the JSON licence.  But I like to keep things simple. It's a header-only library as well, but there are LOTS of header files.  I wanted to see if I could find something with fewer files. JsonCpp The JsonCpp library is where I've ended up.  To get this integrated into my project, I did have to install Python and run the "amalgamate.py" script.  This produces a distribution folder with two header files, and a single *.cpp source file.  The library's API is just fine for my purposes, and I was able to parse and navigate some sample Json files without any trouble. So, JsonCpp it is.

rileyman

rileyman

 

Beggining the Doom Challenge

Im glad i clean my email inbox just to see this challenge was active. all the weekend i was thinking how to make this game and i now have a solid idea what to do. Doom its my favorite game and this challenge its perfect to retun making games, its been a while since my last game jam and my last "completed game", i really hope to finish this project becasue my game design skill are very weak by now, i wll start today and when i have sometime interesting to show i will post it here. Good Luck to everyone!!  

Adrian HS

Adrian HS

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!