In response to Bravo1
Bravo1 wrote:
Who knows, you might be able to control one...

hint hint nudge nudge

Do you have a name for them :P?
In response to Azurift
They mentioned in the thread (previous page perhaps?) that it's for colour matrix blending, they don't want to worry about drawing different colour sprites for the mob, and have opted to greyscale it instead so that the code can colour it.
In response to CrimsonVision
CrimsonVision wrote:
They mentioned in the thread (previous page perhaps?) that it's for colour matrix blending, they don't want to worry about drawing different colour sprites for the mob, and have opted to greyscale it instead so that the code can colour it.

Bingo!

I do it mainly for enemies that will show up in several areas, so they can be colored to match the area.

I also often forgo using the color matrix at all, and instead use the colors menu in the dmi editor to create file versions of each color permutation.

This works well once I've finalized the sprites, but until then I just fiddle with color matrices.

Yut Put wrote:
mage is really restricted RN but certain additions like magic blast have allowed it some leeway

the reason mage is restricted is because if you're a mage you're probably going to be doing a lot of ranged attacks and ranged attacks are OP in epoch

Also if staffs are too good then every single player will have a staff in their off hand and just spam them for their range, which is kind of degenerate. keep in mind this game has been played through like one hundred times and we've see the outcomes of so many different mage nerfs/buffs and i'm still not 100% happy with it

trying to play mage in your first go though is just generally not recommended until i work out the tools that i want that build path to have

Quick question when you uhh "enhance" a sword with element damage does that element damage scale with int :3?

Because
Also if staffs are too good then every single player will have a staff in their off hand and just spam them for their range

Having a non ranged but magic based attack could be what mages need :P. Think of like the combat mages in es:V
So, why not nerf the range of magic?
In response to Akto
Because it's already crap :P.


Nearly finished... just need death animations and it should be done.
In response to Bravo1
I like the eye thing.
I like it, but I think the moving animation on the legs should be slowed down a bit.


Slowed the legs a bit (0.5 delay to 0.75) and finished up the death animation.
Well, I finally seem to have finally implemented division, which means that all basic arithmetic for unsigned 32-bit integers is now possible in DM! I might release an (undocumented) beta version after I get some stuff cleaned up, or I might just wait until I get signed integers implemented too. At the very least, I want to get a PrintDecimal() method in now that it's possible for me to compute the remainder of division.

But, my god was division difficult to implement. The _AlgorithmD() "private" method—which handles the guts of division and is used in three other methods—is 640 lines long by itself. To compare, the next-longest method, Multiply(), is only 201 lines. The private method and the three public methods, Quotient(), Remainder(), and Divide() together come to a total of 817 lines. This was basically a consequence of me unrolling the relevant loops, though, and there's a lot of repeated code.

So, was it worth it? I used the following code to run some diagnostics,
#define DEBUG

mob
var
const/total = 25000

list
dividends = new
divisors = new

Login()
..()

world << "<tt>Populating lists...</tt>"

sleep(10)
for(var/i = 1, i <= total, i ++)

var
a1 = rand(0x0000, 0xFFFF)
a0 = rand(0x0001, 0xFFFF)

b1 = rand(0,1) * rand(0x0000, a1)
b0 = rand(0x0001, 0xFFFF)

dividends += new /pif_LongInt/UnsignedDouble(a1, a0)
divisors += new /pif_LongInt/UnsignedDouble(b1, b0)

if( (i % 1000) == 0)
sleep(1)

world << "<tt>Finished initial list populations ([total]).</tt>"

verb
ComputeQuotients()
for(var/i = 1, i <= total, i ++)
var/pif_LongInt/UnsignedDouble
Dividend = dividends[i]
Divisor = divisors[i]

Dividend.Quotient(Divisor)

world << "<tt>Done!</tt>"

ComputeRemainders()
for(var/i = 1, i <= total, i ++)
var/pif_LongInt/UnsignedDouble
Dividend = dividends[i]
Divisor = divisors[i]

Dividend.Remainder(Divisor)

world << "<tt>Done!</tt>"

ComputeBoth()
for(var/i = 1, i <= total, i ++)
var/pif_LongInt/UnsignedDouble
Dividend = dividends[i]
Divisor = divisors[i]

Dividend.Divide(Divisor)

world << "<tt>Done!</tt>"

and on my machine I'm getting the following results.
/*

Profile results (total time)
Proc Name Self CPU Total CPU Real Time Calls
-------------------------------------------- --------- --------- --------- ---------
/mob/verb/ComputeQuotients 0.040 0.633 0.633 1
/pif_LongInt/UnsignedDouble/Quotient 0.103 0.593 0.582 25000
/pif_LongInt/UnsignedDouble/proc/_AlgorithmD 0.454 0.454 0.443 25000
/pif_LongInt/UnsignedDouble/_SetBlock 0.024 0.026 0.021 37366
/pif_LongInt/UnsignedDouble/New 0.012 0.012 0.010 25000

*/


/*

Profile results (total time)
Proc Name Self CPU Total CPU Real Time Calls
-------------------------------------------- --------- --------- --------- ---------
/mob/verb/ComputeRemainders 0.059 1.440 1.440 1
/pif_LongInt/UnsignedDouble/Remainder 0.170 1.381 1.384 25000
/pif_LongInt/UnsignedDouble/proc/_AlgorithmD 1.012 1.012 1.031 50000
/pif_LongInt/UnsignedDouble/Quotient 0.115 0.709 0.743 25000
/pif_LongInt/UnsignedDouble/_SetBlock 0.047 0.047 0.051 75150
/pif_LongInt/UnsignedDouble/New 0.037 0.038 0.045 50000

*/


/*

Profile results (total time)
Proc Name Self CPU Total CPU Real Time Calls
-------------------------------------------- --------- --------- --------- ---------
/mob/verb/ComputeBoth 0.076 1.485 1.484 1
/pif_LongInt/UnsignedDouble/Divide 0.207 1.409 1.425 25000
/pif_LongInt/UnsignedDouble/proc/_AlgorithmD 0.994 0.994 1.006 50000
/pif_LongInt/UnsignedDouble/Quotient 0.113 0.705 0.697 25000
/pif_LongInt/UnsignedDouble/_SetBlock 0.060 0.060 0.075 112516
/pif_LongInt/UnsignedDouble/New 0.035 0.036 0.056 75000

*/

Computing quotients is quite quick, which I'm happy with—that's what most people will be doing anyways. Computing the remainder is more expensive because it ends up involving another call back to _AlgorithmD() to unnormalize the data (as Knuth calls it), and the Division() method outputs a list containing the quotient and remainder, hence the reason it takes about as long as finding the quotient.

I'm gonna see if I can bring down the time it takes to compute the remainder (looking through, there might be a more efficient way than waht I'm doing), but for now I'm fairly satisfied. Unfortunately, the code for triple and quadruple precision arithmetic will be the same, but much longer.

For anyone curious, here is the mentioned code. It's far too long to paste here without feeling painfully spammy.
It was a bit hard for the eyes to actually see the leg movement. The brain kind of fills in the frames it can't actually see. I think this new version is great. Death animation is cool!!
And now there is finally decimal conversion, which will probably make this seem more "real" to a lot of people. Using the following code,
mob
var
const/total = 100

list
dividends = new
divisors = new

Login()
..()

world << "<tt>Populating lists...</tt>"

sleep(10)
for(var/i = 1, i <= total, i ++)

var
a1 = rand(0x0000, 0xFFFF)
a0 = rand(0x0001, 0xFFFF)

b1 = rand(0,1) * rand(0x0000, a1)
b0 = rand(0x0001, 0xFFFF)

dividends += new /pif_LongInt/UnsignedDouble(a1, a0)
divisors += new /pif_LongInt/UnsignedDouble(b1, b0)

if( (i % 1000) == 0)
sleep(1)

world << "<tt>Finished initial list populations ([total]).</tt>"

verb/Test()
for(var/i = 1, i <= total, i ++)
var
pif_LongInt/UnsignedDouble
A = dividends[i]
B = divisors[i]

Q
R

list/L = A.Divide(B)
Q = L[1]
R = L[2]

world << "<tt>[B.Print()] * [Q.Print()] + [R.Print()] == [A.Print()]</tt>"

I have generated the following random sample output for unsigned double precision integers, which can be independently verified as correct (if you're so compelled):
1159416082 * 1 + 1026600590 == 2186016672
1344239066 * 3 + 78806696 == 4111523894
2674236156 * 1 + 236776761 == 2911012917
5082 * 215276 + 3893 == 1094036525
2037627837 * 1 + 1955331588 == 3992959425
214570014 * 3 + 203748894 == 847458936
64906 * 53994 + 23164 == 3504557728
545414878 * 4 + 180877911 == 2362537423
1451471753 * 1 + 717189320 == 2168661073
1760418314 * 1 + 1685192579 == 3445610893
29482 * 126323 + 14150 == 3724268836
44165 * 19880 + 39963 == 878040163
762034070 * 3 + 45214203 == 2331316413
18772 * 31040 + 15602 == 582698482
55163 * 17616 + 50007 == 971801415
178955272 * 2 + 139942978 == 497853522
40486 * 82910 + 23222 == 3356717482
374482226 * 1 + 210639106 == 585121332
13350 * 207383 + 8776 == 2768571826
30567 * 104992 + 19267 == 3209309731
2005533978 * 1 + 1774438395 == 3779972373
18994 * 42543 + 3180 == 808064922
8465 * 291714 + 5213 == 2469364223
30555 * 140244 + 29316 == 4285184736
68528916 * 1 + 23285600 == 91814516
751863007 * 1 + 207514336 == 959377343
44159003 * 1 + 29706082 == 73865085
57749 * 2726 + 39496 == 157463270
458448085 * 1 + 309699278 == 768147363
63968 * 4794 + 38570 == 306701162
38074 * 65352 + 22961 == 2488235009
3101 * 509272 + 2891 == 1579255363
1346178226 * 3 + 7968957 == 4046503635
1106524156 * 1 + 471232997 == 1577757153
12085 * 278777 + 7912 == 3369027957
2187975552 * 1 + 1647548105 == 3835523657
407315447 * 3 + 365616531 == 1587562872
6006 * 43652 + 3696 == 262177608
332261300 * 2 + 48279963 == 712802563
2010112432 * 1 + 328071758 == 2338184190
2077652416 * 1 + 1407078336 == 3484730752
119262138 * 5 + 9979668 == 606290358
2202195956 * 1 + 560327507 == 2762523463
38209 * 79246 + 1863 == 3027912277
62550 * 11848 + 5394 == 741097794
42065 * 67354 + 27373 == 2833273383
15094 * 246653 + 8262 == 3722988644
47047 * 68935 + 4183 == 3243189128
28943 * 78359 + 27578 == 2267972115
38522 * 90800 + 3553 == 3497801153
65228 * 60784 + 63096 == 3964881848
22500 * 178981 + 12162 == 4027084662
47616 * 17878 + 44527 == 851323375
15633 * 263023 + 8656 == 4111847215
49168 * 52509 + 35815 == 2581798327
1726911480 * 1 + 1137499216 == 2864410696
4916 * 35422 + 1883 == 174136435
47097 * 83671 + 34840 == 3940687927
1616505866 * 1 + 776409776 == 2392915642
34866 * 102470 + 32917 == 3572751937
440902382 * 1 + 111099245 == 552001627
1400509096 * 1 + 690324038 == 2090833134
493744341 * 1 + 141138606 == 634882947
1069373246 * 1 + 418180065 == 1487553311
37485 * 83667 + 31165 == 3136288660
655487832 * 5 + 235987320 == 3513426480
113224486 * 2 + 40074978 == 266523950
35071 * 15679 + 28799 == 549907008
1770991985 * 1 + 971300797 == 2742292782
37788 * 19983 + 35363 == 755152967
10609 * 311513 + 6103 == 3304847520
752809332 * 3 + 182403642 == 2440831638
60580 * 26481 + 34820 == 1604253800
1785619917 * 2 + 605942000 == 4177181834
713329502 * 1 + 63566808 == 776896310
828649824 * 1 + 745677009 == 1574326833
77525700 * 18 + 43692572 == 1439155172
50396 * 60433 + 37362 == 3045618830
2614353491 * 1 + 510287148 == 3124640639
57437 * 19488 + 37316 == 1119369572
25401 * 143166 + 17844 == 3636577410
61688 * 42083 + 42566 == 2596058670
3418062130 * 1 + 363443590 == 3781505720
31871 * 88431 + 27777 == 2818412178
329336977 * 2 + 119876257 == 778550211
27484 * 35781 + 13564 == 983418568
38052 * 20105 + 36328 == 765071788
637406594 * 3 + 342482377 == 2254702159
1370178865 * 2 + 678896001 == 3419253731
1541466812 * 1 + 587008683 == 2128475495
3117396171 * 1 + 94528085 == 3211924256
1087969167 * 1 + 788298425 == 1876267592
2383866638 * 1 + 57099188 == 2440965826
1003485621 * 2 + 340890040 == 2347861282
1708728223 * 1 + 1402273326 == 3111001549
2085872787 * 1 + 1210235043 == 3296107830
195179149 * 6 + 150590014 == 1321664908
1016277943 * 1 + 1005883598 == 2022161541
90513961 * 4 + 25836752 == 387892596
18657 * 48816 + 18359 == 910778471

For example, you can take any of the above lines and plug it into Wolfram|Alpha and it should spit out True or False depending on the truth of the statement (i.e., hopefully True).

The good thing about this particular output is that it simultaneously tests the correct functioning of addition, multiplication, and division with remainder. At the same time, you can test it to see that DM loses its precision with most of this output, demonstrating the utility of the library.
In response to Bravo1
Bravo1 wrote:


Slowed the legs a bit (0.5 delay to 0.75) and finished up the death animation.

Looks great. With some mechanical movement sounds, I think the legs will be fine. Love the final look the mech gives. Nice touch.
Love that explosion. Some debris would punch it up even more.
Although I haven't touched this in a little while, I may as well share some cool things I was doing with SotS II to bring it up to speed with 509's new features. (I'll probably make use of KEEP_TOGETHER in it at some point too; one of the reasons I prioritized implementing that was that I didn't like that maptext and its background couldn't fade out together.)

- Opacity has been removed; a little of the atmosphere was sacrificed for better gameplay.

- Replacing most icon operations with color matrices has resulted in a huge speedup when the round starts.

- Each page now has a theme color; all of the walls are variations on that color.

- Team colors used to be limited to red, orange, gold, green, blue, sky blue, purple, and brown. Now they also include silver, pink, lime, black, teal, maroon, and periwinkle.

- When walls are created (via a crayon attached to a trap or by drawing them in your team's base), an animation fills them in.

- Walls show how much damage they have taken, as cracks.

- When a wall is destroyed, it breaks into blocks that fly apart and disappear.

- When a continuous section of wall is broken up, one of the sections will fade to a new color.

- The eraser grenade has had its explosion icon replaced with an animation of eraser "cloud" particles, which looks much cooler.

- The chalkporter vortex icon has been improved.

- The Stickster's roar causes the screen to shake, when in close proximity.

- The Stickster no longer spawns in the open. He either comes in from the side of the page, or spawns in a wall which he breaks out of.

- Work in progress: The end of the round has been changed to show a summary screen saying who won, who got MVP, etc. The plan is for winners and MVPs to do a victory walk. Eventually medals will be shown here too.

- Work in progress: The round start now shows the instructions on the map, and has a countdown delay.

- TODO: The weapon HUD needs to be updated to avoid the use of icon operations, which will also benefit from KEEP_TOGETHER.

- TODO: The tracker will be moved on-screen, replaced with an arrow and allowing the user to switch targets. This will replace the Ping command completely, and by only allowing the user to track items or the Stickster at any given time (not both), it will ramp up difficulty.

- TODO: Medals earned in-game should have a display on-screen.

- TODO: Death announcements and chat should go on-screen as well, eliminating the need for an output control.
In response to Bravo1
Bravo1 wrote:


Slowed the legs a bit (0.5 delay to 0.75) and finished up the death animation.

Looks pretty good. I have a bit of art critique though:

The speed at which he moves doesn't feel correct with his walking animation. He's very very rapidly scurrying about, which gives a frantic and light-footed feeling to his character that works against his big blockyness and strong heavy punches. I think you should make him take longer, heavier steps to drive home how meaty he is and how much punishment he may be able to take (especially with that shield). To maintain his speed and his feeling of weight, perhaps with each stride he takes off the ground a little and have his whole body react (with the weight) when he lands right before taking off on the next stride.

The explosion animation doesn't feel too satisfying. I agree with Lummox, where there should be some debris particles to juice it up. The white shockwave ring that expands looks kind of crummy because you're scaling up. Instead, you should draw a white ring like that at high resolution and animate it so that initially it's scaled down, and have it animate towards it's normal resolution as it expands.
Yut Put wrote:
@lummox: How do you plan on adding on screen chat if there is no way to know where a message line ends or how much screen space maptext takes up? It is currently impossible to make functional on screen chat because of these two problems (you cant read the number of lines the maptext takes up)

Javascript, have a browser return the width of a span of some text.
In response to D4RK3 54B3R
He's actually not all that big :P. I mean he's a little taller than the rover robot thingy which compared to some of the bosses arent all that tall :P.
Adding in little text-logs that you'll be able to find all over the station while doing the quests/missions/etc. They provide some backstory about events that transpired aboard Sol VI before your arrival.

Really glad I decided to dip more into the interface stuff.

Page: 1 2 3 ... 177 178 179 180 181 ... 349 350 351