Spent the early portion of the day rewriting my private projectile library. I'm pretty pleased with the results now that I'm only running 20wFPS/40cFPS.

My private UI library has seen similar work over the last two days that I've had off. Support for tab panes and paging panes have been added, though they could always be more flexible. Work needs to be done to allow custom tooltip menus and right click context menus. As much as I'd like to use HTML, it simply isn't going to happen. Instead, I'm going to use a floating secondary map to achieve tooltip and context menus.

My private control library is also seeing quite a lot of work and now uses BYOND's ANY macros and [[*]] formatted arguments to great effect. I've added a new linked list to the client to account for the new macro setup, which will also help quite a lot with a control customization screen that non-BYOND audiences will expect. More work and planning needs to be done to support gamepads. The controls are very simplistic, with LMB and RMB being the control WASD being movement, E being interaction, and a few other hotkeys for manipulating the menu. I suppose I can simply bind the left stick to WASD, right stick to facing direction, L2 and R2 to LMB/RMB, X/Y/L1/R1/DU/DD/DL/DR/L3/R3 to 1-0, and select/start/B to menu navigation buttons.

I'll have to retool bufflib and itemlib for integration with the newer private libraries, and have plans for statuslib seeing a total rewrite. movelib is undergoing a major overhaul ATM and probably won't be ready before alpha, but I reckon I have very little use for the majority of that feature set with my current goals.



I then spent the rest of the day focusing on artwork. I feel like I got quite a lot done, but I've still got a fair bit more to do before I'm happy with the environmental set. Currently, I have 16 autotiles complete and two cliff sets finished. I still need to work on water features and some of the more dangerous biome types that I want to draw.

Currently, the environment art covers mountain, forest, grasslands, steppe, and desert, with the desert and mountain needing a fair bit more work as far as detail tiles go.



Ideally, by the end of tomorrow night, I'd like to have swamps, tundra, glacial plains, badlands, and volcanic autotiles finished.

I have very little idea what I'm actually working toward, but I have some fragments seem to be coalescing. At least I know that the art is generic fantasy enough that it will probably withstand whatever changes to the overall game design concept happen over the coming months.
I thought I was the only person using MSPaint.

I didn't wind up finishing the new biomes, but I did spend quite a lot of time fooling around with my old private autotiling library to get it working as it is supposed to. I'd made some errors that I hadn't noticed before that resulted in some really ugly effects when used.



Most of the day was spent animating some things and mucking around with enemy AI. Enemies currently wander around, but don't actively pursue goals or target the player yet. It's a beautiful, peaceful world.

I hope Orcs don't come out of that portal
In response to Ter13
That vortex reminds me of work I did a little while back on SotS II, to improve the chalkporter graphics. I developed an icon that has a whirl effect to it, where it seems to radiate inward or outward.

The monstrous code I used to create the vortex looks like this:
iconop/vortex
Operate(icn,sz=96)
var/szi = sz*5/16
var/szh = (sz+1)/2
var/szo = sz*(sz+1)
var/szf = (szi)*(szi+1)
var/fs = 15/(szh-szi)
var/icon/I = new('blank.dmi')
I.Crop(1,1,sz,sz)
var/icon/B = new('blank.dmi')
B.Crop(1,1,sz,sz)
var/n,X,Y,d,r,a,i,j,aa,ab,ga,gb,o,p,s,s2i,s2o,ao,ad,ado
var/list/g1 = new(sz*sz*6)
var/list/sp = new(sz*sz)
i=1; j=1
for(Y=1,Y<=sz,++Y)
for(X=1,X<=sz,++X)
d = (X-szh)*(X-szh)+(Y-szh)*(Y-szh)
if(d >= szo)
aa = 0
ab = 0
else if(d >= szf)
aa = round((szh-sqrt(d))*fs + rand(-2,2), 1) * 17
ab = round((szh-sqrt(d))*fs + rand(-2,2), 1) * 17
else
aa = 255
ab = 255
//d = (rand(0,3)+rand(0,3)+rand(0,3))*17
g1[i++] = aa
g1[i++] = ab
g1[i++] = (rand(0,3)+rand(0,3)+rand(0,3))*17
g1[i++] = (rand(0,3)+rand(0,3)+rand(0,3))*17
g1[i++] = rand() * 360
g1[i++] = rand(1,2)
r = sqrt(d)
a = arccos((X-szh)/r)
if(Y<szh) a = 360-a
sp[j++] = a*3 + (r*(5*360)/(szh-1))
sleep()
world << "Template done"
for(n=1,n<=15,++n)
var/icon/J = new(B)
var/icon/Jd = new(B)
var/icon/Jo = new(B)
var/icon/Jod = new(B)
var/icon/Js = new(B)
i=1; j=1
for(Y=1,Y<=sz,++Y)
for(X=1,X<=sz,++X)
aa = g1[i++]; ab = g1[i++]
ga = g1[i++]; gb = g1[i++]
o = g1[i++]; p = g1[i++]
s = sin(p * (o + (n-1)*24))
// here, a is for angle
a = sp[j++]
s2i = sin(a + (n-1)*48) // 15*24 is 360, so it moves the spiral in/out by one ring; 48 moves two rings
s2o = sin(a - (n-1)*48)
// a is for alpha now
a = (aa + (ab-aa) * s) * ((s2i+1) * 0.25 + 1)
ao = (aa + (ab-aa) * s) * ((s2o+1) * 0.25 + 1)

// dissipation alpha
ad = min(a, 340)
ado = min(ao, 340)
r = sqrt(((X-szh)*(X-szh)+(Y-szh)*(Y-szh))) / (szh-1)
r = min(0, (r-(n*2-1)/24)*(255*3))
ad += r
ado += r

d = ga + (gb-ga) * s - s2i * 10
d = (max(0,d)/0.75) - 85
if(a > 0) J.DrawBox(rgb(d,d,abs(d),a), X, Y)
if(ad > 0) Jd.DrawBox(rgb(d,d,abs(d),ad), X, Y)

d = ga + (gb-ga) * s - s2o * 10
d = (max(0,d)/0.75) - 85
if(ao > 0) Jo.DrawBox(rgb(d,d,abs(d),ao), X, Y)
if(ado > 0) Jod.DrawBox(rgb(d,d,abs(d),ado), X, Y)

// static version
a = (aa + (ab-aa) * s)
d = ga + (gb-ga) * s
d = (max(0,d)/0.75) - 85
if(a > 0) Js.DrawBox(rgb(d,d,abs(d),a), X, Y)
sleep()
world << "Frame [n] done"
I.Insert(J,"",frame=n,delay=0.5)
I.Insert(Jd,"dissipate",frame=n,delay=0.5)
I.Insert(Jo,"out",frame=n,delay=0.5)
I.Insert(Jod,"outdissipate",frame=n,delay=0.5)
I.Insert(Js,"static",frame=n,delay=0.5)
return I

Here's the breakdown of what that code does:

1) Each pixel within the circle is visited; if it's outside the max radius it's discarded. If it's inside the min radius it gets max alpha; if it's between the min and max, the alpha falls off gradually, but can fluctuate between two values.

2) Each pixel that has any alpha is given a random amount of alpha and brightness fluctuation; brightness tends toward black but can spike upwards. A sine wave will determine the brightness and alpha, and the wave's frequency is either 1 or 2; it repeats either once or twice, exactly, during the whole animation. All of these values are in the g1 list.

3) A spiral angle is determined, which is used for the vortex spiral effect. It takes into account not only the angle from the center, but the distance from the center, and adds them together. The angle increases counter-clockwise. The formula sp[j++] = a*3 + (r*(5*360)/(szh-1)) basically says that the angle gets multiplied by 3--therefore the spiral has 3 arms--and radius is effectively multiplied by 5, so that starting from the center in any direction you should be able to cross the spiral 5 times. The 3 and 5 values I got through experimentation; altering them will create very different spirals.

4) The icon is built, one frame and one pixel at a time. To ensure a continuous look, the exact same g1 values are reused to create all versions of this vortex: in, out, static, and dissipating versions of the first two. The alpha value of the pixel is altered based on which version we're creating. For the inward and outward versions, the spiral angle is altered by adding a multiple of the time; this is scaled so that a full animation should have put the spiral angle through 2 full rotations; or, visually, equivalent to moving each spiral arm 2 crests inward/outward. (E.g., on the inward animation, the 5th spiral arm should appear to be the 3rd by the time it's done.) The spiral angle is also used to alter the brightness, so that crests in the sine wave match up with darker pixels.

The end result is a pretty, pretty vortex. In the center it's murkier and very opaque, and the spiral pattern is subtle; toward the fringes the spiral becomes very noticeable. And during dissipation, which happens from the inside out, the spiral shows up pretty well there, too.
In response to Lummox JR
Gifs or it didn't happen.


(jk I just want to see what it looks like)


I have a thing for plague doctors and what-not.
In response to WorldWideDuelist
WorldWideDuelist wrote:
I hope Orcs don't come out of that portal

Goblins. Blizzard pls no sue.
In response to Bravo1
Bravo1 wrote:
Gifs or it didn't happen.


(jk I just want to see what it looks like)

I'll have to mock something up later that can produce a .gif. The Export command in Dream Maker can't handle the alpha properly (since .gif doesn't support alpha), so it'd be best if I could get it on a white background first.
Here is a little screenshot of whats to come from me. Keep in mind a lot of placeholder art is being used. :)


Click the image for full resolution.

I have a general idea of where I'm going with this but I can't reveal much yet until I set everything in stone.


More plague shenanigans. Hanging out in a tavern.

EDIT



More plague fun-times. That green wispy stuff is airborne plague. Will infect you if you hang around it too much. Infected players will also be able to infect other nearby players if they stick in the vicinity of said infected person too long without the proper attire, and if said infected player has a high enough infection level.

Players with a high enough infection level also get their PvP-flag enabled, so other players can off them.


1500 goblins active. ~90% CPU usage average AI is currently heavily unoptimized. I've got some ideas to push that number to 10,000 active ai per server, but it's going to take some serious work.

...I think they like me.

enemies generate pressure on tiles they are standing on. Enemies try to avoid being too pressurized to prevent them from stacking up too much. Some enemies are more willing to cluster than others. Goblins are quite happy to cluster all the time. Other enemies have a much stronger aversion to being crushed, to the point where they will actually break off interest in the player they are chasing for some time. Goblins? Well, goblins don't really care.
In response to Ter13
With all those creatures, have you given any thought to flocking algorithms? I know implementing them for speed could be a bit tricky, but there are probably shortcuts you could work out for that. Maybe flocking is overkill, though; I'm just fascinated by such things.
have you given any thought to flocking algorithms?

I have, actually. One of the optimizations I was planning on was going to be through causing enemies to group up and receive directions from the ai director.

There will not be this many enemies in a single zone at a time. Not by a long shot. Maybe 50 to a zone is reasonable IMO.
Ter13, I absolutely love the simplicity of your art.
Private testing for Severed World has begun. I've never seen the game be broken so utterly.











Well, the good news is that none of our ~15 testers have complained about FPS issues as of yet, so Lummox deserves a cookie or two for the work he's done there!
http://puu.sh/r5Uxp/7e6ad19ca4.png 6 pages of bug reports and we're only 24 hours in. Poor Doohl.


The stat menu now updates in response to changes to the linked user's stats. Stat bars also update in response to the user's stat changes.

Inventory management now works, and loot bags now mostly work. I still need to go through and implement despawn timers on them. I also need to implement the ability to discard items by dragging them over the map, but I hadn't drawn the confirmation menu.

Tooltips are in the works as well.

This may not seem like a lot of progress, but the type of UI I'm working on takes much longer to get working properly than would a statpanel-based UI. My UI doesn't do any polling, but rather responds to changes. This takes a lot more work than something that simply loops over and over, rebuilding itself constantly, but the benefit is that it consumes so much less CPU than the other approach would.
Page: 1 2 3 ... 238 239 240 241 242 ... 349 350 351